Управление поддувалом котла отопления.
- Войдите на сайт для отправки комментариев
Пнд, 09/01/2017 - 16:18
Здравствуйте!
Собрал скетч и все вроде нечего но есть косяк! серва дребезжит, сделал так чтобы серва включалась в определенные интервалы температуры, но хотелось бы избавится от дребезга совсем.
Спасибо заранее!
#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Servo.h>
OneWire oneWire(15);
DallasTemperature ds(&oneWire);
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
Servo serv;
int alarm = 12; // подача сигнализации перегрева
int motor = 3; // управление насосом
int Tnight = 60; // по умолчанию температура закрытия заслонки ночь
int Tday = 80; // по умолчанию температура закрытия заслонки ночь
int TzadN = 50; // по умолчанию температура включения насоса
int TzadA = 100; // по умолчанию температура включения сигнализации
int list;//
byte E; // для вывода ошибки датчика температуры
int Tzad; // для переключения между день и ночь
int mode=0; // переключение листов select key 1
DeviceAddress sensor1 = {0x28, 0xEE, 0x41, 0x3E, 0x16, 0x16, 0x01, 0xDE};
byte key(){ //// для кнопок ЛСДшилда
int val = analogRead(0);
if (val < 50) return 5;
else if (val < 150) return 3;
else if (val < 350) return 4;
else if (val < 500) return 2;
else if (val < 800) return 1;
else return 0;
}
////
void tit(int titul) {
if (titul == 0) {
lcd.setCursor(0, 0); lcd.print("NIGHT ");
lcd.setCursor(12,0); lcd.print(" DAY");
lcd.setCursor(0,1); lcd.print(" ");
lcd.setCursor(3,1); lcd.print("C ");
lcd.setCursor(1,1); lcd.print(Tnight);
lcd.setCursor(3,1); lcd.print("C");
lcd.setCursor(13,1); lcd.print(Tday);
lcd.setCursor(15,1); lcd.print("C");
lcd.setCursor(6, 1); lcd.print(ds.getTempC(sensor1));
lcd.setCursor(10,1); lcd.print("C ");
}
}
void naklon(){ // наклон от температуры
serv.attach(12);
if (Tzad < ds.getTempC(sensor1)) { serv.write(0); }
if (((Tzad-5) < ds.getTempC(sensor1))&&(Tzad > ds.getTempC(sensor1))){ serv.write(50); }
if ((Tzad-5) > ds.getTempC(sensor1)) { serv.write(180); }
}
void setList(int List) { // листы на экране
if (List == 0) { tit(0);
lcd.setCursor(6,0); lcd.print("<= "); list = 0; }
else if (List == 1) { tit(0);
lcd.setCursor(6,0); lcd.print(" =>"); list = 1;}
else if (List == 2) { lcd.clear();
lcd.setCursor(0, 0); lcd.print(" Set");
lcd.setCursor(4, 0); lcd.print("(HACOC)");
lcd.setCursor(6, 1); lcd.print(TzadN);
lcd.setCursor(12, 1); lcd.print(int(ds.getTempC(sensor1)));
lcd.setCursor(15, 1); lcd.print("C");
list = 2;}
else if (List == 3) { lcd.clear();
lcd.setCursor(0, 0); lcd.print(" Set");
lcd.setCursor(4, 0); lcd.print("(ALARM) ");
lcd.setCursor(6, 1); lcd.print(TzadA);
lcd.setCursor(12, 1); lcd.print(int(ds.getTempC(sensor1)));
lcd.setCursor(15, 1); lcd.print("C");
list = 3;}
}
void setup() {
pinMode(alarm, OUTPUT);
pinMode(motor, OUTPUT);
Serial.begin(9600);
lcd.begin(16, 2);
ds.begin();
E= ds.getDeviceCount();
}
void loop(){
/////// ошибка градусника
ds.requestTemperatures();
ds.begin();
if(ds.getDeviceCount()!= E){ lcd.clear();
lcd.setCursor(4, 0); lcd.print("(Ds ERROR)");
lcd.setCursor(6, 1); lcd.print("Mon");
serv.write(0); digitalWrite(motor, HIGH);
delay(5000);
}
///////////////////////////
byte KEY = key();
// переключение листов
if (KEY == 1) { mode ++ ; }
if (mode == 4) mode=0; setList(mode);
///// температура управления задвижой /////
if (list==0) {
if (KEY == 3) { Tnight = Tnight +5; }
if (KEY == 4) { Tnight = Tnight -5; }
Tzad = Tnight; }
if (list==1) {
if (KEY == 3) { Tday = Tday +5; }
if (KEY == 4) { Tday = Tday -5; }
Tzad = Tday; }
///// температура управления насосом //////
if ((KEY == 3)&&(list==2)) { TzadN = TzadN +5; setList(2); }
if ((KEY == 4)&&(list==2)) { TzadN = TzadN -5; setList(2); }
//////// alarm
if ((KEY == 3)&&(list==3)) { TzadA = TzadA +5; setList(3); }
if ((KEY == 4)&&(list==3)) { TzadA = TzadA -5; setList(3); }
//////// задвижка /////////////
if (((Tzad-1 < ds.getTempC(sensor1))&&(Tzad+1 > ds.getTempC(sensor1))) ||
((Tzad-6 < ds.getTempC(sensor1))&&(Tzad-4 > ds.getTempC(sensor1)))) {
naklon(); }
else { serv.detach(); }
/////////////насос//////////
if (TzadN > ds.getTempC(sensor1)) {
digitalWrite(motor, LOW); }
if (TzadN < ds.getTempC(sensor1)) {
digitalWrite(motor, HIGH); }
/// СИГНАЛ ///
if (ds.getTempC(sensor1)>TzadA){
digitalWrite(alarm, HIGH); lcd.clear();
lcd.setCursor(4, 0); lcd.print("(ALARM)");
lcd.setCursor(6, 1); lcd.print(int(ds.getTempC(sensor1)));
digitalWrite(motor, HIGH);
lcd.setCursor(12, 0); lcd.print("Mon ");
delay(5000); lcd.clear(); }
if (ds.getTempC(sensor1)<TzadA){ digitalWrite(alarm, LOW); }
///
delay(100);
}
118-121 включает серву только в интервалах, а 46-50 регулирует наклон от установленной температуры.
видео приложить попробую если надо конечно.
Да еще. сейчас работает от терморезистора на котле без дребезга через map(....) без ЛСД ...
Испльзовать серву не айс, вот жто гораздо лучше подойдет
http://i040.radikal.ru/1109/57/d8e2a66f4dc1.jpg
Привод заслонки печки от ваза, этот представляет собой биполярный шаговик, а что у поддувала всего два положения? Промежуточных нет?
нет средних я решил убрать, так лучше получается, а если шаговый шаг пропустит?
или не должно быть такого?
видео дребезга
https://youtu.be/5kLRwhgFKFI
При нормальном напряжении, усилие на штоке и скорости ничего не пропустит, а серва дребежжит потому что когда ей задаешь угол она включает мотор, доводит заслонку до нужного положения и отключает мотор, заслонка под своим весом начинает опускаться и проворачивать мотор, что фиксируется сервой, соответсвенно мотор включается и цикл замкнулся, получилось дрожжание, чтобы его небыло, надо чтобы заслонка не опускалась под собственным весом, но и не была слишком тугой.
Видос не пашет
не на нее пока нечего не давит, это пройденый этап, сейчас сделал скетч и так не дергается уже.
#include <OneWire.h> #include <DallasTemperature.h> #include <Servo.h> OneWire oneWire(15); DallasTemperature ds(&oneWire); Servo serv; DeviceAddress sensor1 = {0x28, 0xEE, 0x41, 0x3E, 0x16, 0x16, 0x01, 0xDE}; //DeviceAddress sensor2 = {0x28, 0xEE, 0x44, 0x77, 0x16, 0x16, 0x01, 0x7F}; //4 кабина //DeviceAddress sensor1 = {0x28, 0xEE, 0x37, 0x65, 0x1E, 0x16, 0x01, 0x46}; //5 салон void setup() { //Serial.begin(9600); ds.begin(); serv.attach(12); } void loop() { int temp; ds.requestTemperatures(); temp= ds.getTempC(sensor1); temp = map(temp,75,90,170,2); // 650-24` 860-60` 875-70` serv.write(temp); delay(1000);}https://youtu.be/mwrqNJl9NTo видео работы экрана
Видео заработало, а как сервамсебя ведет если небольшое усилие к ней приложить?
повернется
а вот так
temp = map(temp,75,90,170,2); не повернешьПохоже строка 48 дергает серву на 0, а потом 49 сразу на 50
в скетч ЛСД вставил map(...) не провернешь, но дергает... не че не пойму.
может скорость вращения надо изменить?
Надо условие пересмотреть, или на ноль или на 50 градусов, а не сначала на 0 а в следующей строке на 50 градусов
Ура!!! победа!!!!
#include <LiquidCrystal.h> #include <OneWire.h> #include <DallasTemperature.h> #include <Servo.h> OneWire oneWire(15); DallasTemperature ds(&oneWire); LiquidCrystal lcd(8, 9, 4, 5, 6, 7); Servo serv; int alarm = 12; // подача сигнализации перегрева int motor = 3; // управление насосом int Tnight = 60; // по умолчанию температура закрытия заслонки ночь int Tday = 80; // по умолчанию температура закрытия заслонки ночь int TzadN = 50; // по умолчанию температура включения насоса int TzadA = 100; // по умолчанию температура включения сигнализации int list;// byte E; // для вывода ошибки датчика температуры int Tzad; // для переключения между день и ночь int mode=0; // переключение листов select key 1 DeviceAddress sensor1 = {0x28, 0xEE, 0x41, 0x3E, 0x16, 0x16, 0x01, 0xDE}; int temp; byte key(){ //// для кнопок ЛСДшилда int val = analogRead(0); if (val < 50) return 5; else if (val < 150) return 3; else if (val < 350) return 4; else if (val < 500) return 2; else if (val < 800) return 1; else return 0; } //// void tit(int titul) { if (titul == 0) { lcd.setCursor(0, 0); lcd.print("NIGHT "); lcd.setCursor(12,0); lcd.print(" DAY"); lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(3,1); lcd.print("C "); lcd.setCursor(1,1); lcd.print(Tnight); lcd.setCursor(3,1); lcd.print("C"); lcd.setCursor(13,1); lcd.print(Tday); lcd.setCursor(15,1); lcd.print("C"); lcd.setCursor(6, 1); lcd.print(ds.getTempC(sensor1)); lcd.setCursor(10,1); lcd.print("C "); } } void naklon(){ // наклон от температуры int temp; serv.attach(12); ds.requestTemperatures(); temp = ds.getTempC(sensor1); if ((Tzad-5) > temp) { serv.write(170);serv.detach(); } if (((Tzad-5) < temp)&&(Tzad > temp)){ serv.write(50);serv.detach(); } if (Tzad < temp) { serv.write(10);serv.detach(); } } void setList(int List) { // листы на экране if (List == 0) { tit(0); lcd.setCursor(6,0); lcd.print("<= "); list = 0; } else if (List == 1) { tit(0); lcd.setCursor(6,0); lcd.print(" =>"); list = 1;} else if (List == 2) { lcd.clear(); lcd.setCursor(0, 0); lcd.print(" Set"); lcd.setCursor(4, 0); lcd.print("(HACOC)"); lcd.setCursor(6, 1); lcd.print(TzadN); lcd.setCursor(12, 1); lcd.print(int(ds.getTempC(sensor1))); lcd.setCursor(15, 1); lcd.print("C"); list = 2;} else if (List == 3) { lcd.clear(); lcd.setCursor(0, 0); lcd.print(" Set"); lcd.setCursor(4, 0); lcd.print("(ALARM) "); lcd.setCursor(6, 1); lcd.print(TzadA); lcd.setCursor(12, 1); lcd.print(int(ds.getTempC(sensor1))); lcd.setCursor(15, 1); lcd.print("C"); list = 3;} } void setup() { pinMode(alarm, OUTPUT); pinMode(motor, OUTPUT); Serial.begin(9600); lcd.begin(16, 2); ds.begin(); E= ds.getDeviceCount(); } void loop(){ /////// ошибка градусника ds.requestTemperatures(); ds.begin(); if(ds.getDeviceCount()!= E){ lcd.clear(); lcd.setCursor(4, 0); lcd.print("(Ds ERROR)"); lcd.setCursor(6, 1); lcd.print("Mon"); serv.write(0); digitalWrite(motor, HIGH); delay(5000); } /////////////////////////// byte KEY = key(); // переключение листов if (KEY == 1) { mode ++ ; } if (mode == 4) mode=0; setList(mode); ///// температура управления задвижой ///// if (list==0) { if (KEY == 3) { Tnight = Tnight +5; } if (KEY == 4) { Tnight = Tnight -5; } Tzad = Tnight; } if (list==1) { if (KEY == 3) { Tday = Tday +5; } if (KEY == 4) { Tday = Tday -5; } Tzad = Tday; } ///// температура управления насосом ////// if ((KEY == 3)&&(list==2)) { TzadN = TzadN +5; setList(2); } if ((KEY == 4)&&(list==2)) { TzadN = TzadN -5; setList(2); } //////// alarm if ((KEY == 3)&&(list==3)) { TzadA = TzadA +5; setList(3); } if ((KEY == 4)&&(list==3)) { TzadA = TzadA -5; setList(3); } //////// задвижка ///////////// naklon(); /////////////насос////////// if (TzadN > ds.getTempC(sensor1)) { digitalWrite(motor, LOW); } if (TzadN < ds.getTempC(sensor1)) { digitalWrite(motor, HIGH); } /// СИГНАЛ /// if (ds.getTempC(sensor1)>TzadA){ digitalWrite(alarm, HIGH); lcd.clear(); lcd.setCursor(4, 0); lcd.print("(ALARM)"); lcd.setCursor(6, 1); lcd.print(int(ds.getTempC(sensor1))); digitalWrite(motor, HIGH); lcd.setCursor(12, 0); lcd.print("Mon "); delay(5000); lcd.clear(); } if (ds.getTempC(sensor1)<TzadA){ digitalWrite(alarm, LOW); } /// delay(500); }отключается провернуть можно руками, но у меня дополнительный редуктор сделан к серве.
убрал лишнее и после каждого условия
serv.detach();или такvoid naklon(){ // наклон от температуры //int temp; serv.attach(12); ds.requestTemperatures(); // temp = ds.getTempC(sensor1); if ((Tzad-5) > ds.getTempC(sensor1)) { serv.write(170); } else if (((Tzad-5) < ds.getTempC(sensor1))&&(Tzad > ds.getTempC(sensor1))){ serv.write(50); } else if (Tzad < ds.getTempC(sensor1)) { serv.write(10); } serv.detach();Видео работы на котле....
https://youtu.be/eap7Fmv8P-w
и еще пытаюсь подружить все это с ENC28J60, но есть проблема. После начала работы отправляет на страницу показания несколько раз, а затем теряется связь со страницей, хотя пинг на адрес идет.
может по неопытности че лишнее туда влил, или наоборот забыл чего... пока не догнал.
#include <LiquidCrystal.h> #include <EtherCard.h> #include <OneWire.h> #include <DallasTemperature.h> #include <Servo.h> OneWire oneWire(15); DallasTemperature ds(&oneWire); LiquidCrystal lcd(8, 9, 4, 5, 6, 7); Servo serv; // serv.attach(2); // выход серво int alarm = A2; // выход подача сигнализации перегрева int motor = A3; // выход управление насосом int light = 3; // выход управления яркостью int Tnight = 40; // по умолчанию температура закрытия заслонки ночь int Tday = 60; // по умолчанию температура закрытия заслонки ночь int TzadN = 40; // по умолчанию температура включения насоса int TzadA = 95; // по умолчанию температура включения сигнализации int list; // для переключения листов byte E; // для вывода ошибки датчика температуры int Tzad; // для переключения между переменными int mode = 0; // переключение переменных int modeLight = 1; // переключение яркости int sensor2; // выводит int температуру без запятой static byte mymac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; static byte myip[] = { 192,168,0,203}; // Буфер, чем больше данных на Web странице, тем больше понадобится значения буфера. byte Ethernet::buffer[700]; BufferFiller bfill; DeviceAddress sensor1 = {0x28, 0xEE, 0x81, 0x57, 0x1E, 0x16, 0x01, 0xDA}; // 28 EE 81 57 1E 16 01 DA //28 EE C9 5E 1E 16 01 9E // на печке byte key(){ //// для кнопок ЛСДшилда int val = analogRead(0); if (val < 50) return 5; else if (val < 150) return 3; else if (val < 350) return 4; else if (val < 500) return 2; else if (val < 800) return 1; else return 0; } //// const char http_OK[] PROGMEM = "HTTP/1.0 200 OK\r\n" "Content-Type: text/html\r\n" "Pragma: no-cache\r\n\r\n"; const char http_Unauthorized[] PROGMEM = "HTTP/1.0 401 Unauthorized\r\n" "Content-Type: text/html\r\n\r\n" "<h1>401 Unauthorized</h1>"; const char http_Found[] PROGMEM = "HTTP/1.0 302 Found\r\n" "Location: /\r\n\r\n"; static word homePage() { bfill = ether.tcpOffset(); bfill.emit_p(PSTR( "HTTP/1.0 200 OK\r\n" "Content-Type: text/html\r\n" "Pragma: no-cache\r\n" "\r\n" "<meta http-equiv='refresh' content='5'/>" "<title>Temp Server</title>" "<h1>$D</h1>"),sensor2); ether.httpServerReply(bfill.position()); } void tit(int titul) { if (titul == 0) { lcd.setCursor(0,0); lcd.print("1:"); lcd.setCursor(0,1); lcd.print("2:"); lcd.setCursor(4, 0); lcd.print(Tnight); lcd.setCursor(4,1); lcd.print(Tday); lcd.setCursor(7,0); lcd.print("C"); lcd.setCursor(7,1); lcd.print("C"); lcd.setCursor(6,0); lcd.print("\xDF"); lcd.setCursor(6,1); lcd.print("\xDF"); lcd.setCursor(8,0); lcd.print(" TEMP "); lcd.setCursor(8,1); lcd.print(" "); lcd.setCursor(9, 1); lcd.print(ds.getTempC(sensor1)); lcd.setCursor(15,1); lcd.print("C"); lcd.setCursor(14,1); lcd.print("\xDF");} if (titul == 1) { lcd.setCursor(0, 0); lcd.print(" HACOC : ) "); lcd.setCursor(11, 0); lcd.print(TzadN); lcd.setCursor(13,0); lcd.print("\xDF"); lcd.setCursor(14,0); lcd.print("C "); lcd.setCursor(14,1); lcd.print("C "); lcd.setCursor(0, 1); lcd.print(" ALARM : "); lcd.setCursor(11, 1); lcd.print(TzadA); lcd.setCursor(13,1); lcd.print("\xDF");} } void naklon(){ serv.attach(2); if (Tzad < ds.getTempC(sensor1)) { serv.write(0); } if (((Tzad-5) < ds.getTempC(sensor1))&&(Tzad > ds.getTempC(sensor1))){ serv.write(50); } if ((Tzad-5) > ds.getTempC(sensor1)) { serv.write(180); } serv.detach(); } ////////// настройка яркости void setLight(int L) { if (L == 0) { analogWrite(light,0); } else if (L == 1) { analogWrite(light,50); } else if (L == 2) {analogWrite(light,100); } else if (L == 3) { analogWrite(light,150); } else if (L == 4) { analogWrite(light,200); } else if (L == 5) { analogWrite(light,250); } } void setList(int List) { // листы на экране if (List == 0) { tit(0); lcd.setCursor(2,0); lcd.print("\x7E "); lcd.setCursor(2,1); lcd.print(" "); list = 0; } else if (List == 1) { tit(0); lcd.setCursor(2,1); lcd.print("\x7E "); lcd.setCursor(2,0); lcd.print(" "); list = 1;} else if (List == 2) { tit(1); lcd.setCursor(9,0); lcd.print("\x7E "); lcd.setCursor(9,1); lcd.print(" "); list = 2; } else if (List == 3) { tit(1); lcd.setCursor(9,1); lcd.print("\x7E "); lcd.setCursor(9,0); lcd.print(" "); list = 3; } } void setup() { pinMode(alarm, OUTPUT); pinMode(motor, OUTPUT); pinMode(light, OUTPUT); Serial.begin(9600); lcd.begin(16, 2); ds.begin(); E= ds.getDeviceCount(); if (ether.begin(sizeof Ethernet::buffer, mymac,10) == 0); if (!ether.dhcpSetup()); ether.staticSetup(myip); ether.printIp("My Router IP: ", ether.myip); } void loop(){ /////// ошибка градусника ds.requestTemperatures(); ds.begin(); if(ds.getDeviceCount()!= E){ lcd.clear(); lcd.setCursor(4, 0); lcd.print("(Ds ERROR)"); lcd.setCursor(6, 1); lcd.print("Mon"); serv.attach(2); serv.write(180); digitalWrite(motor, HIGH); delay(5000); } /////////////////////////// byte KEY = key(); // переключение листов if (KEY == 5) { mode ++ ; } if (mode == 4) mode=0; setList(mode); if (KEY == 2) { mode -- ; } if (mode == -1) mode=0; setList(mode); ////// подсветка LCD if (KEY == 1) { modeLight ++ ; } if (modeLight == 6) modeLight=0; setLight(modeLight); ///// температура управления задвижой ///// if (list==0) { if (KEY == 3) { Tnight = Tnight +1; } if (KEY == 4) { Tnight = Tnight -1; } Tzad = Tnight; } if (list==1) { if (KEY == 3) { Tday = Tday +1; } if (KEY == 4) { Tday = Tday -1; } Tzad = Tday; } ///// температура управления насосом ////// if (list==2) { if (KEY == 3) { TzadN = TzadN +5; } if (KEY == 4) { TzadN = TzadN -5; } TzadN = TzadN; } //////// alarm if (list==3) { if (KEY == 3) { TzadA = TzadA +5; } if (KEY == 4) { TzadA = TzadA -5; } TzadA = TzadA; } //////// задвижка ///////////// naklon(); /////////////насос////////// if (TzadN > ds.getTempC(sensor1)) { digitalWrite(motor, LOW); } if (TzadN < ds.getTempC(sensor1)) { digitalWrite(motor, HIGH); } /// СИГНАЛ /// if (ds.getTempC(sensor1)>TzadA){ analogWrite(alarm,1000); lcd.clear(); lcd.setCursor(4, 0); lcd.print("(ALARM)"); lcd.setCursor(6, 1); lcd.print(int(ds.getTempC(sensor1))); digitalWrite(motor, HIGH); serv.attach(2); serv.write(180); lcd.setCursor(12, 0); lcd.print("Mon "); delay(5000); lcd.clear(); } if (ds.getTempC(sensor1)<TzadA){ analogWrite(alarm,0); } /// // выводим на страницу sensor2=ds.getTempC(sensor1); delay(1); word len = ether.packetReceive(); word pos = ether.packetLoop(len); ether.httpServerReply(homePage()); }Заменил библиотеку , переписал. #include <UIPEthernet.h> перестала виснуть, пока конечно только температуру шлет, но я думаю надо продолжать.
Доброго времени суток. а Вы не задумывались чтобы сделать заслонке всего 2 положения, открыто и закрыто. т е запустить котел в режим старт-стоп. На форум хаусе, есть не плохая тема про плюсы и минусы данного режима. Просто поставить ЭМ на 12 вольт который будет открывать задвижку. Просто при не полном открытии заслонки котел будет работать в задушенном режиме, следовательно топливо не будет полностью сгорать. И при пропаже питания заслонка просто под своим весом опустится в положение закрыто, что не даст котлу уйти в разгон
Просто при не полном открытии заслонки котел будет работать в задушенном режиме, следовательно топливо не будет полностью сгорать.
чтобы такого небыло на котлах есть подача вторичного воздуха который и дожигает.
так у ТС всего 3 положения заслонки- закрыто,почти закрыто и открыто
Сгорает все на ура! Проблем нет с этим, посыплю голову пеплом! в открытом состоянии серва не дергается, в чуть закрытом дергается немного, в полностью закрытом не дергается, возможно уберу серву, замену чем нибудь, но это не особо изменит саму задумку и скетч. уже 2 недели прошло полет нормальный.
Если смотрели видео, то видно что день и ночь есть только в скетче, просто для удобства сделал 2 режима.
Сейчас долепил примивный сервер кидаю скеч и видео небольшое.
#include <LiquidCrystal.h> #include <UIPEthernet.h> #include <OneWire.h> #include <DallasTemperature.h> #include <Servo.h> OneWire oneWire(15); DallasTemperature ds(&oneWire); LiquidCrystal lcd(8, 9, 4, 5, 6, 7); Servo serv; // serv.attach(2); // выход серво int alarm = A2; // выход подача сигнализации перегрева int motor = A3; // выход управление насосом int light = 3; // выход управления яркостью int Tnight = 40; // по умолчанию температура закрытия заслонки ночь int Tday = 60; // по умолчанию температура закрытия заслонки ночь int TzadN = 40; // по умолчанию температура включения насоса int TzadA = 95; // по умолчанию температура включения сигнализации int list; // для переключения листов byte E; // для вывода ошибки датчика температуры int Tzad; // для переключения между переменными int mode = 0; // переключение переменных int modeLight = 1; // переключение яркости int sensor2; // выводит int температуру без запятой boolean newInfo = 0; byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192,168,0,203); // Буфер, чем больше данных на Web странице, тем больше понадобится значения буфера. EthernetServer server(80); DeviceAddress sensor1 = {0x28, 0xEE, 0x81, 0x57, 0x1E, 0x16, 0x01, 0xDA}; // 28 EE 81 57 1E 16 01 DA //28 EE C9 5E 1E 16 01 9E // на печке byte key(){ //// для кнопок ЛСДшилда int val = analogRead(0); if (val < 50) return 5; else if (val < 150) return 3; else if (val < 350) return 4; else if (val < 500) return 2; else if (val < 800) return 1; else return 0; } //// void tit(int titul) { if (titul == 0) { lcd.setCursor(0,0); lcd.print("1:"); lcd.setCursor(0,1); lcd.print("2:"); lcd.setCursor(4, 0); lcd.print(Tnight); lcd.setCursor(4,1); lcd.print(Tday); lcd.setCursor(7,0); lcd.print("C"); lcd.setCursor(7,1); lcd.print("C"); lcd.setCursor(6,0); lcd.print("\xDF"); lcd.setCursor(6,1); lcd.print("\xDF"); lcd.setCursor(8,0); lcd.print(" TEMP "); lcd.setCursor(8,1); lcd.print(" "); lcd.setCursor(9, 1); lcd.print(ds.getTempC(sensor1)); lcd.setCursor(15,1); lcd.print("C"); lcd.setCursor(14,1); lcd.print("\xDF");} if (titul == 1) { lcd.setCursor(0, 0); lcd.print(" HACOC : ) "); lcd.setCursor(11, 0); lcd.print(TzadN); lcd.setCursor(13,0); lcd.print("\xDF"); lcd.setCursor(14,0); lcd.print("C "); lcd.setCursor(14,1); lcd.print("C "); lcd.setCursor(0, 1); lcd.print(" ALARM : "); lcd.setCursor(11, 1); lcd.print(TzadA); lcd.setCursor(13,1); lcd.print("\xDF");} } void naklon(){ serv.attach(2); if (Tzad < ds.getTempC(sensor1)) {delay(10); serv.write(0); } if (((Tzad-5) < ds.getTempC(sensor1))&&(Tzad > ds.getTempC(sensor1))){serv.write(50); } if ((Tzad-5) > ds.getTempC(sensor1)) {serv.write(180); } serv.detach(); } ////////// настройка яркости void setLight(int L) { if (L == 0) { analogWrite(light,0); } else if (L == 1) { analogWrite(light,50); } else if (L == 2) {analogWrite(light,100); } else if (L == 3) { analogWrite(light,150); } else if (L == 4) { analogWrite(light,200); } else if (L == 5) { analogWrite(light,250); } } void setList(int List) { // листы на экране if (List == 0) { tit(0); lcd.setCursor(2,0); lcd.print("\x7E "); lcd.setCursor(2,1); lcd.print(" "); list = 0; } else if (List == 1) { tit(0); lcd.setCursor(2,1); lcd.print("\x7E "); lcd.setCursor(2,0); lcd.print(" "); list = 1;} else if (List == 2) { tit(1); lcd.setCursor(9,0); lcd.print("\x7E "); lcd.setCursor(9,1); lcd.print(" "); list = 2; } else if (List == 3) { tit(1); lcd.setCursor(9,1); lcd.print("\x7E "); lcd.setCursor(9,0); lcd.print(" "); list = 3; } } void setup() { pinMode(alarm, OUTPUT); pinMode(motor, OUTPUT); pinMode(light, OUTPUT); //Serial.begin(9600); lcd.begin(16, 2); ds.begin(); E= ds.getDeviceCount(); Ethernet.begin(mac, ip); server.begin(); Serial.print("server is at "); Serial.println(Ethernet.localIP()); } void loop(){ /////// ошибка градусника ds.requestTemperatures(); ds.begin(); if(ds.getDeviceCount()!= E){ lcd.clear(); lcd.setCursor(4, 0); lcd.print("(Ds ERROR)"); lcd.setCursor(6, 1); lcd.print("Mon"); serv.attach(2); serv.write(0); digitalWrite(motor, HIGH); delay(5000); } /////////////////////////// byte KEY = key(); // переключение листов if (KEY == 5) { mode ++ ; } if (mode == 4) mode=0; setList(mode); if (KEY == 2) { mode -- ; } if (mode == -1) mode=0; setList(mode); ////// подсветка LCD if (KEY == 1) { modeLight ++ ; } if (modeLight == 6) modeLight=0; setLight(modeLight); ///// температура управления задвижой ///// if (list==0) { if (KEY == 3) { Tnight = Tnight +1; } if (KEY == 4) { Tnight = Tnight -1; } Tzad = Tnight; } if (list==1) { if (KEY == 3) { Tday = Tday +1; } if (KEY == 4) { Tday = Tday -1; } Tzad = Tday; } ///// температура управления насосом ////// if (list==2) { if (KEY == 3) { TzadN = TzadN +5; } if (KEY == 4) { TzadN = TzadN -5; } TzadN = TzadN; } //////// alarm if (list==3) { if (KEY == 3) { TzadA = TzadA +5; } if (KEY == 4) { TzadA = TzadA -5; } TzadA = TzadA; } //////// задвижка ///////////// naklon(); /////////////насос////////// if (TzadN > ds.getTempC(sensor1)) { digitalWrite(motor, LOW); } if (TzadN < ds.getTempC(sensor1)) { digitalWrite(motor, HIGH); } /// СИГНАЛ /// if (ds.getTempC(sensor1)>TzadA){ analogWrite(alarm,1000); lcd.clear(); lcd.setCursor(4, 0); lcd.print("(ALARM)"); lcd.setCursor(6, 1); lcd.print(int(ds.getTempC(sensor1))); digitalWrite(motor, HIGH); serv.attach(2); serv.write(0); lcd.setCursor(12, 0); lcd.print("Mon "); delay(5000); lcd.clear(); } if (ds.getTempC(sensor1)<TzadA){ analogWrite(alarm,0); } /// // выводим на страницу sensor2=ds.getTempC(sensor1); // listen for incoming clients EthernetClient client = server.available(); if (client) { Serial.println("new client"); // an http request ends with a blank line boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); Serial.write(c); if(newInfo && c == ' '){ //если переменная новой информации = 1 и "с", в которой записан запрос, равен пустой строке newInfo = 0; //то обнуляем переменную поступления новой информации } if(c == '$'){ //если переменная "с", несущая отправленный нам запрос, содержит символ $ //(все новые запросы) - "$" подразумевает разделение получаемой информации (символов) newInfo = 1; //то пришла новая информация, ставим метку новой информации в 1 } if(newInfo == 1){ //если есть новая информация if(c == '1'){ //и "с" содержит 1 Tday = Tday +1; Tzad = Tday; mode=1; setList(mode); } if(c == '2'){ //если "с" содержит 2 Tday = Tday -1; Tzad = Tday; mode=1; setList(mode); } if(c == '3'){ //если "с" содержит 2 c =' '; } } // if you've gotten to the end of the line (received a newline // character) and the line is blank, the http request has ended, // so you can send a reply if (c == '\n' && currentLineIsBlank) { // send a standard http response header client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); // the connection will be closed after completion of the response // client.println("Refresh: 20"); // refresh the page automatically every 5 sec client.println(); client.println("<!DOCTYPE HTML>"); client.println("<html>"); // output the value of each analog input pin client.println("<font color=\"green\">"); client.print("TEMP "); client.print(ds.getTempC(sensor1)); client.print(" C "); client.println("<font color=\"red\">"); client.print("Zakr "); client.print(Tzad); client.print(" C"); client.println("<font color=\"Burnt Orange\">"); client.print("Alarm "); client.print(TzadA); client.print(" C "); client.println("<font color=\"blue\">"); client.print("HACOC "); client.print(TzadN); client.print(" C "); client.print("<a href=\"/$1\"><button>+</button></a>"); client.print("<a href=\"/$2\"><button>-</button></a>"); client.print("<a href=\"/$3\"><button>refresh</button></a>"); client.println("</html>"); break; } if (c == '\n') { // you're starting a new line currentLineIsBlank = true; } else if (c != '\r') { // you've gotten a character on the current line currentLineIsBlank = false; } } } // give the web browser time to receive the data delay(10); // close the connection: client.stop(); Serial.println("client disonnected"); } delay(500); }Доброго времени суток. а Вы не задумывались чтобы сделать заслонке всего 2 положения, открыто и закрыто. т е запустить котел в режим старт-стоп. На форум хаусе, есть не плохая тема про плюсы и минусы данного режима. Просто поставить ЭМ на 12 вольт который будет открывать задвижку. Просто при не полном открытии заслонки котел будет работать в задушенном режиме, следовательно топливо не будет полностью сгорать. И при пропаже питания заслонка просто под своим весом опустится в положение закрыто, что не даст котлу уйти в разгон
Вы слегка не в теме. Горение дров более сложный процесс и управлять эффективно только полностью открыто и закрыто не получится. На том форуме тоже об этом есть.
Да, сервер на ENC28j60 вид и работа...
https://youtu.be/6QxgfkYUZW0
Алексей, можете дать схему подключения? По видео не понятно, а по скетчу разобрался с пинами только на LCD ))
Друзья, помогите новичку, немогу разобраться по скетчу, к каким пинам подключать датчики...
напишите кто нибудь, например: реле-5 пин, ds18b20-3пин, серво-6 пин ... и т.д. Заранее спасибо
Есть не старт-стоп, а имитироване плавного изменения расхода воздуха кратковременным открытием на небольшой промежуток времени раз, допустим, в 5 секунд.
По сабжу - тема интересная но больно дорогая в реализации. Не вижу радикальных отличий от тех, режимов, которые обеспечивает термомеханическая "цепочка" за 25 баксов. Сам задумывался над регулятором и решил собирать наддув на вентиляторе WPA с симисторным фазовым управлением - вот где можно компенсировать сезонный не только избыток, но и недостаток тяги, контролируя температуру уходящих газов.
Всем привет.
Как система работает?
При компиляции пишет-недостаточно памяти.
Используется почти 27 килобайт.
Как сервер,допилил?