Уважаемые форумчани. Необходима ваша помощь. Оборудование: Arduino Uno, DHT11, LCD Keypad Shild Проблема с выводом символов на дисплей. Происходит постоянное мерцание. Как я понимаю вызвано это функцией lcd.clear(); Может быть есть какой то вариант избежать мерцания и при этом корректно менять значения? Или тут просто ошибки? У автора этого кода все выводит без проблем. С автором связи нет. Код (C++): #include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7); #include "DHT.h" #include <math.h> #define DHTPIN A1 // what pin we're connected to #define DHTTYPE DHT11 // DHT 11 int status; int relay_start =12; int relay1 = 0; int relay2 = 3; int relay3 = 2; int relay4 = 1; int kontrol = 11; int attempt = 0; int k_attempt = 2; //Количество попыток запуска отопителя double time_start; int time; int multi; int nakal = 15; //через сколько секунд включаеться свеча накала после нажатия на старт int motor1 = 25; //через сколько секунд включаеться отопитель на слабых оборотах после нажатия на старт int stop_nakal = 50; //через сколько секунд выключаем свечу накала после нажатия на старт int teme_kontrol = 100; //через сколько секунд включаеться свеча накала повторно если нет запуска int time_multi = 200; //Время через которое отопитель перейдет в максимльній режим работы. int teme_max = 2700; //Максемальное время работы отопителя int max_t = 23; //Максемальная температура воздуха перед отключение отопителя DHT dht(DHTPIN, DHTTYPE); void setup() { lcd.begin(16, 2); pinMode(relay1, OUTPUT); pinMode(relay2, OUTPUT); pinMode(relay3, OUTPUT); pinMode(relay4, OUTPUT); pinMode(relay_start, OUTPUT); digitalWrite(relay1, HIGH); digitalWrite(relay2, HIGH); digitalWrite(relay3, HIGH); digitalWrite(relay4, HIGH); digitalWrite(relay_start, HIGH); pinMode(kontrol, INPUT); } void loop() { if(time_start) time = (millis() - time_start)/1000; //double h = dht.readHumidity(); int h = dht.readHumidity(); int t = dht.readTemperature(); //------Запуск кнопкой----------------------- int x = analogRead (0); //Отключение if(x < 25){ lcd.clear(); status = 5; digitalWrite(relay1, HIGH); digitalWrite(relay2, LOW); digitalWrite(relay3, HIGH); digitalWrite(relay4, HIGH); } //Включение if(x < 200 && t < 25){ if(!status){ status = 1; time_start = millis(); digitalWrite(relay_start, LOW); //Включаем инвертор 24-12 digitalWrite(relay1, LOW); //Включаем подачу топлева digitalWrite(relay2, LOW); //Включаем мотор lcd.clear(); } multi = 0; } //Включение ускоренное if(x < 400 && x > 200){ if(!status){ status = 1; time_start = millis(); digitalWrite(relay_start, LOW); //Включаем инвертор 24-12 digitalWrite(relay1, LOW); //Включаем подачу топлева digitalWrite(relay2, LOW); //Включаем мотор lcd.clear(); } multi = 1; } if(!digitalRead(kontrol)){ digitalWrite(relay4, HIGH); //Отключаем свечу накала если сработал дотчик роботы отопителя } if(status == 1 && time > nakal){ //Включаем свечу накала digitalWrite(relay2, HIGH); //Отключаем мотор digitalWrite(relay4, LOW); status = 2; } if(status == 2 && time > motor1){ //Включаем слабые обороты мотора digitalWrite(relay3, HIGH); digitalWrite(relay2, LOW); status = 3; } if(status == 3 && time > stop_nakal){ //Выключаем свечу накала digitalWrite(relay4, HIGH); status = 4; int repetition = 1; } if(attempt < k_attempt){ if(status == 4 && time > teme_kontrol && digitalRead(kontrol) == 1){ status = 1; time_start = millis()-nakal*1000; attempt++; } }else if(digitalRead(kontrol)){ //отключам так как нет запуска digitalWrite(relay4, HIGH); digitalWrite(relay2, HIGH); digitalWrite(relay1, HIGH); attempt = 0; status = 0; time_start = 0; time = 0; } if(!digitalRead(kontrol) && status == 4){ if(time > time_multi && multi){ //Переходим в ускоренный режим digitalWrite(relay3, LOW); digitalWrite(relay2, HIGH); } if(time > time_multi && !multi){ //Переходим в обычный режим digitalWrite(relay3, HIGH); digitalWrite(relay2, LOW); } if( t >= max_t || time > teme_max){ digitalWrite(relay1, HIGH); digitalWrite(relay2, LOW); digitalWrite(relay3, HIGH); status = 5; } } if(status == 5 && digitalRead(kontrol)){ digitalWrite(relay4, HIGH); digitalWrite(relay3, HIGH); digitalWrite(relay2, HIGH); digitalWrite(relay1, HIGH); digitalWrite(relay_start, HIGH); attempt = 0; status = 0; time_start = 0; time = 0; lcd.clear(); } lcd.clear(); if(!digitalRead(relay1)){ lcd.setCursor(0, 0); lcd.print("Top"); } if(!digitalRead(relay2)){ lcd.setCursor(4, 0); lcd.print("M1"); } if(!digitalRead(relay3)){ lcd.setCursor(7, 0); lcd.print("M2"); } if(!digitalRead(relay4)){ lcd.setCursor(10, 0); lcd.print("Na"); } if(!digitalRead(relay_start)){ lcd.setCursor(13, 0); lcd.print("12v"); } lcd.setCursor(0, 1); lcd.print(t); lcd.print(" C"); lcd.setCursor(5, 1); lcd.print(h); lcd.print(" %"); lcd.setCursor(11, 1); if(!digitalRead(kontrol) && status == 4){ lcd.print(teme_max - time); lcd.setCursor(16, 1); lcd.print("*"); }else if(time && status != 5) lcd.print(time); }
Скорее всего выводите несколько раз в сек. Так делать не надо, достаточно обновлять пару раз в секунду или реже. И только те места которые меняются, а не все целиком.
Я в этой теме еще не селен, но меня очень заинтересовала платформа Arduino. У меня получается несколько динамических параметров: lcd.print("Top"); клапан подачи топлива lcd.print("M1"); мотор 1 lcd.print("M2"); мотор 2 lcd.print("Na"); Накал свечи Может вы сможете подсказать где поправить скетч для обновления конкретных данных?