Предотвратить мерцание ЖК - дисплея с помощью модуля 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();
*/
}
}
@Coder9390, 👍1
Обсуждение0
Смотрите также:
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- ЖК-дисплей I2C отображает странные символы
- Экран LCD 16*02 I2C показывает только первый напечатанный символ
- Sainsmart LCD 2004 - проблема с библиотекой LiquidCrytal_I2C, не удается скомпилировать
- Что означают цифры позади lcd (0x27)?
- Как подключить MPU9250 к NodeMCU с помощью SPI или I2C Slave?
- ATtiny85 I2C ЖК
- Документы по использованию i2C LCD с библиотекой Newliquidcrystal_1.3.5
Не делайте "lcdI2C.clear ();" в каждом цикле. Просто перепишите существующее содержимое. Тогда он не мерцает., @PMF
@PMF Я только что попробовал это, теперь ЖК-дисплей заморожен, @Coder9390
Замерзла? Как в: "Вообще ничего не показывает"? Я точно не знаю, какую библиотеку ЖК-дисплеев вы там используете, но, возможно, потребуется один раз вызвать функцию clear() при запуске., @PMF
@PMF Показывает информацию, которую он должен показывать, но не обновляет, @Coder9390
Возможно, вам потребуется выполнить " lcdI2C.setCursor(0, 0);", где было " очистить ()", чтобы убедиться, что вы начинаете с верхнего левого угла с обновления ЖК-дисплея., @PMF
Теперь это работает... но есть еще одна небольшая проблема - теперь, если я физически потревожу ЖК-дисплей, он отображает случайные символы. Не главная проблема, просто хочу знать, почему., @Coder9390
Я видел, как ЖК-дисплеи непредсказуемо ведут себя с плохими кабелями или плохим источником питания. Поэтому, если перемещение ЖК-дисплея вызывает проблемы с контактами, это может быть причиной. Убедитесь, что все кабели правильно подсоединены., @PMF
Хорошо, я немного покопался и выяснил, что это связано с высокой частотой процессора, дело закрыто, @Coder9390
одно предложение. Дайте хорошее описание обнаруженной проблемы. Решение, которое вы использовали. Ответьте на свой собственный вопрос. Это будет полезно кому-то позже., @ArduinoFan