Управление поддувалом котла отопления.

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

Здравствуйте!

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

Спасибо заранее!

#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);
}

 

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

118-121 включает серву только в интервалах, а 46-50 регулирует наклон от установленной температуры.

видео приложить попробую если надо конечно.

Да еще. сейчас работает от терморезистора на котле без дребезга через map(....) без ЛСД ...

evgta
Offline
Зарегистрирован: 02.09.2016

Испльзовать серву не айс, вот жто гораздо лучше подойдет
http://i040.radikal.ru/1109/57/d8e2a66f4dc1.jpg
Привод заслонки печки от ваза, этот представляет собой биполярный шаговик, а что у поддувала всего два положения? Промежуточных нет?

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

нет средних я решил убрать, так лучше получается, а если шаговый шаг пропустит?

или не должно быть такого?

видео дребезга

https://youtu.be/5kLRwhgFKFI

evgta
Offline
Зарегистрирован: 02.09.2016

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

Видос не пашет

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

не на нее пока нечего не давит, это пройденый этап, сейчас сделал скетч и так не дергается уже.

#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);}

 

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

https://youtu.be/mwrqNJl9NTo видео работы экрана

 

evgta
Offline
Зарегистрирован: 02.09.2016

Видео заработало, а как сервамсебя ведет если небольшое усилие к ней приложить?

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

повернется

а вот так temp = map(temp,75,90,170,2);  не повернешь

evgta
Offline
Зарегистрирован: 02.09.2016

Похоже строка 48 дергает серву на 0, а потом 49 сразу на 50

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

в скетч ЛСД вставил map(...)  не провернешь, но дергает... не че не пойму.

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

может скорость вращения надо изменить?

evgta
Offline
Зарегистрирован: 02.09.2016

Надо условие пересмотреть, или на ноль или на 50 градусов, а не сначала на 0 а в следующей строке на 50 градусов

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

Ура!!! победа!!!!

#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);
}

 

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

отключается провернуть можно руками, но у меня дополнительный редуктор сделан к серве.

убрал лишнее и после каждого условия 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();

 

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

Видео работы на котле....

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()); 

}

 

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

Заменил библиотеку , переписал. #include <UIPEthernet.h> перестала виснуть, пока конечно только температуру шлет, но я думаю надо продолжать.

Timon351
Offline
Зарегистрирован: 19.01.2017

Доброго времени суток. а Вы не задумывались чтобы сделать заслонке всего 2 положения, открыто и закрыто. т е запустить котел в режим старт-стоп. На форум хаусе, есть не плохая тема про плюсы и минусы данного режима. Просто поставить ЭМ на 12 вольт который будет открывать задвижку. Просто при не полном открытии заслонки котел будет работать в задушенном режиме, следовательно топливо не будет полностью сгорать. И при пропаже питания заслонка просто под своим весом опустится в положение закрыто, что не даст котлу уйти в разгон

evgta
Offline
Зарегистрирован: 02.09.2016

Timon351 пишет:

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

чтобы такого небыло на котлах есть подача вторичного воздуха который и дожигает.

так у ТС всего 3 положения заслонки- закрыто,почти закрыто и открыто

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

Сгорает все на ура! Проблем нет с этим, посыплю голову пеплом! в открытом состоянии серва не дергается, в чуть закрытом дергается немного, в полностью закрытом не дергается, возможно уберу серву, замену чем нибудь, но это не особо изменит саму задумку и скетч. уже 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);
}

 

uragan
Offline
Зарегистрирован: 23.02.2015

Timon351 пишет:

Доброго времени суток. а Вы не задумывались чтобы сделать заслонке всего 2 положения, открыто и закрыто. т е запустить котел в режим старт-стоп. На форум хаусе, есть не плохая тема про плюсы и минусы данного режима. Просто поставить ЭМ на 12 вольт который будет открывать задвижку. Просто при не полном открытии заслонки котел будет работать в задушенном режиме, следовательно топливо не будет полностью сгорать. И при пропаже питания заслонка просто под своим весом опустится в положение закрыто, что не даст котлу уйти в разгон

Вы слегка не в теме. Горение дров более сложный процесс и управлять эффективно только полностью открыто и закрыто не получится. На том форуме тоже об этом есть.

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

Да, сервер на ENC28j60 вид и работа...

https://youtu.be/6QxgfkYUZW0

vadimg
Offline
Зарегистрирован: 19.02.2017

Алексей, можете дать схему подключения? По видео не понятно, а по скетчу разобрался с пинами только на LCD ))

vadimg
Offline
Зарегистрирован: 19.02.2017

Друзья, помогите новичку, немогу разобраться по скетчу, к каким пинам подключать датчики...
напишите кто нибудь, например: реле-5 пин, ds18b20-3пин, серво-6 пин ... и т.д. Заранее спасибо

CatSoup
Offline
Зарегистрирован: 01.05.2017

Есть не старт-стоп, а имитироване плавного изменения расхода воздуха кратковременным открытием на небольшой промежуток времени раз, допустим, в 5 секунд.

По сабжу - тема интересная но больно дорогая в реализации. Не вижу радикальных отличий от тех, режимов, которые обеспечивает термомеханическая "цепочка" за 25 баксов. Сам задумывался над регулятором и решил собирать наддув на вентиляторе WPA с симисторным фазовым управлением - вот где можно компенсировать сезонный не только избыток, но и недостаток тяги, контролируя температуру уходящих газов.

АндрейT
Offline
Зарегистрирован: 08.02.2019

Всем привет.
Как система работает?
При компиляции пишет-недостаточно памяти.
Используется почти 27 килобайт.
Как сервер,допилил?