Liquid I2C баг

svitr
Offline
Зарегистрирован: 16.04.2017

Привет всем кто заглянул. 
Есть программа. Контроль уровня влажности в помещении. Как только уровень влажности поднимется выше заданного значения (в данном случаи выше 30%), должна замигать лампочка (лампочка мигает), и что самое главное на экране должно высветится предупреждение ALARM. 
То есть, когда % влаги ниже 30, на экране, рядом с показанием текущего % влажности, должно высвечиваться "ОК". Как только % превысит заданное, вместо "ОК" должно высветится ALARM. 
В чем проблема ? После загрузки скетча, на экране светится "ОК", все впорядке, при превышении 30% высвечивается, "ОК" уходит, высвечивается "ALARM", но, когда % влажности опускается до допустимого предупреждение АЛАРМ никуда не исчезает и поверх него накладывается ОК, и на экране высвечивается OKARM.
Основная часть программы работает за исключением индикации состояние системы.
Как исправить ?
Используемый экран: LiquidCrystal I2C  
Датчик: DHT22 
Arduino UNO.
 

#include <Wire.h>                       
#include <LiquidCrystal_I2C.h> 
#include <DHT.h>   


                      
int LED = 3;
i
  
LiquidCrystal_I2C LCD(0x27,16,2);  
DHT dht(2, DHT22);                          

void setup() {

   LCD.init();           
   LCD.backlight();  
   dht.begin();         
   pinMode (3, OUTPUT);
   
}

void loop() {
   
   float h = dht.readHumidity();
   float t = dht.readTemperature();
  

   LCD.setCursor(0,0);
   LCD.print("Hum: ");
   LCD.print(h);
   LCD.print("%");

   LCD.setCursor(0,1);
   LCD.print("Temp: ");
   LCD.print(t);
   LCD.print("*C");


 if (h > 30) {
 digitalWrite(LED, (millis() / 100) % 2);
  LCD.setCursor (11,0);
   LCD.print ("ALARM");
} 
 else {  
  digitalWrite (LED, LOW);
 LCD.setCursor (11,0);
   LCD.print ("OK");
 }}
 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

"OK" ->"OK ” (+ 3 пробела)

-NMi-
Offline
Зарегистрирован: 20.08.2018

Код похож на "осла" из м/ф шрек2, когда он через каждые 10 секунд спрашивал: -нучО, приехали???

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Либо верно обновляй инфо после изменения, либо три (это не число) все не нужное. 
и да, верно подмечено - зачем это делать на каждой итерации? Нагрузка на процессор выше, да и не нужно это.  Ты каждую миллисекунду на экран смотришь (условно), может до раза в минуту довести?

svitr
Offline
Зарегистрирован: 16.04.2017

BOOM пишет:

Либо верно обновляй инфо после изменения, либо три (это не число) все не нужное. 
и да, верно подмечено - зачем это делать на каждой итерации? Нагрузка на процессор выше, да и не нужно это.  Ты каждую миллисекунду на экран смотришь (условно), может до раза в минуту довести?

Требуется пояснение. Где искать собаку ?
Программа настолько короткая насколько возможно. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

svitr пишет:

Программа настолько короткая насколько возможно. 

Отнюдь

Программа ниже - гораздо короче.

void setup() {}
void loop() {}

 

b707
Offline
Зарегистрирован: 26.05.2017

svitr пишет:

Требуется пояснение.
Программа настолько короткая насколько возможно. 

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

Bruzzer
Offline
Зарегистрирован: 17.03.2020

svitr пишет:

Требуется пояснение. Где искать собаку ?
Программа настолько короткая насколько возможно. 

Если пояснение про неправильный вывод "OKARM", то вам в первом же ответе сказали возможное решение. Вместо "ОК" выводить "ОК   " т.е. ОК и три пробела.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Главное, что баг в "Liquid I2C", а вовсе не у ТС :-)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Bruzzer пишет:

svitr пишет:

Требуется пояснение. Где искать собаку ?
Программа настолько короткая насколько возможно. 

Если пояснение про неправильный вывод "OKARM", то вам в первом же ответе сказали возможное решение. Вместо "ОК" выводить "ОК   " т.е. ОК и три пробела.

Низ-зя!

Так будет на целых три байта длиннее, а ТС нужно - короче.

2ТС: пиши "AL" вместо "ALARM" - будет как раз на 3 байта короче.

svitr
Offline
Зарегистрирован: 16.04.2017

BOOM пишет:

Либо верно обновляй инфо после изменения, либо три (это не число) все не нужное. 
и да, верно подмечено - зачем это делать на каждой итерации? Нагрузка на процессор выше, да и не нужно это.  Ты каждую миллисекунду на экран смотришь (условно), может до раза в минуту довести?


Спасибо, попробую !

svitr
Offline
Зарегистрирован: 16.04.2017

Всем кто помог, спасибо !

lc433
Offline
Зарегистрирован: 22.03.2020

Я не вижу в коде команду очищения экрана. Эту процедуру нужно делать обязательно. Потому что в самом дисплее накапливается ошибка и со временем, если не отключать питание, будут появляться ложные надписи и знаки.

В конце кода можно попробовать написать что-то вроде:

delay (50);

lcd.clear();

 

То есть периодически по ходу программы очищать экран, это даже не будет заметно, насколько быстро это происходит.

 

nik182
Offline
Зарегистрирован: 04.05.2015

Никогда не чищу экран. Всегда пишу по верху старых надписей. За 20 лет использования никаких ошибок не накопилось. Что я не так делаю? 

lc433
Offline
Зарегистрирован: 22.03.2020

А что у вас за экран? У меня дешевый китайский HD44780 с алиэкспресса.

b707
Offline
Зарегистрирован: 26.05.2017

lc433 пишет:

А что у вас за экран? У меня дешевый китайский HD44780 с алиэкспресса.

не имеет значения. Сам экран никакие "ложные надписи и знаки" создать не может, они появляются из-за ошибок в вашем коде

nik182
Offline
Зарегистрирован: 04.05.2015

У меня их много. И с Али и МЕЛТовские. Разница небольшая. Как раз проблемы у некоторых с lcd.clear(); поэтому и lcd.clear(); не использую.  

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

lc433 пишет:
в самом дисплее накапливается ошибка и со временем, если не отключать питание, будут появляться ложные надписи и знаки.

 

А мужики-то не знают. 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

lc433 пишет:

А что у вас за экран? У меня дешевый китайский HD44780 с алиэкспресса.

Как бы Вам попроще объяснить - тут очень редко используют б/у экраны от верту, практически никогда. А вот с али очень часто.

b707
Offline
Зарегистрирован: 26.05.2017

lc433 пишет:

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

это духи предков обращаются к тебе

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

lc433 пишет:

Я не вижу в коде команду очищения экрана. Эту процедуру нужно делать обязательно.

Не нужно. Совсем.

Цитата:

Потому что в самом дисплее накапливается ошибка...

Если на дисплее "накапливается ошибка", значит ошибка непременно присутствует либо в скетче, либо в схеме (включая БП). 

Так что от ошибок нужно избавляться (именно там, где они есть), а не "чистить" их на экране.

-NMi-
Offline
Зарегистрирован: 20.08.2018

lc433 пишет:

Потому что в самом дисплее накапливается ошибка и со временем, если не отключать питание, будут появляться ложные надписи и знаки.

ДатышО! И каково количество накопленных ащибок за день - неделю - год ???

lc433 пишет:

lcd.clear();

То есть периодически по ходу программы очищать экран, это даже не будет заметно, насколько быстро это происходит.

ДатыгОнишь! Мерцать буит как херовый манитор с 60-ю Герцами!!!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

-NMi- пишет:

ДатыгОнишь! Мерцать буит как херовый манитор с 60-ю Герцами!!!

Отнюдь.

У него там delay(50), так что не с 60-ю, а с 20-ю Герцами.