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 устройств/библиотек.
Да, проблема, по видимому, аппаратная. Закомментировал строки, с датчиком, убрал датчик, дисплей все выдал. Хотя этот скетч работает с датчиком:
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display long count = 0; void setup() { lcd.init(); // initialize the lcd lcd.init(); // Print a message to the LCD. lcd.backlight(); lcd.setCursor(0,0); lcd.print("Hello, world!"); lcd.setCursor(0,1); lcd.print("Ywrobot Arduino!"); delay(5000); lcd.clear(); lcd.setCursor(0,0); lcd.print("Arduino 1602"); lcd.setCursor(0,1); lcd.print("Power By Ec-yuan!"); delay(5000); lcd.clear(); } void loop() { lcd.setCursor(5, 0); lcd.print(count); count++; delay(1000); }Не вижу никакого датчика в последнем скетче.
В том то и дело, взял этот пример, датчик не отключал - работает.
Но если в 1м закомментировать, все, что связано с датчиком, все-равно виснет:
//#include <AHT10.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> uint8_t readStatus = 0; float temp, hum; //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() { /*if (readStatus != AHT10_ERROR) { readStatus = myAHT10.readRawData(); //read 6 bytes from AHT10 over I2C temp = myAHT10.readTemperature(AHT10_USE_READ_DATA); hum = myAHT10.readHumidity(AHT10_USE_READ_DATA); }*/ /* prints dynamic temperature 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"); 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 }и откуда в этом скетче берутся значения 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);
да посмотрим
Этот скетч работает, как должен. Скопировал строки из одного в другой... Отличается только...(забыл здесь датчик проинициализировать)
#include <Wire.h> #include <LiquidCrystal_I2C.h> #include <AHT10.h> LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display AHT10 myAHT10(AHT10_ADDRESS_0X38); uint8_t readStatus = 0; float temp, hum; long count = 0; void setup() { Serial.begin(9600); lcd.init(); // initialize the lcd lcd.init(); // Print a message to the LCD. lcd.backlight(); lcd.setCursor(0,0); lcd.print("Hello, world!"); lcd.setCursor(0,1); lcd.print("Ywrobot Arduino!"); delay(5000); lcd.clear(); lcd.setCursor(0,0); lcd.print("Arduino 1602"); lcd.setCursor(0,1); lcd.print("Power By Ec-yuan!"); delay(5000); lcd.clear(); } void loop() { readStatus = myAHT10.readRawData(); //read 6 bytes from AHT10 over I2C if (readStatus != AHT10_ERROR) { temp = myAHT10.readTemperature(AHT10_USE_READ_DATA); hum = myAHT10.readHumidity(AHT10_USE_READ_DATA); } lcd.setCursor(0, 0); lcd.print("Temp:"); lcd.setCursor(6, 0); lcd.print(temp); lcd.setCursor(12, 0); lcd.print("C"); Serial.println((String)"Temp: " + temp + " C"); 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 + "%"); //count++; delay(10000); }мошт вот тут
Serial.println((String)"Temp: "+ temp +" C");в преобразовании в String вешаеца?
100500, перед выводом надо стринг собрать, у меня в коде как выше не работало
Я же уже написал, что и в таком виде работает. Вывод в порт добавил, когда увидел, что виснет (для отладки). Скопировал код из одного скетча в другой и все также, в одном работает, в другом нет.