Простой вопрос по Сериал Рид

shAAde

✩✩✩✩✩✩✩
24 Окт 2024
42
1
C++:
if (Serial.available())
    {
      val = Serial.read();
      if (val = 'AUTOFUN')
      {
        //Serial.println("");
        Serial.print("Авто вентиляция включено");
        digitalWrite(10,HIGH);
        LONGPRESSBUT1=1;
      }
    }
Почему "Авто вентиляция включено" прописывается несколько раз ....
 

shAAde

✩✩✩✩✩✩✩
24 Окт 2024
42
1
Если нужно вот весь код:

C++:
#include <LCD_1602_RUS.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <SoftwareSerial.h>
#include <Wire.h>

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

unsigned long last_yes=millis(), period_yes=100000; //Это параметры организации цикла задержки включения вентиляции и отопления

LCD_1602_RUS lcd(0x27, 16, 2);
// int knopka1=0;
//int knopka2=0;
int knopka3=0;
const int maxMoisture=50; //максимальная влажность
const int minTemperature=10; //минимальня температура
int LONGPRESSBUT1=0;
int LONGPRESSBUT2=0;
int val;

boolean button1  = false; //Переменная для хранения состояния кнопки1
boolean press_flag1 = false; //Флажок нажатия кнопки1
boolean long_press_flag1 = false; //Флажок долгого нажатия кнопки1
unsigned long last_press1 = 0; //Перемменная хранит момент последнего нажатия на кнопку1

boolean button2  = false; //Переменная для хранения состояния кнопки2
boolean press_flag2 = false; //Флажок нажатия кнопки2
boolean long_press_flag2 = false; //Флажок долгого нажатия кнопки2
unsigned long last_press2 = 0; //Перемменная хранит момент последнего нажатия на кнопку2

#define DHTPIN 6 //пин для получения сигнала от датчика DHT11

// Раскомментировать тип датчика, который используется
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);

void setup() 
  {
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(9, OUTPUT);
    Serial.begin(9600);
    Serial.println("Hello");
    dht.begin();
       lcd.init(); // Инициализируем экран, включаем подсветку
       lcd.backlight();
       //Устанавливаем положение курсора для первой строки.
       lcd.home();
       //выводим строку 1
       lcd.print("Welcome!");
       //выводим строку 2
       lcd.setCursor(0, 1);
       lcd.print("AO Sam. Transf.");

  }
void loop()
{

{

if (Serial.available())
    {
      val = Serial.read();
      if (val = 'AUTOFUN')
      {
        //Serial.println("");
        Serial.print("Авто вентиляция включено");
        digitalWrite(10,HIGH);
        LONGPRESSBUT1=1;
      }
    }


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

float h = dht.readHumidity(); //Измеряем влажность
  float t = dht.readTemperature(); //Измеряем температуру
  if (isnan(h) || isnan(t))  // Проверка. Если не удается считать показания, выводится «Ошибка считывания», и программа завершает работу
  {
    Serial.println("Ошибка считывания");
    return;
  }
  Serial.println("");
  Serial.print("Влажность: ");
  Serial.print(h);
  Serial.println(" %\t");
  Serial.print("Температура: ");
  Serial.print(t);
  Serial.print(" *C ");

  //Вывод показателей на экран
  //Устанавливаем положение курсора для первой строки.
  lcd.home();
  //выводим строку 1
  lcd.print("Темп.: ");
  lcd.print(t);
  lcd.print(" *C ");
  //выводим строку 2
  lcd.setCursor(0, 1);
  lcd.print("Влажн.: ");
  lcd.print(h);
  lcd.print(" %");
 }

button1 = digitalRead(14);

button2 = digitalRead(15);


// Все что касается Кнопки 1!!!!!!!!!!!!!!!!!
    if(button1==true&&press_flag1==false&&millis()-last_press1>100)//если кнопка нажата
  //флаг опущен и с последнего нажатия прошло не более 100 мсек, то ...
     {
       press_flag1 = !press_flag1; //Поднять флаг короткого нажатия на кнопку1
       last_press1 = millis(); //Присвоить текущее время переменной last_press1
     }
   if (button1 == true && press_flag1 == true && millis() - last_press1 > 1000 && LONGPRESSBUT1==0) {
   long_press_flag1 = !long_press_flag1;
   last_press1 = millis();
      Serial.println("");
      Serial.print("Авто вентиляция включено"); // Само действие при длинном нажатии
      LONGPRESSBUT1=1;
      digitalWrite(10,HIGH);
   }

   if (button1 == true && press_flag1 == true && millis() - last_press1 > 1000 && LONGPRESSBUT1==1) //если кнопка нажата
      {
        long_press_flag1 = !long_press_flag1;
        last_press1 = millis();
        Serial.println("");
        Serial.print("Авто вентиляция выключено"); // Само действие при длинном нажатии
        LONGPRESSBUT1=0;
          if (digitalRead(7)==HIGH)
           {
           digitalWrite(7,!digitalRead(7));
           }
        digitalWrite(10,LOW);
      }
     if (button1 == false && press_flag1 == true && long_press_flag1 == true) {
     press_flag1 = !press_flag1;
     long_press_flag1 = !long_press_flag1;
     }
     if (button1 == false && press_flag1 == true && long_press_flag1 == false) {
     press_flag1 = !press_flag1;
     digitalWrite(7,!digitalRead(7)); // Само действие при коротком нажатии
    Serial.println("");
    Serial.print("Вентиляция вкл/откл");
     LONGPRESSBUT1=0;
     digitalWrite(10,LOW);
     }
    if(button1==true&&press_flag1==false&&millis()-last_press1>100)//если кнопка нажата
  //и перемення knopka1 равна 0 и флаг опущен и с последнего нажатия прошло не более 100 мсек, то ...
     {
       press_flag1 = !press_flag1; //Поднять флаг короткого нажатия на кнопку1
       last_press1 = millis(); //Присвоить текущее время переменной last_press1
     }
   if (button1 == true && press_flag1 == true && millis() - last_press1 > 1000 && LONGPRESSBUT1==0) {
   long_press_flag1 = !long_press_flag1;
   last_press1 = millis();
      Serial.println("");
      Serial.print("Авто вентиляция выключено"); // Само действие при длинном нажатии
      LONGPRESSBUT1=1;
      digitalWrite(10,HIGH);
   }
// Все что касается Кнопки 2!!!!!!!!!!!!!!!!!
    if(button2==true&&press_flag2==false&&millis()-last_press2>100)//если кнопка нажата
  //и перемення knopka2 равна 0 и флаг опущен и с последнего нажатия прошло не более 100 мсек, то ...
     {
       press_flag2 = !press_flag2; //Поднять флаг короткого нажатия на кнопку2
       last_press2 = millis(); //Присвоить текущее время переменной last_press2
     }
   if (button2 == true && press_flag2 == true && millis() - last_press2 > 1000 && LONGPRESSBUT2==0) {
   long_press_flag2 = !long_press_flag2;
   last_press2 = millis();
      Serial.println("");
      Serial.print("Авто отопление включено"); // Само действие при длинном нажатии
      LONGPRESSBUT2=1;
      digitalWrite(11,HIGH);
   }

   if (button2 == true && press_flag2 == true && millis() - last_press2 > 1000 && LONGPRESSBUT2==1)
      {
        long_press_flag2 = !long_press_flag2;
        last_press2 = millis();
        Serial.println("");
        Serial.print("Авто отопление выключено"); // Само действие при длинном нажатии
        LONGPRESSBUT2=0;
          if (digitalRead(8)==HIGH)
           {
           digitalWrite(8,!digitalRead(8));
           }
        digitalWrite(11,LOW);
      }
     if (button2 == false && press_flag2 == true && long_press_flag2 == true) {
     press_flag2 = !press_flag2;
     long_press_flag2 = !long_press_flag2;
     }
     if (button2 == false && press_flag2 == true && long_press_flag2 == false) {
     press_flag2 = !press_flag2;
     digitalWrite(8,!digitalRead(8)); // Само действие при коротком нажатии
    Serial.println("");
    Serial.print("Отопление вкл/откл");
     LONGPRESSBUT2=0;
     digitalWrite(11,LOW);
     }
    if(button2==true&&press_flag2==false&&millis()-last_press2>100)//если кнопка нажата
  //и перемення knopka1 равна 0 и флаг опущен и с последнего нажатия прошло не более 100 мсек, то ...
     {
       press_flag2 = !press_flag2; //Поднять флаг короткого нажатия на кнопку2
       last_press2 = millis(); //Присвоить текущее время переменной last_press2
     }
   if (button2 == true && press_flag2 == true && millis() - last_press2 > 1000 && LONGPRESSBUT1==0) {
   long_press_flag2 = !long_press_flag2;
   last_press2 = millis();
      Serial.println("");
      Serial.print("Авто отопление включено"); // Само действие при длинном нажатии
      LONGPRESSBUT2=1;
      digitalWrite(11,HIGH);
   }
     // if(digitalRead(14)==LOW&&knopka1==1&&press_flag1==true)//если кнопка НЕ нажата
     //   if(button1==false&&press_flag1==true)//если кнопка НЕ нажата
     //и переменная knopka1 равна - 1 ,то ...
    
     // knopka1=0;//обнуляем переменную knopka1
     // press_flag1 = !press_flag1; //опустить флаг короткого нажатия на кнопку



 // if(digitalRead(15)==HIGH&&knopka2==0)//если кнопка нажата   
     // и перемення knopka2 равна 0 , то ...
 //    {
 //      digitalWrite(8,!digitalRead(8));
 //      knopka2=1;
        //это нужно для того что бы с каждым нажатием кнопки
        //происходило только одно действие
        // плюс защита от "дребезга"  100%
//     }
 //     if(digitalRead(15)==LOW&&knopka2==1)//если кнопка НЕ нажата
     //и переменная knopka2 равна - 1 ,то ...
 //    {
 //    knopka2=0;//обнуляем переменную knopka1
//     }
  if(digitalRead(16)==HIGH&&knopka3==0)//если кнопка нажата   
     // и перемення knopka3 равна 0 , то ...
     {
       digitalWrite(9,!digitalRead(9));
       knopka3=1;
        if(digitalRead(9)==LOW)
       {
       Serial.println("");
       Serial.print("Свет выключен");
       }
       if(digitalRead(9)==HIGH)
       {
       Serial.println("");
       Serial.print("Свет включен");
       }
      
        //это нужно для того что бы с каждым нажатием кнопки
        //происходило только одно действие
        // плюс защита от "дребезга"  100%
     }
      if(digitalRead(16)==LOW&&knopka3==1)//если кнопка НЕ нажата
     //и переменная knopka3 равна - 1 ,то ...
     {
     knopka3=0;//обнуляем переменную knopka3     
     }

//  Это все что касается кнопки1 (Автовентиляция) !!!!!
       // if(dht.readHumidity()>maxMoisture&&digitalRead(7)==LOW&&knopka1==0&&millis()-last_yes>period_yes)
        if(dht.readHumidity()>maxMoisture&&digitalRead(7)==LOW&&millis()-last_yes>period_yes&&LONGPRESSBUT1==1)
        {
          last_yes=millis();
            digitalWrite(7,!digitalRead(7));
            Serial.println("");
            Serial.print("Включен вентилятор");
           // knopka1=1;//включаем кнопку1
        }
       // if(dht.readHumidity()<maxMoisture&&digitalRead(7)==HIGH&&knopka1==0&&millis()-last_yes>period_yes)
        if(dht.readHumidity()<maxMoisture&&digitalRead(7)==HIGH&&millis()-last_yes>period_yes&&LONGPRESSBUT1==1)
        {
            last_yes=millis();
            digitalWrite(7,!digitalRead(7));
            Serial.println("");
            Serial.print("Выключен вентилятор");
           // knopka1=0;//включаем кнопку1
        }

//  Это все что касается кнопки2 (Автоотопление) !!!!!
        if(dht.readTemperature()<minTemperature&&digitalRead(8)==LOW&&millis()-last_yes>period_yes&&LONGPRESSBUT2==1)
        {
            last_yes=millis();
            digitalWrite(8,!digitalRead(8));
            Serial.println("");
            Serial.print("Включен конвектор");
        }
        if(dht.readTemperature()>minTemperature&&digitalRead(8)==HIGH&&millis()-last_yes>period_yes&&LONGPRESSBUT2==1)
        {
            last_yes=millis();
            digitalWrite(8,!digitalRead(8));
            Serial.println("");
            Serial.print("Выключен конвектор");
        }

}
}
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
476
137
При сравнении надо два знака равенства т.е. ==

Добавление. Вы неправильно используете
val = Serial.read();
Прочитайте, как надо. Например
И вы наверно неправильно используете кавычки, если хотите строку - кавычки должны быть двойные "AUTOFUN"
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
Знаки равенства тут конечно важно, но они не совсем причем. Присвоение всегда даст истину и отправит в тело условия.
1) Но val это целое число, и оно как может быть равно строке ?
2) read читает только одно значение типа байт. Если отправлять строку на ввод, например через монитор порта отправить AUTOFUN , то будет читаться от 7 до 9 символов в зависимости от выбранного типа конца строки. И на каждый из этих символов будет проверяться условие. Т.к. оно задано неверно (см пост от @Bruzzer и всегда выдают истину, то и выдает несколько надписей.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва

@shAAde,
Что бы строку сравнивать надо строку считывать. Считывать можно:
Serial.readString()
Serial.readStringUntil()
Для понимания курите мануал.
 

shAAde

✩✩✩✩✩✩✩
24 Окт 2024
42
1
C++:
#include <LCD_1602_RUS.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <SoftwareSerial.h>
#include <Wire.h>

char target[] = "AUTOFUNON";
char target1[] = "AUTOFUNOFF";

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

unsigned long last_yes=millis(), period_yes=100000; //Это параметры организации цикла задержки включения вентиляции и отопления

LCD_1602_RUS lcd(0x27, 16, 2);
// int knopka1=0;
//int knopka2=0;
int knopka3=0;
const int maxMoisture=50; //максимальная влажность
const int minTemperature=10; //минимальня температура
int LONGPRESSBUT1=0;
int LONGPRESSBUT2=0;
int val;

boolean button1  = false; //Переменная для хранения состояния кнопки1
boolean press_flag1 = false; //Флажок нажатия кнопки1
boolean long_press_flag1 = false; //Флажок долгого нажатия кнопки1
unsigned long last_press1 = 0; //Перемменная хранит момент последнего нажатия на кнопку1

boolean button2  = false; //Переменная для хранения состояния кнопки2
boolean press_flag2 = false; //Флажок нажатия кнопки2
boolean long_press_flag2 = false; //Флажок долгого нажатия кнопки2
unsigned long last_press2 = 0; //Перемменная хранит момент последнего нажатия на кнопку2

#define DHTPIN 6 //пин для получения сигнала от датчика DHT11

// Раскомментировать тип датчика, который используется
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);

void setup() 
  {
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(9, OUTPUT);
    Serial.begin(9600);
    Serial.println("Hello");
    dht.begin();
       lcd.init(); // Инициализируем экран, включаем подсветку
       lcd.backlight();
       //Устанавливаем положение курсора для первой строки.
       lcd.home();
       //выводим строку 1
       lcd.print("Welcome!");
       //выводим строку 2
       lcd.setCursor(0, 1);
       lcd.print("AO Sam. Transf.");

  }
void loop()
{

{

if (Serial.available() > 0)
    {
      if (Serial.find(target))
      {
       last_yes=millis();
       long_press_flag1 = !long_press_flag1;
       Serial.println("");
       Serial.print("Авто вентиляция включено");
       digitalWrite(10,HIGH);
       LONGPRESSBUT1=1;
      }
   }
if (Serial.available() > 0)
    {
      if (Serial.find(target1))
      {
       last_yes=millis();
       long_press_flag1 = !long_press_flag1;
       Serial.println("");
       Serial.print("Авто вентиляция отключено");
       digitalWrite(10,LOW);
       if (digitalRead(7)==HIGH)
           {
           digitalWrite(7,!digitalRead(7));
           Serial.println("");
           Serial.print("Выключен вентилятор");
           }
       LONGPRESSBUT1=0;
      }
   }
if(millis()-last_read>period_read)
{ last_read=millis();  //Если работа модуля очень длительная, то тип last_read надо изменить!

float h = dht.readHumidity(); //Измеряем влажность
  float t = dht.readTemperature(); //Измеряем температуру
  if (isnan(h) || isnan(t))  // Проверка. Если не удается считать показания, выводится «Ошибка считывания», и программа завершает работу
  {
    Serial.println("Ошибка считывания");
    return;
  }
  Serial.println("");
  Serial.print("Влажность: ");
  Serial.print(h);
  Serial.println(" %\t");
  Serial.print("Температура: ");
  Serial.print(t);
  Serial.print(" *C ");

  //Вывод показателей на экран
  //Устанавливаем положение курсора для первой строки.
  lcd.home();
  //выводим строку 1
  lcd.print("Темп.: ");
  lcd.print(t);
  lcd.print(" *C ");
  //выводим строку 2
  lcd.setCursor(0, 1);
  lcd.print("Влажн.: ");
  lcd.print(h);
  lcd.print(" %");
 }

button1 = digitalRead(14);
button2 = digitalRead(15);


// Все что касается Кнопки 1!!!!!!!!!!!!!!!!!
    if(button1==true&&press_flag1==false&&millis()-last_press1>100)//если кнопка нажата
  //флаг опущен и с последнего нажатия прошло не более 100 мсек, то ...
     {
       press_flag1 = !press_flag1; //Поднять флаг короткого нажатия на кнопку1
       last_press1 = millis(); //Присвоить текущее время переменной last_press1
     }
   if (button1 == true && press_flag1 == true && millis() - last_press1 > 1000 && LONGPRESSBUT1==0) {
   long_press_flag1 = !long_press_flag1;
   last_press1 = millis();
      Serial.println("");
      Serial.print("Авто вентиляция включено"); // Само действие при длинном нажатии
      LONGPRESSBUT1=1;
      digitalWrite(10,HIGH);
   }

   if (button1 == true && press_flag1 == true && millis() - last_press1 > 1000 && LONGPRESSBUT1==1) //если кнопка нажата
      {
        long_press_flag1 = !long_press_flag1;
        last_press1 = millis();
        Serial.println("");
        Serial.print("Авто вентиляция выключено"); // Само действие при длинном нажатии
        LONGPRESSBUT1=0;
          if (digitalRead(7)==HIGH)
           {
           digitalWrite(7,!digitalRead(7));
           }
        digitalWrite(10,LOW);
      }
     if (button1 == false && press_flag1 == true && long_press_flag1 == true) {
     press_flag1 = !press_flag1;
     long_press_flag1 = !long_press_flag1;
     }
     if (button1 == false && press_flag1 == true && long_press_flag1 == false) {
     press_flag1 = !press_flag1;
     digitalWrite(7,!digitalRead(7)); // Само действие при коротком нажатии
               LONGPRESSBUT1=0;
     digitalWrite(10,LOW);
     }
 //    if (digitalRead(7) == LOW);
 //    {
 //     Serial.println("");
 //     Serial.print("Вентиляция отключена");
 //     }
    if(button1==true&&press_flag1==false&&millis()-last_press1>100)//если кнопка нажата
  //и перемення knopka1 равна 0 и флаг опущен и с последнего нажатия прошло не более 100 мсек, то ...
     {
       press_flag1 = !press_flag1; //Поднять флаг короткого нажатия на кнопку1
       last_press1 = millis(); //Присвоить текущее время переменной last_press1
     }
   if (button1 == true && press_flag1 == true && millis() - last_press1 > 1000 && LONGPRESSBUT1==0) {
   long_press_flag1 = !long_press_flag1;
   last_press1 = millis();
      Serial.println("");
      Serial.print("Авто вентиляция выключено"); // Само действие при длинном нажатии
      LONGPRESSBUT1=1;
      digitalWrite(10,HIGH);
   }
// Все что касается Кнопки 2!!!!!!!!!!!!!!!!!
    if(button2==true&&press_flag2==false&&millis()-last_press2>100)//если кнопка нажата
  //и перемення knopka2 равна 0 и флаг опущен и с последнего нажатия прошло не более 100 мсек, то ...
     {
       press_flag2 = !press_flag2; //Поднять флаг короткого нажатия на кнопку2
       last_press2 = millis(); //Присвоить текущее время переменной last_press2
     }
   if (button2 == true && press_flag2 == true && millis() - last_press2 > 1000 && LONGPRESSBUT2==0) {
   long_press_flag2 = !long_press_flag2;
   last_press2 = millis();
      Serial.println("");
      Serial.print("Авто отопление включено"); // Само действие при длинном нажатии
      LONGPRESSBUT2=1;
      digitalWrite(11,HIGH);
   }

   if (button2 == true && press_flag2 == true && millis() - last_press2 > 1000 && LONGPRESSBUT2==1)
      {
        long_press_flag2 = !long_press_flag2;
        last_press2 = millis();
        Serial.println("");
        Serial.print("Авто отопление выключено"); // Само действие при длинном нажатии
        LONGPRESSBUT2=0;
          if (digitalRead(8)==HIGH)
           {
           digitalWrite(8,!digitalRead(8));
           }
        digitalWrite(11,LOW);
      }
     if (button2 == false && press_flag2 == true && long_press_flag2 == true) {
     press_flag2 = !press_flag2;
     long_press_flag2 = !long_press_flag2;
     }
     if (button2 == false && press_flag2 == true && long_press_flag2 == false) {
     press_flag2 = !press_flag2;
     digitalWrite(8,!digitalRead(8)); // Само действие при коротком нажатии
    Serial.println("");
    Serial.print("Отопление вкл/откл");
     LONGPRESSBUT2=0;
     digitalWrite(11,LOW);
     }
    if(button2==true&&press_flag2==false&&millis()-last_press2>100)//если кнопка нажата
  //и перемення knopka1 равна 0 и флаг опущен и с последнего нажатия прошло не более 100 мсек, то ...
     {
       press_flag2 = !press_flag2; //Поднять флаг короткого нажатия на кнопку2
       last_press2 = millis(); //Присвоить текущее время переменной last_press2
     }
   if (button2 == true && press_flag2 == true && millis() - last_press2 > 1000 && LONGPRESSBUT1==0) {
   long_press_flag2 = !long_press_flag2;
   last_press2 = millis();
      Serial.println("");
      Serial.print("Авто отопление включено"); // Само действие при длинном нажатии
      LONGPRESSBUT2=1;
      digitalWrite(11,HIGH);
   }
     // if(digitalRead(14)==LOW&&knopka1==1&&press_flag1==true)//если кнопка НЕ нажата
     //   if(button1==false&&press_flag1==true)//если кнопка НЕ нажата
     //и переменная knopka1 равна - 1 ,то ...
    
     // knopka1=0;//обнуляем переменную knopka1
     // press_flag1 = !press_flag1; //опустить флаг короткого нажатия на кнопку



 // if(digitalRead(15)==HIGH&&knopka2==0)//если кнопка нажата   
     // и перемення knopka2 равна 0 , то ...
 //    {
 //      digitalWrite(8,!digitalRead(8));
 //      knopka2=1;
        //это нужно для того что бы с каждым нажатием кнопки
        //происходило только одно действие
        // плюс защита от "дребезга"  100%
//     }
 //     if(digitalRead(15)==LOW&&knopka2==1)//если кнопка НЕ нажата
     //и переменная knopka2 равна - 1 ,то ...
 //    {
 //    knopka2=0;//обнуляем переменную knopka1
//     }
  if(digitalRead(16)==HIGH&&knopka3==0)//если кнопка нажата   
     // и перемення knopka3 равна 0 , то ...
     {
       digitalWrite(9,!digitalRead(9));
       knopka3=1;
        if(digitalRead(9)==LOW)
       {
       Serial.println("");
       Serial.print("Свет выключен");
       }
       if(digitalRead(9)==HIGH)
       {
       Serial.println("");
       Serial.print("Свет включен");
       }
      
        //это нужно для того что бы с каждым нажатием кнопки
        //происходило только одно действие
        // плюс защита от "дребезга"  100%
     }
      if(digitalRead(16)==LOW&&knopka3==1)//если кнопка НЕ нажата
     //и переменная knopka3 равна - 1 ,то ...
     {
     knopka3=0;//обнуляем переменную knopka3     
     }

//  Это все что касается кнопки1 (Автовентиляция) !!!!!
       // if(dht.readHumidity()>maxMoisture&&digitalRead(7)==LOW&&knopka1==0&&millis()-last_yes>period_yes)
        if(dht.readHumidity()>maxMoisture&&digitalRead(7)==LOW&&millis()-last_yes>period_yes&&LONGPRESSBUT1==1)
        {
          last_yes=millis();
            digitalWrite(7,!digitalRead(7));
            Serial.println("");
            Serial.print("Включен вентилятор");
           // knopka1=1;//включаем кнопку1
        }
       // if(dht.readHumidity()<maxMoisture&&digitalRead(7)==HIGH&&knopka1==0&&millis()-last_yes>period_yes)
        if(dht.readHumidity()<maxMoisture&&digitalRead(7)==HIGH&&millis()-last_yes>period_yes&&LONGPRESSBUT1==1)
        {
            last_yes=millis();
            digitalWrite(7,!digitalRead(7));
            Serial.println("");
            Serial.print("Выключен вентилятор");
           // knopka1=0;//включаем кнопку1
        }

//  Это все что касается кнопки2 (Автоотопление) !!!!!
        if(dht.readTemperature()<minTemperature&&digitalRead(8)==LOW&&millis()-last_yes>period_yes&&LONGPRESSBUT2==1)
        {
            last_yes=millis();
            digitalWrite(8,!digitalRead(8));
            Serial.println("");
            Serial.print("Включен конвектор");
        }
        if(dht.readTemperature()>minTemperature&&digitalRead(8)==HIGH&&millis()-last_yes>period_yes&&LONGPRESSBUT2==1)
        {
            last_yes=millis();
            digitalWrite(8,!digitalRead(8));
            Serial.println("");
            Serial.print("Выключен конвектор");
        }

}
}


Вот момент теперь, AUTOFUNON видит и отрпбатывает, а вот AUTOFUNOFF - нет ... в чем может быть дело?
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
@shAAde, как написали, так и выполняется. Первым чтением обнуляется всё, что послали. Второе чтение обращается к пустому буферу.
 

shAAde

✩✩✩✩✩✩✩
24 Окт 2024
42
1
@poty, Даже если сразу пишу AUTOFUNOFF, то не работает тоже... а как я обнуляю?

Получается что даже если он не нашел нужную строку, он очистил буфер?
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
476
137
@shAAde,
Да. буфер очищается, если не нашел строку. Очищается столько - сколько прочитал, а раз не нашел, значит прочитал (очистил) все.
Вообще по парсингу можно долго говорить и спорить как правильно, как не правильно и мнения могут быть разные.
Например - зачем передавать AUTOFUNON и AUTOFUNOFF, если достаточно 1 и 2. (или #1 и #2, или еще как).
Что использовать - посимвольное чтение или использовать чтение строк предварительно настроив setTimeout(2) (2 - как пример).
У гайвера есть обзор - сборник простых способов Не идеальных для всех случаев, но наверно полезных для ознакомления.
 

shAAde

✩✩✩✩✩✩✩
24 Окт 2024
42
1
C++:
if (Serial.available() > 0)
    {
      int val = Serial.parseInt();
      if (val == 1)
      {
       last_yes=millis();
       long_press_flag1 = !long_press_flag1;
       Serial.println("");
       Serial.print("Авто вентиляция включено");
       digitalWrite(10,HIGH);
       LONGPRESSBUT1=1;
      }
      if (val == 2)
      {
       last_yes=millis();
       long_press_flag1 = !long_press_flag1;
       Serial.println("");
       Serial.print("Авто вентиляция отключено");
       digitalWrite(10,LOW);
       if (digitalRead(7)==HIGH)
           {
           digitalWrite(7,!digitalRead(7));
           Serial.println("");
           Serial.print("Выключен вентилятор");
           }
       LONGPRESSBUT1=0;
      }
   }
ну так заработало конечно

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

Bruzzer

★★★✩✩✩✩
23 Май 2020
476
137
@shAAde,
Повторюсь - способов много (ссылку давал выше - почитайте).
Как "лобовой" вариант - считываете строку readString(), предварительно настроив setTimeout(2)
Потом ищите по очереди в строке AUTOFUNON и AUTOFUNOFF. или ON и OFF Искать в строке можно много раз.
if(myStr.indexOf("AUTOFUNOFF") > = 0);
if(myStr.indexOf("OFF") > = 0);
if(myStr.indexOf("ON") > = 0);
 

shAAde

✩✩✩✩✩✩✩
24 Окт 2024
42
1
@Bruzzer, Спасибо!) Очень полезная инфа! Редко кто прям подробно отвечает!
 

Nitrogenium

✩✩✩✩✩✩✩
25 Ноя 2022
33
3
if (button1 == true && press_flag1 == true && millis() - last_press1 > 1000 && LONGPRESSBUT1==1) //если кнопка нажата
Смотри, момент первый... Сравнительные операнды нужно заключать в скобки. Чтобы компилятор совершено точно знал что с чем сравнивать. Например:

if ( ( (button1 == true) && press_flag1) ==( true && millis() - last_press1) > 1000 && LONGPRESSBUT1==1)

А что касается вопроса о том "Почему "Авто вентиляция включено" прописывается несколько раз ...." Ну дык несколько раз пролистывается твой чудо-код.