Официальный сайт компании Arduino по адресу arduino.cc
Модуль управления электрическми котлом Proterm Scat
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Доброго времени форумчане и форумчанки. Достался по случаю котел Протерм Скат 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("***"); } }
Счас очень нравится что можно просматривать параметры температур и количество включенных тэнов и режим работы через тот самый https://thingspeak.com и вообще все делать с телефончика потмоу и дисплей пока невключал для самого котла и кнопки (по правде дисплей будет i2c а вот для кнопки ридтся поискать пин свободный. Фотк итого что сейчас в работе:
и скрин вебинтерфейса и настроек
Два года, точнее два лета ушло на стройку и вобщем на все работы внтури и снаружи, понимаю дорого будет но выхода пока нет, газ этой зимой точно несмогу ни газ даже в баллонах (тоже дорого) ни котёл раздобыть - всё в финансы, сейчас на голом энтузиазме.
Чегойто скетчик и невставилсо, сюда приложу:
он есчо у еня весь такой отладочный но рабочий и ниразу небыло разрыва :) ниединого. Выручайте, первым делом нужно задать механизм последовательного включения реле тэнов, к примеру задано два тэна, сначала включаем реле_1 далее пауза (время которое я тоже включу в вебинтерфейс чтобы его можно было тоже менять, хотя надоли..) дале реле_2 и также выключение. Если три тэна заданы, то реле_1 - пауза - реле_2 - пауза и реле_3
Я кое как осилил подобное для отключения второй скорости помпы после отключения тэнов, тоетсь когда греет котел скорость высокая, далее отключение тэнов - пауза - отключение второй скорости. Так же и на ключение, за 1 гарудс до необходимой температуры включения тэнов включается вторая скорость помпы.
для такого тока не реле, а пускатель нада. 3-й величины с запасом, но можно и 2-й.
Счас пускатель\контактор и стоит ESB-24-40 - НО его задача по моему разумению была РАЗМЫКАТЬ цепь при аварийном превышении температуры в контуре подачи. А Тэновыми контактами у меня управляют релюшки HF115F-Q 24вольтовое с током коммутации 20А - что в ДВА раза превышает ток самого тэна. так что тут я немного спокоен, мнебы помочь споочерёжным включением как я сделал дляпоследовательного отключения повышенной скорости после отключения тэнов в строке 177-178 скетчика. не могу понять как применить ремя имерения интервала и как его потом обнулить. ПРобовал строки 146-154 заменить на примерное так:
где
время в ве сек до включения второго после первого реле, его я буду задавать в вебнастройках поэтому параметр пока неприсваивал, однако работает до первого переключения потом ВСЕ разом начинают вкл\выкл
Прочитайте тут про задержки. http://alxarduino.blogspot.com/2013/08/delay.html
Но тут дело не в задержке условия неправильно построено.
В этой теме есть ответы http://arduino.ru/forum/programmirovanie/tft-24-touch-shield-nuzhna-pomo...
Оно и будет вкл. И вык. До тех пор пока relayTenState==on
У вас какое то интересное условие. Вы не меняете статус
(relayTenState') зато меняете статусы релюшек но ни где эти статусы не проверяются.
Ага спасибо за учасл=стие статус самого главного параметра relayTenState нужно изменять два раза всего, когда нужно включить тэны (один или все неважно) и когда нужно выключить тэны опятьже, все или один неважно, это ОБЩИЙ флаг для вкл\откл нагрева потому я его и неменяю нигде кроме как когда помпа вЫключена или температура подачи\обратки выше - relayTenState=OFF и ниже (нужно включить нар=грев relayTenState=ON
Но ведь вы включаете реле напрямую без участия флага.
командой digitalWrite(relay1,High), может надо digitalWrite
(relay1, relay1State)
Хм, думаю стоит продумать эту логику. А с milis что подскажите? Как его приаттачить, говорю же попробовать как только включилось relay1State сравнить с
prvMlsPowerTOn=ON
и если оно больше двух секунд то включить relay2State=ON и все работает ОДИН раз, послеrelayTenState =
OFF
они СНОВА ОДНОВРЕМЕННО ВКЛЮЧАЮТСЯ\ОТКЛЮЧАЮТСЯ.
Условие с millis() включает у вас второе реле
через 2 секунды, а переключаютя все время
Скорей всего все три реле. Правильно ?
тут зависит от того сколько их выбрано, будем считать что все три, так проще логику понять и потом применить к каждому свое время включения по порядку.
А может они не включаются и выключаются а трещат ? Ведь при каждом прохождении loop()
На них подается сигнал.
И еще А если убрать millis все нормально работает ?