Предотвратить мерцание ЖК - дисплея с помощью модуля I2C?

У меня есть ЖК-дисплей 16x2 с интерфейсом I2C и NodeMCU на базе Esp8266.

У меня есть проблема, когда вторая строка жидкокристаллического дисплея мерцает, но почему - то первая строка не мерцает.

Почему это происходит и как мне это предотвратить?

Мой код :-

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include "DHT.h"
#include "LiquidCrystal_PCF8574.h"
#include <EEPROM.h>

#define BLYNK_PRINT Serial
#define DHT_PIN_DATA  12
// LCD definations
#define LCD_ADDRESS 0x27
#define LCD_ROWS 2
#define LCD_COLUMNS 16
#define SCROLL_DELAY 150
#define BACKLIGHT 25
#define DHTTYPE DHT22

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "ymri80lbh9_xZhf6WIRHtQ1qHYOt9zBy";
char ssid[] = "DB";
char pass[] = "bkg88q";
int autoSch;
int waterNow;
int morTime;
int afterTime;
int postNoon;
int eveTime;
int schTime;
int minStep;
int interval;
int count;
int flag = 0;
unsigned long previousMillis = 0;

DHT dht(DHT_PIN_DATA, DHTTYPE);
LiquidCrystal_PCF8574 lcdI2C;
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "in.pool.ntp.org", 19800, 600000);
// This function will be called every time Slider Widget
// in Blynk app writes values to the Virtual Pin 1

BLYNK_CONNECTED() {
  Blynk.syncAll();
}

BLYNK_WRITE(V0)
{
  autoSch = param.asInt(); // assigning incoming value from pin V1 to a variable
}

BLYNK_WRITE(V1)
{
  morTime = param.asInt(); // assigning incoming value from pin V1 to a variable
}

BLYNK_WRITE(V2)
{
  afterTime = param.asInt(); // assigning incoming value from pin V1 to a variable
}

BLYNK_WRITE(V6)
{
  postNoon = param.asInt(); // assigning incoming value from pin V1 to a variable
}

BLYNK_WRITE(V3)
{
  eveTime = param.asInt(); // assigning incoming value from pin V1 to a variable
}

BLYNK_WRITE(V10)
{
  waterNow = param.asInt(); // assigning incoming value from pin V1 to a variable

}

BLYNK_WRITE(V4)
{
  schTime = param.asInt(); // assigning incoming value from pin V1 to a variable
}

BLYNK_WRITE(V7)
{
  minStep = param.asInt(); // assigning incoming value from pin V1 to a variable
}

void setup()
{
  dht.begin();
  lcdI2C.begin(LCD_COLUMNS, LCD_ROWS, LCD_ADDRESS, BACKLIGHT);
lcdI2C.setBacklight(2);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);
  pinMode(14, OUTPUT);
  digitalWrite(14, LOW);
  Blynk.virtualWrite(V5, 0);
  Blynk.virtualWrite(V8, 0);
  pinMode(2, INPUT_PULLUP);
  Serial.begin(9600);
  EEPROM.begin(512);
  //WiFi.begin(ssid, password);
  Blynk.begin(auth, ssid, pass);
  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }
  timeClient.begin();
  Blynk.syncAll();
}

void loop()
{
  Blynk.run();
  time_run();
  lcd();
  butPress();
  //test();
  timeClient.update();
  if (waterNow == 1) {
    waterNowrun();
  } else if (autoSch == 0) {
    auto_run1();
  } else if (autoSch == 1) {
    sch_run2();
  } else {
    Blynk.virtualWrite(V10, 0);
    digitalWrite(14, LOW);
    Blynk.virtualWrite(V5, 0);
    Blynk.syncAll();
  }
  Blynk.syncAll();
}


void lcd() {
  lcdI2C.clear();

  timeClient.update();
  lcdI2C.print(timeClient.getFormattedTime());

  if (autoSch == 0) {
    lcdI2C.setCursor(9, 0);
    lcdI2C.print("Auto");
  } else {
    lcdI2C.print(" Sch");
  }


  if (digitalRead(14) == 1) {
    lcdI2C.selectLine(2);
    lcdI2C.print("Wtr Now           ");
  }
  else
  {

    if (int(timeClient.getHours()) < 6 && morTime == 1 && autoSch == 0) {
      Blynk.syncAll();
      lcdI2C.selectLine(2);
      lcdI2C.print("Auto Wtr at: 6a");
    } else if (int(timeClient.getHours()) < 12 && afterTime == 1 && autoSch == 0) {
      Blynk.syncAll();
      lcdI2C.selectLine(2);
      lcdI2C.print("Auto Wtr at: 12n");
    } else if (int(timeClient.getHours()) < 14 && postNoon == 1 && autoSch == 0) {
      Blynk.syncAll();
      lcdI2C.selectLine(2);
      lcdI2C.print("Auto Wtr at:14pn");
    } else if (int(timeClient.getHours()) < 18 && eveTime == 1 && autoSch == 0) {
      Blynk.syncAll();
      lcdI2C.selectLine(2);
      lcdI2C.print("Auto Wtr at: 18e");
    } else if (int(timeClient.getHours()) >= 18 && morTime == 1 && autoSch == 0) {
      Blynk.syncAll();
      lcdI2C.selectLine(2);
      lcdI2C.print("Auto Wtr at: 6a");
    } else {

    }

  }

}

void waterNowrun() {
  interval = minStep * 60 * 1000;
  unsigned long currentMillis = millis();
  Serial.println (currentMillis);
  Serial.println (previousMillis);
  Blynk.syncAll();
  if (((currentMillis - previousMillis) >= interval) || waterNow == 0) {
    previousMillis = currentMillis;
    Blynk.virtualWrite(V10, 0);
    digitalWrite(14, LOW);
    Blynk.virtualWrite(V5, 0);
    Blynk.virtualWrite(V8, 0);
    Blynk.syncAll();
  } else {
    digitalWrite(14, HIGH);
    Blynk.virtualWrite(V5, 255);
    lcdI2C.selectLine(2);
    lcdI2C.print("Wtr Now :");
    lcdI2C.print((minStep * 60) - ((currentMillis - previousMillis) / 1000));
    Blynk.virtualWrite(V8, ((interval / 1000) - ((currentMillis - previousMillis) / 1000)));
    Blynk.syncAll();
  }
}

void sch_run2() {
  if (schTime == 1) {
    digitalWrite(14, HIGH);
    Blynk.virtualWrite(V5, 255);
    Blynk.syncAll();
  } else if (schTime == 0) {
    digitalWrite(14, LOW);
    Blynk.virtualWrite(V5, 0);
    Blynk.syncAll();
  }

}

void time_run() {
  Blynk.virtualWrite(V11, int(timeClient.getHours()));
  Blynk.virtualWrite(V12, int(timeClient.getMinutes()));
  Blynk.virtualWrite(V13, float(dht.readTempC()));
  Blynk.virtualWrite(V14, float(dht.readHumidity()));

}

void butPress() {
  if (digitalRead(2) == LOW) {
    if (flag == 0) {


      flag = 1;
      digitalWrite(14, HIGH);
    }
    else {
      digitalWrite(14, LOW);
      flag = 0;
    }
    int y = 10;
    int x = 0;
    if (digitalRead(14) == HIGH) {
      for (x = 0; x < y; x++) {
        delay(500);
        Serial.println("x:  ");         Serial.println(x);
      }
    }else{
      digitalWrite(14, LOW);
      }

  }
}

void test() {
  if (digitalRead(2) == LOW) {
    Serial.println("IDLY BLAA");
    int y = 10;
    for (int x = 0; x < y; x++) {
      delay(500);
      Serial.println("x:  ");         Serial.println(x);
    }
  }

}



void auto_run1() {
  if (morTime == 1 && String(timeClient.getFormattedTime()) > "06:00:00" && String(timeClient.getFormattedTime()) < "06:20:00") {
    digitalWrite(14, HIGH);
    Blynk.virtualWrite(V5, 255);
    Blynk.syncAll();
  }
  else if (afterTime == 1 && String(timeClient.getFormattedTime()) > "12:00:00" && String(timeClient.getFormattedTime()) < "12:20:00") {
    digitalWrite(14, HIGH);
    Blynk.virtualWrite(V5, 255);
    Blynk.syncAll();
  }
  else if (postNoon == 1 && String(timeClient.getFormattedTime()) > "14:00:00" && String(timeClient.getFormattedTime()) < "14:20:00") {
    digitalWrite(14, HIGH);
    Blynk.virtualWrite(V5, 255);
    Blynk.syncAll();
  }
  else if (eveTime == 1 && String(timeClient.getFormattedTime()) > "12:59:00" && String(timeClient.getFormattedTime()) < "13:01:00") {
    digitalWrite(14, HIGH);
    Blynk.virtualWrite(V5, 255);
    Blynk.syncAll();
  }
  else  {
    //(String(timeClient.getFormattedTime() == "06:20:00" || "12:20:00" || "14:20:00" || "13:48:00"))
    //waterNowrun();
    /*
      Blynk.virtualWrite(V10, 0);
      digitalWrite(14, LOW);
      Blynk.virtualWrite(V5, 0);
      Blynk.virtualWrite(V8, 0);
      Blynk.syncAll();
    */
  }
}

, 👍1

Обсуждение

Не делайте "lcdI2C.clear ();" в каждом цикле. Просто перепишите существующее содержимое. Тогда он не мерцает., @PMF

@PMF Я только что попробовал это, теперь ЖК-дисплей заморожен, @Coder9390

Замерзла? Как в: "Вообще ничего не показывает"? Я точно не знаю, какую библиотеку ЖК-дисплеев вы там используете, но, возможно, потребуется один раз вызвать функцию clear() при запуске., @PMF

@PMF Показывает информацию, которую он должен показывать, но не обновляет, @Coder9390

Возможно, вам потребуется выполнить " lcdI2C.setCursor(0, 0);", где было " очистить ()", чтобы убедиться, что вы начинаете с верхнего левого угла с обновления ЖК-дисплея., @PMF

Теперь это работает... но есть еще одна небольшая проблема - теперь, если я физически потревожу ЖК-дисплей, он отображает случайные символы. Не главная проблема, просто хочу знать, почему., @Coder9390

Я видел, как ЖК-дисплеи непредсказуемо ведут себя с плохими кабелями или плохим источником питания. Поэтому, если перемещение ЖК-дисплея вызывает проблемы с контактами, это может быть причиной. Убедитесь, что все кабели правильно подсоединены., @PMF

Хорошо, я немного покопался и выяснил, что это связано с высокой частотой процессора, дело закрыто, @Coder9390

одно предложение. Дайте хорошее описание обнаруженной проблемы. Решение, которое вы использовали. Ответьте на свой собственный вопрос. Это будет полезно кому-то позже., @ArduinoFan