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

shAAde

✩✩✩✩✩✩✩
24 Окт 2024
38
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
пришло - Авто вентиляция отключена (это вообще не должно приходить)
и сразу пришло - Авто вентиляция включена (это в принципе пришло верно)

Сменил пин 9 на пин 8 ..... не помогло

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;

}
}


}


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

Ну это же инверсно получается ?????
 

Nitrogenium

✩✩✩✩✩✩✩
25 Ноя 2022
33
3
Кака какя-то... Ты использовал функцию digitalRead а там оказалось что-то не то? Давай начнем с того, а что ты там собирался увидеть? А?
 

shAAde

✩✩✩✩✩✩✩
24 Окт 2024
38
0
@Nitrogenium, Ну я читаю пин и если там высокий уровень, то пишу одно, если низки - то другое ...
 

Nitrogenium

✩✩✩✩✩✩✩
25 Ноя 2022
33
3
@shAAde, Дык в чем проблема? Ты считаешь что функция digitaRead не вполне корректно работает?
Если не устраивает функция, можешь напрямую обратиться к пину порта через регстр. Например (PINA>>0)&1;
 

shAAde

✩✩✩✩✩✩✩
24 Окт 2024
38
0
На этом пине сидит светодиод. Я глазами вижу что он горит ... посылаю команду и он гаснет, а текст при это выводится как будто он загорелся ....

(PINA>>0)&1; Это в If нужно вставлять?
 

Nitrogenium

✩✩✩✩✩✩✩
25 Ноя 2022
33
3
@shAAde,
(PINA>>0)&1; Это в If нужно вставлять?
Можно и туда вставить, предварительно заключив в скобки ((PINA>>0)&1)

Например, для Ардуино Нано, 9-й пин это первый пин порта B. Будет выглядеть ((PINB>>1)&1);
8й пин - нулевой пин порта B. Это даже выглядит как PINB&1;

То есть сдвигаем в нулевую позицию и сравниваем (делаем &) с единицей. Если там 1, значит будет true (HIGH)
 

shAAde

✩✩✩✩✩✩✩
24 Окт 2024
38
0
У меня VOSTOK UNO )))

Но не суть, сейчас попробую ... Да и вообще странно. Кусок кода выше, полностью идентичен для других пинов .... наверное где-то у меня в коде есть ошибка, если по сути погасший светодиод на пине, все равно выдает высокий уровень на нем ...

C++:
    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;
Вот все тоже самое, но работает нормально
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
611
145
если по сути погасший светодиод на пине, все равно выдает высокий уровень на нем
А при погасшем светодиоде на пине точно 0? Может там 1? Мультиметром не тыкали в него? Мало ли, как там тот Vostok uno устроен, информации по нему очень мало, а ценник запредельный.
 
Изменено:

shAAde

✩✩✩✩✩✩✩
24 Окт 2024
38
0
@viktor1703, Ну нет, не замерял) А что считается HIGH? Если там выше скольки вольт?