Просьба помочь с выводом даты, времени и температуры на дисплей. Код (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()); // выводим дату }
Убрать то уберу....только на экран выводиться будет лишь влажность земли на постоянной основе....хотелось бы заполнить экран полезной информацией
Ошибка кроется в неопытности человека, который создал тему, а ваш способ мне кажется нерациональным...