Термогигрометр Выдает абракадабру

Собран термогигрометр на датчике SHT10(20). Во времия работы стал зависать и показывать на дисплее авбракадабру. После перезагрузки (питания) снова начинает работать и опять повтор

 
#include <Sodaq_SHT2x.h>

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

uint8_t bukva_Pe[8] = {
  B11111,
  B10001,
  B10001,
  B10001,
  B10001,
  B10001,
  B10001
};
uint8_t bukva_L[8] = {
  B00111,
  B01001,
  B01001,
  B01001,
  B01001,
  B01001,
  B10001
};
uint8_t bukva_G[8] = {
  B10101,
  B01110,
  B00100,
  B01110,
  B10101,
  B10101,
  B10101
  };
uint8_t bukva_gr[8] = {
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000
};
LiquidCrystal_I2C lcd(0x27, 16, 2); // установка  LCD address to 0x3F for a 16 chars and 2 line display
//LiquidCrystal_I2C lcd(0x3F, 16, 2);
void setup()
{
  Serial.begin(9600);
  lcd.init();   // Инициализируем lcd
  lcd.clear();

  // Печать приветствия на  LCD.
  lcd.backlight();
  lcd.setCursor(1, 0);
  lcd.print("TermoGigrometr");
  //lcd.setCursor(3, 0);
  //lcd.print("GRIGORIEV");
  lcd.setCursor(5, 1);
  lcd.print("NOVO.SU");
  //lcd.setCursor(6, 1);
  //lcd.print("PAVEL");
  delay(5000);
  lcd.clear();
  lcd.setCursor(1, 0);
  lcd.print("TermoGigrometr");
  lcd.setCursor(5, 1);
  lcd.print("NOVO.SU");
  delay(5000);
  lcd.clear();
 
  lcd.createChar(1, bukva_Pe);      // создаем символ и записываем его в память LCD
  lcd.createChar(2, bukva_L);
  lcd.createChar(3, bukva_G);
  lcd.createChar(4, bukva_gr);
  lcd.home();

}

void loop()
{

  float temp_c;

  float humidity;

  // Читаем показания датчика SHT20
  temp_c =SHT2x.GetTemperature();
  
  humidity = SHT2x.GetHumidity();
  Serial.print(temp_c);
  lcd.clear();
  // Выводим данные на LCD
  lcd.setCursor(0, 0);
  //lcd.print("Temperat: ");
  lcd.print("T");
  lcd.print("E");
  lcd.print("M");
  lcd.print("\1.  ");
  lcd.print(temp_c); //Если нужна коррекция температуры то + или - Х градусов
  lcd.print("\4");
  lcd.print("C ");
  lcd.setCursor(0, 1);// вывод второй строки
  //lcd.print("Vlazhnst: ");
  lcd.print("B");
  lcd.print("\2");
  lcd.print("A");
  lcd.print("\3");
  lcd.print("H. ");
  lcd.print(humidity);
  lcd.println(" %       ");

  delay(1000);
}

Добавил програмный Reset думал поможет - стало получше - просто текст стал зависать

//термогигрометр на основе sht20 датчик питается от 3в и
//вешается по протоколу I2C data на А4 a clock на  А5
#include <Wire.h>
#include "SHT2x.h"

SHT2x SHT2x;
//питание SHT20 от 3,3вольта
//дата и клок на А4 и Ф5

unsigned long timer;


#include <LiquidCrystal_I2C.h>

uint8_t bukva_Pe[8] = {
  B11111,
  B10001,
  B10001,
  B10001,
  B10001,
  B10001,
  B10001
};
uint8_t bukva_L[8] = {
  B00111,
  B01001,
  B01001,
  B01001,
  B01001,
  B01001,
  B10001
};
uint8_t bukva_G[8] = {
  B10101,
  B01110,
  B00100,
  B01110,
  B10101,
  B10101,
  B10101
};
uint8_t bukva_gr[8] = {
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000
};
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup()
{
  SHT2x.begin();
  Serial.begin(9600);
  //pinMode(dataPin, INPUT);
  //pinMode(clockPin, INPUT);
  lcd.begin();
  lcd.clear();

  lcd.backlight();// Печать приветствия на  LCD.
  lcd.setCursor(1, 0);
  lcd.print("TermoGigrometr");
  lcd.setCursor(5, 1);
  lcd.print("NOVO.SU");
  delay(4000);
  lcd.clear();

  lcd.createChar(1, bukva_Pe);      // создаем символ и записываем его в память LCD
  lcd.createChar(2, bukva_L);
  lcd.createChar(3, bukva_G);
  lcd.createChar(4, bukva_gr);
  lcd.home();
  timer = millis();
}

void loop()
{
  float temp_c;
  float humidity;

  temp_c = SHT2x.GetTemperature(); // Читаем температуру датчика SHT20
  humidity = SHT2x.GetHumidity();// Читаем влажность датчика SHT20

  Serial.print(temp_c);
  lcd.clear();
  // Выводим данные на LCD
  lcd.setCursor(0, 0);
  //lcd.print("Temperat: ");
  lcd.print("T");
  lcd.print("E");
  lcd.print("M");
  lcd.print("\1.  ");
  lcd.print(temp_c); //Если нужна коррекция температуры то + или - Х градусов
  lcd.print("\4");
  lcd.print("C ");
  lcd.setCursor(0, 1);// вывод второй строки
  //lcd.print("Vlazhnst: ");
  lcd.print("B");
  lcd.print("\2");
  lcd.print("A");
  lcd.print("\3");
  lcd.print("H. ");
  lcd.print(humidity);
  lcd.println(" %       ");

  delay(1000);
  if (millis() - timer > 200000) {
    Serial.println("reboot");
    delay(100);
    asm volatile("jmp 0x00");
  }
  }

В чем причина? 
Кто подскажет

держите нас в курсе, тему перенес в песочницу.

1 лайк

При очень похожем поведении помог конденсатор 470 мкФ припаянный прямо на ноги питания платы I2c-LCD. Вместо ресета можно поробовать вызывать lcd.begin(). Но поведение зависит от программной реализации инициализации дисплея в библиотеке.
А по опыту эксплуатации могу сказать что чаще всего такое поведение бывает при наводке на сигнал строб дисплея.

попробую конденсатор.
ресет же вызывает lcd.begin() ?

Подтянуты ли линии I2C к питанию? Какие номиналы резисторов? Скорее всего, мусор на дисплее из-за неправильной работы шины.

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

у меня на шине LCD и датчик SHT. +5 подтянуть к земле?

Что значить подтянуть к земле?

CDA и SLC через 4,7кОм на +5. Это будет общая подтяжка и для LCD и для датчика?

Да.
А вот если они сидят на одной шине надо для проверки их надо бы разделить. Можно взять программный i2c и повесить на него датчик. Есть вероятность того что датчик мешает дисплею.

согласно datasheet SHT 20 ставятся два резистора по 10кОм и кондер. И все это уже есть на плате с датчиком. Надо ли еще на LCD добавлять?

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

как вариант попробую снять датчик с провода.Провод около 4 метров длинной останеться.

Вот с этого надо было начинать. i2c не расчитан на такое расстояние. Максимум два метра на низкой(!) частоте тактирования. Повесить такой длинный кабель - гробить сигнал на емкости кабеля, максимальное значение 400рF.
Набери в гугле “i2c интерфейс длина линии”

спасибо!