Проблема с выводом данных на дисплей

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

  1. tair57

    tair57 Нуб

    Просьба помочь с выводом даты, времени и температуры на дисплей.
    Код (C++):
    #include <LiquidCrystal_I2C.h>
    #include <DS3231.h> // подключение библиотеки часов

    LiquidCrystal_I2C lcd(0x27, 16, 2);
    DS3231  rtc(SDA, SCL);

    #define SOIL_SENSOR A0 // пин данных датчика влажности
    #define SOIL_POWER 10  // пин питания датчика влажности
    #define RELAY_PUMP 12  // пин для реле полива
    #define LED 13        // пин для индикации событий. Моргает 1 раз в 5 сек: все в порядке, не висим
                          // Горит: идет полив. Мерцает: что-то пошло не так, нужна помощь человека...

    #define printByte(args)  write(args); // начиная отсюда... не удалять, это необходимо для напечатывания знака градуса
    uint8_t znak[8]  = {B11000, B11000, B00111, B01000, B01000, B01000, B01000, B00111,}; // знак градуса

    const byte soilMin = 16;    // значение влажности, при котором пора включать полив
    const byte soilMax = 25;    // критическая величина влажности, когда пора паниковать (болото в горшке)
    const unsigned long soilInterval = 3000; // интервал опроса датчика влажности (12 мин)
    const unsigned long relayTimeout = 180000L; // через сколько отключится полив (3 мин)
    const unsigned int ledBlink = 5000; // частота мигания светодиода
    const unsigned int ledFlick = 50;  // частота мерцания светодиода

    byte soilHumidity;          // переменная, где храним текущее значение влажности (условные проценты, т.е. 0% - пустыня, 80% - болото)
    unsigned long currTime;    // переменная, где храним текущее время проверки
    unsigned long prevSoilTime; // переменная, где храним время последней проверки влажности
    unsigned long prevPumpTime; // переменная, где храним время последней проверки длительности полива
    unsigned long prevBlinkTime; // переменная, где храним время последнего включения LED

    // ---------------------------------------------------
    void setup()
    {
      {

      Serial.begin(9600);
      pinMode(RELAY_PUMP,OUTPUT);
      pinMode(SOIL_POWER,OUTPUT);
      pinMode(LED,OUTPUT);
      digitalWrite(RELAY_PUMP, LOW); // отключаем полив
      digitalWrite(SOIL_POWER, LOW); // отключаем датчик влажности
      }
    {  lcd.init();
      lcd.backlight();  //активируем дисплей
       lcd.createChar(1, znak);
    }
    }

    // ---------------------------------------------------
    void loop()
    {
      currTime = millis(); // обновляем текущее время проверки
      checkSoilSensor();  // проверяем влажность почвы
      checkPump();        // проверяем состояние полива
      blinkLed();          // управляем индикацией по текущему состоянию
    }
    // работаем с датчиком влажности почвы
    void checkSoilSensor()
    {
      if(currTime - prevSoilTime > soilInterval) // если от предыдущей проверки влажности прошло более 15 минут...
      {
        digitalWrite(SOIL_POWER, HIGH);        // подаем питание на датчик
        delay(1100);                            // время на стабилизацию после включения
        soilHumidity = analogRead(SOIL_SENSOR); // читаем абсолютные показания датчика
        digitalWrite(SOIL_POWER, LOW);          // выключаем питание датчика
        soilHumidity = map(soilHumidity,0,1023,0,100); // преобразуем показания в условные проценты (с ними визуально легче работать)
        outputToLCD();    // выводим показания на дисплей
        outputToSerial();  // дублируем показания на комп
        if (soilHumidity < soilMin) startPump();  // если сухо, включаем полив
        if (soilHumidity > soilMax) alert();  // если критически мокро, то вопим на всю Ивановскую
        prevSoilTime = currTime;  // запоминаем время проверки
      }
    }
    //************
      void outputToLCD()
      {
        lcd.clear();
        lcd.setCursor(0, 1);
        lcd.print(soilHumidity);
        lcd.print("%");
    }
    // выводим показания влажности в Serial порт
    void outputToSerial()
    {
      Serial.print("Soil Humidity: ");
      Serial.print(soilHumidity);
      Serial.print("%");
      if ( (soilHumidity > soilMin) &&  (soilHumidity < soilMax) ) Serial.print("\t HOPMA");
      else if (soilHumidity < soilMin) Serial.print("\t MALO!");
            else if (soilHumidity > soilMax) Serial.print("\t MHOGO!!");
    }


    // проверяем состояние полива
    void checkPump()
    {
      if( digitalRead(RELAY_PUMP) && (currTime - prevPumpTime > relayTimeout) ) // если реле включено И поливаем уже больше 3 минут...
      {
        stopPump();              // отключаем полив
      }
    }


    // включаем полив
    void startPump()
    {
      lcd.setCursor(4, 0);                  // выводим сообщения
      lcd.print("POLIVAEM          ");
      Serial.println("\nPOLIVAEM");
      digitalWrite(LED, HIGH);                // включаем светодиод на постоянное свечение
      digitalWrite(RELAY_PUMP, HIGH);          // включаем реле для полива
      prevPumpTime = currTime;                // запоминаем время включения реле
    }


    // отключаем полив
    void stopPump()
    {
        Serial.println("\nPOLIV OKOH4EH");
      digitalWrite(RELAY_PUMP, LOW);          // отключаем реле для полива
      digitalWrite(LED, LOW);                  // отключаем светодиод
    }


    // мигаем LED по текущему состоянию системы
    void blinkLed()
    {
      if(!digitalRead(RELAY_PUMP)) // если сейчас нет полива (реле выключено)...
      {
        if(currTime - prevBlinkTime > ledBlink) // если прошло более 5 сек с момента мигания LED
        {
          digitalWrite(LED, !digitalRead(LED));  // показываем, что не висим: мигаем LED (меняем его состояние на противоположное)
        }
        else if ( (soilHumidity > soilMax) && (currTime - prevBlinkTime > ledFlick) ) // если очень мокро
          {
            digitalWrite(LED, !digitalRead(LED));  // мерцаем LED
          }
      }
    }


    // кричим о том, что в горшке болото и нужна помощь
    void alert()
    {
      lcd.setCursor(0, 0);                    // выводим сообщения
      lcd.print("****MHOGO VODY!   ");
      Serial.println("***MHOGO VODY!");
      stopPump(); // на всякий случай еще раз выключаем реле
    }
    //************
      void LCD()
      {
        lcd.clear();
        lcd.setCursor(0, 0); // установка курсора на ...
        lcd.print(rtc.getTemp()); //вывод температуры
        lcd.printByte(1); // знак градуса
        lcd.setCursor(8, 1);
        lcd.print(rtc.getTimeStr()); // выводим время
        lcd.setCursor(8, 0);
        lcd.print(rtc.getDateStr()); // выводим дату
           }
     
    Если убрать эту часть кода, то все работает, а если добавить, то все ступорится, хотя и загружается в контроллер
    Код (C++):
    //************
      void LCD()
      {
        lcd.clear();
        lcd.setCursor(0, 0); // установка курсора на ...
        lcd.print(rtc.getTemp()); //вывод температуры
        lcd.printByte(1); // знак градуса
        lcd.setCursor(8, 1);
        lcd.print(rtc.getTimeStr()); // выводим время
        lcd.setCursor(8, 0);
        lcd.print(rtc.getDateStr()); // выводим дату
           }
     
    Последнее редактирование: 8 мар 2017
  2. mcureenab

    mcureenab Гуру

    Так уберите, раз без нее все работает.
     
  3. Tomasina

    Tomasina Сушитель лампочек Модератор

    RTC модуль точно работает? Такое бывает если он не отвечает.
     
  4. tair57

    tair57 Нуб

    Да, конечно работает. Пробовал в другом скетче.
     
  5. tair57

    tair57 Нуб

    Убрать то уберу....только на экран выводиться будет лишь влажность земли на постоянной основе....хотелось бы заполнить экран полезной информацией
     
  6. mcureenab

    mcureenab Гуру

    Ну закоментируйте все строчки кода и открывайте их поодной. Как перестанет работать, тут оно
     
  7. alekseev2017

    alekseev2017 Нерд

    Ошибка кроется в неопытности человека, который создал тему, а ваш способ мне кажется нерациональным...
     
  8. mcureenab

    mcureenab Гуру

    Восемь строчек перебрать, много опыта не надо.