LCD1602I2C AHT10 Arduino nano зависает программа
- Войдите на сайт для отправки комментариев
Пнд, 23/11/2020 - 11:23
Всем доброго времени! Собрал термометр на макетке. Но есть проблема - зависает программа. Если точнее: в строке 45 выводит на дисплей только "Tem". Ардуинка зависает наглухо - в монитор порта ничего не вывоводит. Если заменить Temp на 1234, а Hum на 567, то зависает уже на 2ой строке на 56. Не пойму, в чем проблема. Если отключить дисплей, то в порт данные выводятся, как нужно. Также скетч из примеров дисплея работает.
#include <Wire.h> #include <AHT10.h> #include <LiquidCrystal_I2C.h> uint8_t readStatus = 0; AHT10 myAHT10(AHT10_ADDRESS_0X38); LiquidCrystal_I2C lcd(0x27, 16, 2); void setup() { Serial.begin(9600); Serial.println(); lcd.init(); /* AHT10 connection check */ while (myAHT10.begin() != true) { lcd.print("AHT10 error"); //(F()) saves string to flash & keeps dynamic memory free Serial.println("AHT10 not connected or fail to load calibration coefficient"); delay(5000); } lcd.clear(); lcd.print("AHT10 OK"); delay(2000); lcd.clear(); } void loop() { readStatus = myAHT10.readRawData(); //read 6 bytes from AHT10 over I2C /* prints dynamic temperature data */ if (readStatus != AHT10_ERROR) { float temp = myAHT10.readTemperature(AHT10_USE_READ_DATA); lcd.setCursor(0, 0); lcd.print("Temp:"); lcd.setCursor(6, 0); lcd.print(temp); //use previously read 6 bytes lcd.setCursor(12, 0); lcd.print("C"); Serial.println((String)"Temp: " + temp + " C"); float hum = myAHT10.readHumidity(AHT10_USE_READ_DATA); lcd.setCursor(0, 1); lcd.print("Hum:"); lcd.setCursor(5, 1); lcd.print(hum); //use previously read 6 bytes lcd.setCursor(11, 1); lcd.print("%"); Serial.println((String)"Hum: " + hum + "%"); } delay(10000); //recomended polling frequency 8sec..30sec }
Явного криминала, соответствующего симптоматике, в коде не усматривается.
Или в соединении/питании проблема или несовместимость I2C устройств/библиотек.
Да, проблема, по видимому, аппаратная. Закомментировал строки, с датчиком, убрал датчик, дисплей все выдал. Хотя этот скетч работает с датчиком:
Не вижу никакого датчика в последнем скетче.
В том то и дело, взял этот пример, датчик не отключал - работает.
Но если в 1м закомментировать, все, что связано с датчиком, все-равно виснет:
и откуда в этом скетче берутся значения temp и hum , которые выводяься на дисплей?
простите - а вы вообще понимаете, как этот код работает?
Тут-то уж чему вешаться...
Комментируйте все с 49 по 60 и по строчке выпускайте. Больше предложений нет.
Переменные объявлены глобалами с дефолтовым значением 0.0, тут магии нема.
так может оно и не вешается... просто значения temp и hum непечатные... вот их и не видно на экране
Шлепайте куда-нить в нулевую строку millis() - будет ясно, висит или нет.
мошт вот тут
Serial
.println((String)
"Temp: "
+ temp +
" C"
);
в преобразовании в String вешаеца?
Я недавно вставил в скетч функцию cназванием init()-все умерло. C названием init_() все прекрасно работает
Нет, туда даже не доходит (вывод в сериал я уже позже добавил для отладки), вешается на выводе "Temp:", причем вот так выводит "Tem". Если датчик убрать с макетки, то работает как нужно... Но вот чего никак понять могу, в двух последних скетчах, в принципе код схож, за исключением подсветки дисплея. Но один работает (из 2го сообщения), другой нет (4 сообщение).
значит точно в преобразованиях дело. Вместо этого
Serial
.println((String)
"Temp: "
+ temp +
" C"
);
Напиши это
String tmp_str = String("Temp")+String(temp)+String(" C");
Serial.println(tmp_str);
да посмотрим
Этот скетч работает, как должен. Скопировал строки из одного в другой... Отличается только...(забыл здесь датчик проинициализировать)
мошт вот тут
Serial
.println((String)
"Temp: "
+ temp +
" C"
);
в преобразовании в String вешаеца?
100500, перед выводом надо стринг собрать, у меня в коде как выше не работало
Я же уже написал, что и в таком виде работает. Вывод в порт добавил, когда увидел, что виснет (для отладки). Скопировал код из одного скетча в другой и все также, в одном работает, в другом нет.