Модуль управления электрическми котлом Proterm Scat

Thorn
Offline
Зарегистрирован: 07.11.2014

Доброго времени форумчане и форумчанки. Достался по случаю котел Протерм Скат 14 кВт, с наглухо сгоревшей платой управления, котлу пару лет почти новый :) Даже и желания невозникло чегото чинить так как есть ардуино и реле. Вобщем реши модернизировать сильно. Для начала полностью изучил схемку управления имеющимися элементами (тэнами, контактором, термостатом и датчиком давления. Реле используемые для коммутации тэнов (всего 6 шт по 2,2кВт но оставил тольк отри так как уже ток потребления более 30А и это грустно:(. )

отапливать будет мастерскую в 24кв.м, пеноблок. Радиаторы и обвязка уже готовы порядка 36 секций должно хватить. Да и котёл уже в строю чего греха таить но работает пока чисто на чесном слове, реле высокотоковые (родные по 20А которые с коммутацие тока) неиспользовал, тупо включаю контактор для вкл\откл тэнов и контроль от ds18b20 температуры). Контактором управляет обычное 5ти вольтове реле всеми любимое). Так вот хочется плючеш и надёжности. Для начала накидал на 8266 плате вебинтерфейс с установкой параметров:

вкл\отключения помпы (первой скорости для выбега и прогона теплоносителя)

вкл\откл второй сокрости помпы для более быстрого перемешивания в момент нагрева тэнами

температура отключения тэнов

температура включения тэнов

время выбега насоса на второй скорости после отключения тэнов.

В планах добавит ds3231 и на них таймер чтобы греть по ночам или когда надо заранее и пнемного кривоватый веб-интерфейс допилить, сейчас вкл\выкл некоторых параметров сделал на 1 и 0 а надо бы кнопочками :)

Что неработает:

задержка мжду включениями тэнов и это важно, коммутируются сразу все тоесть сами понимаете какая нехилая искра на контакторе пробегает при 30А (при 60 молчу ну да мне и ненадо на 1-ой фазе столько).

Прошу помочь с этой бедой а заодно может и чего упростить\объединить как всегда.

Скетч прилагаю, из него выкинул всё чт окасалось WEB-сервера чтобы непутать, когда получистя все выложу как обычно в ветке - может кому и сгодится хотя такой г-код навренео врядли :(



#include <EEPROM.h>                  //Подключаем библиотеку для работы с энергонезависимой памятью
#include <OneWire.h>                 //Подключаем библиотеку для температурного датчика DS18B20

//=====Termo_Sensor ds18b20*
int tempPin=13 ;                     //Определяем порт шины OneWire (IC) для температурного датчика DS18B20
OneWire ds(tempPin);                //Создаем объект для работы с термометром
unsigned long flagDallRead=0;
byte data[12];
byte addr[2][8]={{0x28,0xFF,0x9C,0x20,0x54,0x14,0x01,0xC2},{0x28,0xFF,0xF2,0x0E,0xC2,0x16,0x03,0xC0}};
float temp[2];                      //Температура подачи \ обратки

//=====Delays*
unsigned long prvMlsTemp=0;           //Предыдущее показание Обработки температур
unsigned long prvMlspompx2Off=0;      //Предыдущее показание обновления увеличенной скорости помпы х2
unsigned long prvMlsPowerTOn=0;       //Предыдущее показание обновления последовательного включения реле Тэнов
unsigned long prvMlsPowerTOff=0;      //Предыдущее показание обновления последовательного вЫключения реле Тэнов
unsigned long prvMlsThiSp=0;          //Период для отправки на ThingSpeak.com 
unsigned long prvMlsNarMo=0;          //Период для отправки на NarodMon.ru 

//unsigned long zadM[4];                //Массив для задержек меню
const long zadTime[] = {100, 500, 750, 1000, 2000, 3000, 5000, 10000, 60000, 300000};

//=====Relay*
#define relay1 5 // D2              //Тэн-1 2,2кВт
#define relay2 4 // D2              //Тэн-2 4,6кВт
#define relay3 14 // D2             //Тэн-3 6,8кВт
#define relay4 12 // D2             //Насос 2-скорость
#define relay5 16 // D2             //Насос 1-скорость

byte power;                         //Мощность включенных одновременно Тэнов
byte powerT;                        //Количество включенных одновременно Тэнов
byte relayTen;                      //Включение\отключение работы Тэнов
String relayTenState="OFF";         //Состояние реле Тэнов
byte recycling;                     //Отключение Тэнов и периодическое включение работы помпы
String recyclingStat="OFF";         //Флаг необходимсоти включения РЕЦИРКУЛЯЦИИ, 0-Off, 1-On
String pompOnStat="OFF";            //Флаг необходимсоти включения помпы, ВКЛЮЧЕНИЕ котла
String pompx2State="OFF";            //Флаг необходимсоти включения помпы x2 увеличенная скорость

byte pompOn;                        //Переменная ВКЛЮЧЕНИЯ работы помпы
byte pompOff;                       //Переменная ВКЛЮЧЕНИЯ работы помпы
byte pompx2On;                      //Переменная ВКЛЮЧЕНИЯ работы помпы (увеличенный режим вращения) х2
byte pompx2Off;                     //Переменная ВыКЛЮЧЕНИЯ работы помпы (увеличенный режим вращения) х2
byte heatOn;                        //Параметр температуры для ВКЛЮЧЕНИЯ Тэнов и скорости помпы х2
byte heatOff;                       //Параметр температуры для ВыКЛЮЧЕНИЯ Тэнов и скорости помпы х1

bool pwrOn1=true;                   //Разомкнуто для низкоуровнего реле при включении микроконтроллера
bool pwrOn2=true;
bool pwrOn3=true;
bool pwrOn4=true;
bool pwrOn5=true;

String relay1State="OFF";           //Флаг состояние низкоуровнего реле при включении микроконтроллера
String relay2State="OFF";
String relay3State="OFF";
String relay4State="OFF";
String relay5State="OFF";

/*
  if (webMessage == ""){
  EEPROM.begin(512);              //Начало работы с EEPROM модуля esp8266
  EEPROM.write(11, heatOn);       //Запись значения температуры теплоносителя на ВКЛЮЧЕНИЕ работы Тэнов
  EEPROM.write(12, heatOff);      //Запись значения температуры теплоносителя на ВыКЛЮЧЕНИЕ работы Тэнов
  EEPROM.write(21, pompOn);       //Запись значения на ВКЛЮЧЕНИЕ/ВыКЛЮЧЕНИЕ помпы, "0"-Выкл
  EEPROM.write(22, pompx2Off);    //Запись значения МИНУТ на ВыКЛЮЧЕНИЕ х2 скорости помпы при достижении heatOff, "0"-Выкл
  EEPROM.write(31, recycling);    //Запись значения на ВКЛЮЧЕНИЕ/ВыКЛЮЧЕНИЕ режима РЕЦИРКУЛЯЦИИ, "0"-Выкл
  EEPROM.write(41, powerT);       //Запись значенивключенных Тэнов 0 -0.0kWt, 1 -2.2kWt, 2 -4.4kWt, 3 -6.6kW
  EEPROM.commit();                //Окончание работы после записи с EPROM модуля esp8266
}
 */

void setup(void){
  Serial.begin(115200);             //Serial connection from ESP-01 via 3.3v console cable
  EEPROM.begin(512);                //Начало работы с EEPROM модуля esp8266
  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
  pinMode(relay3, OUTPUT);
  pinMode(relay4, OUTPUT);
  pinMode(relay5, OUTPUT);
  digitalWrite(relay1,pwrOn1);      //При включении микроконтроллера низкоуровневое реле разомкнуто
  digitalWrite(relay2,pwrOn2);
  digitalWrite(relay3,pwrOn3);
  digitalWrite(relay4,pwrOn4);
  digitalWrite(relay5,pwrOn5);
   razrDall(0x60);                                    //Установка разрядности ds18b20, 0x60 12 -бит, 0x00 -9бит разрешение    
  controlPomp();
  controlPompx2();
  controlTemp();
    delay(50);
}

//=========== Функция изменения разрядности Даллас
void razrDall(byte raz){
 ds.reset();                                         //Cброс шины
 ds.select(addr[2]);                                 //выставить адрес
 ds.write(0x4E);                                     //разрешение записать конфиг
 ds.write(0x7F);                                     //Th контроль температуры макс 128грд
 ds.write(0xFF);                                     //Tl контроль температуры мин -128грд
 ds.write(0x60);                                     //0x60 12-бит разрешение, 0x00 -9бит разрешение
}

//=========== Считывание и Обработка температур
void tempDallas(unsigned long interval){
  static unsigned long prevTime=0;
  if (millis()-prevTime>interval){                         //Проверка заданного интервала
  static boolean flagDall=0;                               //Признак операции
  prevTime=millis();
  flagDall=!flagDall;                                      //Инверсия признака
  if (flagDall){
    ds.reset();
    ds.write(0xCC);                                        //Обращение ко всем датчикам
    ds.write(0x44);                                        //Команда на конвертацию
    flagDallRead=1;                                        //Время возврата в секундах
      }else{
  byte i;
    for (i=0; i<2; i++){                                   //Перебор количества датчиков
    ds.reset();
    ds.select(addr[i]);
    ds.write(0xBE);                                        //Считывание значения с датчика
    float celsius=(short)(ds.read()|(ds.read()<<8))/16.0;  //Принимаем два байта температуры
     temp[i]= (float) celsius;
     flagDallRead = 2; //Время возврата в секундах
     }
   }
  }
}

//=========== Обработка включения\отключения  Помпы 
void controlPomp(){
  EEPROM.begin(512);              //Начало работы с EEPROM модуля esp8266
  pompOn=EEPROM.read(21);
  if (pompOn==1) {pompOnStat="ON"; digitalWrite(relay5, LOW); relay5State = "ON";}         //Turn the relay switch Off or On depending on the temperature reading
    else if (pompOn==0) {pompOnStat="OFF"; digitalWrite(relay5, HIGH); relay5State = "OFF";}
}
//=========== Обработка включения Тэнов
void controlPower(){
  EEPROM.begin(512);              //Начало работы с EEPROM модуля esp8266
  powerT=EEPROM.read(41);
  if (powerT==0) {relayTenState="OFF";
    digitalWrite(relay1, HIGH); digitalWrite(relay2,HIGH); digitalWrite(relay3,HIGH);digitalWrite(relay4,HIGH);
    relay1State="OFF"; relay2State="OFF";relay3State="OFF";relay4State="OFF";}  //Turn the relay switch Off or On depending on the temperature reading
//=========== Обработка включения Тэна 1
  if (powerT==1 && relayTenState=="ON") {digitalWrite(relay1,LOW);relay1State="ON";
    digitalWrite(relay2,HIGH);relay2State="OFF"; digitalWrite(relay3,HIGH);relay3State="OFF";}  //Turn the relay switch Off or On depending on the temperature reading
  if (powerT==1 && relayTenState=="OFF") {digitalWrite(relay1,HIGH);relay1State = "OFF";
    digitalWrite(relay2,HIGH);relay2State="OFF"; digitalWrite(relay3,HIGH);relay3State="OFF";}
//=========== Обработка включения Тэна 2
  if (powerT==2 && relayTenState=="ON") {digitalWrite(relay1,LOW);relay1State="ON";
    if (millis()-prvMlsPowerTOn>3000){ 
      prvMlsPowerTOn=millis();  
    digitalWrite(relay2,LOW); relay2State="ON";} prvMlsPowerTOn=0; digitalWrite(relay3,HIGH);relay3State="OFF";}  //Turn the relay switch Off or On depending on the temperature reading
  if (powerT==2 && relayTenState=="OFF") {digitalWrite(relay1,HIGH);relay1State="OFF"; 
    if (millis()-prvMlsPowerTOff>3000){ 
    prvMlsPowerTOff=millis();  
    digitalWrite(relay2,HIGH);relay2State="OFF";} digitalWrite(relay3,HIGH);relay3State="OFF";}
//=========== Обработка включения Тэна 3
  if (powerT==3 && relayTenState=="ON") {digitalWrite(relay1,LOW);relay1State="ON";
    digitalWrite(relay2,LOW);relay2State="ON"; digitalWrite(relay3,LOW);relay3State="ON";}  //Turn the relay switch Off or On depending on the temperature reading
  if (powerT==3 && relayTenState=="OFF") {digitalWrite(relay1,HIGH);relay1State="OFF";
    digitalWrite(relay2,HIGH);relay2State="OFF"; digitalWrite(relay3,HIGH);relay3State="OFF";}
}
//=========== Обработка термо реле
void controlTemp(){
  EEPROM.begin(512);            //Начало работы с EEPROM модуля esp8266
  heatOn=EEPROM.read(11);
  heatOff=EEPROM.read(12);
  if (pompOn==1){
  if (temp[1] <= heatOn) {controlPower();relayTenState="ON";prvMlsPowerTOn=0;}    //Turn the relay switch Off or On depending on the temperature reading
  if (temp[1] >= heatOff) {controlPower();relayTenState="OFF";prvMlsPowerTOff=0;}
  if (((temp[1]-1) <= heatOn) && powerT>0) {controlPower();pompx2State="ON";}      //Если температура Теплоносителя больше на 1 град чем температура включения Тэнов
  }
  if (pompOn==0) {controlPower();relayTenState="OFF"; digitalWrite(relay4,HIGH);relay4State="OFF";} 
}
//=========== Обработка включения\отключения увеличенной скорости Помпы х2
void controlPompx2(){
  EEPROM.begin(512);
  pompx2Off=EEPROM.read(22);
      if  (pompx2State=="ON") {digitalWrite(relay4,LOW); relay4State="ON";}
      if  (pompx2State=="ON" && relayTenState=="OFF"){prvMlspompx2Off=millis(); pompx2State="OFF";}
    if  (pompx2State=="OFF"){
    if (millis()-prvMlspompx2Off>(pompx2Off*1000)){ 
    prvMlspompx2Off=millis();      
  digitalWrite(relay4, HIGH); relay4State = "OFF";}
  }
}

void loop(){
  tempDallas(flagDallRead*1000);
    controlPomp();
    controlPompx2();
    controlTemp();
  if (millis()-prvMlsTemp>zadTime[3]){                        //Проверяем интервал для обновления показаний в Serial
    prvMlsTemp=millis();
    Serial.print("Temp0: ");
    Serial.println(temp[0]);                                  //Температура обратки
    Serial.print("Temp1: ");
    Serial.println(temp[1]);                                  //Температура подачи
    Serial.println("***");
    Serial.print("hotOn: ");
    Serial.println(EEPROM.read(11));                          //Значение температуры для включения Тэнов
    Serial.print("hotOff: ");
    Serial.println(EEPROM.read(12));                          //Значение температуры для вЫключения Тэнов                             
    Serial.print("pompOn: ");
    Serial.println(EEPROM.read(21));                          //Флаг Включение помпы низка скорость (1-вкл), (0-вЫкл)
    Serial.print("pompx2On: ");
    Serial.println(EEPROM.read(22));                          //Флаг Включение помпы высокая скорость (1-вкл), (0-вЫкл)                         
//    Serial.print("recycling: ");
//    Serial.println(EEPROM.read(31));
    Serial.print("power: ");                                  
    Serial.println(EEPROM.read(41));                          //Количество одновременно включенных тэнов
    Serial.println("***");
    Serial.print("Relay1: ");                                 
    Serial.println(relay1State);                              //Состояние реле Тэна-1 2,2кВт
    Serial.print("Relay2: ");
    Serial.println(relay2State);                              //Состояние реле Тэна-2 2,2кВт
    Serial.print("Relay3: ");
    Serial.println(relay3State);                              //Состояние реле Тэна-3 2,2кВт
    Serial.print("Relay4: ");
    Serial.println(relay4State);                              //Состояние реле помпы высокая скорость
    Serial.print("Relay5: ");
    Serial.println(relay5State);                              //Состояние реле помпы низкая скорость
    Serial.println("***");
    Serial.print("RelayTenState: ");
    Serial.println(relayTenState);                            //Состояние необходимости включения тэнов
    Serial.print("Pompx2State: ");
    Serial.println(pompx2State);                              //Состояние необходимости включения высокой скорости помпы
    Serial.println("***");
  }
}

 

Thorn
Offline
Зарегистрирован: 07.11.2014

Счас очень нравится что можно просматривать параметры температур и количество включенных тэнов и режим работы через тот самый https://thingspeak.com и вообще все делать с телефончика потмоу и дисплей пока невключал для самого котла и кнопки (по правде дисплей будет i2c а вот для кнопки ридтся поискать пин свободный. Фотк итого что сейчас в работе:

и

и скрин вебинтерфейса и настроек

Два года, точнее два лета ушло на стройку и вобщем на все работы внтури и снаружи, понимаю дорого будет но выхода пока нет, газ этой зимой точно несмогу ни газ даже в баллонах (тоже дорого) ни котёл раздобыть - всё в финансы, сейчас на голом энтузиазме.

Thorn
Offline
Зарегистрирован: 07.11.2014

Чегойто скетчик и невставилсо, сюда приложу:

#include <EEPROM.h>                  //Подключаем библиотеку для работы с энергонезависимой памятью
#include <OneWire.h>                 //Подключаем библиотеку для температурного датчика DS18B20

//=====Termo_Sensor ds18b20*
int tempPin=13 ;                     //Определяем порт шины OneWire (IC) для температурного датчика DS18B20
OneWire ds(tempPin);                //Создаем объект для работы с термометром
unsigned long flagDallRead=0;
byte data[12];
byte addr[2][8]={{0x28,0xFF,0x9C,0x20,0x54,0x14,0x01,0xC2},{0x28,0xFF,0xF2,0x0E,0xC2,0x16,0x03,0xC0}};
float temp[2];                      //Температура подачи \ обратки

//=====Delays*
unsigned long prvMlsTemp=0;           //Предыдущее показание Обработки температур
unsigned long prvMlspompx2Off=0;      //Предыдущее показание обновления увеличенной скорости помпы х2
unsigned long prvMlsPowerTOn=0;       //Предыдущее показание обновления последовательного включения реле Тэнов
unsigned long prvMlsPowerTOff=0;      //Предыдущее показание обновления последовательного вЫключения реле Тэнов
unsigned long prvMlsThiSp=0;          //Период для отправки на ThingSpeak.com 
unsigned long prvMlsNarMo=0;          //Период для отправки на NarodMon.ru 

//unsigned long zadM[4];                //Массив для задержек меню
const long zadTime[] = {100, 500, 750, 1000, 2000, 3000, 5000, 10000, 60000, 300000};

//=====Relay*
#define relay1 5 // D2              //Тэн-1 2,2кВт
#define relay2 4 // D2              //Тэн-2 4,6кВт
#define relay3 14 // D2             //Тэн-3 6,8кВт
#define relay4 12 // D2             //Насос 2-скорость
#define relay5 16 // D2             //Насос 1-скорость

byte power;                         //Мощность включенных одновременно Тэнов
byte powerT;                        //Количество включенных одновременно Тэнов
byte relayTen;                      //Включение\отключение работы Тэнов
String relayTenState="OFF";         //Состояние реле Тэнов
byte recycling;                     //Отключение Тэнов и периодическое включение работы помпы
String recyclingStat="OFF";         //Флаг необходимсоти включения РЕЦИРКУЛЯЦИИ, 0-Off, 1-On
String pompOnStat="OFF";            //Флаг необходимсоти включения помпы, ВКЛЮЧЕНИЕ котла
String pompx2State="OFF";            //Флаг необходимсоти включения помпы x2 увеличенная скорость

byte pompOn;                        //Переменная ВКЛЮЧЕНИЯ работы помпы
byte pompOff;                       //Переменная ВКЛЮЧЕНИЯ работы помпы
byte pompx2On;                      //Переменная ВКЛЮЧЕНИЯ работы помпы (увеличенный режим вращения) х2
byte pompx2Off;                     //Переменная ВыКЛЮЧЕНИЯ работы помпы (увеличенный режим вращения) х2
byte heatOn;                        //Параметр температуры для ВКЛЮЧЕНИЯ Тэнов и скорости помпы х2
byte heatOff;                       //Параметр температуры для ВыКЛЮЧЕНИЯ Тэнов и скорости помпы х1

bool pwrOn1=true;                   //Разомкнуто для низкоуровнего реле при включении микроконтроллера
bool pwrOn2=true;
bool pwrOn3=true;
bool pwrOn4=true;
bool pwrOn5=true;

String relay1State="OFF";           //Флаг состояние низкоуровнего реле при включении микроконтроллера
String relay2State="OFF";
String relay3State="OFF";
String relay4State="OFF";
String relay5State="OFF";

/*
  if (webMessage == ""){
  EEPROM.begin(512);              //Начало работы с EEPROM модуля esp8266
  EEPROM.write(11, heatOn);       //Запись значения температуры теплоносителя на ВКЛЮЧЕНИЕ работы Тэнов
  EEPROM.write(12, heatOff);      //Запись значения температуры теплоносителя на ВыКЛЮЧЕНИЕ работы Тэнов
  EEPROM.write(21, pompOn);       //Запись значения на ВКЛЮЧЕНИЕ/ВыКЛЮЧЕНИЕ помпы, "0"-Выкл
  EEPROM.write(22, pompx2Off);    //Запись значения МИНУТ на ВыКЛЮЧЕНИЕ х2 скорости помпы при достижении heatOff, "0"-Выкл
  EEPROM.write(31, recycling);    //Запись значения на ВКЛЮЧЕНИЕ/ВыКЛЮЧЕНИЕ режима РЕЦИРКУЛЯЦИИ, "0"-Выкл
  EEPROM.write(41, powerT);       //Запись значенивключенных Тэнов 0 -0.0kWt, 1 -2.2kWt, 2 -4.4kWt, 3 -6.6kW
  EEPROM.commit();                //Окончание работы после записи с EPROM модуля esp8266
}
 */

void setup(void){
  Serial.begin(115200);             //Serial connection from ESP-01 via 3.3v console cable
  EEPROM.begin(512);                //Начало работы с EEPROM модуля esp8266
  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
  pinMode(relay3, OUTPUT);
  pinMode(relay4, OUTPUT);
  pinMode(relay5, OUTPUT);
  digitalWrite(relay1,pwrOn1);      //При включении микроконтроллера низкоуровневое реле разомкнуто
  digitalWrite(relay2,pwrOn2);
  digitalWrite(relay3,pwrOn3);
  digitalWrite(relay4,pwrOn4);
  digitalWrite(relay5,pwrOn5);
   razrDall(0x60);                                    //Установка разрядности ds18b20, 0x60 12 -бит, 0x00 -9бит разрешение    
  controlPomp();
  controlPompx2();
  controlTemp();
    delay(50);
}

//=========== Функция изменения разрядности Даллас
void razrDall(byte raz){
 ds.reset();                                         //Cброс шины
 ds.select(addr[2]);                                 //выставить адрес
 ds.write(0x4E);                                     //разрешение записать конфиг
 ds.write(0x7F);                                     //Th контроль температуры макс 128грд
 ds.write(0xFF);                                     //Tl контроль температуры мин -128грд
 ds.write(0x60);                                     //0x60 12-бит разрешение, 0x00 -9бит разрешение
}

//=========== Считывание и Обработка температур
void tempDallas(unsigned long interval){
  static unsigned long prevTime=0;
  if (millis()-prevTime>interval){                         //Проверка заданного интервала
  static boolean flagDall=0;                               //Признак операции
  prevTime=millis();
  flagDall=!flagDall;                                      //Инверсия признака
  if (flagDall){
    ds.reset();
    ds.write(0xCC);                                        //Обращение ко всем датчикам
    ds.write(0x44);                                        //Команда на конвертацию
    flagDallRead=1;                                        //Время возврата в секундах
      }else{
  byte i;
    for (i=0; i<2; i++){                                   //Перебор количества датчиков
    ds.reset();
    ds.select(addr[i]);
    ds.write(0xBE);                                        //Считывание значения с датчика
    float celsius=(short)(ds.read()|(ds.read()<<8))/16.0;  //Принимаем два байта температуры
     temp[i]= (float) celsius;
     flagDallRead = 2; //Время возврата в секундах
     }
   }
  }
}

//=========== Обработка включения\отключения  Помпы 
void controlPomp(){
  EEPROM.begin(512);              //Начало работы с EEPROM модуля esp8266
  pompOn=EEPROM.read(21);
  if (pompOn==1) {pompOnStat="ON"; digitalWrite(relay5, LOW); relay5State = "ON";}         //Turn the relay switch Off or On depending on the temperature reading
    else if (pompOn==0) {pompOnStat="OFF"; digitalWrite(relay5, HIGH); relay5State = "OFF";}
}
//=========== Обработка включения Тэнов
void controlPower(){
  EEPROM.begin(512);              //Начало работы с EEPROM модуля esp8266
  powerT=EEPROM.read(41);
  if (powerT==0) {relayTenState="OFF";
    digitalWrite(relay1, HIGH); digitalWrite(relay2,HIGH); digitalWrite(relay3,HIGH);digitalWrite(relay4,HIGH);
    relay1State="OFF"; relay2State="OFF";relay3State="OFF";relay4State="OFF";}  //Turn the relay switch Off or On depending on the temperature reading
//=========== Обработка включения Тэна 1
  if (powerT==1 && relayTenState=="ON") {digitalWrite(relay1,LOW);relay1State="ON";
    digitalWrite(relay2,HIGH);relay2State="OFF"; digitalWrite(relay3,HIGH);relay3State="OFF";}  //Turn the relay switch Off or On depending on the temperature reading
  if (powerT==1 && relayTenState=="OFF") {digitalWrite(relay1,HIGH);relay1State = "OFF";
    digitalWrite(relay2,HIGH);relay2State="OFF"; digitalWrite(relay3,HIGH);relay3State="OFF";}
//=========== Обработка включения Тэна 2
  if (powerT==2 && relayTenState=="ON") {digitalWrite(relay1,LOW);relay1State="ON";
    if (millis()-prvMlsPowerTOn>3000){ 
      prvMlsPowerTOn=millis();  
    digitalWrite(relay2,LOW); relay2State="ON";} prvMlsPowerTOn=0; digitalWrite(relay3,HIGH);relay3State="OFF";}  //Turn the relay switch Off or On depending on the temperature reading
  if (powerT==2 && relayTenState=="OFF") {digitalWrite(relay1,HIGH);relay1State="OFF"; 
    if (millis()-prvMlsPowerTOff>3000){ 
    prvMlsPowerTOff=millis();  
    digitalWrite(relay2,HIGH);relay2State="OFF";} digitalWrite(relay3,HIGH);relay3State="OFF";}
//=========== Обработка включения Тэна 3
  if (powerT==3 && relayTenState=="ON") {digitalWrite(relay1,LOW);relay1State="ON";
    digitalWrite(relay2,LOW);relay2State="ON"; digitalWrite(relay3,LOW);relay3State="ON";}  //Turn the relay switch Off or On depending on the temperature reading
  if (powerT==3 && relayTenState=="OFF") {digitalWrite(relay1,HIGH);relay1State="OFF";
    digitalWrite(relay2,HIGH);relay2State="OFF"; digitalWrite(relay3,HIGH);relay3State="OFF";}
}
//=========== Обработка термо реле
void controlTemp(){
  EEPROM.begin(512);            //Начало работы с EEPROM модуля esp8266
  heatOn=EEPROM.read(11);
  heatOff=EEPROM.read(12);
  if (pompOn==1){
  if (temp[1] <= heatOn) {controlPower();relayTenState="ON";prvMlsPowerTOn=0;}    //Turn the relay switch Off or On depending on the temperature reading
  if (temp[1] >= heatOff) {controlPower();relayTenState="OFF";prvMlsPowerTOff=0;}
  if (((temp[1]-1) <= heatOn) && powerT>0) {controlPower();pompx2State="ON";}      //Если температура Теплоносителя больше на 1 град чем температура включения Тэнов
  }
  if (pompOn==0) {controlPower();relayTenState="OFF"; digitalWrite(relay4,HIGH);relay4State="OFF";} 
}
//=========== Обработка включения\отключения увеличенной скорости Помпы х2
void controlPompx2(){
  EEPROM.begin(512);
  pompx2Off=EEPROM.read(22);
      if  (pompx2State=="ON") {digitalWrite(relay4,LOW); relay4State="ON";}
      if  (pompx2State=="ON" && relayTenState=="OFF"){prvMlspompx2Off=millis(); pompx2State="OFF";}
    if  (pompx2State=="OFF"){
    if (millis()-prvMlspompx2Off>(pompx2Off*1000)){ 
    prvMlspompx2Off=millis();      
  digitalWrite(relay4, HIGH); relay4State = "OFF";}
  }
}

void loop(){
  tempDallas(flagDallRead*1000);
    controlPomp();
    controlPompx2();
    controlTemp();
  if (millis()-prvMlsTemp>zadTime[3]){                        //Проверяем интервал для обновления показаний в Serial
    prvMlsTemp=millis();
    Serial.print("Temp0: ");
    Serial.println(temp[0]);                                  //Температура обратки
    Serial.print("Temp1: ");
    Serial.println(temp[1]);                                  //Температура подачи
    Serial.println("***");
    Serial.print("hotOn: ");
    Serial.println(EEPROM.read(11));                          //Значение температуры для включения Тэнов
    Serial.print("hotOff: ");
    Serial.println(EEPROM.read(12));                          //Значение температуры для вЫключения Тэнов                             
    Serial.print("pompOn: ");
    Serial.println(EEPROM.read(21));                          //Флаг Включение помпы низка скорость (1-вкл), (0-вЫкл)
    Serial.print("pompx2On: ");
    Serial.println(EEPROM.read(22));                          //Флаг Включение помпы высокая скорость (1-вкл), (0-вЫкл)                         
//    Serial.print("recycling: ");
//    Serial.println(EEPROM.read(31));
    Serial.print("power: ");                                  
    Serial.println(EEPROM.read(41));                          //Количество одновременно включенных тэнов
    Serial.println("***");
    Serial.print("Relay1: ");                                 
    Serial.println(relay1State);                              //Состояние реле Тэна-1 2,2кВт
    Serial.print("Relay2: ");
    Serial.println(relay2State);                              //Состояние реле Тэна-2 2,2кВт
    Serial.print("Relay3: ");
    Serial.println(relay3State);                              //Состояние реле Тэна-3 2,2кВт
    Serial.print("Relay4: ");
    Serial.println(relay4State);                              //Состояние реле помпы высокая скорость
    Serial.print("Relay5: ");
    Serial.println(relay5State);                              //Состояние реле помпы низкая скорость
    Serial.println("***");
    Serial.print("RelayTenState: ");
    Serial.println(relayTenState);                            //Состояние необходимости включения тэнов
    Serial.print("Pompx2State: ");
    Serial.println(pompx2State);                              //Состояние необходимости включения высокой скорости помпы
    Serial.println("***");
  }
}

 

он есчо у еня весь такой отладочный но рабочий и ниразу небыло разрыва :) ниединого. Выручайте, первым делом нужно задать механизм последовательного включения реле тэнов, к примеру задано два тэна, сначала включаем реле_1 далее пауза (время которое я тоже включу в вебинтерфейс чтобы его можно было тоже менять, хотя надоли..) дале реле_2 и также выключение. Если три тэна заданы, то реле_1 - пауза - реле_2 - пауза и реле_3

Я кое как осилил подобное для отключения второй скорости помпы после отключения тэнов, тоетсь когда греет котел скорость высокая, далее отключение тэнов - пауза - отключение второй скорости. Так же и на ключение, за 1 гарудс до необходимой температуры включения тэнов включается вторая скорость помпы.

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

для такого тока не реле, а пускатель нада. 3-й величины с запасом, но можно и 2-й.

Thorn
Offline
Зарегистрирован: 07.11.2014

Счас пускатель\контактор и стоит ESB-24-40 - НО его задача по моему разумению была РАЗМЫКАТЬ цепь при аварийном превышении температуры в контуре подачи. А Тэновыми контактами у меня управляют релюшки HF115F-Q 24вольтовое с током коммутации 20А - что в ДВА раза превышает ток самого тэна. так что тут я немного спокоен, мнебы помочь споочерёжным включением как я сделал дляпоследовательного отключения повышенной скорости после отключения тэнов в строке 177-178 скетчика. не могу понять как применить ремя имерения интервала и как его потом обнулить. ПРобовал строки 146-154 заменить на примерное так:

//=========== Обработка включения Тэна 2
  if (powerT==2 && relayTenState == "ON") {digitalWrite(relay1,LOW);relay1State="ON";
    if (millis()-prvMlsPowerTOn>2000){ 
    prvMlsPowerTOn=millis();  
    digitalWrite(relay2,LOW); relay2State="ON";} digitalWrite(relay3,HIGH);relay3State="OFF";}  //Turn the relay switch Off or On depending on the temperature reading
  if (powerT==2 && relayTenState == "OFF") {digitalWrite(relay1,HIGH);relay1State="OFF"; 
//    if (millis()-prvMlsPowerTOn>1000){ 
//    prvMlsPowerTOn=millis();  
    digitalWrite(relay2,HIGH);relay2State="OFF"; digitalWrite(relay3,HIGH);relay3State="OFF";}

 

где

if (millis()-prvMlsPowerTOn>2000)

время в ве сек до включения второго после первого реле, его я буду задавать в вебнастройках поэтому параметр пока неприсваивал, однако работает до первого переключения потом ВСЕ разом начинают вкл\выкл

Yurik_krr
Offline
Зарегистрирован: 20.10.2017

Прочитайте тут про задержки. http://alxarduino.blogspot.com/2013/08/delay.html

Но тут дело не в задержке условия неправильно построено.
В этой теме есть ответы http://arduino.ru/forum/programmirovanie/tft-24-touch-shield-nuzhna-pomo...

Yurik_krr
Offline
Зарегистрирован: 20.10.2017

Оно и будет вкл. И вык. До тех пор пока relayTenState==on
У вас какое то интересное условие. Вы не меняете статус
(relayTenState') зато меняете статусы релюшек но ни где эти статусы не проверяются.

Thorn
Offline
Зарегистрирован: 07.11.2014

Ага спасибо за учасл=стие статус самого главного параметра relayTenState нужно изменять два раза всего, когда нужно включить тэны (один или все неважно) и когда нужно выключить тэны опятьже, все или один неважно, это ОБЩИЙ флаг для вкл\откл нагрева потому я его и неменяю нигде кроме как когда помпа вЫключена или температура подачи\обратки выше - relayTenState=OFF и ниже (нужно включить нар=грев relayTenState=ON

Yurik_krr
Offline
Зарегистрирован: 20.10.2017

Но ведь вы включаете реле напрямую без участия флага.
командой digitalWrite(relay1,High), может надо digitalWrite
(relay1, relay1State)

Thorn
Offline
Зарегистрирован: 07.11.2014

Хм, думаю стоит продумать эту логику. А с milis что подскажите? Как его приаттачить, говорю же попробовать как только включилось relay1State сравнить с prvMlsPowerTOn=ON и если оно больше двух секунд то включить relay2State=ON и все работает ОДИН раз, после relayTenState = OFF

они СНОВА ОДНОВРЕМЕННО ВКЛЮЧАЮТСЯ\ОТКЛЮЧАЮТСЯ.

Yurik_krr
Offline
Зарегистрирован: 20.10.2017

Условие с millis() включает у вас второе реле
через 2 секунды, а переключаютя все время
Скорей всего все три реле. Правильно ?

Thorn
Offline
Зарегистрирован: 07.11.2014

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

Yurik_krr
Offline
Зарегистрирован: 20.10.2017

А может они не включаются и выключаются а трещат ? Ведь при каждом прохождении loop()
На них подается сигнал.
И еще А если убрать millis все нормально работает ?