Алгоритм работы : Включение вентилятора на digital 7. Ту часть что вниз добавляю, приводит к глюкам - реле отключается ....

shAAde

✩✩✩✩✩✩✩
24 Окт 2024
42
1
Вот код:

C++:
#include <LCD_1602_RUS.h>

#include <LiquidCrystal_I2C.h>

//#include <LiquidCrystal.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; //Это параметры организации цикла

LCD_1602_RUS lcd(0x27, 16, 2);

int knopka1=0;

const int maxMoisture=50; //максимальная влажность



#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(9,INPUT);

//pinMode(8,OUTPUT);

//mySerial.begin(9600);

pinMode(7, 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()

{



{

// Задержка перед измерениями

// delay(2000); //Это завешиват всю программу, но измерять нужно все же с интервалом, как?

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

}

}

if(digitalRead(14)==HIGH&&knopka1==0)//если кнопка нажата

// и перемення knopka1 равна 0 , то ...

{

digitalWrite(7,!digitalRead(7));

knopka1=1;

//это нужно для того что бы с каждым нажатием кнопки

//происходило только одно действие

// плюс защита от "дребезга" 100%

}

if(digitalRead(14)==LOW&&knopka1==1)//если кнопка НЕ нажата

//и переменная knopka1 равна - 1 ,то ...

{

knopka1=0;//обнуляем переменную knopka1

}

// if(millis()-last_read>period_read)

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

// if(dht.readHumidity()>maxMoisture)

// {

// digitalWrite(7,!digitalRead(7));

// knopka1=1;//включаем кнопку1

// }

// }

}
Вообще, думаю может длительное нажатие кнопки включало режим Авто, ну от датчика, а просто быстрое нажатие включить, отключить .. такое можно реализовать кодом?

One Button библиотека может поможет, если есть у кого пример кода на ней с длительным и коротким нажатием?
 
Изменено:

Bruzzer

★★★✩✩✩✩
23 Май 2020
476
137
При вставке кода используйте значок </> на панели редактирования сообщения.1730438982999.png
Тогда в том числе появятся номера строк, и можно будет написать - добавление каких именно строк приводит к глюкам.
И желательно написать что именно происходит не так. И как должно быть и почему. Возможно если при написании "почему", вы сами увидите ошибку. Если нет, то остальным будет проще вас понять.
 

shAAde

✩✩✩✩✩✩✩
24 Окт 2024
42
1
@Bruzzer, Строки 177-187, реле само выключается и маргает светодиод на нем
 

shAAde

✩✩✩✩✩✩✩
24 Окт 2024
42
1
C++:
if(dht.readHumidity()>maxMoisture&&digitalRead(7)==LOW&&knopka1==0)
Вот такую проверку сделал и глюки пропали ))

@viktor1703, а так нельзя? я думал это константа ....

C++:
const int maxMoisture=50; //максимальная влажность
Тогда такой вопрос, как можно ввести переменную, которая будет принимать 1 или 0 при длительном нажатии кнопки? Чтобы я эту переменную в условия работы автовключения ввел?
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
619
148
Ну, очевидно, определить эту переменную и подсчитывать время нажатия кнопки. Если меньше какого-то значения, значит короткое, если больше, значит длинное.
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
619
148
Так же как и эти
C++:
int knopka1=0;

const int maxMoisture=50;
Для флагов состояний, обычно, используют переменные типа
C++:
bool
Например
C++:
bool long_time = 0; // короткое нажатие 0, долгое 1
 

shAAde

✩✩✩✩✩✩✩
24 Окт 2024
42
1
C++:
        if(dht.readHumidity()>maxMoisture&&digitalRead(7)==LOW&&knopka1==0)
        {
            digitalWrite(7,!digitalRead(7));
            knopka1=1;//включаем кнопку1
        }
        if(dht.readHumidity()<maxMoisture&&digitalRead(7)==HIGH&&knopka1==0)
        {
            digitalWrite(7,!digitalRead(7));
            knopka1=0;//включаем кнопку1
        }
Еще момент, чтобы работа включения и отключения была с задержкой: Например влажность выше 50 и не сразу, а через 5 мин включился, а если влажность ниже, то не сразу, а через 5 мин выключился....

@viktor1703, А как он поймет что bool это долгое нажатие чтобы ее менять? Это библиотека нужна еще?
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
619
148
Это пип данных, как и int, long, float. Объявляя переменную типа bool в памяти МК выделяется под нее один байт. Под int 2 байта.
А как он поймет что bool это долгое нажатие чтобы ее менять?
А вот это уже ваша задача заставить микроконтроллер так делать. И не bool, а переменная типа данных bool.
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
@shAAde, с каждой библиотекой идут примеры, установите и посмотрите. Это решит Вашу проблему
длительное нажатие кнопки включало режим Авто... быстрое нажатие включить, отключить
без написания кода для кнопки. Но вот это:
работа включения и отключения была с задержкой
всё же говорит о том, что Вам нужно написать код. Некоторое время назад Вам уже подсказали как менять delay на millis, здесь должен быть ровно такой же подход.
@shAAde, Ваш код из первого поста делает ровно то, что Вы описали.
 

shAAde

✩✩✩✩✩✩✩
24 Окт 2024
42
1
@viktor1703,

Про мою задачу, это понятно!)) Я же прошу конкретной подсказки )) Можно с куском кода .... Если кому-то не сложно? ))

@poty, да но как еще один цикл организовать? мне значения цикла задержки опроса датчика не подходит ....

@poty, Может можно ввести переменную и по истечении цикла к ней что-то прибавлять и как только переменная получила значение определенное, выполнять включение или отключение..... ?

C++:
unsigned long last_yes=millis(), period_yes=10000; //Цикл для задержки включения и отключения
C++:
        if(dht.readHumidity()>maxMoisture&&digitalRead(7)==LOW&&knopka1==0&&millis()-last_yes>period_yes)
        {
          last_yes=millis();
            digitalWrite(7,!digitalRead(7));
            knopka1=1;//включаем кнопку1
        }
        if(dht.readHumidity()<maxMoisture&&digitalRead(7)==HIGH&&knopka1==0&&millis()-last_yes>period_yes)
        {
            last_yes=millis();
            digitalWrite(7,!digitalRead(7));
            knopka1=0;//включаем кнопку1
        }
}
Ну в целом задержку включения сделал. Теперь как быть с долгим нажатием? )))