контроллер для горелки
- Войдите на сайт для отправки комментариев
Ср, 03/02/2016 - 04:09
Здравствуйте, сделал горелку на отработке, решил прилепить автоматизацию, нашел инфу про ардуино купил мегу, два датчика ds18b20, ик датчик пламени и блок на 4 реле, полистав инет, решил попробовать написать прогу, с этим дело имею впервые... написал скетч, но ничего не работает, при включении питания все лампы на реле загораются и ни на датчик пламени, ни на нагрев датчиков темп не реагирует... может толкнете в нужное русло, что упустил, где почитать...
вот т.н. "скетч"
#include <OneWire.h>
#include <DallasTemperature.h>
//DS18b20
#define ONE_WIRE_BUS 10 // датчики температуры на 10 пине
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress sensor1 = {0x28, 0xFF, 0xE0, 0x9F, 0x83, 0x15, 0x02, 0xC0}; // адреса датчиков
DeviceAddress sensor2 = {0x28, 0xFF, 0x46, 0x9D, 0x83, 0x15, 0x02, 0x68};
// Температура
float temp1 = 0; // текущая температура первого датчика
float temp2 = 0; // второй датчик
//
// настраиваем выводы
#define RELAY_PIN1 22 // выходы на реле
#define RELAY_PIN2 23
#define RELAY_PIN3 24
#define RELAY_PIN4 25
#define IR_PIN 26 // вход датчика ИК пламени
void setup()
{
sensors.begin();
sensors.setResolution(sensor1, 10);
sensors.setResolution(sensor2, 10);
pinMode(IR_PIN, INPUT); // пин ик датчика выход
pinMode(RELAY_PIN1, OUTPUT); // пины реле выходы
pinMode(RELAY_PIN2, OUTPUT);
pinMode(RELAY_PIN3, OUTPUT);
pinMode(RELAY_PIN4, OUTPUT);
}
void loop()
{
sensors.requestTemperatures();
// Температура
temp1 = sensors.getTempC(sensor1); // получаем температуру
temp2 = sensors.getTempC(sensor2);
digitalRead (IR_PIN); // проверка пламени
delay (1000);
if (temp1 >= 34 && temp2 <= 34 && IR_PIN == 0) {
digitalWrite(RELAY_PIN1, HIGH);
digitalWrite(RELAY_PIN2, LOW);
digitalWrite(RELAY_PIN3, LOW);
digitalWrite(RELAY_PIN4, LOW);
} else if (temp1 >= 34 && temp2 <= 34 && IR_PIN == 1){
digitalWrite(RELAY_PIN1, LOW);
digitalWrite(RELAY_PIN2, HIGH);
digitalWrite(RELAY_PIN3, LOW);
digitalWrite(RELAY_PIN4, LOW);
}else if (temp1 >= 34 && temp2 > 34 && IR_PIN == 0){
digitalWrite(RELAY_PIN1, LOW);
digitalWrite(RELAY_PIN2, LOW);
digitalWrite(RELAY_PIN3, HIGH);
digitalWrite(RELAY_PIN4, LOW);
} else if (temp1 >= 34 && temp2 > 34 && IR_PIN == 1){
digitalWrite(RELAY_PIN1, LOW);
digitalWrite(RELAY_PIN2, LOW);
digitalWrite(RELAY_PIN3, LOW);
digitalWrite(RELAY_PIN4, HIGH);
}
else
{ digitalWrite(RELAY_PIN1, LOW);
digitalWrite(RELAY_PIN2, LOW);
digitalWrite(RELAY_PIN3, LOW);
digitalWrite(RELAY_PIN4, LOW);
}
}
#include <OneWire.h> #include <DallasTemperature.h> //DS18b20 #define ONE_WIRE_BUS 10 // датчики температуры на 10 пине OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); DeviceAddress sensor1 = {0x28, 0xFF, 0xE0, 0x9F, 0x83, 0x15, 0x02, 0xC0}; // адреса датчиков DeviceAddress sensor2 = {0x28, 0xFF, 0x46, 0x9D, 0x83, 0x15, 0x02, 0x68}; // Температура float temp1 = 0; // текущая температура первого датчика float temp2 = 0; // второй датчик // int oilMin = 30; // температура масла, для включения int waterMax = 31 ; // t теплоносителя максимальная // настраиваем выводы #define RELAY_PIN1 22 // выходы на реле #define RELAY_PIN2 23 #define RELAY_PIN3 24 #define RELAY_PIN4 25 #define IR_PIN 26 // вход датчика ИК пламени // создаем переменные bool relayStat1 = 0; //переменные состояния реле bool relayStat2 = 0; bool relayStat3 = 0; bool relayStat4 = 0; bool flame = 0; // переменная состояния пламени void setup() { sensors.begin(); sensors.setResolution(sensor1, 10); sensors.setResolution(sensor2, 10); pinMode(IR_PIN, INPUT); // пин ик датчика выход pinMode(RELAY_PIN1, OUTPUT); // пины реле выходы pinMode(RELAY_PIN2, OUTPUT); pinMode(RELAY_PIN3, OUTPUT); pinMode(RELAY_PIN4, OUTPUT); } void loop() { sensors.requestTemperatures(); // Температура temp1 = sensors.getTempC(sensor1); // получаем температуру temp2 = sensors.getTempC(sensor2); digitalRead (IR_PIN); // проверка пламени delay (1000); if (temp1 >= 34 && temp2 <= 34 && IR_PIN == 0) { digitalWrite(RELAY_PIN1, HIGH); digitalWrite(RELAY_PIN2, LOW); digitalWrite(RELAY_PIN3, LOW); digitalWrite(RELAY_PIN4, LOW); } else if (temp1 >= 34 && temp2 <= 34 && IR_PIN == 1){ digitalWrite(RELAY_PIN1, LOW); digitalWrite(RELAY_PIN2, HIGH); digitalWrite(RELAY_PIN3, LOW); digitalWrite(RELAY_PIN4, LOW); }else if (temp1 >= 34 && temp2 > 34 && IR_PIN == 0){ digitalWrite(RELAY_PIN1, LOW); digitalWrite(RELAY_PIN2, LOW); digitalWrite(RELAY_PIN3, HIGH); digitalWrite(RELAY_PIN4, LOW); } else if (temp1 >= 34 && temp2 > 34 && IR_PIN == 1){ digitalWrite(RELAY_PIN1, LOW); digitalWrite(RELAY_PIN2, LOW); digitalWrite(RELAY_PIN3, LOW); digitalWrite(RELAY_PIN4, HIGH); } else { digitalWrite(RELAY_PIN1, LOW); digitalWrite(RELAY_PIN2, LOW); digitalWrite(RELAY_PIN3, LOW); digitalWrite(RELAY_PIN4, LOW); } }заранее благодарен за помощь
Начните с простеньких задач и поэтапно: включить диод, реле, замер пламени. Весь скетч из 5 операторов.
замер пламени делал, там совсем просто, зажигалку зажигал, реле включалось, а вот с температурой засада
#define SENS 26 // пин для сенсора #define RELAYA 22 #define RELAYB 23 #define RELAYC 24 #define RELAYD 25 bool flame = 0; void setup () { pinMode (SENS, INPUT); //сенсор вход pinMode (RELAYA, OUTPUT); // Реле выход pinMode (RELAYB, OUTPUT); pinMode (RELAYC, OUTPUT); pinMode (RELAYD, OUTPUT); } void loop (){ flame = digitalRead (SENS); if (flame == 1){ digitalWrite (RELAYB, 1); flame = 1; } else { digitalWrite (RELAYB, 0); } }По поводу "замера" пламени:
1. Смотрим что пламени нет
2. Поджигаем
3. Смотрим что пламя есть через время зажигания
4. Если пропало- отключаем подачу топлива
в принципе что-то подобное и хотел изобразить
if (temp1 >= 34 && temp2 <= 34 && IR_PIN == 0) { 73 digitalWrite(RELAY_PIN1, HIGH); 74 digitalWrite(RELAY_PIN2, LOW); 75 digitalWrite(RELAY_PIN3, LOW); 76 digitalWrite(RELAY_PIN4, LOW); 77 } else if (temp1 >= 34 && temp2 <= 34 && IR_PIN == 1){ 78 digitalWrite(RELAY_PIN1, LOW); 79 digitalWrite(RELAY_PIN2, HIGH); 80 digitalWrite(RELAY_PIN3, LOW); 81 digitalWrite(RELAY_PIN4, LOW);а в моем скетче вообще все неправильно? мож ткнете в чем ошибка и что прочесть по этой теме.. так то я впервые столкнулся с программированием.. стало интересно свои силы испытать..
Попробуйте 34.0
А при отладке используйте Serial.println(***), для вывода контрольных значений из нужных мест программы. Будете понимать, попадаете куда хотелось или нет + плюс информация к размышлению, "почему".
вставил Serial.println(***), температура отображается с обоих датчиков... Вот еще в чем дело, в одном условии включения реле заменял && на & по идее должно было сработать от ИК датчика, тк одно из условий выполняется, но этого не произошло... Чую какая то заковырка есть, а не понимаю где...
заработало... ввел bool flame = digital read IR_PIN.. и понял где я тупанул, надо в скобках условие было писать не IR_PIN==0, а digital read IR_PIN==0
но это только начало, надо усложнять код под реальные условия, надеюсь с вашей помощью разобраться
digital read IR_PIN==0 , прямо так и написали или все таки digitalRead ( IR_PIN ) == 0 ? Старайтесь даже в сообщениях сохранять синтаксис, автоматизм вырабатывает.
со скобками
Как успехи со скетчем?
У меня такаяже ситуация, горелку сделал, работает отлично, даже есть немного автоматики, стоит фотосенсор на пламя и искровой розжиг срабатывающий при пропадании пламени.
Сейчас взял пару контроллеров и датчики с релюшками. Осваиваю программирование, очень интересен Ваш проект, буду следить.
здравствуйте! подскажите пожалуйсто есть ли уроки по программированию ардуино? совсем нет времени после работы(( а очень нужен скетч на горелку с монитором и энкодером и реле! для чайников как я)))
да тема к сожедению стухла....... сам сейчас этой темой интересуюсь...
Free_men. начни с создания алгоритма и схемы.
есть незаконченный проект (заказчик слился и не заплатил )))))
если интересно можно поковыряться и завершить
7808543@gmail.com
написал...
есть следущие компоненты :
NANO 3.0
датчик пламени - Wavelength 760nm-1100nm LM393 IR
5 обычных кнопок
2(3) ds18b20
дисплей IIC/I2C 2004 blue screen LCD
само паенные платы управления нагрузкой на базе :
цена всего 1200р.. а вот с програмным кодом косяк...
ЭТА ТЕМА ЕЩЁ ИНТЕРЕСНА ?
Спасибо за ответ! а как фото схемы вставить ? в течении недели выложу алгоритм!!! если успею... пытаюсь дом под крышу поставить до холодов... пока работает все в ручном режиме когда я там... когда нет ставою капельницу т.к собраная схема на реле и простеше автоматики сбоит(
Конечно интересна.
Добрый день собрал горелку на форсунке делаван с блоком управления ардуино уно 3 нужна помощь!
У меня тоже есть недобитый код для масляного котла, сейчас с воздушной помпой занимаюсь (безщеточный 12v/ двиг идет с китая)
на данный момент запоминает и выводит на экран 1602 положение масляной заслонки (вентиль к которому прикручен шаговик)
управляет воздушной турбиной pwm 0-255 (на безщеточный двиг)
сигналка если температура в котле выше ...
два датчика температуры (на выходе котла и улица)
в плане
управление водяным насосом в доме: Включает если температура вкотле выше 28
выключает когда потух котел (20гр)
включает импульсно если на улице ниже ноля и в котле ниже 20 (3 мин. крутим 20 минут стоит ) чтоб неразморозить ночью котел когда закончится топить но и чтоб не мутузил холодную воду в дом.
передача данных температур, положения вентиля и турбины на андроид и обратное управление заслонкой и турбиной.
тоисть ручник, никакого управления по температуре! (как показала практика) только привода подачи масла и воздуха.
млть....можно сказать начал с него осваивать арду)))
http://radikal.ru][img]http://s018.radikal.ru/i519/1610/f0/fa40d1c05dd5.jpgсобрал макет.... но случилась печаль +5 на gnd... печаль даже не в том а что я вставил 2 контроллер... отошол.. пришол.... и...... короче нет у меня больше контроллера.... заказал новый.... http://s018.radikal.ru/i519/1610/f0/fa40d1c05dd5.jpg
к стате может кто подскажет что сгореть могло...
Контролер сгорел. Ну кто сырую непровереную программу включает и уходит. Программист наверно удаленно писал, значит некие нюансы не сказал или упустил. Так что сначало макетно программу надо проверять.
Да нет сам накосячил…. Т.к в программировании полный ноль… а денег нет…..то решил программу написать в flprog.. далее взял за пример программы с сайта.. там везде были кнопки подключены к цифровым входам…. Но не получалось не как записать значение в память… дальнейшие поиски привели вот к этой теме … http://flprog.ru/publ/stati/userprojects/kontrol_temperatury_v_servernykh_shkafakh_i_upravlenie_rabotoj_ventiljatorov_so_starogo_sajta/1-1-0-66?la9Pi6 …. там более просто написано программный код и его изменить оказалось проще под мои цели… но при попытки подключения аналоговой кнопки провод GND упал на +5…. Контроллер вырубился…. По матерившись вспомнил что есть запасной…. Поставил его.. залил прошивку… порадовался…. Пошол чай пить…. Пришол и О****БОГИ…. Провода то я не отключил от +5.. ну и по закону везения провод упал ровненько лег опять на гнд…… так что я спалил за час 2 платы нано…….
пока жду новые платы займусь алгоритмом и корпусом... а у кого какие успехи ?
там есть диод защитный, попробуйте перепаять
У меня практически закончен проект, горелка Бабингтон + контроллер на Ардуино. Всё работает уже с прошлой зимы, дорабатываю помаленьку.
Плата Ардуино УНО китай.
4 реле - подогрев масла, маслонасос, подача воздуха, искровое зажигание.
Датчик пламени.
Два температурных датчика Даллас - один на температуру масла, второй на температуру помещения.
Реостат 10кОм, для выбора переменной температуры помещения, от 0 до 30 градусов.
ЖК дисплей 20*4. Отображает текущюю температуру масла и помещения, значение желаемой температуры в помещении, сосотояние 4-х реле, и если произошла то ошибку поджига.
Алгоритм, включается маслонасос \ через паузу включатся подогрев масла если требуется\ через паузу включается воздух и искра\ если произошол поджиг, то отключаем искру\ если поджиг не произошол за 40 секунд, то отключаем всё и пишем на экране об ошибке поджига. Все процессы зависимы от температур.
Скетч позже выложу, нету сейчас под рукой.
да на обоих платах сгорели диоды... СПаСБО!!! замкнул и все ок ) надо искать новые теперь...
лучше впаяйте туда новые, можете спалить порт
не могу найти откуда выпаять ((( на материнке старой нету.. а вблоке петания есть такие ?
можно и обычные, только падение напряжения будет больше, и вместо 5в будет 4,6-4,7
ну я думаю это не особо кретичное подение... нашел на материнской плате старой... но там только буква s стоит .. не т цифр.... вечером попробую..
Здравствуйте! пытался я научиться в среде скетч писать но не получилось(( вернее нет времени пока! если не трудно скинте скетч?)) я скачивал много скетчей но ни один не работает) у меня ардуино уно и мега и нано есть) 4 РЕЛЛЕ энкодер и.т.д
посмотри в сторону программы flprog... это визуальная среда... а у тебя форсунка или шар ?
#include <Wire.h> #include <OneWire.h> #include <LiquidCrystal_I2C.h> #include <EEPROM.h> byte _d18x2x1Addr[8]={0x28, 0xFF, 0xC9, 0x13, 0x4D, 0x4, 0x0, 0x33}; LiquidCrystal_I2C _lcd1(0x27, 20, 4); int _dispTempLength1=0; boolean _isNeedClearDisp1; byte _d18x2x2Addr[8]={0x28, 0xFF, 0x23, 0x2F, 0x4C, 0x4, 0x0, 0xA5}; struct UB_94000232 { bool ubo_231651231 = 0; int ubo_247529162 = 0; bool _FreeLog1_Q1 = 0; int _swi1 = 0; bool _gen1I = 0; bool _gen1O = 0; unsigned long _gen1P = 0UL; bool _tim1I = 0; bool _tim1O = 0; unsigned long _tim1P = 0UL; bool _trgrt1 = 0; bool _trgrt1I = 0; int _swi2 = 0; int _swi3 = 0; }; UB_94000232 UB_94000232_Instance5; UB_94000232 UB_94000232_Instance6; UB_94000232 UB_94000232_Instance7; UB_94000232 UB_94000232_Instance8; UB_94000232 UB_94000232_Instance9; UB_94000232 UB_94000232_Instance2; UB_94000232 UB_94000232_Instance1; UB_94000232 UB_94000232_Instance3; int UB_94000232_ubi_230256467 = 0; bool UB_94000232_ubi_208697949 = 0; bool UB_94000232_ubi_43699656 = 0; bool UB_94000232_ubi_223774358 = 0; int UB_94000232_ubi_30210132 = 0; int UB_94000232_ubi_22283946 = 0; int UB_94000232_ubi_53228606 = 0; OneWire _ow10(10); int _gtv1 = 80; bool _gtv2 = 0; bool _gtv3 = 0; bool _gtv4 = 0; bool _gtv5 = 0; int _gtv6; bool _gtv7 = 0; int _gtv8; bool _gtv9 = 0; int _gtv10 = 110; int _gtv11 = 80; int _gtv12 = 90; int _gtv13 = 50; int _gtv14 = 30; int _gtv15 = 30; int _gtv16 = 5; int _gtv17 = 3; int _gtv18 = 10; int _disp4oldLength = 0; unsigned long _d18x2x1Tti = 0UL; float _d18x2x1O = 0.00; int _disp1oldLength = 0; bool _SEEPR9OSN = 0; int _disp5oldLength = 0; int _disp6oldLength = 0; bool _SEEPR5OSN = 0; int _disp3oldLength = 0; int _disp17oldLength = 0; int _disp12oldLength = 0; int _disp10oldLength = 0; int _disp2oldLength = 0; bool _bounseInputD7S = 0; bool _bounseInputD7O = 0; unsigned long _bounseInputD7P = 0UL; int _disp18oldLength = 0; int _disp16oldLength = 0; bool _trgr1 = 0; bool _trgs1 = 0; bool _SEEPR3OSN = 0; bool _bounseInputD8S = 0; bool _bounseInputD8O = 0; unsigned long _bounseInputD8P = 0UL; bool _SEEPR1OSN = 0; int _disp15oldLength = 0; bool _count1I = 0; int _count1P = 0; bool _trgr2 = 0; int _disp14oldLength = 0; bool _bounseInputD9S = 0; bool _bounseInputD9O = 0; unsigned long _bounseInputD9P = 0UL; bool _SEEPR7OSN = 0; int _disp9oldLength = 0; bool _tim1I = 0; bool _tim1O = 0; unsigned long _tim1P = 0UL; bool _SEEPR8OSN = 0; bool _SEEPR6OSN = 0; int _disp7oldLength = 0; bool _SEEPR2OSN = 0; unsigned long _d18x2x2Tti = 0UL; float _d18x2x2O = 0.00; int _disp11oldLength = 0; int _disp13oldLength = 0; void setup() { Wire.begin(); pinMode(9, INPUT); digitalWrite(9, HIGH); pinMode(8, INPUT); digitalWrite(8, HIGH); pinMode(7, INPUT); digitalWrite(7, HIGH); pinMode(4, OUTPUT); _lcd1.init(); _lcd1.backlight(); _bounseInputD9O = digitalRead(9); _bounseInputD8O = digitalRead(8); _bounseInputD7O = digitalRead(7); } void loop() {if (_isNeedClearDisp1) {_lcd1.clear(); _isNeedClearDisp1= 0;} bool _bounceInputTmpD8 = (digitalRead (8)); if (_bounseInputD8S) { if (millis() >= (_bounseInputD8P + 40)) {_bounseInputD8O= _bounceInputTmpD8; _bounseInputD8S=0;} } else { if (_bounceInputTmpD8 != _bounseInputD8O ) {_bounseInputD8S=1; _bounseInputD8P = millis();} } bool _bounceInputTmpD9 = (digitalRead (9)); if (_bounseInputD9S) { if (millis() >= (_bounseInputD9P + 40)) {_bounseInputD9O= _bounceInputTmpD9; _bounseInputD9S=0;} } else { if (_bounceInputTmpD9 != _bounseInputD9O ) {_bounseInputD9S=1; _bounseInputD9P = millis();} } bool _bounceInputTmpD7 = (digitalRead (7)); if (_bounseInputD7S) { if (millis() >= (_bounseInputD7P + 40)) {_bounseInputD7O= _bounceInputTmpD7; _bounseInputD7S=0;} } else { if (_bounceInputTmpD7 != _bounseInputD7O ) {_bounseInputD7S=1; _bounseInputD7P = millis();} } if(_isTimer(_d18x2x1Tti, 1000)) { _d18x2x1Tti = millis(); _d18x2x1O= _readDS18_ow10(_d18x2x1Addr, 0);} if(_isTimer(_d18x2x2Tti, 1000)) { _d18x2x2Tti = millis(); _d18x2x2O= _readDS18_ow10(_d18x2x2Addr, 0);} _gtv6 = (_d18x2x1O); _gtv1 = (_d18x2x2O); _gtv2 = !(_bounseInputD9O); _gtv3 = !(_bounseInputD7O); _gtv5 = ( (analogRead (0))) < (700); _gtv4 = !(_bounseInputD8O); if(_gtv4) _trgs1 = 1; if(_gtv9) _trgs1 = 0; if (( (_trgs1) ^ (( (_gtv2) || (_gtv3) || (_gtv4) )) )) { if (_tim1I) { if (_isTimer(_tim1P, 5000)) {_tim1O = 1;}} else {_tim1I =1; _tim1P = millis();}} else {_tim1O = 0; _tim1I = 0;} if (_gtv4) { if (! _count1I) { _count1P = _count1P+1; _count1I = 1; } } else { _count1I=0; } if (( (_gtv7) || (_gtv9) )) _count1P = 0; _gtv9 = _tim1O; _gtv8 = _count1P; _gtv7 = _count1P >= 10; UB_94000232_ubi_230256467 = _gtv10; UB_94000232_ubi_208697949 = (_gtv8) == (1); UB_94000232_ubi_43699656 = _gtv2; UB_94000232_ubi_223774358 = _gtv3; UB_94000232_ubi_30210132 = 80; UB_94000232_ubi_22283946 = 120; UB_94000232_ubi_53228606 = 1; UB_94000232_Instance5 = _func_UB_94000232(UB_94000232_Instance5, UB_94000232_ubi_230256467, UB_94000232_ubi_208697949, UB_94000232_ubi_43699656, UB_94000232_ubi_223774358, UB_94000232_ubi_30210132, UB_94000232_ubi_22283946, UB_94000232_ubi_53228606); if(UB_94000232_Instance5.ubo_231651231){ if(!_SEEPR5OSN){ EEPROMWriteInt(0, UB_94000232_Instance5.ubo_247529162); _SEEPR5OSN=1;} }else{ if(_SEEPR5OSN){_SEEPR5OSN=0;}} _gtv10 = (EEPROMReadInt(0)); UB_94000232_ubi_230256467 = _gtv11; UB_94000232_ubi_208697949 = (_gtv8) == (2); UB_94000232_ubi_43699656 = _gtv2; UB_94000232_ubi_223774358 = _gtv3; UB_94000232_ubi_30210132 = 50; UB_94000232_ubi_22283946 = 120; UB_94000232_ubi_53228606 = 1; UB_94000232_Instance6 = _func_UB_94000232(UB_94000232_Instance6, UB_94000232_ubi_230256467, UB_94000232_ubi_208697949, UB_94000232_ubi_43699656, UB_94000232_ubi_223774358, UB_94000232_ubi_30210132, UB_94000232_ubi_22283946, UB_94000232_ubi_53228606); if(UB_94000232_Instance6.ubo_231651231){ if(!_SEEPR6OSN){ EEPROMWriteInt(2, UB_94000232_Instance6.ubo_247529162); _SEEPR6OSN=1;} }else{ if(_SEEPR6OSN){_SEEPR6OSN=0;}} _gtv11 = (EEPROMReadInt(2)); UB_94000232_ubi_230256467 = _gtv12; UB_94000232_ubi_208697949 = (_gtv8) == (3); UB_94000232_ubi_43699656 = _gtv2; UB_94000232_ubi_223774358 = _gtv3; UB_94000232_ubi_30210132 = 50; UB_94000232_ubi_22283946 = 92; UB_94000232_ubi_53228606 = 1; UB_94000232_Instance7 = _func_UB_94000232(UB_94000232_Instance7, UB_94000232_ubi_230256467, UB_94000232_ubi_208697949, UB_94000232_ubi_43699656, UB_94000232_ubi_223774358, UB_94000232_ubi_30210132, UB_94000232_ubi_22283946, UB_94000232_ubi_53228606); if(UB_94000232_Instance7.ubo_231651231){ if(!_SEEPR7OSN){ EEPROMWriteInt(4, UB_94000232_Instance7.ubo_247529162); _SEEPR7OSN=1;} }else{ if(_SEEPR7OSN){_SEEPR7OSN=0;}} _gtv12 = (EEPROMReadInt(4)); UB_94000232_ubi_230256467 = _gtv13; UB_94000232_ubi_208697949 = (_gtv8) == (4); UB_94000232_ubi_43699656 = _gtv2; UB_94000232_ubi_223774358 = _gtv3; UB_94000232_ubi_30210132 = 50; UB_94000232_ubi_22283946 = 90; UB_94000232_ubi_53228606 = 1; UB_94000232_Instance8 = _func_UB_94000232(UB_94000232_Instance8, UB_94000232_ubi_230256467, UB_94000232_ubi_208697949, UB_94000232_ubi_43699656, UB_94000232_ubi_223774358, UB_94000232_ubi_30210132, UB_94000232_ubi_22283946, UB_94000232_ubi_53228606); if(UB_94000232_Instance8.ubo_231651231){ if(!_SEEPR8OSN){ EEPROMWriteInt(6, UB_94000232_Instance8.ubo_247529162); _SEEPR8OSN=1;} }else{ if(_SEEPR8OSN){_SEEPR8OSN=0;}} _gtv13 = (EEPROMReadInt(6)); UB_94000232_ubi_230256467 = _gtv14; UB_94000232_ubi_208697949 = (_gtv8) == (5); UB_94000232_ubi_43699656 = _gtv2; UB_94000232_ubi_223774358 = _gtv3; UB_94000232_ubi_30210132 = 0; UB_94000232_ubi_22283946 = 360; UB_94000232_ubi_53228606 = 5; UB_94000232_Instance9 = _func_UB_94000232(UB_94000232_Instance9, UB_94000232_ubi_230256467, UB_94000232_ubi_208697949, UB_94000232_ubi_43699656, UB_94000232_ubi_223774358, UB_94000232_ubi_30210132, UB_94000232_ubi_22283946, UB_94000232_ubi_53228606); if(UB_94000232_Instance9.ubo_231651231){ if(!_SEEPR9OSN){ EEPROMWriteInt(8, UB_94000232_Instance9.ubo_247529162); _SEEPR9OSN=1;} }else{ if(_SEEPR9OSN){_SEEPR9OSN=0;}} _gtv14 = (EEPROMReadInt(8)); UB_94000232_ubi_230256467 = _gtv15; UB_94000232_ubi_208697949 = (_gtv8) == (6); UB_94000232_ubi_43699656 = _gtv2; UB_94000232_ubi_223774358 = _gtv3; UB_94000232_ubi_30210132 = 0; UB_94000232_ubi_22283946 = 360; UB_94000232_ubi_53228606 = 5; UB_94000232_Instance2 = _func_UB_94000232(UB_94000232_Instance2, UB_94000232_ubi_230256467, UB_94000232_ubi_208697949, UB_94000232_ubi_43699656, UB_94000232_ubi_223774358, UB_94000232_ubi_30210132, UB_94000232_ubi_22283946, UB_94000232_ubi_53228606); if(UB_94000232_Instance2.ubo_231651231){ if(!_SEEPR2OSN){ EEPROMWriteInt(10, UB_94000232_Instance2.ubo_247529162); _SEEPR2OSN=1;} }else{ if(_SEEPR2OSN){_SEEPR2OSN=0;}} _gtv15 = (EEPROMReadInt(10)); UB_94000232_ubi_230256467 = _gtv16; UB_94000232_ubi_208697949 = (_gtv8) == (7); UB_94000232_ubi_43699656 = _gtv2; UB_94000232_ubi_223774358 = _gtv3; UB_94000232_ubi_30210132 = 0; UB_94000232_ubi_22283946 = 30; UB_94000232_ubi_53228606 = 1; UB_94000232_Instance1 = _func_UB_94000232(UB_94000232_Instance1, UB_94000232_ubi_230256467, UB_94000232_ubi_208697949, UB_94000232_ubi_43699656, UB_94000232_ubi_223774358, UB_94000232_ubi_30210132, UB_94000232_ubi_22283946, UB_94000232_ubi_53228606); if(UB_94000232_Instance1.ubo_231651231){ if(!_SEEPR1OSN){ EEPROMWriteInt(12, UB_94000232_Instance1.ubo_247529162); _SEEPR1OSN=1;} }else{ if(_SEEPR1OSN){_SEEPR1OSN=0;}} _gtv16 = (EEPROMReadInt(12)); UB_94000232_ubi_230256467 = _gtv17; UB_94000232_ubi_208697949 = (_gtv8) == (8); UB_94000232_ubi_43699656 = _gtv2; UB_94000232_ubi_223774358 = _gtv3; UB_94000232_ubi_30210132 = 0; UB_94000232_ubi_22283946 = 9; UB_94000232_ubi_53228606 = 1; UB_94000232_Instance3 = _func_UB_94000232(UB_94000232_Instance3, UB_94000232_ubi_230256467, UB_94000232_ubi_208697949, UB_94000232_ubi_43699656, UB_94000232_ubi_223774358, UB_94000232_ubi_30210132, UB_94000232_ubi_22283946, UB_94000232_ubi_53228606); if(UB_94000232_Instance3.ubo_231651231){ if(!_SEEPR3OSN){ EEPROMWriteInt(14, UB_94000232_Instance3.ubo_247529162); _SEEPR3OSN=1;} }else{ if(_SEEPR3OSN){_SEEPR3OSN=0;}} _gtv17 = (EEPROMReadInt(14)); if ((_gtv8) == (0)) { _dispTempLength1 = ((((String("t.m")) + ((String(_gtv6, DEC))) + (String("c ")) + (String("t.k")) + ((String(_gtv1, DEC))) + (String("c"))))).length(); if (_disp9oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp9oldLength = _dispTempLength1; _lcd1.setCursor(int((20 - _dispTempLength1)/2), 0); _lcd1.print((((String("t.m")) + ((String(_gtv6, DEC))) + (String("c ")) + (String("t.k")) + ((String(_gtv1, DEC))) + (String("c"))))); } else { if (_disp9oldLength > 0) {_isNeedClearDisp1 = 1; _disp9oldLength = 0;} } if ((_gtv8) == (1)) { _dispTempLength1 = (String("max.t.masla")).length(); if (_disp10oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp10oldLength = _dispTempLength1; _lcd1.setCursor(int((20 - _dispTempLength1)/2), 0); _lcd1.print(String("max.t.masla")); } else { if (_disp10oldLength > 0) {_isNeedClearDisp1 = 1; _disp10oldLength = 0;} } if ((_gtv8) == (1)) { _dispTempLength1 = (((((String(_gtv10, DEC))) + (String(" t."))))).length(); if (_disp11oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp11oldLength = _dispTempLength1; _lcd1.setCursor(int((20 - _dispTempLength1)/2), 1); _lcd1.print(((((String(_gtv10, DEC))) + (String(" t."))))); } else { if (_disp11oldLength > 0) {_isNeedClearDisp1 = 1; _disp11oldLength = 0;} } if ((_gtv8) == (2)) { _dispTempLength1 = (String("min. t. masla")).length(); if (_disp12oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp12oldLength = _dispTempLength1; _lcd1.setCursor(int((20 - _dispTempLength1)/2), 0); _lcd1.print(String("min. t. masla")); } else { if (_disp12oldLength > 0) {_isNeedClearDisp1 = 1; _disp12oldLength = 0;} } if ((_gtv8) == (2)) { _dispTempLength1 = (((((String(_gtv11, DEC))) + (String(" t."))))).length(); if (_disp13oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp13oldLength = _dispTempLength1; _lcd1.setCursor(int((20 - _dispTempLength1)/2), 1); _lcd1.print(((((String(_gtv11, DEC))) + (String(" t."))))); } else { if (_disp13oldLength > 0) {_isNeedClearDisp1 = 1; _disp13oldLength = 0;} } if ((_gtv8) == (3)) { _dispTempLength1 = (String("max. t.kotla")).length(); if (_disp14oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp14oldLength = _dispTempLength1; _lcd1.setCursor(int((20 - _dispTempLength1)/2), 0); _lcd1.print(String("max. t.kotla")); } else { if (_disp14oldLength > 0) {_isNeedClearDisp1 = 1; _disp14oldLength = 0;} } if ((_gtv8) == (3)) { _dispTempLength1 = (((((String(_gtv12, DEC))) + (String(" t."))))).length(); if (_disp15oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp15oldLength = _dispTempLength1; _lcd1.setCursor(int((20 - _dispTempLength1)/2), 1); _lcd1.print(((((String(_gtv12, DEC))) + (String(" t."))))); } else { if (_disp15oldLength > 0) {_isNeedClearDisp1 = 1; _disp15oldLength = 0;} } if ((_gtv8) == (4)) { _dispTempLength1 = (String("min. t.kotla")).length(); if (_disp16oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp16oldLength = _dispTempLength1; _lcd1.setCursor(int((20 - _dispTempLength1)/2), 0); _lcd1.print(String("min. t.kotla")); } else { if (_disp16oldLength > 0) {_isNeedClearDisp1 = 1; _disp16oldLength = 0;} } if ((_gtv8) == (4)) { _dispTempLength1 = (((((String(_gtv13, DEC))) + (String(" t."))))).length(); if (_disp17oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp17oldLength = _dispTempLength1; _lcd1.setCursor(int((20 - _dispTempLength1)/2), 1); _lcd1.print(((((String(_gtv13, DEC))) + (String(" t."))))); } else { if (_disp17oldLength > 0) {_isNeedClearDisp1 = 1; _disp17oldLength = 0;} } if ((_gtv8) == (5)) { _dispTempLength1 = (String("start produvki")).length(); if (_disp18oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp18oldLength = _dispTempLength1; _lcd1.setCursor(int((20 - _dispTempLength1)/2), 0); _lcd1.print(String("start produvki")); } else { if (_disp18oldLength > 0) {_isNeedClearDisp1 = 1; _disp18oldLength = 0;} } if ((_gtv8) == (5)) { _dispTempLength1 = (((((String(_gtv14, DEC))) + (String(" sek."))))).length(); if (_disp4oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp4oldLength = _dispTempLength1; _lcd1.setCursor(int((20 - _dispTempLength1)/2), 1); _lcd1.print(((((String(_gtv14, DEC))) + (String(" sek."))))); } else { if (_disp4oldLength > 0) {_isNeedClearDisp1 = 1; _disp4oldLength = 0;} } if ((_gtv8) == (6)) { _dispTempLength1 = (String("stop produvki")).length(); if (_disp3oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp3oldLength = _dispTempLength1; _lcd1.setCursor(int((20 - _dispTempLength1)/2), 0); _lcd1.print(String("stop produvki")); } else { if (_disp3oldLength > 0) {_isNeedClearDisp1 = 1; _disp3oldLength = 0;} } if ((_gtv8) == (6)) { _dispTempLength1 = (((((String(_gtv15, DEC))) + (String(" sek."))))).length(); if (_disp1oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp1oldLength = _dispTempLength1; _lcd1.setCursor(int((20 - _dispTempLength1)/2), 1); _lcd1.print(((((String(_gtv15, DEC))) + (String(" sek."))))); } else { if (_disp1oldLength > 0) {_isNeedClearDisp1 = 1; _disp1oldLength = 0;} } if ((_gtv8) == (7)) { _dispTempLength1 = (String("vrem9 podhiga")).length(); if (_disp2oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp2oldLength = _dispTempLength1; _lcd1.setCursor(int((20 - _dispTempLength1)/2), 0); _lcd1.print(String("vrem9 podhiga")); } else { if (_disp2oldLength > 0) {_isNeedClearDisp1 = 1; _disp2oldLength = 0;} } if ((_gtv8) == (7)) { _dispTempLength1 = (((((String(_gtv16, DEC))) + (String(" sek."))))).length(); if (_disp5oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp5oldLength = _dispTempLength1; _lcd1.setCursor(int((20 - _dispTempLength1)/2), 1); _lcd1.print(((((String(_gtv16, DEC))) + (String(" sek."))))); } else { if (_disp5oldLength > 0) {_isNeedClearDisp1 = 1; _disp5oldLength = 0;} } if ((_gtv8) == (8)) { _dispTempLength1 = (String("kol. popitok")).length(); if (_disp6oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp6oldLength = _dispTempLength1; _lcd1.setCursor(int((20 - _dispTempLength1)/2), 0); _lcd1.print(String("kol. popitok")); } else { if (_disp6oldLength > 0) {_isNeedClearDisp1 = 1; _disp6oldLength = 0;} } if ((_gtv8) == (8)) { _dispTempLength1 = (((((String(_gtv17, DEC))) + (String("."))))).length(); if (_disp7oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp7oldLength = _dispTempLength1; _lcd1.setCursor(int((20 - _dispTempLength1)/2), 1); _lcd1.print(((((String(_gtv17, DEC))) + (String("."))))); } else { if (_disp7oldLength > 0) {_isNeedClearDisp1 = 1; _disp7oldLength = 0;} } if(((_gtv6)*(_gtv18)) < (((EEPROMReadInt(4)))*(_gtv18))) _trgr1 = 0; if(((_gtv6)*(_gtv18)) > (((EEPROMReadInt(2)))*(_gtv18))) _trgr1 = 1; if(((_gtv1)*(_gtv18)) < (((EEPROMReadInt(4)))*(_gtv18))) _trgr2 = 0; if(((_gtv1)*(_gtv18)) > (((EEPROMReadInt(6)))*(_gtv18))) _trgr2 = 1; digitalWrite(4, !(_trgr1)); } bool _isTimer(unsigned long startTime, unsigned long period ) { unsigned long currentTime; currentTime = millis(); if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));} } float _convertDS18x2xData(byte type_s, byte data[12]) { int16_t raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60); if (cfg == 0x00) raw = raw & ~7; else if (cfg == 0x20) raw = raw & ~3; else if (cfg == 0x40) raw = raw & ~1; } return (float)raw / 16.0; } float _readDS18_ow10(byte addr[8], byte type_s) { byte data[12]; byte i; _ow10.reset(); _ow10.select(addr); _ow10.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = _ow10.read();} _ow10.reset(); _ow10.select(addr); _ow10.write(0x44, 1); return _convertDS18x2xData(type_s, data);}int EEPROMReadInt(int p_address) { byte lowByte = EEPROM.read(p_address); byte highByte = EEPROM.read(p_address + 1); return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00); } void EEPROMWriteInt(int p_address, int p_value) { byte lowByte = ((p_value >> 0) & 0xFF); byte highByte = ((p_value >> 8) & 0xFF); EEPROM.write(p_address, lowByte); EEPROM.write(p_address + 1, highByte); } bool _checkFreeLogicBlockOutput(bool inArray[], int inArraySize, bool stArray[], int stArraySize) { int inIndex = 0; bool result = 1; for (int i = 0; i < stArraySize; i = i + 1) { if (!(inArray[inIndex] == stArray[i])) { result = 0;} inIndex ++; if (inIndex == inArraySize) { if (result) { return 1;} else {result = 1;} inIndex = 0; } } return 0; } struct UB_94000232 _func_UB_94000232(struct UB_94000232 _ubInstans, int ubi_230256467, bool ubi_208697949, bool ubi_43699656, bool ubi_223774358, int ubi_30210132, int ubi_22283946, int ubi_53228606) { bool ubo_231651231 = _ubInstans.ubo_231651231; int ubo_247529162 = _ubInstans.ubo_247529162; bool _FreeLog1_Q1 = _ubInstans._FreeLog1_Q1; int _swi1 = _ubInstans._swi1; bool _gen1I = _ubInstans._gen1I; bool _gen1O = _ubInstans._gen1O; unsigned long _gen1P = _ubInstans._gen1P; bool _tim1I = _ubInstans._tim1I; bool _tim1O = _ubInstans._tim1O; unsigned long _tim1P = _ubInstans._tim1P; bool _trgrt1 = _ubInstans._trgrt1; bool _trgrt1I = _ubInstans._trgrt1I; int _swi2 = _ubInstans._swi2; int _swi3 = _ubInstans._swi3; bool _FreeLog1_IArr[2]; bool _FreeLog1_Q1_StArr[] = {0, 1}; if(((ubi_230256467)+(ubi_53228606)) > (ubi_22283946)) {_swi1=ubi_30210132;} else {_swi1=(ubi_230256467)+(ubi_53228606);} if (( (ubi_208697949) && (( (ubi_43699656) || (ubi_223774358) )) )) { if (! _gen1I) { _gen1I = 1; _gen1O = 1; _gen1P = millis(); } } else { _gen1I = 0 ; _gen1O= 0;} if (_gen1I) { if ( _isTimer ( _gen1P , 150 )) { _gen1P = millis(); _gen1O = ! _gen1O;}} if (_gen1O) { if (_tim1I) { if (_isTimer(_tim1P, 30)) {_tim1O = 1;}} else {_tim1I =1; _tim1P = millis();}} else {_tim1O = 0; _tim1I = 0;} if (_tim1O) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; if(_FreeLog1_Q1) {_swi2=_swi3;} else {_swi2=_swi1;} if(((ubi_230256467)-(ubi_53228606)) < (ubi_30210132)) {_swi3=ubi_22283946;} else {_swi3=(ubi_230256467)-(ubi_53228606);} _FreeLog1_IArr[0] = ubi_43699656; _FreeLog1_IArr[1] = ubi_223774358; _FreeLog1_Q1 = _checkFreeLogicBlockOutput(_FreeLog1_IArr, 2, _FreeLog1_Q1_StArr, 2); ubo_247529162 = _swi2; ubo_231651231 = _trgrt1; _ubInstans.ubo_231651231 = ubo_231651231; _ubInstans.ubo_247529162 = ubo_247529162; _ubInstans._FreeLog1_Q1 = _FreeLog1_Q1; _ubInstans._swi1 = _swi1; _ubInstans._gen1I = _gen1I; _ubInstans._gen1O = _gen1O; _ubInstans._gen1P = _gen1P; _ubInstans._tim1I = _tim1I; _ubInstans._tim1O = _tim1O; _ubInstans._tim1P = _tim1P; _ubInstans._trgrt1 = _trgrt1; _ubInstans._trgrt1I = _trgrt1I; _ubInstans._swi2 = _swi2; _ubInstans._swi3 = _swi3; return _ubInstans; }ну пока что вот это... 3 кнопки все записываеться в энерго независимую память.... меню работает на отлично.... пока что работает толко нагрев масла!!! на больше пока мозна не хватает залейте пробуйте )
У меня практически закончен проект, горелка Бабингтон + контроллер на Ардуино. Всё работает уже с прошлой зимы, дорабатываю помаленьку.
Плата Ардуино УНО китай.
4 реле - подогрев масла, маслонасос, подача воздуха, искровое зажигание.
Датчик пламени.
Два температурных датчика Даллас - один на температуру масла, второй на температуру помещения.
Реостат 10кОм, для выбора переменной температуры помещения, от 0 до 30 градусов.
ЖК дисплей 20*4. Отображает текущюю температуру масла и помещения, значение желаемой температуры в помещении, сосотояние 4-х реле, и если произошла то ошибку поджига.
Алгоритм, включается маслонасос \ через паузу включатся подогрев масла если требуется\ через паузу включается воздух и искра\ если произошол поджиг, то отключаем искру\ если поджиг не произошол за 40 секунд, то отключаем всё и пишем на экране об ошибке поджига. Все процессы зависимы от температур.
Скетч позже выложу, нету сейчас под рукой.
выложите, если может свою программу?
Дождались ?
Всем привет, кто сталкивался, датчики Даллас, пока идёт нагрев масла температура отображается корректно. При переходе в режим горения температура масла и воды становятся -127, (периодически проскакивает верная температура). Отключал и двигатель и воздух, все те же -127. Причем если отключаю оба реле и имитирую присутствие пламени температура нормально видна. Только подключаю реле, сразу -127 даже с отключенными потребителями. Реле использую твердотельные. Пробовал подкидывать другие релюшки не помогло.
И какова реальная температура кипящего масла?
Оно не закипает градусов до 90 нагревалось только, подачу масла обрывает термопредохранитель на трубе подачи, в паузе все температуры нормально показывают
вы вероятно используете паганую библиотеку DallasTemperature.
в ней написано -
#define DEVICE_DISCONNECTED_C -127
думаю разберётесь что это означает.
а причина - или корявая схема или корявая сборка или то и другое....
допустим, корявая сборка, но тогда почему не выдает ошибки на других режимах, только в режиме работы?
в режиме нагрева масла или в режиме паузы температуры показывает корректно, все контакты вроде в норме.
А есть ли альтернатива этой поганой библиотеке?
А есть ли альтернатива этой поганой библиотеке?
конечно. Альтернатива - написать самому, примеров в инете полно. Вот, прямо из вчерашнего, в разделе для чайников...
http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/miganiya-led-bez-delay#comment-501833
Только обязательно проверять CRC при чтении
допустим, корявая сборка, но тогда почему не выдает ошибки на других режимах, только в режиме работы?
в режиме нагрева масла или в режиме паузы температуры показывает корректно, все контакты вроде в норме.
раз при каких то условиях отваливается получение данных с датчика. значит где то что то не в норме.
Я думал, что реле дают помехи, но вроде твердотельные, без катушек, может ли это быть из-за того,что все питается от компьютерного БП, в том числе исполнительные механизмы
кто может поделится с скечам для полетнои горелки на Arduine Uno