rewrite this code for use pid regulation
/*
ПАЯЛЬНАЯ СТАНЦИЯ ver. 1.5

Дата создания 2015
Автор Олег Андреев
<PRESIDIO_ANONYMIZED_EMAIL_ADDRESS>
http://www.d-serviss.lv
*/

#define sKp 25 // коэфициент ошибки на канал паяльника
#include <LiquidCrystal_I2C.h> // Подключаем библиотеку для работы с дисплеем

/-------------------настройки-----------------------------------------/
LiquidCrystal_I2C lcd(0x27,16,2);
boolean Rele = HIGH; //Если неправильно работает реле измените на HIGH
boolean ReleSo = HIGH; // Если не правильно работает меняем на LOW, HIGH
int pinSolderOut = 5; // Выход для паяльника
int pinSolderIn = A0; // Потенциометр паяльника
int pinSolderTCouple = A1; // Термопара паяльника
int pinSolderButton = 2; // Кнопка вкл. и выкл. паяльника
int pinSleepState = 1; // Спящий режим паяльника 3 нога меги
int pinHotAirOut = 6; // Выход для фена
int pinHotAirIn = A2; // Потенциометр фена
int pinHotAirTCouple = A3; // Термопара фена
int pinHotAirCoolerOut = 3; // Выход для вентилятора фена ( PWM )
int pinHotAirCoolerIn = A7; // Потенциометр вентилятора фена
int pinHotAirButton = 4; // Кнопка вкл.и выкл. фена
int pinGerkon = 1; // Геркон фена 28ая нога
int pinRele = 0; //На управление реле(13я нога меги)
int pinReleSol = 7; // на управление реле паяльника
long Sleep = 900000; // Время задержки на включение спящего режима в милисекундах
long Off = 2700000; //Время задержки перед отключением паяльника, время отсчитывается от срабатывания геркона спящего режима
int Max = 150; // Максимальная температура спящего режима паяльника
int Min = 0; // минимальная температура спящего режима паяльника

/-------------------------------------------------------------------------/
/--------------------------------служебные переменные---------------------/
boolean FAN = true;
boolean Error = LOW;
boolean ErSol = LOW;
boolean Ss = LOW;
boolean Sss = LOW;
boolean SleepState;
boolean SolderButton;
boolean HotAirButton;
boolean Gerkon;
int SolderTemp;
int setSolderTemp;
int solderTCouple;
int setHotAirTemp;
int hotAirTCouple;
int setHotAirCooler;
int displayHotAirCooler;
int sTCouple;
int hATCouple;
int err1=0;
int sKp1= 10; // коэфициент ошибки на канал фена
int outN = 0;
int err = 0;
long STC = 0;
long HAT = 0;
int L = 0;
int N = 0;
int I = 0;
int K = 0;
int S = 0;

long PO = 0;
long PM = 0;
long PS = 0;
long PF = 0;
long TT;
uint8_t char_cel[8] = {
B00111, B00101, B00111, B00000, B00000, B00000, B00000
};
/-------------------------------------------------------------------------------/
void setup() {
TCCR2B = TCCR2B & 0b11111000 | 0x02; //кулер фена 24v. Частота ШИМ 11 и 3
pinMode(pinSolderOut, OUTPUT);
pinMode(pinSolderButton, INPUT);
pinMode(pinHotAirOut, OUTPUT);
pinMode(pinHotAirButton, INPUT);
pinMode(pinGerkon, INPUT);
pinMode(pinRele, OUTPUT);
pinMode(pinReleSol, OUTPUT);
pinMode(pinSleepState, INPUT);
digitalWrite(pinRele, Rele);
digitalWrite(pinReleSol, ReleSo);
lcd.begin(16, 2);
lcd.createChar(1, char_cel);

lcd.init(); // инициализация LCD
lcd.backlight(); // включаем подсветку

// Вывод приветствия
lcd.setCursor(0, 0);
lcd.print("Hello DRON");
lcd.setCursor(0, 1);
lcd.print(" Ver 2.0.2 ");
// задержка
delay (5000);
lcd.clear();
lcd.print("Solder:");
lcd.setCursor(0, 1);
lcd.print("Fen:");

}

void loop() { //основной цикл
/-------------- чтение и Преобразовывание значении -------------------------------/
setSolderTemp = map(analogRead(pinSolderIn), 0, 1023, 0, 450);
solderTCouple = map(analogRead(pinSolderTCouple), 0, 1023, 0, 500);
setHotAirTemp = map(analogRead(pinHotAirIn), 0, 1023, 0, 460);
hotAirTCouple = map(analogRead(pinHotAirTCouple), 0, 1023, 0, 500);
setHotAirCooler = map(analogRead(pinHotAirCoolerIn), 0, 1023, 80, 255);
displayHotAirCooler = map(analogRead(pinHotAirCoolerIn), 0, 1023, 0, 99);
//SleepState = digitalRead(pinSleepState);
SleepState = 0 ;
SolderButton = digitalRead(pinSolderButton);
HotAirButton = digitalRead(pinHotAirButton);
Gerkon = digitalRead(pinGerkon);
TT = millis();
/---------------------------------------------------------------------------------/
/---------------------------------работа паяльника--------------------------------/
solder();
/---------------------------------------------------------------------------------/
/---------------------------------работа фена-------------------------------------/
fen();

/--------------------------------------------------------------------------------/
/--------------------усреднение значений измеренных температур-------------------/
if (outN == 0) {
sTCouple = 0;
hATCouple = 0;
}
if (outN < 50) {
++outN;
STC = STC + solderTCouple;
HAT = HAT + hotAirTCouple;
} else {
sTCouple = STC / 50;
hATCouple = HAT / 50;
STC = 0;
HAT = 0;
outN = 0;
out();//вывод на экран
}
/---------------------------------------------------------------------------/
}

void solder() {//подпрограмма паяльника
/---------------Защита от обрыва/замыкания термопары паяльника--------------/
if (SolderButton == HIGH) {
if (solderTCouple > 479)
{
ErSol = HIGH; //флаг по превышении температуры
}
if (I < 1500) {
I++;
}
if (I == 1500 && solderTCouple <= 10) {
ErSol = HIGH; //флаг по обрыву или кз термопары
}
} else {
I = 0;
}
/-------------------------управление реле защиты паяльника----------------------------/
if (digitalRead(pinSolderButton) == HIGH && ErSol == LOW ) {
if (digitalRead(pinReleSol) !=ReleSo) {
digitalWrite(pinReleSol, ReleSo); // При включенной кнопке паяльник и не сработанной защите замыкаем реле и подаем 24В на паяльник
}
} else {
digitalWrite(pinReleSol, !ReleSo); // Иначе реле размыкаем и отключаем паяльник
}
/---------------------------------------------------------------------------------/
// Поддержка установленной температуры паяльника
if (digitalRead(pinSolderButton) && ErSol == LOW && SleepState == HIGH ) { // если включено - работаем
SolderTemp = setSolderTemp;
err = SolderTemp - solderTCouple; // Определяем ошибку
int TempPower = sKp * err; // Рассчитываем нужную мощность, с учётом коэфф. пропорциональности
if (solderTCouple < 75) { //мягкий старт
TempPower = 100;
} //конец мягкий старт
uint16_t SPower = constrain(TempPower, 0, 255); // ограничиваем макс. и мин.
analogWrite(pinSolderOut, SPower); // ШИМ-им нагрузку
S = 0;
Ss = LOW;
Sss = LOW;
} else if ( SolderButton && SleepState == LOW && ErSol == LOW ) {
if ( S == 0 ) {
PO = TT;
S++;
Ss = LOW;
Sss = LOW;
}
if ( S == 1) {
if ((TT - PO < Sleep))
{
SolderTemp = setSolderTemp;
err = SolderTemp - solderTCouple; // Определяем ошибку
int TempPower = sKp * err; // Рассчитываем нужную мощность, с учётом коэфф. пропорциональности
uint16_t SPower = constrain(TempPower, 0, 255); // ограничиваем макс. и мин.
analogWrite(pinSolderOut, SPower); // ШИМ-им нагрузку
Ss = LOW;
Sss = LOW;
} else if ((TT - PO) > Off) {
analogWrite(pinSolderOut, 0);
Ss = HIGH;
Sss = HIGH;
} else {
SolderTemp = setSolderTemp;

    int STemp = constrain((setSolderTemp * 0.75), Min, Max); // ограничиваем макс. и мин.
    if (setSolderTemp < STemp) {
      STemp = setSolderTemp;
    }
    err = STemp - solderTCouple;
    int TempPower = sKp * err; // Рассчитываем нужную мощность, с учётом коэфф. пропорциональности
    uint16_t SPower = constrain(TempPower, 0, 255); // ограничиваем макс. и мин.
    analogWrite(pinSolderOut, SPower); // ШИМ-им нагрузку
    Ss = LOW;
    Sss = HIGH;
  }
}
} else {
analogWrite(pinSolderOut, 0);
S = 0;
}

}
void fen() {//подпрогамма фена
/---------------Защита от пробоя симистора/замыкания термопары ФЕНА--------------/
if (HotAirButton == HIGH && Gerkon == HIGH ) {
if (hotAirTCouple > 479)
{
Error = HIGH; //флаг по превышении температуры
// setHotAirTemp = 0;
}
if (N < 1500) {
++N;
}
if (N == 1500 && hotAirTCouple <= 15) {
Error = HIGH; //флаг по обрыву или кз термопары
}
} else {
N = 0;
}
/---------------------------------------------------------------------------------/
/-------------------------управление реле защиты фена----------------------------/
if (HotAirButton == HIGH && Error == LOW ) {
if (digitalRead(pinRele) != Rele) {
digitalWrite(pinRele, Rele); // При включенной кнопке фена и не сработанной защите замыкаем реле и подаем 220в на фен
}
} else {
digitalWrite(pinRele, !Rele); // Иначе реле размыкаем и отключаем фен
}
/--------------------------------------------------------------------------------/
// Поддержка установленной температуры фена
if (setHotAirTemp >= hotAirTCouple && HotAirButton == HIGH && Gerkon == HIGH && Error == LOW )
{
int err1 = setHotAirTemp - hotAirTCouple; // Определяем ошибку
int TempPowerAir = sKp1 * err1; // Рассчитываем нужную мощность, с учётом коэфф. пропорциональности
byte max_power = 255;
uint16_t SPowerAir = constrain(TempPowerAir, 0, 255); // ограничиваем макс. и мин.

   analogWrite(pinHotAirOut, SPowerAir); // ШИМ-им нагрузку
} else {
digitalWrite(pinHotAirOut, LOW);
}
/* Установка оборотов вентилятора фена*/
if (hotAirTCouple > 45 && HotAirButton == LOW && FAN) //Продувка фена после выключения
{
analogWrite(pinHotAirCoolerOut, 255);
}
else if (hotAirTCouple <= 45 && HotAirButton == LOW && FAN)
{
analogWrite(pinHotAirCoolerOut, 0);
FAN = false;
}
else if (hotAirTCouple < 70 && HotAirButton == LOW && FAN == false)
{
analogWrite(pinHotAirCoolerOut, 0);
}
else if (hotAirTCouple > 70 && HotAirButton == LOW && FAN == false)
{
FAN = true;
analogWrite(pinHotAirCoolerOut, 255);
}
else
{
analogWrite(pinHotAirCoolerOut, setHotAirCooler);
FAN = true;
}

}
void out() {//подпрограмма вывода данных на дисплей
/----------------- Данные паяльника на дисплей-------------------------/
lcd.setCursor(7, 0);
lcd.print(" ");
lcd.setCursor(7, 0);
if (SolderButton == HIGH && ErSol == LOW) {
if (Ss == LOW) {
lcd.print(SolderTemp);
} else {
lcd.print("Off");
}
lcd.print("\1");
lcd.setCursor(12, 0);
lcd.print(sTCouple);
lcd.print("\1");
if (SleepState == LOW && Sss == HIGH && ErSol == LOW) //геркон замкнут, мигаем уст. температурой (ловим по земле)
{
lcd.setCursor(7, 0);
if (Ss == LOW) {
lcd.print(SolderTemp);
} else {
lcd.print("Off");
}
lcd.print("\1");
lcd.setCursor(12, 0);
lcd.print(sTCouple);
lcd.print("\1");
if ( L == 0 ) {
PS = TT;
L++;
}
if ( L == 1) {
if (TT - PS < 300)
{
} else {
L++;
}
}
if (L == 2) {
if (TT - PS < 600) {
lcd.setCursor(7, 0);
lcd.print(" ");
lcd.print("\1");
lcd.setCursor(12, 0);
lcd.print(sTCouple);
lcd.print("\1");
} else {
L = 0;
}
}
}
else {
lcd.print(" Warning");
}
}
//Температура выключенного паяльника на дисплей до 60 градусов
else if ( solderTCouple < 479 && solderTCouple > 60 && SolderButton == LOW && ErSol == LOW) {
lcd.print(" Off");
lcd.setCursor(12, 0);
lcd.print(sTCouple);
lcd.print("\1");
} else if (ErSol == HIGH) {
lcd.print(" Warning");
} else {
lcd.print(" Off");
}
/---------------------------/
/--------------------- Данные фена на дисплей----------------------------/
lcd.setCursor(4, 1);
lcd.print(" ");
lcd.setCursor(4, 1);
if (HotAirButton == HIGH && Error == LOW) {
lcd.print(setHotAirTemp);
lcd.print("\1");
lcd.setCursor(9, 1);
lcd.print(hATCouple);
lcd.print("\1");
// Вентилятор фена на дисплей
lcd.setCursor(14, 1);
lcd.print(displayHotAirCooler);
if (Gerkon == LOW && HotAirButton == HIGH && Error == LOW) //геркон замкнут, мигаем уст. температурой (ловим по земле)
{
lcd.setCursor(4, 1);
lcd.print(setHotAirTemp);
lcd.print("\1");
lcd.setCursor(9, 1);
lcd.print(hATCouple);
lcd.print("\1");
lcd.setCursor(14, 1);
lcd.print(displayHotAirCooler);
if ( K == 0 ) {
PM = TT;
K++;
}
if ( K == 1) {
if (TT - PM < 300)
{
} else {
K++;
}
}
if (K == 2) {
if (TT - PM < 600) {
lcd.setCursor(4, 1);
lcd.print(" ");
lcd.setCursor(9, 1);
lcd.print(hATCouple);
lcd.print("\1");
lcd.setCursor(14, 1);
lcd.print(displayHotAirCooler);
} else {
K = 0;
}
}
}
else {
lcd.print(" Warning");
}
}
//Температура выключенного фена на дисплей до 60 градусов
else if (hotAirTCouple > 70 && HotAirButton == LOW && hotAirTCouple < 479 && Error == LOW) {
lcd.print(" Off");
lcd.setCursor(9, 1);
lcd.print(hATCouple);
lcd.print("\1");
} else if (Error == HIGH) {
lcd.print(" Warning");
} else {
lcd.print(" Off");
}

}