Отопление и Вентиляция гаража

mrtester
Offline
Зарегистрирован: 26.02.2015

Гараж 50 м.кв. отопление теплый пол, классическая схема трехходовой и насос. трехходовой (н. о.) управляется термоэлектрическим сервоприводом (н. з.). Датчик температуры стоит на подаче в пол. Вентиляция пока монтируется. Приточная установка имеет 3 скорости и калорифер водяной киловат 20-30 и вытяжной вентилятор. Идея вентиляции сделать с рекуперацией (труба в трубе). Управление теплым проводом, 1 кнопка с подсветкой синий (не работает), зеленый (еле греем 13 градусов воздух) и красная(18 градусов воздух). Управление вентиляцией 1 кнопка с зеленой подсветкой, 1 режим - не работает, 2 режим - 1 скорость, и т. д.. Вытяжной вентилятор трубы глушителя, 1 кнопка красного света вкючено или выключено.

 

 

 

 

mrtester
Offline
Зарегистрирован: 26.02.2015
//pro mini

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include "DHT.h"
#include <Servo.h>
#include "PCF8574.h" //подключаем расщиритель на 8 входов выходов
#include <LCD_1602_RUS.h> //отображение русских букв
#define LED_IND_R 3 // подсветка кнопки R красный
#define LED_IND_G 10 // подсветка кнопки G зеленый
#define LED_IND_B 9 // подсветка кнопки B синий
#define FAN_SPED 6 // вентилятор вытяжки 220 вольт на к1182пм1р https://www.chipdip.ru/product/k1182pm1r
#define BUTTON_R A0 // кнопка режимов пола
#define BUTTON_F A1 // кнопка режимов вентиляции
#define BUTTON_CH A2 // кнопка режимов вытяжки выхлопа
#define PHOTORESISTOR A3 // фоторезистор включение подсветки дисплея
#define SERVO_PIN1 5 // серва пин калорифер
#define SERVO_PIN2 11 // серва пин
#define LED_IND_CH 2 // подсветка кнопки выхлоп, красная
#define LED_IND_FAN 4 // подсветка кнопки вентиляции, зеленая
#define FAN_CH 12 // вентилятор выхлопа реле 1
#define HEATING_ELEMENT_OUT 13 //ТЭН выходной

Servo fanservo;
PCF8574 expander;
DHT dht;
OneWire  ds(7);
LCD_1602_RUS lcd(0x3F,16,2); //  A4, A5 - SDA, SCL
byte pol[8]={0x28,0x94,0x46,0x7A,0x05,0x00,0x00,0x80};
byte air[8]={0x28,0xD6,0x50,0x7A,0x05,0x00,0x00,0x7B};
byte stove[8]={0x28,0x01,0x44,0x7A,0x05,0x00,0x00,0x59};
boolean flagR = 0; //переменная кнопки пола
boolean flagRb = 0; //переменная кнопки пола
byte timerR = 0; //таймер кнопки пола
byte BR=2; //режимы подогрева пола, еле греем
int TempPol, TempStove, TempHause, Humidity, TempAir;
byte dsb=0; //переменная времени датчика температуры
boolean dr=0; //флаг датчика температуры
byte Fan=0; //режим работы вентиляции
boolean flagF = 0, flagFb = 0; //переменная кнопки вентилятора
byte BF=1; //режимы вентилятора, выключен
byte timerF = 0; //таймер кнопки вентилятора
byte timerS = 0; //таймер отключения сервы
boolean flagS=0, flagSb=0;
boolean flagCH = 0, flagCHb = 0; //переменная кнопки вентилятора CH
byte BCH=0; //режимы вентилятора CH
byte timerCH = 0; //таймер кнопки вентилятора CH
boolean FOTO=0; //режимы работы фоторезистора 
boolean warms=0; //режим работы т. п.


void setup() {
lcd.init(); // initialize the lcd 
dht.setup(8);
//Serial.begin(9600);
WDTCSR=(1<<WDCE)|(1<<WDE); //установить биты WDCE WDE (что б разрешить запись в другие биты
WDTCSR=(1<<WDIE)| (1<<WDP2); // разрешение прерывания + выдержка 1/4 секунды
//WDTCSR=(1<<WDIE)| (1<<WDP2)|(1<<WDP1); // разрешение прерывания + выдержка 1 секунда
//WDTCSR=(1<<WDIE)| (1<<WDP3)|(1<<WDP0); //разрешение прерывания + выдержка 8 секунда
expander.begin(0x20); // A4, A5 - SDA, SCL
pinMode (LED_IND_R, OUTPUT); 
pinMode (LED_IND_G, OUTPUT); 
pinMode (LED_IND_B, OUTPUT);
pinMode (LED_IND_CH, OUTPUT);
pinMode (LED_IND_FAN, OUTPUT);
pinMode (FAN_CH, OUTPUT); // вентилятор выхлопа ~220 вольт, реле 1
pinMode (HEATING_ELEMENT_OUT, OUTPUT); //~220 вольт, твердотельное реле 4, 2A
pinMode (FAN_SPED, OUTPUT); 
expander.pinMode (0, OUTPUT);// трехходовой кран ~220 вольт, твердотельное реле 1, 2A
expander.pinMode (1, OUTPUT);// насос полов ~220 вольт, твердотельное реле 2, 2A
expander.pinMode (2, OUTPUT);// насос печки ~220 вольт, твердотельное реле 3, 2A
expander.pinMode (3, OUTPUT);// вентилятор притока 1 скорость ~220 вольт, реле 2
expander.pinMode (4, OUTPUT);// вентилятор притока 2 скорость ~220 вольт, реле 3
expander.pinMode (5, OUTPUT);// вентилятор притока 3 скорость ~220 вольт, реле 4
expander.pinMode (6, OUTPUT);// обогрев воздуха с улицы ТЗН1~220 вольт, на BTA41 600V
expander.pinMode (7, OUTPUT);// обогрев воздуха с улицы ТЗН2~220 вольт, на BTA41 600V
//установили выкл всё
//digitalWrite(LED_IND_R, 1); 
//digitalWrite(LED_IND_G, 1);
//digitalWrite(LED_IND_B, 1);
digitalWrite(LED_IND_CH, 1); 
digitalWrite(LED_IND_FAN, 1);
digitalWrite(FAN_CH, 1); 
digitalWrite(FAN_SPED,1);
digitalWrite(HEATING_ELEMENT_OUT,0);
expander.digitalWrite(0,0);
expander.digitalWrite(1,0);
expander.digitalWrite(2,0);
expander.digitalWrite(3,1);
expander.digitalWrite(4,1);
expander.digitalWrite(5,1);
expander.digitalWrite(6,1);
expander.digitalWrite(7,1);
//Приветствие
  lcd.backlight();
  lcd.setCursor(3, 0);
  lcd.print(L"СМОТРИШЬ?!");
  lcd.setCursor(1, 1);
  lcd.print(L"Иди работать!!");
  delay (5000);
  lcd.clear();
}

void loop(){
  DS18B20(); //запустить работу датчиков температуры
  if (TempStove<40) FanSpeed(); //разрешить работу вентиляции когда не работает печь
  if (TempStove>=40) STOVE(); //разрешить работу печки
  WarmFloor(); //теплый пол запускаем
  DisPlay(); // дисплей запускаем
//вытяжка глушителя
//кнопки все по класической схеме, вместо миллисекунд таймер четверть секунды
  if (digitalRead(BUTTON_CH)==LOW && flagCH==0){
      BCH++;
      flagCH=1;
      if (BCH>1) BCH=0;} //ограничеваем 2 режимами, если дощло до 2 возращаем на 0 режим 
  if (digitalRead(BUTTON_CH)==HIGH && flagCH==1 && flagCHb==0){
      flagCHb = 1;
      timerCH = 0;}
  if (timerCH >= 2 && flagCH==1 && flagCHb==1) {
      flagCHb = 0;
      flagCH = 0;
      timerCH = 0;}
  if( BCH==0){ //не работает
      if(TempStove<80) digitalWrite(LED_IND_CH, 1);
      digitalWrite(FAN_CH, 1);}
  if (BCH==1){ //работает
      if(TempStove<80) digitalWrite(LED_IND_CH, 0);
      digitalWrite(FAN_CH, 0);}}

 void STOVE(){  // печь
  digitalWrite(HEATING_ELEMENT_OUT,0);
  if (TempStove>=40 && TempStove<50){ //задали температуру от 40 до 49
    Fan=1; //работает вентиляция печки
    //BF=1; //сбрасываем вентиляцию воздуха в выкл
    //flagSb=1;
    fanservo.attach(SERVO_PIN1);
    analogWrite(FAN_SPED,30); //обороты вытяжного вентилятора
    expander.digitalWrite(2,1); //включили насос печки
    expander.digitalWrite(3,0); //включили 1 скорость
    //моргаем индикацией вентиляции
    if (dsb==3) digitalWrite(LED_IND_FAN, 0); //включили
    if (dsb==4) digitalWrite(LED_IND_FAN, 1); //выключили
    fanservo.write(125); //открыли заслонку на.....
    expander.digitalWrite(4,1); //выкл
    expander.digitalWrite(5,1);} //выкл
  if(TempStove>50 && TempStove<60){ //задали температуру от 51 до 59
    analogWrite(FAN_SPED,25);
    expander.digitalWrite(2,1); //включили насос печки
    expander.digitalWrite(4,0); //включили 2 скорость
    if (dsb==3) digitalWrite(LED_IND_FAN, 0); //включили
    if (dsb==5) digitalWrite(LED_IND_FAN, 1); //выключили
    Fan=2;
    expander.digitalWrite(3,1);
    expander.digitalWrite(5,1);
    fanservo.write(10);} //открыли заслонку на.....
  if(TempStove>59){ //задали температуру от 60
    analogWrite(FAN_SPED,15);
    expander.digitalWrite(2,1); //включили насос печки
    expander.digitalWrite(5,0); //включили 3 скорость
    if (dsb==2 && TempStove<80) digitalWrite(LED_IND_FAN, 0); //включили
    if (dsb==5 && TempStove<80) digitalWrite(LED_IND_FAN, 1); //выключили
    Fan=3;
    expander.digitalWrite(3,1);
    expander.digitalWrite(4,1);
    fanservo.write(90);}} //открыли заслонку на.....  
  
void DisPlay(){ //
    if (FOTO==1 || (Fan>0 && Fan<4) || (Fan>4 && Fan<7)) {
      lcd.backlight(); //вкл подсветку дисплея
      lcd.setCursor(0, 1);
      lcd.print(L"ДОМ");
      lcd.setCursor(4, 1);
      lcd.print(TempHause);
      lcd.print(L"°");
      lcd.print("C");
      lcd.setCursor(11, 1);
      lcd.print("f=");
      lcd.setCursor(13, 1);
      lcd.print(Humidity);
      lcd.print("%"); } 
    if (FOTO==0 && Fan==0) {
      lcd.noBacklight(); //выкл подсветку дисплея
      lcd.clear();} // очистили дисплей
    // вывели показание на дисплей
    if (FOTO==1 && Fan==0) { // не работает вентилято и печ отображаем т. п.
      lcd.setCursor(0, 0);
      lcd.print(L"ПОЛ ");
      lcd.print(TempPol);
      lcd.print(L"°");
      lcd.print("C");
      lcd.print("   ");
      if (warms==1){
        lcd.setCursor(11, 0);
        lcd.print(L"ГРЕЕТ");}
      if (warms==0){
        lcd.setCursor(11, 0);
        lcd.print("     ");}}
    if (Fan>0 && Fan<4) { // работает печь
      lcd.setCursor(0, 0);
      lcd.print(L"ПЕЧЬ ");
      lcd.print(TempStove);
      lcd.print(L"°");
      lcd.print("C ");
      if (Fan==1) lcd.print("1");
      if (Fan==2) lcd.print("2");
      if (Fan==3) lcd.print("3");
      lcd.print(L" скор");}
    if (Fan>3 && Fan<7){ // работает вентиляция 
      lcd.setCursor(0, 0);
      lcd.print(L"Вентиляция реж ");
      if (Fan==4)lcd.print("1");
      if (Fan==5)lcd.print("2");
      if (Fan==6)lcd.print("3");}}
  
void WarmFloor(){ //теплый пол
  if(TempHause>25) BR=1; //если температура больше... выкл все, 1 режим
  if(TempHause<12 && BR==1) BR=2; //если температура меньше... вкл 2 режим
  if (dsb==1) {
    if(analogRead(PHOTORESISTOR) < 900) FOTO=1; //включили подсветку дисплея
    else FOTO=0;} //выключили подсветку дисплея
  if (digitalRead(BUTTON_R)==LOW && flagR==0){
    BR++;
    flagR=1;
    if (BR>3) BR=1;} //ограничеваем 3 режимами, если дощло до 4 возращаем на 1 режим 
  if (digitalRead(BUTTON_R)==HIGH && flagR==1 && flagRb == 0){
    flagRb = 1;
    timerR = 0;}
  if (timerR >= 15 && flagRb == 1 && flagR == 1) {
    flagRb = 0;
    flagR = 0;
    timerR = 0;}
  if(BR==1) { //выключили все
    digitalWrite(LED_IND_R,1);
    digitalWrite(LED_IND_G,1);
    digitalWrite(LED_IND_B,0); //включили синию индикацию
    expander.digitalWrite(0,0); //выкл трехходовой
    expander.digitalWrite(1,0);} //выкл насос
  if(BR==2) { //1 режим полов, еле греем
    digitalWrite(LED_IND_G,0); //включили зеленую индикацию
    digitalWrite(LED_IND_B,1);
    if(TempHause<=15) expander.digitalWrite(1,1); //включили насос 
    if(TempHause>15) expander.digitalWrite(1,0); //выключили насос
  if(TempPol<=33 && TempHause<14) {
    expander.digitalWrite(0,1); // греем
    digitalWrite(LED_IND_R,0); //добавили красный, получили индикатор желтый
    warms=1;}
  if(TempPol>33 || TempHause>=14) { // нагрели, выкл
    expander.digitalWrite(0,0);
    digitalWrite(LED_IND_R,1);
    warms=0;}}
  if(BR==3) { //2 режим полов, греем конфортно
    digitalWrite(LED_IND_R,0); //включили красную индикацию
    digitalWrite(LED_IND_G,1);
    digitalWrite(LED_IND_B,1);
    expander.digitalWrite(1,1);
  if(TempPol<=45 && TempHause<20) {
    expander.digitalWrite(0,1); //греем
    warms=1;}
  if(TempPol>45 || TempHause>=20) {
    expander.digitalWrite(0,0); //нагрели выкл
    warms=0;}}}
    
void FanSpeed(){ //вентиляция
  if (digitalRead(BUTTON_F)==LOW && flagF==0){
     BF++;
     flagF=1;
     timerF = 0; 
     if (BF>4) BF=1;} //ограничеваем 4 режимами, если дощло до 5 возращаем на 1 режим 
  if (digitalRead(BUTTON_F)==HIGH && flagF==1 && flagFb==0){
     flagFb = 1;
     timerF = 0;}
  if (timerF >=2 && flagF == 1 && flagFb==1){
     flagFb = 0;
     flagF = 0;
     timerF = 0;}
  if(BF==1){ //не работает, все выкл
    Fan=0;
    digitalWrite(FAN_SPED,1);
    digitalWrite(LED_IND_FAN, 1);
    digitalWrite(HEATING_ELEMENT_OUT,0);
    expander.digitalWrite(2,0); //выключили насос печки
    expander.digitalWrite(3,1); //выключили 1 скорость
    expander.digitalWrite(4,1); //выключили 2 скорост
    expander.digitalWrite(5,1); //выключили 3 скорость
    fanservo.write(0); //закрыли заслонку
  if (flagS==0 && flagSb == 0){
    flagS=1;
    timerS=0;
    if (timerS >= 8 && flagS == 1 && flagSb == 0){
      flagS=0;
      flagSb=1;
      fanservo.detach(); //выключаем серво
      timerS=0;}}}
  if(BF==2){ //1 скорость
    Fan=4;
    expander.digitalWrite(3,0); //включили 1 скорость
    fanservo.attach(SERVO_PIN1);
    analogWrite(FAN_SPED,33);
    expander.digitalWrite(4,1); //выключили 2 скорость
    expander.digitalWrite(5,1); //выключили 3 скорость
    fanservo.write(55);} //открыли заслонку на.....
  if(BF==3){ //2 скорость
    Fan=5;
    expander.digitalWrite(4,0); //включили 2 скорость
    analogWrite(FAN_SPED,23);
    expander.digitalWrite(3,1); //выключили 1 скорость
    expander.digitalWrite(5,1); //выключили 3 скорость
    fanservo.write(75);} //открыли заслонку на.....
  if(BF==4){ //3 скорость, максимальная
    Fan=6;
    expander.digitalWrite(5,0); //включили 3 скорость
    analogWrite(FAN_SPED,10);
    flagSb=0;
    expander.digitalWrite(3,1); //выключили 1 скорость
    expander.digitalWrite(4,1); //выключили 2 скорость
    fanservo.write(90);} //открыли заслонку на.....
  if (Fan!=0 && BR==2 && TempHause <=14){ // моргаем индикатором и греем 
    if (dsb==3) digitalWrite(LED_IND_FAN, 1);
    if (dsb==4) digitalWrite(LED_IND_FAN, 0);
    digitalWrite(HEATING_ELEMENT_OUT,1);}
  if (BR==2 && TempHause >15) { //горит индикатор и не греем
    digitalWrite(HEATING_ELEMENT_OUT,0);
    digitalWrite(LED_IND_FAN, 0);}
  if (Fan!=0 && BR==3 && TempHause <=20) { // моргаем индикатором и греем 
    if (dsb==3) digitalWrite(LED_IND_FAN, 1);
    if (dsb==4) digitalWrite(LED_IND_FAN, 0);
    digitalWrite(HEATING_ELEMENT_OUT,1);}
  if (BR==3 && TempHause >21) { //горит индикатор и не греем
    digitalWrite(LED_IND_FAN, 0);
    digitalWrite(HEATING_ELEMENT_OUT,0);}}
    
void DS18B20(){
  byte dataP[12];
  byte dataA[12];
  byte dataS[12];
  if (dsb>3 && dr==0){ // сделали 1,25 секунды
    ds.reset();
    ds.write(0xCC); //Обращение ко всем датчикам
    ds.write(0x44); //Команда на конвертацию
    dr=1;}
  if (dsb>6 && dr==1){ //сделали 2 секунды
    ds.reset();
    ds.select(pol);    
    ds.write(0xBE); // Read Scratchpad (чтение регистров)
    for (byte p = 0; p < 9; p++) 
     { //  нам нужно 9 байт (с сотыми после запятой)
        dataP[p] = ds.read ();}
     if (OneWire::crc8(dataP, 8) == dataP[8]){  //проверяем CRC  
         TempPol = ((dataP[1] << 8) | dataP[0]) /16.0;} //прочитаны 2 байта      
          //if (TP > 1 && TP < 60) TP=TempPol;
        // получение с 2-го датчика
     ds.reset();
     ds.select(air);   
     ds.write(0xBE); // Read Scratchpad (чтение регистров)
     for (byte a = 0; a < 9; a++) 
      { //  нам нужно 9 байт (с сотыми после запятой)
         dataA[a] = ds.read ();}
     if (OneWire::crc8(dataA, 8) == dataA[8]){  //проверяем CRC  
         TempAir = ((dataA[1] << 8) | dataA[0]) /16.0;} //прочитаны 2 байта         
        // получение с 3-го датчика
     ds.reset();
     ds.select(stove);   
     ds.write(0xBE); // Read Scratchpad (чтение регистров)
     for (byte s = 0; s < 9; s++) 
       { //  нам нужно 9 байт (с сотыми после запятой)
          dataS[s] = ds.read ();}
     if (OneWire::crc8(dataS, 8) == dataS[8]){  //проверяем CRC  
         TempStove = ((dataS[1] << 8) | dataS[0]) /16.0;} //прочитаны 2 байта
     TempHause = dht.getTemperature();
     Humidity = dht.getHumidity();  
     dsb=0; dr=0;}} 

ISR (WDT_vect){ //вектор прерывания WD
  dsb++; // таймер датчика температуры
  timerF++; // таймер кгопки вентиляторов
  timerS++; // таймер отключения сервы
  timerR++;  //таймер кнопки пола
  timerCH++; //таймер кнопки вентилятора CH

/*     // для настройки
Serial.print("TempPol= ");
Serial.print(TempPol);
Serial.print("  ");
Serial.print("TempAir= ");
Serial.print(TempAir);
Serial.print("  ");
Serial.print("TempStove= ");
Serial.println(TempStove); 
Serial.print("  ");
Serial.print("TempHause= ");
Serial.print(TempHause); 
Serial.print("  ");*/
}

 

mrtester
Offline
Зарегистрирован: 26.02.2015

опечатка не теплым проводом, а теплым полом

mrtester
Offline
Зарегистрирован: 26.02.2015

Это пробный код который пока работает. Надо добавить диагностику датчиков  с выводом на дисплей ошибок.

mrtester
Offline
Зарегистрирован: 26.02.2015

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

Добавил диагностику ошибок датчиков температыры, считает сколько ошибок было. Вход в диагностику нажатием одновременно кнопки вентиляция и вытяжка глушителя, просмотр нажатие кнопки вытяжка глушителя.

Оптимизировал код. Работу выходов переделал что бы не долбило постоянно.

mrtester
Offline
Зарегистрирован: 26.02.2015
//pro mini

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <LCD_1602_RUS.h> //отображение русских букв
#define LED_IND_R 3 // j подсветка кнопки R красный
#define LED_IND_G 10 // k подсветка кнопки G зеленый
#define LED_IND_B 9 // l подсветка кнопки B синий
#define FAN_SPED 6 // m вентилятор вытяжки 220 вольт на к1182пм1р https://www.chipdip.ru/product/k1182pm1r
#define BUTTON_R A0 // кнопка режимов пола
#define BUTTON_F A1 // кнопка режимов вентиляции
#define BUTTON_CH A2 // кнопка режимов вытяжки выхлопа
#define PHOTORESISTOR A3 // фоторезистор включение подсветки дисплея
#define DAMPER_ON 5 // n заслонка открывание
#define DAMPER_OFF 11 // o заслонка закрывание
#define LED_IND_CH 2 // p подсветка кнопки выхлоп, красная
#define LED_IND_FAN 4 // q подсветка кнопки вентиляции, зеленая
#define FAN_CH 12 // r вентилятор выхлопа реле 1
#define HEATING_ELEMENT_OUT 13 // s ТЭН выходной
#define DHT_pin 8
//=================DHT==============================
uint8_t data[5];
boolean dht=0;
boolean readingDHT(byte pin) {
  byte duration = 0;
  byte j = 0;
  //for(byte i = 0; i < 5; i++){
    //data[i] = 0;
  //}
  pinMode(pin, OUTPUT);
  digitalWrite(pin, LOW);
  delay(1);           //более 800mks нужно чтобы рабудить датчик DHT21-22
  //delay(18);        //для DHT11 
  pinMode(pin, INPUT);     //начинаем слушать датчик
  delayMicroseconds(50);
  for(byte i = 0; i < 41; i++){//читаем 41 положительный импульс (первый неинформативный)
    duration = pulseIn(pin, HIGH, 200);
    if(!duration)  break;
    if (i){     //записываем сo 2 (i==1) импульса (1,?,?,...?)
      data[j/8] <<= 1; //пишем в младший бит "0"
      if(duration > 50)
        data[j/8] |= 1;//пишем в младший бит "1"
      j++;
    }
  }//end for 
  uint8_t sum = data[0] + data[1] + data[2] + data[3];
  if(sum == data[4]) return 1;
  else               return 0;
}
//==================================================
OneWire  ds(7);
LCD_1602_RUS lcd(0x3F,16,2); //  A4, A5 - SDA, SCL
byte pol[8]={0x28,0x94,0x46,0x7A,0x05,0x00,0x00,0x80};
byte air[8]={0x28,0x50,0x1D,0x29,0x07,0x00,0x00,0x39};
byte stove[8]={0x28,0x01,0x44,0x7A,0x05,0x00,0x00,0x59};
boolean flagRa = 0, flagRb = 0, press_R=0; //переменная кнопки пола
byte timerR = 0; //таймер кнопки пола
byte BR=2; //режимы подогрева пола, еле греем
int TempPol, TempStove, TempHause, Humidity, TempAir;
byte timerDSB=0; //переменная времени датчика температуры
boolean flagDR=0; //флаг датчика температуры
byte Fan=0; //режим работы вентиляции
boolean flagF = 0, flagFb = 0, press_F =0; //переменная кнопки вентилятора
byte BF=1; //режимы вентилятора, выключен
byte timerF = 0; //таймер кнопки вентилятора
byte BS=4; //режим диагностики датчиков темпервтуры 
boolean flagCH = 0, flagCHb = 0, press_CH=0; //переменная кнопки вентилятора CH
byte BCH=0; //режимы вентилятора CH
byte timerCH = 0; //таймер кнопки вентилятора CH
boolean FOTO=0; //режимы работы фоторезистора 
boolean warms=0; //режим работы т. п.
byte timerFS=0; //таймер холодного пуска вентидятора вытяжки
boolean flagFS=0, flagFSb=0; //флаг пуска вентидятора вытяжки
byte TS=0, TA=0, TH=0, TP=0, errTS=0, errTA=0, errTH=0, errTP=0; // переменные ошиюок датчиков температуры
boolean flagDPa=0; // флаг переклюяения строки 
byte regimDP=0; // флаг очистки экрана
byte timerDP=0; // таймер моргания дисплея
//подключаем расщиритель на 8 выходов 
byte y=0;//B11111111;
//       0    1    2    3    4    5    6    7  выходы на PCF8574 и выкл. всё
boolean a=0, // трехходовой кран ~220 вольт, твердотельное реле 1, 2A
             b=0, // насос полов ~220 вольт, твердотельное реле 2, 2A
                  c=0, // насос печки ~220 вольт, твердотельное реле 3, 2A
                       d=1, // вентилятор притока 1 скорость ~220 вольт, реле 2
                             f=1, // вентилятор притока 2 скорость ~220 вольт, реле 3
                                  e=1, // вентилятор притока 3 скорость ~220 вольт, реле 4
                                       g=1, // обогрев воздуха с улицы ТЗН1~220 вольт, на BTA41 600V
                                            h=1; // обогрев воздуха с улицы ТЗН2~220 вольт, на BTA41 600V
byte change=0; //признак изменения y

boolean j=1, flagJ=1, //LED_IND_R  подсветка кнопки R красный
        k=1, flagK=1, //LED_IND_G  подсветка кнопки G зеленый
        l=1, flagL=1, //LED_IND_B  подсветка кнопки B синий
        n=1, flagN=1, //DAMPER_ON заслонка открывание
        o=1, flagO=1, //DAMPER_OFF заслонка закрывание
        p=1, flagP=1, //LED_IND_CH подсветка кнопки выхлоп, красная
        q=1, flagQ=1, //LED_IND_FAN подсветка кнопки вентиляции, зеленая
        r=1, flagR=1,//FAN_CH вентилятор выхлопа реле 
        s=1, flagS=1; //HEATING_ELEMENT_OUT ТЭН выходной
byte mflag=0, m=0; //FAN_SPED  вентилятор вытяжки        
boolean  flagM=0;     

void setup() {
Wire.begin(); // A4, A5 - SDA, SCL PCF8574
lcd.init(); // initialize the lcd 
WDTCSR=(1<<WDCE)|(1<<WDE); //установить биты WDCE WDE (что б разрешить запись в другие биты
WDTCSR=(1<<WDIE)| (1<<WDP2); // разрешение прерывания + выдержка 1/4 секунды
//WDTCSR=(1<<WDIE)| (1<<WDP2)|(1<<WDP1); // разрешение прерывания + выдержка 1 секунда
//WDTCSR=(1<<WDIE)| (1<<WDP3)|(1<<WDP0); //разрешение прерывания + выдержка 8 секунда
pinMode (DAMPER_ON, OUTPUT);
pinMode (DAMPER_OFF, OUTPUT);
pinMode (LED_IND_R, OUTPUT); 
pinMode (LED_IND_G, OUTPUT); 
pinMode (LED_IND_B, OUTPUT);
pinMode (LED_IND_CH, OUTPUT);
pinMode (LED_IND_FAN, OUTPUT);
pinMode (FAN_CH, OUTPUT); // вентилятор выхлопа ~220 вольт, реле 1
pinMode (HEATING_ELEMENT_OUT, OUTPUT); //~220 вольт, твердотельное реле 4, 2A
pinMode (FAN_SPED, OUTPUT); 
//установили выкл всё
//digitalWrite(LED_IND_R, HIGH); 
//digitalWrite(LED_IND_G, HIGH);
//digitalWrite(LED_IND_B, HIGH);
digitalWrite (DAMPER_ON, HIGH);
digitalWrite (DAMPER_OFF, HIGH);
digitalWrite(LED_IND_CH, HIGH); 
digitalWrite(LED_IND_FAN, HIGH);
digitalWrite(FAN_CH, HIGH); 
digitalWrite(FAN_SPED,HIGH);
digitalWrite(HEATING_ELEMENT_OUT,LOW);
//Приветствие
  lcd.backlight();
  lcd.setCursor(3, 0);
  lcd.print(L"СМОТРИШЬ?!");
  lcd.setCursor(1, 1);
  lcd.print(L"Иди работать!!");
  delay (5000);
  lcd.clear();
}

void loop(){
  DS18B20(); //запустить работу датчиков температуры
  if (TempStove>37) c=1; //expander.digitalWrite(2,HIGH); //включили насос печки
  else c=0; //expander.digitalWrite(2,LOW); //выключили насос печки
  if (TempStove<40) FanSpeed(); //разрешить работу вентиляции когда не работает печь
  if (TempStove>=40) STOVE(); //разрешить работу печки
  WarmFloor(); //теплый пол запускаем
  DisPlay(); // дисплей запускаем
//вытяжка выхдопных газов
//кнопки все по класической схеме, вместо миллисекунд таймер четверть секунды
  if (digitalRead(BUTTON_CH)==LOW) press_CH=1;
  else press_CH=0;
  if (press_CH==1 && flagCH==0) flagCH=1;
  if (press_CH==0 && flagCH==1 && flagCHb==0){
  if (flagF==1) BS=0; //если нажаты вместе кнопки вентиляции и вытяжка глушителя, вкл. диагностику
  if (flagF==0 && BS==4) { //если диагностика выкл., то работаем как кнопка вытяжки глущителя
    BCH++;
    if (BCH>1) BCH=0;} //ограничеваем 2 режимами, если дощло до 2 возращаем на 0 режим
  if (flagF==0 && BS<4) BS++; //если находимся в диагностике, то идем по датчикам
  if (flagF==0 && BS>4) BS=4; //если находимся в самодиагностики, то сброс меню
    flagCHb = 1;
    timerCH = 0;}
  if (timerCH >= 2 && flagCH==1 && flagCHb==1) {
    flagCHb = 0;
    flagCH = 0;
    timerCH = 0;}
  if( BCH==0){ //не работает
      if(TempStove<80) p=1; //digitalWrite(LED_IND_CH, HIGH);
      r=1;} //digitalWrite(FAN_CH, HIGH);}
  if (BCH==1){ //работает
      if(TempStove<80) p=0; //digitalWrite(LED_IND_CH, LOW);
      r=0;} //digitalWrite(FAN_CH, LOW);}
  WITHDRAWAI();}

void STOVE(){  // печь
  s=0; //digitalWrite(HEATING_ELEMENT_OUT,LOW);
  if (TempStove>=40 && TempStove<50){ //задали температуру от 40 до 49
    if (flagFSb==0) { //холодный пуск мотора вентилятора
      m=0; //digitalWrite(FAN_SPED,LOW);
      timerFS=0;
      flagFSb=1;}
    if (timerFS>24) flagFS=1;
    if (flagFS==1) m=30; //analogWrite(FAN_SPED,30); //обороты вытяжного вентилятора
    d=0; //expander.digitalWrite(3,LOW); //включили 1 скорость
    n=0; // открыли заслонку
    //моргаем индикацией вентиляции
    if (timerDSB==3) q=0; //digitalWrite(LED_IND_FAN, LOW); //включили
    if (timerDSB==4) q=1; //digitalWrite(LED_IND_FAN, HIGH); //выключили
    Fan=1; //работает вентиляция печки
    f=1; //expander.digitalWrite(4,HIGH); //выкл
    e=1;} //expander.digitalWrite(5,HIGH); //выкл
  if(TempStove>50 && TempStove<60){ //задали температуру от 51 до 59
    n=1; // закрыли заслонку
    m=25; //analogWrite(FAN_SPED,25);
    f=0; //expander.digitalWrite(4,LOW); //включили 2 скорость
    if (timerDSB==3) q=0; //digitalWrite(LED_IND_FAN, LOW); //включили
    if (timerDSB==5) q=1; //digitalWrite(LED_IND_FAN, HIGH); //выключили
    Fan=2;
    d=1; //expander.digitalWrite(3,HIGH);
    e=1;} //expander.digitalWrite(5,HIGH);
  if(TempStove>59){ //задали температуру от 60
    if (TempStove<80) m=15; //analogWrite(FAN_SPED,15);
    e=0; //expander.digitalWrite(5,LOW); //включили 3 скорость
    n=1; // закрыли заслонку
    if (timerDSB==2 && TempStove<80) q=0; //digitalWrite(LED_IND_FAN, LOW); //включили
    if (timerDSB==5 && TempStove<80) q=1; //digitalWrite(LED_IND_FAN, HIGH); //выключили
    Fan=3;
    d=1; //expander.digitalWrite(3,HIGH);
    f=1; //expander.digitalWrite(4,HIGH);
    if (TempStove>=80){ //если печь нагрелась до 80 градусов, то моргаем двумя индикаторами 
       m=5; //analogWrite(FAN_SPED,5);
       if (timerDSB==0) p=0; //digitalWrite(LED_IND_CH, LOW);
       if (timerDSB==1) p=1; //digitalWrite(LED_IND_CH, HIGH);
       if (timerDSB==2) p=0; //digitalWrite(LED_IND_CH, LOW);
       if (timerDSB==3) {p=1; //digitalWrite(LED_IND_CH, HIGH);
                   q=0;} //digitalWrite(LED_IND_FAN, LOW);
       if (timerDSB==4) p=0; //digitalWrite(LED_IND_CH, LOW);
       if (timerDSB==5) p=1; //digitalWrite(LED_IND_CH, HIGH);
       if (timerDSB==6) {p=0; //digitalWrite(LED_IND_CH, LOW);
                   q=1;} //digitalWrite(LED_IND_FAN, HIGH);
       if (timerDSB==7) p=1;} //digitalWrite(LED_IND_CH, HIGH);
     }}
  
void DisPlay(){
  if (regimDP!=BS) { //очищаем дисплей при переходе на любой другой режим отображения
    lcd.clear();
    timerDP=0;
    regimDP=BS;} 
  if (BS>4) { //самодиагностика
    if (timerDSB==0) lcd.backlight(); //вкл подсветку дисплея
    if (timerDSB==5) lcd.noBacklight(); //выкл подсветку дисплея
    if (timerDP>16) { //таймер 1 строки, меняем вывод информации
      flagDPa=!flagDPa;
      timerDP=0;}
    lcd.setCursor(0, 0);
    if (flagDPa==0) {
      lcd.print(L"ОБРЫВ ЛИНИИ ИЛИ");}
    if (flagDPa==1) {
      lcd.print(L" ДЕФЕКТ ДАТЧИКА");}
    if (BS==5) {
      lcd.setCursor(4, 1);
      lcd.print(L"ПОЛ  ");
      lcd.print(TempPol);
      lcd.print(L"°C");}
    if (BS==6) {
      lcd.setCursor(2, 1);
      lcd.print(L"ВОЗДУХ  ");
      lcd.print(TempAir);
      lcd.print(L"°C");}
    if (BS==7) {
      lcd.setCursor(3, 1);
      lcd.print(L"ПЕЧЬ  ");
      lcd.print(TempStove);
      lcd.print(L"°C");}
    if (BS==8) {
      lcd.setCursor(0, 1);
      lcd.print(L"ДОМ  ");
      lcd.print(TempHause);
      lcd.print(L"°С ");
      lcd.print(" f=");
      lcd.print(Humidity);
      lcd.print("%");}}
  if (BS<4) { //отображаем диагностиеу
    lcd.backlight(); //вкл подсветку дисплея
    if (timerCH>252) BS=4; //выходит из диагностики через 63 сек
    lcd.setCursor(0, 0);
    lcd.print(L"ОШИБКИ  ");
    if (BS==0) {
      lcd.print(TP-0); //количество ощибок
      lcd.setCursor(0, 1);
      lcd.print(L"ПОЛ  ");
      lcd.print(TempPol);
      lcd.print(L"°C");}
    if (BS==1) {
      lcd.print(TA-0); //количество ощибок
      lcd.setCursor(0, 1);
      lcd.print(L"ВОЗДУХ  ");
      lcd.print(TempAir);
      lcd.print(L"°C");}
    if (BS==2) {
      lcd.print(TS-0); //количество ощибок
      lcd.setCursor(0, 1);
      lcd.print(L"ПЕЧЬ  ");
      lcd.print(TempStove);
      lcd.print(L"°C");}
    if (BS==3) {
      lcd.print(TH-0); //количество ощибок
      lcd.setCursor(0, 1);
      lcd.print(L"ДОМ  ");
      lcd.print(TempHause);
      lcd.print(L"°С ");
      lcd.print(" f=");
      lcd.print(Humidity);
      lcd.print("%");}}
  if (BS==4) { //рабочий режим
    if (BR==1 && Fan==0){ //ни чего не работает
      lcd.noBacklight(); //выкл подсветку дисплея
      lcd.clear();} // очистили дисплей
    if (FOTO==0 && Fan==0) { //работает т. п., но темно в помещении
      lcd.noBacklight(); //выкл подсветку дисплея
      lcd.clear();} // очистили дисплей
    // вывели показание на дисплей 1 строка
    if (FOTO==1 && Fan==0 && BR!=1) { // не работает вентилято и печ, отображаем т. п.
      lcd.setCursor(0, 0);
      lcd.print(L"ПОЛ ");
      lcd.print(TempPol);
      lcd.print(L"°C");
      lcd.print("   ");
      if (warms==1){
        lcd.setCursor(11, 0);
        lcd.print(L"ГРЕЕТ");}
      if (warms==0){
        lcd.setCursor(11, 0);
        lcd.print("     ");}}
    if (Fan>0 && Fan<4) { // работает печь
      lcd.setCursor(0, 0);
      lcd.print(L"ПЕЧЬ ");
      lcd.print(TempStove);
      lcd.print(L"°C ");
      lcd.print(Fan-0); //отображаем режим 1, 2, 3
      //if (Fan==1) lcd.print("1");
      //if (Fan==2) lcd.print("2");
      //if (Fan==3) lcd.print("3");
      lcd.print(L" скор");}
    if (Fan>3 && Fan<7){ // работает вентиляция 
      lcd.setCursor(0, 0);
      lcd.print(L"Вентиляция реж ");
      lcd.print(Fan-3);} //отображаем режим 1, 2, 3
      //if (Fan==4)lcd.print("1");
      //if (Fan==5)lcd.print("2");
      //if (Fan==6)lcd.print("3");
    if ((Fan>0 && Fan<7) || (BR!=1 && FOTO==1)) { //2 срока
      lcd.setCursor(0, 1);
      lcd.print(L"ДОМ");
      lcd.setCursor(4, 1); 
      lcd.print(TempHause);
      lcd.print(L"°С");
      lcd.setCursor(11, 1);
      lcd.print("f=");
      lcd.setCursor(13, 1); 
      lcd.print(Humidity);
      lcd.print("%"); 
      lcd.backlight();}}} //вкл подсветку дисплея
  
void WarmFloor(){ //теплый пол
  if(TempHause>25) BR=1; //если температура больше... выкл все, 1 режим
  if(TempHause<12 && BR==1) BR=2; //если температура меньше... вкл 2 режим
  if (timerDSB==1) {
    if(analogRead(PHOTORESISTOR) < 900) FOTO=1; //включили подсветку дисплея
    else FOTO=0;} //выключили подсветку дисплея
  if (digitalRead(BUTTON_R)==LOW) press_R=1;
  else press_R=0;
  if (press_R==1 && flagRa==0){
    BR++;
    flagRa=1;
    if (BR>3) BR=1;} //ограничеваем 3 режимами, если дощло до 4 возращаем на 1 режим 
  if (press_R==0 && flagRa==1 && flagRb == 0){
    flagRb = 1;
    timerR = 0;}
  if (timerR >= 15 && flagRb == 1 && flagRa == 1) {
    flagRb = 0;
    flagRa = 0;
    timerR = 0;}
  if(BR==1) { //выключили все
    j=1; //digitalWrite(LED_IND_R,HIGH);
    k=1; //digitalWrite(LED_IND_G,HIGH);
    l=0; //digitalWrite(LED_IND_B,LOW); //включили синию индикацию
    a=0; //expander.digitalWrite(0,LOW); //выкл трехходовой
    b=0;} //expander.digitalWrite(1,LOW);} //выкл насос
  if(BR==2) { //1 режим полов, еле греем
    k=0; //digitalWrite(LED_IND_G,LOW); //включили зеленую индикацию
    l=1; //digitalWrite(LED_IND_B,HIGH);
    if(TempHause<=15) b=1; //expander.digitalWrite(1,HIGH); //включили насос 
    if(TempHause>15) b=0; //expander.digitalWrite(1,LOW); //выключили насос
  if(TempPol<=33 && TempHause<14) {
    a=1; //expander.digitalWrite(0,HIGH); // греем
    j=0; //digitalWrite(LED_IND_R,LOW); //добавили красный, получили индикатор желтый
    warms=1;}
  if(TempPol>33 || TempHause>=14) { // нагрели, выкл
    a=0; //expander.digitalWrite(0,LOW);
    j=1; //digitalWrite(LED_IND_R,HIGH);
    warms=0;}}
  if(BR==3) { //2 режим полов, греем конфортно
    j=0; //digitalWrite(LED_IND_R,LOW); //включили красную индикацию
    k=1; //digitalWrite(LED_IND_G,HIGH);
    l=1; //digitalWrite(LED_IND_B,HIGH);
    b=1; //expander.digitalWrite(1,1);
  if(TempPol<=45 && TempHause<20) {
    a=1; //expander.digitalWrite(0,HIGH); //греем
    warms=1;}
  if(TempPol>45 || TempHause>=20) {
    a=0; //expander.digitalWrite(0,LOW); //нагрели выкл
    warms=0;}}}
    
void FanSpeed(){ //вентиляция
  if (digitalRead(BUTTON_F)==LOW) press_F=1;
  else press_F=0;
  if (press_F==1 && flagF==0) flagF=1; 
  if (press_F==0 && flagF==1 && flagFb==0){
    if (flagCH==1) BS=0; //если нажаты вместе кнопки вентиляции и вытяжка глушителя, вкл. диагностику
    if (flagCH==0 && BS==4){ //если диагностика выкл., то работаем как кнопка вентиляции
      BF++;
      if (BF>4) BF=1;} //ограничеваем 4 режимами, если дощло до 5 возращаем на 1 режим 
    flagFb = 1;
    timerF = 0;}
  if (timerF >=2 && flagF == 1 && flagFb==1){
    flagFb = 0;
    flagF = 0;
    timerF = 0;}
  if( BF==1){ //не работает, все выкл
    Fan=0;
    flagFS=0;
    flagFSb=0;
    n=1; // закрыли заслонку
    m=255; //digitalWrite(FAN_SPED,HIGH);
    q=1; //digitalWrite(LED_IND_FAN,HIGH);
    s=0; //digitalWrite(HEATING_ELEMENT_OUT,LOW);
    d=1; //expander.digitalWrite(3,HIGH); //выключили 1 скорость
    f=1; //expander.digitalWrite(4,HIGH); //выключили 2 скорост
    e=1;} //expander.digitalWrite(5,HIGH); //выключили 3 скорость
  if (BF==2){ //1 скорость
    d=0; //expander.digitalWrite(3,LOW); //включили 1 скорость
    if(flagFSb==0) { //холодный пуск
      m=0; //digitalWrite(FAN_SPED,LOW);
      timerFS=0;
      flagFSb=1;}
    if (timerFS>24) flagFS=1;
    if(flagFS==1) m=33; //analogWrite(FAN_SPED,33);
    Fan=4;
    f=1; //expander.digitalWrite(4,HIGH); //выключили 2 скорость
    e=1;} //expander.digitalWrite(5,HIGH); //выключили 3 скорость
  if (BF==3){ //2 скорость
    f=0; //expander.digitalWrite(4,LOW); //включили 2 скорость
    Fan=5;
    m=23; //analogWrite(FAN_SPED,23);
    d=1; //expander.digitalWrite(3,HIGH); //выключили 1 скорость
    e=1;} //expander.digitalWrite(5,HIGH);//выключили 3 скорость
  if (BF==4){ //3 скорость, максимальная
    e=0; //expander.digitalWrite(5,LOW); //включили 3 скорость
    Fan=6;
    m=10; //analogWrite(FAN_SPED,10);
    d=1; //expander.digitalWrite(3,HIGH); //выключили 1 скорость
    f=1;} //expander.digitalWrite(4,HIGH); //выключили 2 скорость 
  if (Fan!=0) {
    if (BR==1) {
      if (Humidity >50){ // большая влажност греем
        if (timerDSB==3) q=1; //digitalWrite(LED_IND_FAN,HIGH);
        if (timerDSB==4) q=0; //digitalWrite(LED_IND_FAN,LOW);
        s=1;} //digitalWrite(HEATING_ELEMENT_OUT,HIGH);}
      if (Humidity <50){ // подсохло не греем
        s=0; //digitalWrite(HEATING_ELEMENT_OUT,LOW);
        q=0;}} //digitalWrite(LED_IND_FAN,LOW)
    if (BR==2) {
      if (TempHause <=14){ // моргаем индикатором и греем 
        if (timerDSB==3) q=1; //digitalWrite(LED_IND_FAN,HIGH);
        if (timerDSB==4) q=0; //digitalWrite(LED_IND_FAN,LOW);
        s=1;} //digitalWrite(HEATING_ELEMENT_OUT,HIGH);}
      if (TempHause >14) { //горит индикатор и не греем
        s=0; //digitalWrite(HEATING_ELEMENT_OUT,LOW);
        q=0;}} //digitalWrite(LED_IND_FAN,LOW);}
    if (BR==3) {
      if (TempHause <=20) { // моргаем индикатором и греем 
        if (timerDSB==3) q=1; //digitalWrite(LED_IND_FAN,HIGH);
        if (timerDSB==4) q=0; //digitalWrite(LED_IND_FAN,LOW);
        s=1;} //digitalWrite(HEATING_ELEMENT_OUT,HIGH);}
      if (TempHause >20) { //горит индикатор и не греем
        q=0; //digitalWrite(LED_IND_FAN,LOW);
        s=0;}}}} //digitalWrite(HEATING_ELEMENT_OUT,LOW);}}
    
void DS18B20(){
  byte data[12];
  if (timerDSB>2 && flagDR==0){ // сделали 1 секунды
    ds.reset();
    ds.write(0xCC); //Обращение ко всем датчикам
    ds.write(0x44); //Команда на конвертацию
    flagDR=1;}
  if (timerDSB>7 && flagDR==1){ //сделали 2 секунды
    ds.reset();
    ds.select(pol);    
    ds.write(0xBE); // Read Scratchpad (чтение регистров)
    for (byte p = 0; p < 9; p++) 
     { //  нам нужно 9 байт (с сотыми после запятой)
        data[p] = ds.read ();}
     if (OneWire::crc8(data, 8) == data[8]){  //проверяем CRC  
         TempPol = ((data[1] << 8) | data[0]) /16.0; //прочитаны 2 байта 
         errTP=0;}     
      else { //ошибка
        TP ++;
        errTP ++;
        if (errTP>2) BS=5;}
        // получение с 2-го датчика
     ds.reset();
     ds.select(air);   
     ds.write(0xBE); // Read Scratchpad (чтение регистров)
     for (byte a = 0; a < 9; a++) 
      { //  нам нужно 9 байт (с сотыми после запятой)
         data[a] = ds.read ();}
     if (OneWire::crc8(data, 8) == data[8]){  //проверяем CRC  
         TempAir = ((data[1] << 8) | data[0]) /16.0; //прочитаны 2 байта
         errTA=0;} 
     else { //ошибка
       TA ++;
       errTA ++;
       if (errTA>2) BS=6;}       
        // получение с 3-го датчика
     ds.reset();
     ds.select(stove);   
     ds.write(0xBE); // Read Scratchpad (чтение регистров)
     for (byte s = 0; s < 9; s++) 
       { //  нам нужно 9 байт (с сотыми после запятой)
          data[s] = ds.read ();}
     if (OneWire::crc8(data, 8) == data[8]){  //проверяем CRC  
         TempStove = ((data[1] << 8) | data[0]) /16.0; //прочитаны 2 байта
         errTS=0;}
     else { //ошибка
       TS ++;
       errTS ++;
       if (errTS>2) BS=7;}
     timerDSB=0; flagDR=0;}
//=================DHT==============================
  if (timerDSB==5) dht=0;
  if (timerDSB>=6 && dht==0){
    int hum1 = 0, temp1 = 0;
    if(readingDHT(DHT_pin)){   //если контрольная сумма верна
      hum1 = (data[0] << 8) | data[1];//считаем Н и Т датчика
      temp1 = ((data[2] & 0x7F) << 8) | data[3];
      if(data[2] & 0x80)  temp1 *= -1;
      errTH=0;
    }else{
      //ошибка DHT1
      TH ++;
      errTH ++;
      if (errTH>2) BS=8;}
     TempHause = temp1/10;
     Humidity = hum1/10;
     dht=1; }
}

void WITHDRAWAI() {
  if (j==0 && flagJ==0) { digitalWrite(LED_IND_R, LOW); flagJ=1;}
  if (j==1 && flagJ==1) { digitalWrite(LED_IND_R, HIGH); flagJ=0;} 
  if (k==0 && flagK==0) { digitalWrite(LED_IND_G, LOW); flagK=1;}
  if (k==1 && flagK==1) { digitalWrite(LED_IND_G, HIGH); flagK=0;}
  if (l==0 && flagL==0) { digitalWrite(LED_IND_B, LOW); flagL=1;}
  if (l==1 && flagL==1) { digitalWrite(LED_IND_B, HIGH); flagL=0;}
  if (n==0 && flagN==0) { digitalWrite(DAMPER_ON, LOW); flagN=1;}
  if (n==1 && flagN==1) { digitalWrite(DAMPER_ON, HIGH); flagN=0;}
  if (o==0 && flagO==0) { digitalWrite(DAMPER_OFF, LOW); flagO=1;}
  if (o==1 && flagO==1) { digitalWrite(DAMPER_OFF, HIGH); flagO=0;}
  if (p==0 && flagP==0) { digitalWrite(LED_IND_CH, LOW); flagP=1;}
  if (p==1 && flagP==1) { digitalWrite(LED_IND_CH, HIGH); flagP=0;}
  if (q==0 && flagQ==0) { digitalWrite(LED_IND_FAN, LOW); flagQ=1;}
  if (q==1 && flagQ==1) { digitalWrite(LED_IND_FAN, HIGH); flagQ=0;}
  if (r==0 && flagR==0) { digitalWrite(FAN_CH, LOW); flagR=1;}
  if (r==1 && flagR==1) { digitalWrite(FAN_CH, HIGH); flagR=0;}
  if (s==0 && flagS==0) { digitalWrite(HEATING_ELEMENT_OUT, LOW); flagS=1;}
  if (s==1 && flagS==1) { digitalWrite(HEATING_ELEMENT_OUT, HIGH); flagS=0;}
  if (m>0 && m<255 && mflag!=m) {analogWrite(FAN_SPED, m); mflag=m;}
  if (m==0 && flagM==1) { digitalWrite(FAN_SPED, LOW); flagM=0;}
  if (m==255 && flagM==0) { digitalWrite(FAN_SPED, HIGH); flagM=1;}
  //выходы на PCF8574
  y=(h*128)+(g*64)+(e*32)+(f*16)+(d*8)+(c*4)+(b*2)+(a*1);
  if (change!=y) { 
    Wire.beginTransmission(0x20);
    Wire.write(y);
    Wire.endTransmission();
    change=y;}
}

ISR (WDT_vect){ //вектор прерывания WD
  timerDSB++; // таймер датчика температуры
  timerF++; // таймер кгопки вентиляторов
  timerR++;  //таймер кнопки пола
  timerCH++; //таймер кнопки вентилятора CH
  timerFS++; //таймер холодного пуска вентидятора вытяжки
  timerDP++; //таймер ошибок
}

 

mrtester
Offline
Зарегистрирован: 26.02.2015

Надо добавить диагностику электро моторов по току.