Прошу помощи с исполнением команд по SERIAL

shAAde

✩✩✩✩✩✩✩
24 Окт 2024
31
0
C++:
#include <EncButton.h>
#include <DHT22.h>
#include <LCD_I2C.h>

Button btn1(14); // подключаем кнопку 1 на пин 14 (Обогрев)
Button btn2(15); // подключаем кнопку 1 на пин 15 (Свет (РУНН/РУВН))
Button btn3(16); // подключаем кнопку 1 на пин 16 (Свет (Т1))
Button btn4(17); // подключаем кнопку 1 на пин 17 (Свет (Т2))
Button btn5(10); // подключаем кнопку 1 на пин 10 (Вентиляция)

unsigned long last_read=millis(), period_read=8000; //Это параметры организации цикла измерения температуры и влажности (1000 = 1 сек)
unsigned long last_yes=millis(), period_yes=20000; //Это параметры организации цикла задержки включения вентиляции и отопления (1000 = 1 сек)

LCD_I2C lcd(0x27, 16, 2); // Default address of most PCF8574 modules, change according

const int maxMoisture=30; //максимальная влажность
const int minTemperature=10; //минимальня температура

int LPB1=0;
int LPB2=0;

float t1;
float h1;

#define pinDATA 6 // объявление пина для датчика температуры и влажности

DHT22 dht22(pinDATA); //выбор датчика типа DHT

void setup()
{
pinMode(11, OUTPUT); // пин как выход для светодиода 1 (Автоотопление)
pinMode(9, OUTPUT); // пин как выход для светодиода 5 (Автовентиляция)
pinMode(14, INPUT); // пин как вход для кнопки 1 (Отопление)
pinMode(15, INPUT); // пин как вход для кнопки 2 Свет РУНН РУВН
pinMode(16, INPUT); // пин как вход для кнопки 3 Свет Т1
pinMode(17, INPUT); // пин как вход для кнопки 4 Свет Т2
pinMode(10, INPUT); // пин как вход для кнопки 5 (Вентиляция)
pinMode(5, OUTPUT); // пин как выход для реле 1 (Отопление)
pinMode(4, OUTPUT); // пин как выход для реле 2 Свет РУНН РУВН
pinMode(3, OUTPUT); // пин как выход для реле 3 Свет Т1
pinMode(2, OUTPUT); // пин как выход для реле 4 Свет Т2
pinMode(7, OUTPUT); // пин как выход для реле 5 (Вентиляция)
//pinMode(6, OUTPUT); занят датчиком температуры и влажности
  Serial.begin(9600);
  lcd.begin(); // Инициализируем экран, включаем подсветку
  lcd.backlight();
  //Устанавливаем положение курсора для первой строки.
  lcd.home();
  //выводим строку 1
  lcd.print("Welcome!");
  //выводим строку 2
  lcd.setCursor(0, 1);
  lcd.print("AO Sam. Transf.");
  Serial.println("");
  //Serial.println([B]FILE[/B]);
  Serial.print("DATA VERSION: 1");
  // Serial.println(DHTSTABLE_LIB_VERSION);
  Serial.println("");
  Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
  //Serial.println("");
  //Serial.print("Авто обогрев включен"); // Само действие при длинном нажатии
  digitalWrite(11, HIGH);
  LPB1=1;
  digitalWrite(9, HIGH);
  LPB2=1;
}


void loop()
{

if(millis()-last_read>period_read)
{ last_read=millis();  //Если работа модуля очень длительная, то тип last_read надо изменить!

float h = dht22.getHumidity(); //Измеряем влажность
  float t = dht22.getTemperature(); //Измеряем температуру
  if (isnan(h) || isnan(t))  // Проверка. Если не удается считать показания, выводится «Ошибка считывания», и программа завершает работу
  {
    Serial.println("Ошибка считывания с датчика DHT");
    return;
  }
  t1=t;
  h1=h;
  //Вывод показателей на экран
  //Устанавливаем положение курсора для первой строки.
  lcd.home();
  //выводим строку 1
  lcd.print("Temp.: ");
  lcd.print(t);
  lcd.print(" *C ");
  //выводим строку 2
  lcd.setCursor(0, 1);
  lcd.print("Humid.: ");
  lcd.print(h);
  lcd.print(" %");
 }

// опрос кнопок происходит здесь
btn1.tick();
btn2.tick();
btn3.tick();
btn4.tick();
btn5.tick();

// клик по кнопке 1
if (btn1.click())
{
  digitalWrite(5, !digitalRead(5));
  digitalWrite(11, LOW);
  LPB1=0;
}
// удержание кнопки 1
if (btn1.hold())
{
//Serial.println("btn 1 holded!");
digitalWrite(5, LOW);
digitalWrite(11, !digitalRead(11));
LPB1=1;
last_yes=millis();
}
// клик по кнопке 2
if (btn2.click())
{
  digitalWrite(4, !digitalRead(4));
}
// клик по кнопке 3
if (btn3.click())
{
  digitalWrite(3, !digitalRead(3));
}
// клик по кнопке 4
if (btn4.click())
{
  digitalWrite(2, !digitalRead(2));
}
// клик по кнопке 5
if (btn5.click())
{
  digitalWrite(7, !digitalRead(7));
  digitalWrite(9, LOW);
  LPB2=0;
}
// удержание кнопки 5
if (btn5.hold())
{
//Serial.println("btn 5 holded!");
digitalWrite(7, LOW);
digitalWrite(9, !digitalRead(9));
LPB2=1;
last_yes=millis();
}
//Автоотопление
if(dht22.getTemperature()<minTemperature&&digitalRead(11)==HIGH&&millis()-last_yes>period_yes&&LPB1==1)
        {
          last_yes=millis();
            digitalWrite(5, HIGH);
            LPB1=0;
        }
      
if(dht22.getTemperature()>minTemperature&&digitalRead(11)==HIGH&&millis()-last_yes>period_yes&&LPB1==0)
        {
            last_yes=millis();
            digitalWrite(5,LOW);
            LPB1=1;
         }
if(digitalRead(11)==LOW&&LPB1==1)
        {
            digitalWrite(5,LOW);
            LPB1=0;
         }



//Автовентиляция
if(dht22.getHumidity()>maxMoisture&&digitalRead(9)==HIGH&&millis()-last_yes>period_yes&&LPB2==1)
        {
          last_yes=millis();
            digitalWrite(7, HIGH);
            LPB2=0;
        }
      
if(dht22.getHumidity()<maxMoisture&&digitalRead(9)==HIGH&&millis()-last_yes>period_yes&&LPB2==0)
        {
            last_yes=millis();
            digitalWrite(7,LOW);
            LPB2=1;
         }
if(digitalRead(9)==LOW&&LPB2==1)
        {
            digitalWrite(7,LOW);
            LPB2=0;
         }

//Вывод данных в сериал порт при отправке i
if (Serial.available())
{
  char c = Serial.read() ;
   switch (c) {
    case 'i' :
    //Serial.println("");
    //Serial.println("");
     Serial.println("Данные о состоянии:");
     Serial.print("Температура: ");
     Serial.print(t1);
     Serial.print(" *C ");
     Serial.println("");
     Serial.print("Влажность: ");
     Serial.print(h1);
     Serial.println(" %\t");

     if(digitalRead(5)==LOW)
      {
        //Serial.println("");
        Serial.println("Нагреватель отключен");
       }
     if(digitalRead(5)==HIGH)
      {
        //Serial.println("");
        Serial.println("Нагреватель включен");
       }


     if(digitalRead(11)==LOW)
      {
        //Serial.println("");
        Serial.println("Авто отопление отключено");
       }
     if(digitalRead(11)==HIGH)
      {
        //Serial.println("");
        Serial.println("Авто отопление включено");
       }



      if(digitalRead(7)==LOW)
      {
        //Serial.println("");
        Serial.println("Вентилятор отключен (закрыты жалюзи)");
       }
     if(digitalRead(7)==HIGH)
      {
        //Serial.println("");
        Serial.println("Вентилятор включен (открыты жалюзи)");
       }



     if(digitalRead(9)==LOW)
      {
        //Serial.println("");
        Serial.println("Авто вентиляция отключена");
       }
     if(digitalRead(9)==HIGH)
      {
        //Serial.println("");
        Serial.println("Авто вентиляция включена");
       }




     if(digitalRead(4)==LOW)
      {
        //Serial.println("");
        Serial.println("Свет РУНН(РУВН) отключен");
       }
     if(digitalRead(4)==HIGH)
      {
        //Serial.println("");
        Serial.println("Свет РУНН(РУВН) включен");
       }




     if(digitalRead(3)==LOW)
      {
        //Serial.println("");
        Serial.println("Свет T1 отключен");
       }
     if(digitalRead(3)==HIGH)
      {
        //Serial.println("");
        Serial.println("Свет T1 включен");
       }




     if(digitalRead(2)==LOW)
      {
        //Serial.println("");
        Serial.println("Свет T2 отключен");
       }
     if(digitalRead(2)==HIGH)
      {
        //Serial.println("");
        Serial.println("Свет T2 включен");
       }       
    break;
    case 't' :
     digitalWrite(5, LOW);
     digitalWrite(11, !digitalRead(11));
     LPB1=1;
     last_yes=millis();
     //Serial.println("Исполнено");

     if(digitalRead(11)==LOW)
      {
        //Serial.println("");
        Serial.println("Авто отопление отключено");
       }
     if(digitalRead(11)==HIGH)
      {
        //Serial.println("");
        Serial.println("Авто отопление включено");
       }

    break;

    case 'h' :
     digitalWrite(7, LOW);
     digitalWrite(9, !digitalRead(9));
     LPB2=1;
     last_yes=millis();
     //Serial.println("Исполнено");

     if(digitalRead(9)==LOW)
      {
        //Serial.println("");
        Serial.println("Авто вентиляция отключена");
       }
     if(digitalRead(9)==HIGH)
      {
        //Serial.println("");
        Serial.println("Авто вентиляция включена");
       }

    break;

}
}


}
По умолчанию (в setup) Авто отопление и Авто вентиляция включены!

Собственно в строках 322-340 проблема

При отправке "t" все работает корректно для Авто отопления
Отправил t
пришло - Авто отопление отключено
Отправил t
пришло - Авто отопление включено

А вот с точно таким же кодом на Авто вентиляцию все не так .....
Отправил h
пришло - Авто вентиляция включена (но должен написать что Авто вентиляция отключена)
Отправил h
пришло - Авто вентиляция отключена (это вообще не должно приходить)
и сразу пришло - Авто вентиляция включена (это в принципе пришло верно)
 

shAAde

✩✩✩✩✩✩✩
24 Окт 2024
31
0
C++:
#include <EncButton.h>
#include <DHT22.h>
#include <LCD_I2C.h>

Button btn1(14); // подключаем кнопку 1 на пин 14 (Обогрев)
Button btn2(15); // подключаем кнопку 1 на пин 15 (Свет (РУНН/РУВН))
Button btn3(16); // подключаем кнопку 1 на пин 16 (Свет (Т1))
Button btn4(17); // подключаем кнопку 1 на пин 17 (Свет (Т2))
Button btn5(10); // подключаем кнопку 1 на пин 10 (Вентиляция)

unsigned long last_read=millis(), period_read=8000; //Это параметры организации цикла измерения температуры и влажности (1000 = 1 сек)
unsigned long last_yes=millis(), period_yes=20000; //Это параметры организации цикла задержки включения вентиляции и отопления (1000 = 1 сек)

LCD_I2C lcd(0x27, 16, 2); // Default address of most PCF8574 modules, change according

const int maxMoisture=30; //максимальная влажность
const int minTemperature=10; //минимальня температура

int LPB1=0;
int LPB2=0;
int hhh=0;

float t1;
float h1;

#define pinDATA 6 // объявление пина для датчика температуры и влажности

DHT22 dht22(pinDATA); //выбор датчика типа DHT

void setup()
{
pinMode(11, OUTPUT); // пин как выход для светодиода 1 (Автоотопление)
pinMode(8, OUTPUT); // пин как выход для светодиода 5 (Автовентиляция)
pinMode(14, INPUT); // пин как вход для кнопки 1 (Отопление)
pinMode(15, INPUT); // пин как вход для кнопки 2 Свет РУНН РУВН
pinMode(16, INPUT); // пин как вход для кнопки 3 Свет Т1
pinMode(17, INPUT); // пин как вход для кнопки 4 Свет Т2
pinMode(10, INPUT); // пин как вход для кнопки 5 (Вентиляция)
pinMode(5, OUTPUT); // пин как выход для реле 1 (Отопление)
pinMode(4, OUTPUT); // пин как выход для реле 2 Свет РУНН РУВН
pinMode(3, OUTPUT); // пин как выход для реле 3 Свет Т1
pinMode(2, OUTPUT); // пин как выход для реле 4 Свет Т2
pinMode(7, OUTPUT); // пин как выход для реле 5 (Вентиляция)
//pinMode(6, OUTPUT); занят датчиком температуры и влажности
  Serial.begin(9600);
  lcd.begin(); // Инициализируем экран, включаем подсветку
  lcd.backlight();
  //Устанавливаем положение курсора для первой строки.
  lcd.home();
  //выводим строку 1
  lcd.print("Welcome!");
  //выводим строку 2
  lcd.setCursor(0, 1);
  lcd.print("AO Sam. Transf.");
  Serial.println("");
  //Serial.println(__FILE__);
  Serial.print("DATA VERSION: 1");
  // Serial.println(DHTSTABLE_LIB_VERSION);
  Serial.println("");
  Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
  //Serial.println("");
  //Serial.print("Авто обогрев включен"); // Само действие при длинном нажатии
  digitalWrite(11, HIGH);
  LPB1=1;
  digitalWrite(8, HIGH);
  LPB2=1;
  hhh=1;
}


void loop()
{

if(millis()-last_read>period_read)
{ last_read=millis();  //Если работа модуля очень длительная, то тип last_read надо изменить!

float h = dht22.getHumidity(); //Измеряем влажность
  float t = dht22.getTemperature(); //Измеряем температуру
  if (isnan(h) || isnan(t))  // Проверка. Если не удается считать показания, выводится «Ошибка считывания», и программа завершает работу
  {
    Serial.println("Ошибка считывания с датчика DHT");
    return;
  }
  t1=t;
  h1=h;
  //Вывод показателей на экран
  //Устанавливаем положение курсора для первой строки.
  lcd.home();
  //выводим строку 1
  lcd.print("Temp.: ");
  lcd.print(t);
  lcd.print(" *C ");
  //выводим строку 2
  lcd.setCursor(0, 1);
  lcd.print("Humid.: ");
  lcd.print(h);
  lcd.print(" %");
 }

// опрос кнопок происходит здесь
btn1.tick();
btn2.tick();
btn3.tick();
btn4.tick();
btn5.tick();

// клик по кнопке 1
if (btn1.click())
{
  digitalWrite(5, !digitalRead(5));
  digitalWrite(11, LOW);
  LPB1=0;
}
// удержание кнопки 1
if (btn1.hold())
{
//Serial.println("btn 1 holded!");
digitalWrite(5, LOW);
digitalWrite(11, !digitalRead(11));
LPB1=1;
last_yes=millis();
}
// клик по кнопке 2
if (btn2.click())
{
  digitalWrite(4, !digitalRead(4));
}
// клик по кнопке 3
if (btn3.click())
{
  digitalWrite(3, !digitalRead(3));
}
// клик по кнопке 4
if (btn4.click())
{
  digitalWrite(2, !digitalRead(2));
}
// клик по кнопке 5
if (btn5.click())
{
  digitalWrite(7, !digitalRead(7));
  digitalWrite(8, LOW);
  LPB2=0;
  hhh=0;
}
// удержание кнопки 5
if (btn5.hold())
{
//Serial.println("btn 5 holded!");
digitalWrite(7, LOW);
digitalWrite(8, !digitalRead(8));
LPB2=1;
if (digitalRead(8)==HIGH)
{hhh=1;}
if (digitalRead(8)==LOW)
{hhh=0;}
last_yes=millis();
}
//Автоотопление
if(dht22.getTemperature()<minTemperature&&digitalRead(11)==HIGH&&millis()-last_yes>period_yes&&LPB1==1)
        {
          last_yes=millis();
            digitalWrite(5, HIGH);
            LPB1=0;
        }
      
if(dht22.getTemperature()>minTemperature&&digitalRead(11)==HIGH&&millis()-last_yes>period_yes&&LPB1==0)
        {
            last_yes=millis();
            digitalWrite(5,LOW);
            LPB1=1;
         }
if(digitalRead(11)==LOW&&LPB1==1)
        {
            digitalWrite(5,LOW);
            LPB1=0;
         }



//Автовентиляция
if(dht22.getHumidity()>maxMoisture&&digitalRead(8)==HIGH&&millis()-last_yes>period_yes&&LPB2==1)
        {
          last_yes=millis();
            digitalWrite(7, HIGH);
            LPB2=0;
        }
      
if(dht22.getHumidity()<maxMoisture&&digitalRead(8)==HIGH&&millis()-last_yes>period_yes&&LPB2==0)
        {
            last_yes=millis();
            digitalWrite(7,LOW);
            LPB2=1;
         }
if(digitalRead(8)==LOW&&LPB2==1)
        {
            digitalWrite(7,LOW);
            LPB2=0;
         }

//Вывод данных в сериал порт при отправке i
if (Serial.available())
{
  char c = Serial.read() ;
   switch (c) {
    case 'i' :
    //Serial.println("");
    //Serial.println("");
     Serial.println("Данные о состоянии:");
     Serial.print("Температура: ");
     Serial.print(t1);
     Serial.print(" *C ");
     Serial.println("");
     Serial.print("Влажность: ");
     Serial.print(h1);
     Serial.println(" %\t");

     if(digitalRead(5)==LOW)
      {
        //Serial.println("");
        Serial.println("Нагреватель отключен");
       }
     if(digitalRead(5)==HIGH)
      {
        //Serial.println("");
        Serial.println("Нагреватель включен");
       }


     if(digitalRead(11)==LOW)
      {
        //Serial.println("");
        Serial.println("Авто отопление отключено");
       }
     if(digitalRead(11)==HIGH)
      {
        //Serial.println("");
        Serial.println("Авто отопление включено");
       }



      if(digitalRead(7)==LOW)
      {
        //Serial.println("");
        Serial.println("Вентилятор отключен (закрыты жалюзи)");
       }
     if(digitalRead(7)==HIGH)
      {
        //Serial.println("");
        Serial.println("Вентилятор включен (открыты жалюзи)");
       }



     if(digitalRead(8)==LOW)
      {
        //Serial.println("");
        Serial.println("Авто вентиляция отключена");
       }
     if(digitalRead(8)==HIGH)
      {
        //Serial.println("");
        Serial.println("Авто вентиляция включена");
       }




     if(digitalRead(4)==LOW)
      {
        //Serial.println("");
        Serial.println("Свет РУНН(РУВН) отключен");
       }
     if(digitalRead(4)==HIGH)
      {
        //Serial.println("");
        Serial.println("Свет РУНН(РУВН) включен");
       }




     if(digitalRead(3)==LOW)
      {
        //Serial.println("");
        Serial.println("Свет T1 отключен");
       }
     if(digitalRead(3)==HIGH)
      {
        //Serial.println("");
        Serial.println("Свет T1 включен");
       }




     if(digitalRead(2)==LOW)
      {
        //Serial.println("");
        Serial.println("Свет T2 отключен");
       }
     if(digitalRead(2)==HIGH)
      {
        //Serial.println("");
        Serial.println("Свет T2 включен");
       }       
    break;
    case 't' :
     digitalWrite(5, LOW);
     digitalWrite(11, !digitalRead(11));
     LPB1=1;
     last_yes=millis();
     //Serial.println("Исполнено");

     if(digitalRead(11)==LOW)
      {
        //Serial.println("");
        Serial.println("Авто отопление отключено");
       }
     if(digitalRead(11)==HIGH)
      {
        //Serial.println("");
        Serial.println("Авто отопление включено");
       }

    break;

    case 'h' :
     digitalWrite(7, LOW);
     digitalWrite(8, !digitalRead(8));
     LPB2=1;
     if (digitalRead(8)==HIGH)
     {hhh=1;}
     if (digitalRead(8)==LOW)
     {hhh=0;}
     last_yes=millis();
     //Serial.println("Исполнено");

     if(hhh==1)  // Бл... ну почему????
      {
        //Serial.println("");
        Serial.println("Авто вентиляция отключена");  // Бл... ну почему????
       }
     if(hhh==0)  // Бл... ну почему????
      {
        //Serial.println("");
        Serial.println("Авто вентиляция включена");  // Бл... ну почему????
       }

    break;

}
}


}


Я не понимаю ..... но вот так заработало ......