Автоматический запуск дизельного отопителя

Тема в разделе "Arduino & Shields", создана пользователем DrDevil, 15 ноя 2017.

  1. DrDevil

    DrDevil Нуб

    Уважаемые форумчани. Необходима ваша помощь.
    Оборудование: 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);
    }
     
    Последнее редактирование: 15 ноя 2017
  2. ostrov

    ostrov Гуру

    Скорее всего выводите несколько раз в сек. Так делать не надо, достаточно обновлять пару раз в секунду или реже. И только те места которые меняются, а не все целиком.
     
  3. DrDevil

    DrDevil Нуб

    Я в этой теме еще не селен, но меня очень заинтересовала платформа Arduino.
    У меня получается несколько динамических параметров:
    lcd.print("Top"); клапан подачи топлива
    lcd.print("M1"); мотор 1
    lcd.print("M2"); мотор 2
    lcd.print("Na"); Накал свечи

    Может вы сможете подсказать где поправить скетч для обновления конкретных данных?
     
  4. ostrov

    ostrov Гуру

    Сделать функцию с таймером которая выводит инфу, например раз в сек.