контроллер тэнов и насоса СО для ТТ котла

balomut
Offline
Зарегистрирован: 30.05.2018
Помогите разобраться с включением насоса ( последний кусок кода )
  Включается только после уставки для тэнов т.е. после выключения тэнов и выключается после их включения , а должен включатся после 55 гр.С и выключатся после падения
  температуры до 40 .


#include <Wire.h>
#include <OneWire.h>
#define ONE_WIRE_BUS 9 //задаем контакт для датчика
#define RES_TEMP      12    // разрешение (точность) темп. датчика в битах
OneWire oneWire(ONE_WIRE_BUS);
//Подключаем библиотеку для работы с термометром
#include <DallasTemperature.h>
//Создаем объект sensors, подключенный по OneWire
DallasTemperature sensors(&oneWire);
//Создаем переменные для работы с термометром
DeviceAddress temp1DeviceAddress;//переменная для хранения адреса датчика
float temp1 = 0; //переменная для текущего значения температуры 1
int setTmp = 0; // переменная для заданного значения температуры
//Подключаем LCD-дисплей
#include <LiquidCrystal_I2C.h>
//#include <LCD_1602_RUS.h>
//LCD_1602_RUS lcd(0x27,16,2)
LiquidCrystal_I2C lcd(0x27, 16, 2);
//Подсветка управляется через пин D10
//#define BACKLIGHT_PIN 10
//Создаем переменную для хранения состояния подсветки
boolean backlightStatus = 1;
// Подключаем библиотеку для работы с ARDUINO EEPROM
//Заданная температура будет храниться по адресу 0
#include <EEPROM2.h>
//Реле подключено к пину D11
#define RELAY1 11
#define RELAY2 12
#define RELAY3 7
#define RELAY4 8
#define ledPin 13
//Объявим переменную для хранения состояния реле
boolean relayStatus1 = LOW;
boolean relayStatus2 = LOW;
boolean relayStatus3 = LOW;
boolean relayStatus4 = LOW;
//Объявим переменные для задания задержки
long previousMillis1 = 0;
long interval1 = 2000; // интервал опроса датчиков температуры
//Аналоговая клавиатура подключена к пину A0
#define KEYPAD_PIN A0
//Определим значения на аналоговом входе для клавиатуры
#define ButtonUp_LOW 140
#define ButtonUp_HIGH 145
#define ButtonDown_LOW 324
#define ButtonDown_HIGH 330
#define ButtonLeft_LOW 503
#define ButtonLeft_HIGH 509
#define ButtonRight_LOW 0
#define ButtonRight_HIGH 5
#define ButtonSelect_LOW 740
#define ButtonSelect_HIGH 745
void setup()
{
  //Настроим пин для управления реле
  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
  pinMode(RELAY3, OUTPUT);
  pinMode(RELAY4, OUTPUT);
  digitalWrite(RELAY1, LOW);
  digitalWrite(RELAY2, LOW);
  digitalWrite(RELAY3, LOW);
  digitalWrite(RELAY4, LOW);
  //Считаем из постоянной памяти заданную температуру
  setTmp = EEPROM_read_byte(0);

  //Инициализируем термодатчик и установим разрешающую способность 12 бит
  //(обычно она установлена по умолчанию, так что последнюю строчку
  //можно опустить)
  sensors.begin();
  sensors.getAddress(temp1DeviceAddress, 0);
  temp1 = sensors.getTempC(temp1DeviceAddress);
  
  //Выведем на дисплей стартовое сообщение на 2 секунды
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Temp. Controller");
  lcd.setCursor(0, 1);
  lcd.print("      v1.1      ");
  delay(1500);
  // выведем на дисплей заданное значение температуры на 2 секунды
  lcd.setCursor(0, 1);
  lcd.print("  Set temp:     ");
  lcd.setCursor(12, 1);
  lcd.print(setTmp);
  delay(1500);
  //Очистим дисплей
  lcd.begin(16, 2);
}
//Определим функцию для опроса аналоговой клавиатуры
//Функция опроса клавиатуры, принимает адрес пина, к которому
//подключена клавиатура, и возвращает код клавиши:
// 1 - UP
// 2 - DOWN
// 3 - LEFT
// 4 - RIGHT
// 5 - SELECT
int ReadKey(int keyPin)
{
  int KeyNum = 0;
  int KeyValue1 = 0;
  int KeyValue2 = 0;
  //Читаем в цикле аналоговый вход, для подавления дребезга
  //и нестабильности читаем по два раза подряд, пока значения
  //не будут равны.
  //Если значения равны 1023 – значит не была нажата ни  одна клавиша.
  do {
    KeyValue1 = analogRead(keyPin);
    KeyValue2 = analogRead(keyPin);
  } while (KeyValue1 == KeyValue2 && KeyValue2 != 1023);
  //Интерпретируем полученное значение и определяем код нажатой клавиши
  if (KeyValue2 < ButtonUp_HIGH && KeyValue2 > ButtonUp_LOW) {
    KeyNum = 1; //Up
  }
  if (KeyValue2 < ButtonDown_HIGH && KeyValue2 > ButtonDown_LOW) {
    KeyNum = 2; //Down
  }
  if (KeyValue2 < ButtonLeft_HIGH && KeyValue2 > ButtonLeft_LOW) {
    KeyNum = 3; //Left
  }
  if (KeyValue2 < ButtonRight_HIGH && KeyValue2 > ButtonRight_LOW) {
    KeyNum = 4; //Right
  }
  if (KeyValue2 < ButtonSelect_HIGH && KeyValue2 > ButtonSelect_LOW) {
    KeyNum = 5; //Select
  }
  //Возвращаем код нажатой клавиши
  return KeyNum;
}
//Определим процедуру редактирования заданной температуры
//Вызывается по нажатию клавиши Select, отображает на дисплее
//заданную температуру и позволяет изменять ее клавишами Up и Down
void setTemperature()
{
  lcd.begin(16, 2);
  int keyCode = 0;
  //выводим на дисплей заданное значение температуры
  lcd.setCursor(0, 0);
  lcd.print("  Setting temp  ");
  lcd.setCursor(7, 1);
  lcd.print(setTmp);
  //Опрашиваем клавиатуру, если нажата клавиша Up увеличиваем
  //значение на 1, если Down – уменьшаем на 1
  //Если нажаты клавиши Select или Right – цикл опроса прерывается
  //Задержки введены для борьбы с дребезгом, если клавиши срабатывают
  //четко – можно уменьшить время задержек или вообще их убрать
  do
  {
    keyCode = ReadKey(KEYPAD_PIN);
    if (keyCode == 1) {
      setTmp++;
      delay(150);
      lcd.setCursor(7, 1);
      lcd.print(setTmp);
    }
    if (keyCode == 2) {
      setTmp--;
      delay(150);
      lcd.setCursor(7, 1);
      lcd.print(setTmp);
    }
    //lcd.begin(16,2);
  }
  while (keyCode != 5 && keyCode != 4);

  delay(200);
  //lcd.begin(16, 2);
  //По клавише Select – созраняем в EEPROM измененное значение
  //По клавише Right – восстанавливаем старое значение
  if (keyCode == 5) {
    EEPROM_write_byte(0, setTmp);
  }
  if (keyCode == 4) {
    setTmp = EEPROM_read_byte(0);
  }
}
void loop() 
{
  //Модуль опроса датчиков и получения сведений о температуре
  //Вызывается 1 раз в секунду
  unsigned long currentMillis1 = millis();
  if (currentMillis1 - previousMillis1 > interval1) {
    previousMillis1 = currentMillis1;
    //Запуск процедуры измерения температуры
    // sensors.setWaitForConversion(false);
    sensors.requestTemperatures();
    //sensors.setWaitForConversion(true);
    //Delay(250) // задержка для обработки информации внутри термометра,
    //в данном случае можно не задавать
    //Считывание значения температуры
    sensors.getAddress(temp1DeviceAddress, 0);
    temp1 = sensors.getTempC(temp1DeviceAddress);
    
    // Вывод текущего значения температуры на дисплей
    lcd.setCursor(0, 0);
    lcd.print("Power");
    lcd.setCursor(0, 1);
    lcd.print("T=");
    lcd.print(temp1);
    lcd.print("C");
    
  }
  //Проверка условия включения/выключения нагревателя
  if (temp1 < setTmp && relayStatus1 == LOW)
  { relayStatus1 = HIGH; digitalWrite(RELAY1, HIGH);
    lcd.setCursor(10, 0);
    lcd.print("P= 35%");
  }
  if (temp1 > setTmp && relayStatus1 == HIGH)
  { relayStatus1 = LOW; digitalWrite(RELAY1, LOW);
    lcd.setCursor(10, 0);
    lcd.print("P=  0%");
  }
  delay(500);
  if (temp1 + 1 < setTmp && relayStatus2 == LOW)
  { relayStatus2 = HIGH; digitalWrite(RELAY2, HIGH);
    lcd.setCursor(10, 0);
    lcd.print("P= 70%");
  }
  if (temp1 > setTmp && relayStatus2 == HIGH)
  { relayStatus2 = LOW; digitalWrite(RELAY2, LOW);
    //lcd.begin(10, 2);
  }
  delay(500);
  if (temp1 + 2 < setTmp && relayStatus3 == LOW)
  { relayStatus3 = HIGH; digitalWrite(RELAY3, HIGH);
    lcd.setCursor(10, 0);
    lcd.print("P=100%");
  }
  if (temp1 > setTmp && relayStatus3 == HIGH)
  { relayStatus3 = LOW; digitalWrite(RELAY3, LOW);
    //lcd.begin(16, 2);
  }
  delay(200);
  // Опрос клавиатуры
  int Feature = ReadKey(KEYPAD_PIN);
  //Включение подсветки
  if (Feature == 1 )
  {
    backlightStatus = 1;
    
  }
  //Отключение подсветки
  if (Feature == 2 )
  {
    backlightStatus = 0;
    
  }
  //Переход к редактированию заданной температуры
  if (Feature == 5 )
  { delay(200); setTemperature();
  }



 if(temp1>10&&temp1<95){
  if (temp1 >=55&&relayStatus4==LOW){relayStatus4=HIGH; digitalWrite(RELAY4, HIGH);} //температура включения
  if (temp1 <=40&&relayStatus4==HIGH){relayStatus4=LOW; digitalWrite(RELAY4, LOW);}} //температура выключения
  if (temp1 ==(-127)){lcd.init();lcd.setCursor(0,0);lcd.print("Avaria Sensor");digitalWrite(RELAY4, HIGH);
  } //при потере датчика включаем насос
  //if(temp1 !=(-127)){avaria2=LOW;}
  if (temp1 <=-127 )digitalWrite(ledPin, HIGH); //при потере датчика включаем светодиод
  delay(200);              // помигаем светодиодом при потери датчика
  
 // delay(50);
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну почему все пишут подобные сообщения - помогите разобраться с включением насоса , а не разобраться например с лишним пивом, или избытком денег, ну или с лишними шашлыками .

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

А автору кода писали?  Чо он говорит?

balomut
Offline
Зарегистрирован: 30.05.2018

Автор почти я , слепил из трех программ под мои интересы . 

Почти уже сегодня написал свой с более сложной  работой .Завтра выложу.

vvadim
Offline
Зарегистрирован: 23.05.2012

balomut пишет:

Автор почти я , слепил из трех программ под мои интересы . 

Почти уже сегодня написал свой с более сложной  работой .Завтра выложу.

в более сложном коде обратите внимание на большое кол-во делеев и использование далласовской библиотеки - тормоза и проблемки в работе вам обеспечены.

balomut
Offline
Зарегистрирован: 30.05.2018

Как и обещал выкладываю ещё пока сырой код , прошу помочь поправить если можно чтото изменить . Закоментированные части кода для дальнейшего апгрейда пропускаем .



[code]





/*Программа для автоматики управления тэнами и насосом ТТ котла


Входа аналоговые :
А0-вход для подключения клавиатуры
А4 - подключение дисплея I2C
А5 - подключение дисплея 
А1 - температура подачи в бак

Входа дискретные:
D9 -вход шины OneWire для подключения цифрового датчика температуры D18B20
D6 - вход прерывание для регулятора

Выхода:
D2 - выход на подключение насоса СО
D3 - выход на реле 1 тэна
D4 - выход на реле 2 тэна
D5 - выход на реле 3 тэна
*/

//подключаем библиотеки
#include <Wire.h>
#include <EEPROM2.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#include <CyberLib.h> //Библиотека от Cyber-Place.ru
volatile uint8_t tic, Dimmer1;
uint8_t data;

LiquidCrystal_I2C lcd(0x27,16,2); //задаём адрес и тип дисплея

// опрос цифровых датчиков температуры 
#define ONE_WIRE_BUS 9  //шина опроса датчиков на пин9
#define RES_TEMP      12    // разрешение (точность) темп. датчика в битах

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire); //создаём объект sensors, подключенный по oneWire
DeviceAddress Thermometer; // адрес устройства

int a1=0;                // обновление экранов
int a2=0;                // обновление экранов
int a3=0;                // Авария закипание котла

float temp1=0;

//заданые температуры
int setTmp1=0;  // температура поддержания теплоносителя
int setTmp3=0;  // температура включения насоса отопления

//булевые переменые
boolean pusk=LOW;                  //Объявим переменную для хранения команды пуск
boolean avaria=LOW;                // объявим переменую для хранения состояния аварии
boolean avaria1=LOW;                // объявим переменую для хранения состояния аварии датчик1
boolean set=LOW;                   // объявим переменую для переключения экранов

// лонг переменые для работы таймеров
unsigned long currentTime;       // текущее время
unsigned long time1;             // обновление экранов

// релейные выходы
#define RELAY0_PIN 2        //Реле подключено к пину D2
boolean relayStatus0=LOW;   //Объявим переменную для хранения состояния реле
#define RELAY1_PIN 3        //Реле подключено к пину D3
boolean relayStatus1=LOW;   //Объявим переменную для хранения состояния реле
#define RELAY2_PIN 4        //Реле подключено к пину D4
boolean relayStatus2=LOW;   //Объявим переменную для хранения состояния реле
#define RELAY3_PIN 5        //Реле подключено к пину D5
boolean relayStatus3=LOW;   //Объявим переменную для хранения состояния реле

//Аналоговая клавиатура подключена к пину A0
#define KEYPAD_PIN A0   
//Определим значения на аналоговом входе для клавиатуры 
#define ButtonUP_LOW 650
#define ButtonUP_HIGH 700
#define ButtonDOWN_LOW 480
#define ButtonDOWN_HIGH 550
#define ButtonLEFT_LOW 800
#define ButtonLEFT_HIGH 850
#define ButtonRIGHT_LOW 750
#define ButtonRIGHT_HIGH 790
#define ButtonSELECT_LOW 0
#define ButtonSELECT_HIGH 50


void setup() 
{
 
//D6_In;   //настраиваем порт на вход для отслеживания прохождения сигнала через ноль  


     // запуск библиотеки датчиков
    sensors.begin();                                 // Start up the library
    sensors.getAddress(Thermometer, 0);                 // получить адрес DS18B20 (0 - 1 датчик)
   // sensors.setResolution(Thermometer, RES_TEMP);     // установить разрешение (точность)
    sensors.setWaitForConversion(false);             // отключить ожидание при изм.темп.
                                                     // время на изм. должно быть > 750ms
                                 // выборка произойдет по прерыванию таймера через 2 сек (первый раз)
 
  //считываем время с момента запуска программы
  currentTime=millis();   
  
  time1=currentTime;
  //time2=currentTime;
    // считаем из память уставки температуры
  setTmp1=EEPROM_read_byte(0);
  setTmp3=EEPROM_read_byte(2);
  
     // считываем из памяти значение болеан
  pusk=EEPROM_read_byte(7);
  
      //Настроим пин для управления реле
  pinMode(RELAY0_PIN,OUTPUT);
  digitalWrite(RELAY0_PIN,LOW);         // насос отопления
  
  pinMode(RELAY1_PIN,OUTPUT);
  digitalWrite(RELAY1_PIN,LOW);         //Тэн1
   pinMode(RELAY2_PIN,OUTPUT);
  digitalWrite(RELAY2_PIN,LOW);         //Тэн2
   pinMode(RELAY3_PIN,OUTPUT);
  digitalWrite(RELAY3_PIN,LOW);         //Тэн3
  
    lcd.init(); 
  lcd.backlight();
  
  //Выведем на дисплей стартовое сообщение на 3 секунды
  
    lcd.setCursor(3, 0);
  lcd.print("Razrabotal");
  lcd.setCursor(3, 1);
  lcd.print("Gorbachev O.N.");
  delay_ms(1000);
  
    lcd.init(); 
  lcd.setCursor(4, 0);
  lcd.print("BALOMUT");
  lcd.setCursor(5, 1);
  lcd.print("V-1.0");
  delay_ms(2000);
  
    // выведем на дисплей заданное значение температуры на 3 секунды
  lcd.init(); 
  lcd.setCursor(0, 0);
  lcd.print("Zad T(v)");
  lcd.setCursor(11,0);
  lcd.print(setTmp1);
  
    lcd.setCursor(0, 1);
  lcd.print("Kotel");
  if(pusk==HIGH){
                 lcd.setCursor(7,1);
                 lcd.print("v rabote");Dimmer1=0;} 
  else{          lcd.setCursor(6,1);
                 lcd.print("ostanovlen");}
  
  delay_ms(500);
  
 

}

   int ReadKey(int keyPin)
{
 int KeyNum=0;
 int KeyValue1=0;
 int KeyValue2=0;
 int KeyValue3=0;
//Читаем в цикле аналоговый вход, для подавления дребезга и нестабильности читаем по два раза подряд, пока значения не будут равны.
//Если значения равны 1023 – значит не была нажата ни  одна клавиша.
 do {
 //delay(20);
 KeyValue1=analogRead(keyPin);
 KeyValue2=analogRead(keyPin);
 
} while (KeyValue1==KeyValue2&&KeyValue2!=1023);

//Интерпретируем полученное значение и определяем код нажатой клавиши
 if (KeyValue2<ButtonUP_HIGH&&KeyValue2>ButtonUP_LOW) {KeyNum=1;}             //Up
 if (KeyValue2<ButtonDOWN_HIGH&&KeyValue2>ButtonDOWN_LOW) {KeyNum=2;}         //Down
 if (KeyValue2<ButtonLEFT_HIGH&&KeyValue2>=ButtonLEFT_LOW) {KeyNum=3;}        //left
 if (KeyValue2<ButtonRIGHT_HIGH&&KeyValue2>ButtonRIGHT_LOW) {KeyNum=4;}       //right
 if (KeyValue2<ButtonSELECT_HIGH&&KeyValue2>ButtonSELECT_LOW) {KeyNum=5;}     //Select

//Возвращаем код нажатой клавиши
return KeyNum;
}

//void halfcycle()  //прерывания таймера
//{ 
 // tic++;  //счетчик  
 // if(Dimmer1 < tic ) D6_High;  //управляем выходом
//}
//void  detect_up()  // обработка внешнего прерывания. Сработает по переднему фронту
//{  
// tic=0;             //обнулить счетчик
// ResumeTimer1();   //запустить таймер
// attachInterrupt(0, detect_down, HIGH);  //перепрограммировать прерывание на другой обработчик
//}  

//void  detect_down()  // обработка внешнего прерывания. Сработает по заднему фронту
//{   
 //StopTimer1(); //остановить таймер
 //D6_Low; //логический ноль на выходы
 //tic=0;       //обнулить счетчик
 //attachInterrupt(0, detect_up, LOW); //перепрограммировать прерывание на другой обработчик
//} 

void menu()
{
  int keyCode=0;
  int k=0;
  lcd.init();
  lcd.setCursor(0,0);lcd.print("Menu  Nastroyki");
  lcd.setCursor(0, 1);lcd.print("Menu  #");
  lcd.setCursor(7, 1);lcd.print(k);
  delay_ms(1000);
  

   do{
   keyCode=ReadKey(KEYPAD_PIN); 
   if(keyCode==1){k++;delay(300);k=min(k,4);lcd.setCursor(7,1);lcd.print(k);} 
   if(keyCode==2){k--;delay(300);k=max(k,0);lcd.setCursor(7,1);lcd.print(k);}
   
   }while(keyCode!=5);
   
   if(k==1){setTemperature();}
  // if(k==2){setTemperature2();}
}

//Редактирование заданой температуры теплоносителя
void setTemperature(){
  
  // выводим на дисплей заданое значение темп.
  lcd.init();  int keyCode=0; int t=70;
  lcd.setCursor(0,0);lcd.print("Zad T(v) teplon.");
  lcd.setCursor(15,1);lcd.print("C");
  lcd.setCursor(12,1);lcd.print(setTmp1);
  delay_ms(100);
  keyCode=0;
   //опрашиваем клавиатуру, прибавить клавиша вверх +1, убавить клавиша вниз -1
 
  do{
    keyCode=ReadKey(KEYPAD_PIN);
   if(keyCode==1){setTmp1++;delay(100);lcd.setCursor(12,1);lcd.print(setTmp1);} 
   if(keyCode==2){setTmp1--;delay(100);lcd.setCursor(12,1);lcd.print(setTmp1);}
   setTmp1=min(setTmp1,92);
   setTmp1=max(setTmp1,40);
     lcd.setCursor(12,1);lcd.print(setTmp1);
   }while(keyCode!=5);
  delay_ms(100);
  // клавиша селект сохраняем в память
  EEPROM_write_byte(0,setTmp1);

 lcd.init();

}
   
 void loop()
{
  Start
 
    currentTime=millis(); 
 // time2=currentTime/3600000;
    
    // опрос клавиатуры
  int Feature=ReadKey(KEYPAD_PIN);
 
  if(Feature==5){;menu();}// переход в меню настройки

   // запуск котла нажать кнопку вверх
 
  if(Feature==1){delay_ms(100);pusk=HIGH; EEPROM_write_byte(7,pusk);} 
 
  // останов котла нажать кнопку вниз

  if(Feature==2&&pusk==HIGH){delay_ms(100);pusk=LOW;EEPROM_write_byte(7,pusk);} 
  
   // получам значение температуру СО.
   sensors.requestTemperatures();                   // Команда на измерение температуры, 
    temp1 = sensors.getTempC(Thermometer);                  
    
   /****** Авария датчика-Температура подачи теплоносителя*****/
   if(temp1 ==(-127)){lcd.init();lcd.setCursor(0,0);lcd.print("Avaria T1");avaria1=HIGH;delay_ms(1000);}
   if(temp1 !=(-127)){avaria1=LOW;}
     
   /****************************************** Отключение тэнов при аварии датчика теплоносителя **************************************/
 if(avaria1==HIGH||avaria==HIGH){Dimmer1=255;}            //выключаем тэны при аварии датчика температуры подачи теплоносителя

 
  //Проверка условия включения/выключения нагревателя
 if (pusk==HIGH&&avaria==LOW) {
   if (temp1 < setTmp1 && relayStatus1 == LOW)
  { relayStatus1 = HIGH; digitalWrite(RELAY1_PIN, HIGH);
    lcd.setCursor(10, 1);
    lcd.print("P= 35%");
    
    
  }
  if (temp1 > setTmp1 && relayStatus1 == HIGH)
  { relayStatus1 = LOW; digitalWrite(RELAY1_PIN, LOW);
    lcd.setCursor(10, 1);
    lcd.print("P=  0%");
    
    
  }
  delay(500);
  if (temp1 + 1 < setTmp1 && relayStatus2 == LOW)
  { relayStatus2 = HIGH; digitalWrite(RELAY2_PIN, HIGH);
    lcd.setCursor(10, 1);
    lcd.print("P= 70%");
    
    
  }
  if (temp1 > setTmp1 && relayStatus2 == HIGH)
  { relayStatus2 = LOW; digitalWrite(RELAY2_PIN, LOW);
    //lcd.begin(10, 2);
  }
  delay(500);
  if (temp1 + 2 < setTmp1 && relayStatus3 == LOW)
  { relayStatus3 = HIGH; digitalWrite(RELAY3_PIN, HIGH);
    lcd.setCursor(10, 1);
    lcd.print("P=100%");
    
    
  }
  if (temp1 > setTmp1 && relayStatus3 == HIGH)
  { relayStatus3 = LOW; digitalWrite(RELAY3_PIN, LOW);
    
  }}
    


// Включение насоса отопления
//блок управления насосом отопления 

               if(temp1>45&&relayStatus0==LOW)
             {relayStatus0=HIGH; digitalWrite(RELAY0_PIN,HIGH);}                    //пуск насоса отопления в режиме термостата
               if(temp1<45&&relayStatus0==HIGH) 
             {relayStatus0=LOW; digitalWrite(RELAY0_PIN,LOW);}


//обработка аварии от размораживания
if(temp1<10){
// выводим на дисплей аварию по низкой температуре воды
lcd.init();
lcd.setCursor(0,0);lcd.print("Avaria zam");
lcd.setCursor(0,1);lcd.print("T(v) <10C");
  delay_ms(500);
 displayBlink1();

}
//обработка аварии от закипания.
if(temp1>=95){
  
// выводим на дисплей аварию по высокой температуре воды
 lcd.init();
 lcd.setCursor(0,0);lcd.print("Avaria");
 lcd.setCursor(0,1);lcd.print("Kotel kipit");
  delay_ms(500);
  avaria=HIGH;

}
// моргание экрана при аварии
if(avaria==HIGH)
{ displayBlink2();}

// Сброс флага Авария

if(temp1<95){ if (temp1<(setTmp1+5)){avaria=LOW;}}

// Визуализация автоматики

  // обновление экранов
  if(currentTime>=(time1+10000)){set=HIGH;time1=currentTime;}
  if(currentTime>=(time1+7000)){set=LOW;}
  
  // вывод значения температуры на экран
  if(set==HIGH){
  if(a1<1){ lcd.init();a1=1;}a2=0;
  lcd.setCursor(0, 0);lcd.print("Kotel");
  if(pusk==HIGH){
  lcd.setCursor(7,0);lcd.print("v rabote");} 
  else{
  lcd.setCursor(6,0);lcd.print("ostanovlen");}
  lcd.setCursor(0, 1); lcd.print(temp1);
  lcd.setCursor(6, 1); lcd.print("C");}
  
  End
}
  void displayBlink1(){for(int i1;i1<5;i1++){
                                    lcd.noDisplay();
                                    delay_ms(1000);
                                    lcd.display();
                                    delay_ms(1000);}}
  void displayBlink2(){for(int i1;i1<5;i1++){
                                    lcd.noDisplay();
                                    delay_ms(500);
                                    lcd.display();
                                    delay_ms(500);}}                                 
 

   

[/code]