Liquid I2C баг
- Войдите на сайт для отправки комментариев
Привет всем кто заглянул.
Есть программа. Контроль уровня влажности в помещении. Как только уровень влажности поднимется выше заданного значения (в данном случаи выше 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"); }}
"OK" ->"OK ” (+ 3 пробела)
Код похож на "осла" из м/ф шрек2, когда он через каждые 10 секунд спрашивал: -нучО, приехали???
Либо верно обновляй инфо после изменения, либо три (это не число) все не нужное.
и да, верно подмечено - зачем это делать на каждой итерации? Нагрузка на процессор выше, да и не нужно это. Ты каждую миллисекунду на экран смотришь (условно), может до раза в минуту довести?
Либо верно обновляй инфо после изменения, либо три (это не число) все не нужное.
и да, верно подмечено - зачем это делать на каждой итерации? Нагрузка на процессор выше, да и не нужно это. Ты каждую миллисекунду на экран смотришь (условно), может до раза в минуту довести?
Требуется пояснение. Где искать собаку ?
Программа настолько короткая насколько возможно.
Программа настолько короткая насколько возможно.
Отнюдь
Программа ниже - гораздо короче.
Требуется пояснение.
Программа настолько короткая насколько возможно.
вот вам и говорят, что слишком короткая. Добавьте условие. чтобы температура и влажность измерялась не 100 раз в минуту, а только один
Требуется пояснение. Где искать собаку ?
Программа настолько короткая насколько возможно.
Если пояснение про неправильный вывод "OKARM", то вам в первом же ответе сказали возможное решение. Вместо "ОК" выводить "ОК " т.е. ОК и три пробела.
Главное, что баг в "Liquid I2C", а вовсе не у ТС :-)
Требуется пояснение. Где искать собаку ?
Программа настолько короткая насколько возможно.
Если пояснение про неправильный вывод "OKARM", то вам в первом же ответе сказали возможное решение. Вместо "ОК" выводить "ОК " т.е. ОК и три пробела.
Так будет на целых три байта длиннее, а ТС нужно - короче.
2ТС: пиши "AL" вместо "ALARM" - будет как раз на 3 байта короче.
Либо верно обновляй инфо после изменения, либо три (это не число) все не нужное.
и да, верно подмечено - зачем это делать на каждой итерации? Нагрузка на процессор выше, да и не нужно это. Ты каждую миллисекунду на экран смотришь (условно), может до раза в минуту довести?
Спасибо, попробую !
Всем кто помог, спасибо !
Я не вижу в коде команду очищения экрана. Эту процедуру нужно делать обязательно. Потому что в самом дисплее накапливается ошибка и со временем, если не отключать питание, будут появляться ложные надписи и знаки.
В конце кода можно попробовать написать что-то вроде:
delay (50);
lcd.clear();
То есть периодически по ходу программы очищать экран, это даже не будет заметно, насколько быстро это происходит.
Никогда не чищу экран. Всегда пишу по верху старых надписей. За 20 лет использования никаких ошибок не накопилось. Что я не так делаю?
А что у вас за экран? У меня дешевый китайский HD44780 с алиэкспресса.
А что у вас за экран? У меня дешевый китайский HD44780 с алиэкспресса.
не имеет значения. Сам экран никакие "ложные надписи и знаки" создать не может, они появляются из-за ошибок в вашем коде
У меня их много. И с Али и МЕЛТовские. Разница небольшая. Как раз проблемы у некоторых с lcd.clear(); поэтому и lcd.clear(); не использую.
А мужики-то не знают.
А что у вас за экран? У меня дешевый китайский HD44780 с алиэкспресса.
Как бы Вам попроще объяснить - тут очень редко используют б/у экраны от верту, практически никогда. А вот с али очень часто.
со временем, если не отключать питание, будут появляться ложные надписи и знаки.
это духи предков обращаются к тебе
Я не вижу в коде команду очищения экрана. Эту процедуру нужно делать обязательно.
Не нужно. Совсем.
Потому что в самом дисплее накапливается ошибка...
Если на дисплее "накапливается ошибка", значит ошибка непременно присутствует либо в скетче, либо в схеме (включая БП).
Так что от ошибок нужно избавляться (именно там, где они есть), а не "чистить" их на экране.
Потому что в самом дисплее накапливается ошибка и со временем, если не отключать питание, будут появляться ложные надписи и знаки.
ДатышО! И каково количество накопленных ащибок за день - неделю - год ???
lcd.clear();
То есть периодически по ходу программы очищать экран, это даже не будет заметно, насколько быстро это происходит.
ДатыгОнишь! Мерцать буит как херовый манитор с 60-ю Герцами!!!
ДатыгОнишь! Мерцать буит как херовый манитор с 60-ю Герцами!!!
Отнюдь.
У него там delay(50), так что не с 60-ю, а с 20-ю Герцами.