Почему мерцает дисплей lcd(0x27, 20, 4) при выводе информации

Fillip

✩✩✩✩✩✩✩
25 Ноя 2023
2
0
Я подключаю к wemos mini 2 датчика, кнопку и дисплей для вывода данных на сайт и на дисплей. Датчики функционируют и корректно выводят информацию.
Вот, как я подключаю дисплей и кнопку(только не к UNO, а к wemos).
1708072446065.png
Вот код:
C++:
#include "DHT.h"
#include <Wire.h>
#include <Adafruit_BMP085.h> //Подключаем библиотеку для работы с датчиком давления. Версия 1.0.1 обязательно.
#include <ESP8266WiFi.h> // данная библиотека устанавливается вместе с менеджером платы ESP8266
#include <LiquidCrystal_I2C.h>  // библиотека
bool b;
volatile int state = 0;  // переменная-счётчик
unsigned long timer;
Adafruit_BMP085 bmp; //Создаём объект для нашего барометрического датчика
#define DHTPIN 14 //Указываем пин в которому мы подключили наш датчик температуры, на плате он помечен как D5
DHT dht(DHTPIN, DHT11); // Создаём объект для нашего датчика температуры указывая его подключение и модель датчика.

const char* ssid     = "логин";               // Укажите здесь в кавычках название вашей точки доступа
const char* password = "пароль";            // Укажите здесь в кавычках пароль вашей точки доступа

const char* host     = "www.dweet.io";                              // Адрес сервера на который будем отправлять данные

void setup() {
    LiquidCrystal_I2C lcd(0x27, 20, 4); // запускаем
    pinMode(D7, INPUT_PULLUP);
  Serial.begin(9600); //Начинаем работу с монитором порта, в скобках указывая скорость обмена данными.
  delay(1500); //Контрольная пауза для загрузки
  dht.begin();  //Активируем датчик температуры.
  bmp.begin(); //Активируем барометрический датчик
// Подключаемся к точке доступа WiFi
 
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password); 
// begin инициализирует сетевые настройки библиотеки Wi-Fi и отображает текущий статус.
// ssid: SSID (идентификатор набора служб) -- это имя сети Wi-Fi, к которой вы хотите подключиться.
// pass: сети с шифрованием WPA используют пароль в виде строки для обеспечения безопасности.
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
// цикл проверки подключения к роутеру
// если нет подключения то в порт выводиться точка
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
    float h = dht.readHumidity(); //создаем и записываем значение влажности
  float t = dht.readTemperature(); //создаем и записываем значение температуры
  float p = bmp.readPressure() * 0.00750063755419211; //создаем и записываем значение давления переводя его в мм. ртутного столба.
  b = digitalRead(D7);
  if (b == 0) {
    state++;
     LiquidCrystal_I2C lcd(0x27, 20, 4); // запускаем
        lcd.init();
  lcd.backlight();
  }
  if (state == 1){
    LiquidCrystal_I2C lcd(0x27, 20, 4); // запускаем
        lcd.init();
  lcd.backlight();                    // включаем подсветку
  lcd.clear();                        // очищаем экран
  lcd.setCursor(5, 0);                // с 5 позиции первой строки
  lcd.print("Hello,");
  lcd.setCursor(5, 1);                // с 5 позиции второй строки
  lcd.print("World!");
  }
  if (state == 2){
    LiquidCrystal_I2C lcd(0x27, 20, 4); // запускаем
        lcd.init();
  lcd.backlight();                    // включаем подсветку
  lcd.clear();                        // очищаем экран
  lcd.setCursor(1, 0);                // с 5 позиции первой строки
  lcd.print(h);
  }
    if (state == 3){
    LiquidCrystal_I2C lcd(0x27, 20, 4); // запускаем
        lcd.init();
  lcd.backlight();                    // включаем подсветку
  lcd.clear();                        // очищаем экран
  lcd.setCursor(1, 0);                // с 5 позиции первой строки
  lcd.print(t);
  }
    if (state == 4){
    LiquidCrystal_I2C lcd(0x27, 20, 4); // запускаем
        lcd.init();
  lcd.backlight();                    // включаем подсветку
  lcd.clear();                        // очищаем экран
  lcd.setCursor(1, 0);                // с 5 позиции первой строки
  lcd.print(p);
  }
    if (state == 5){
    LiquidCrystal_I2C lcd(0x27, 20, 4); // запускаем
  lcd.clear();                        // очищаем экран
  state=0;
  }
  // Задержка между повторными измерениями 10 секунд
 if(millis() -timer > 10000)
 {
  timer=millis();
  Serial.print("Connecting to ");
  Serial.println(host);

  // Создаем TCP соединение при помощи класса WiFiClient
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
// Создает клиент, который может подключиться к указанному IP адресу с помощью client.connect().
// если клиент не может подключиться к ip адресу то в порт выводиться connection failed
  }

// Отправляем запрос на сервер
  client.print(String("GET /dweet/for/test?temperature=") + String(t) + "&humidity=" + String(h) + "&mmrt=" + String(p) + " HTTP/1.1\r\n"
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");

  while (client.available()) {
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }
  Serial.println();
  Serial.println(b);
 }
}
На сайт все отлично выводит, кнопка при нажатии переключает данные на дисплее, но дисплей при выводе информации мерцает постоянно. У меня есть подозрение что это из-за какого-то delay(), но вот какого.
 

Сотнег

★★★★★★★
15 Янв 2020
4,407
1,509
@Fillip,
вы задержку между измерениями сделали,
а задержку между обновлениями дисплея не сделали.
Его вообще не нужно обновлять, если отображаемая информация не изменилась.
 

Сотнег

★★★★★★★
15 Янв 2020
4,407
1,509
@Fillip,
вы обновляете дисплей не в setup().

По уму вам нужно отслеживать момент изменения информации,
и в конце цикла loop() обновлять дисплей, если информация обновилась.
 
  • Лойс +1
Реакции: Fillip

viktor1703

★★★✩✩✩✩
9 Дек 2021
619
148
А зачем в loop перед каждым выводом на дисплей заново его инициализировать, включать подсветку, очищать дисплей? Вы же это в setup сделали.
 

Вложения

  • Лойс +1
Реакции: Fillip и bort707

Zuker

★✩✩✩✩✩✩
10 Янв 2024
61
12
Мерцание дает функция "lcd.clear()". Попробуйте отказаться от нее. Статичные данные можно просто перерисовывать поверх. Лишнее затирайте пробелами.
 
  • Лойс +1
Реакции: Fillip

bort707

★★★★★★✩
21 Сен 2020
3,066
914
дисплей при выводе информации мерцает постоянно.
Потому что не нужно каждый раз инициализировать дисплей заново.
Вот эта вот строчка должна быть в коде ТОЛЬКО ОДИН РАЗ
LiquidCrystal_I2C lcd(0x27, 20, 4); // запускаем
 
  • Лойс +1
Реакции: Fillip