LCD1602I2C AHT10 Arduino nano зависает программа

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

Всем доброго времени! Собрал термометр на макетке. Но есть проблема - зависает программа. Если точнее: в строке 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
}

 

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

Явного криминала, соответствующего симптоматике, в коде не усматривается.

Или в соединении/питании проблема или несовместимость I2C устройств/библиотек.

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

Да, проблема, по видимому, аппаратная. Закомментировал строки, с датчиком, убрал датчик, дисплей все выдал. Хотя этот скетч работает с датчиком:
 

#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);
}

 

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

Не вижу никакого датчика в последнем скетче.

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

В том то и дело, взял этот пример, датчик не отключал - работает.

Но если в 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
}

 

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

и откуда в этом скетче берутся значения temp и hum , которые выводяься на дисплей?

простите - а вы вообще понимаете, как этот код работает?

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

Тут-то уж чему вешаться...
Комментируйте все с 49 по 60 и по строчке выпускайте. Больше предложений нет.

Переменные объявлены глобалами с дефолтовым значением 0.0, тут магии нема.

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

sadman41 пишет:
Тут-то уж чему вешаться... Комментируйте все с 49 по 60 и по строчке выпускайте. Больше предложений нет.

так может оно и не вешается... просто значения temp и hum непечатные... вот их и не видно на экране

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

Шлепайте куда-нить в нулевую строку millis() - будет ясно, висит или нет.

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

мошт вот тут 

Serial.println((String)"Temp: " + temp + " C");

в преобразовании в String вешаеца? 

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

 Я недавно вставил в скетч функцию  cназванием init()-все умерло. C названием init_() все прекрасно работает

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

Нет, туда даже не доходит (вывод в сериал я уже позже добавил для отладки), вешается на выводе "Temp:", причем вот так выводит "Tem". Если датчик убрать с макетки, то работает как нужно... Но вот чего никак понять могу, в двух последних скетчах, в принципе код схож, за исключением подсветки дисплея. Но один работает (из 2го сообщения), другой нет (4 сообщение).

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

значит точно в преобразованиях дело. Вместо этого 

Serial.println((String)"Temp: " + temp + " C");

Напиши это

String tmp_str = String("Temp")+String(temp)+String(" C");

Serial.println(tmp_str);

да посмотрим

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

Этот скетч работает, как должен. Скопировал строки из одного в другой... Отличается только...(забыл здесь датчик проинициализировать)

#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);
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

мошт вот тут 

Serial.println((String)"Temp: " + temp + " C");

в преобразовании в String вешаеца? 

100500, перед выводом надо стринг собрать, у меня в коде как выше не работало

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

Я же уже написал, что и в таком виде работает. Вывод в порт добавил, когда увидел, что виснет (для отладки). Скопировал код из одного скетча в другой и все также, в одном работает, в другом нет.