#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <RTClib.h>
// Настройки
#define DHTPIN 2
#define DHTTYPE DHT11
// Создаем объекты
LiquidCrystal_I2C lcd(0x27, 16, 2); // Адрес может быть 0x3F
DHT dht(DHTPIN, DHTTYPE);
RTC_DS3231 rtc;
void setup() {
Serial.begin(9600);
// Инициализируем дисплей
lcd.init();
lcd.backlight();
lcd.print("Hello! Weather");
lcd.setCursor(0, 1);
lcd.print("Station is ON");
// Запускаем датчик и часы
dht.begin();
if (!rtc.begin()) {
lcd.print("RTC Error!");
while (1);
}
// Раскомментируйте следующую строку для принудительной установки времени,
// если часы сбились. После прошивки снова закомментируйте!
// rtc.adjust(DateTime(F(DATE), F(TIME)));
delay(2000);
lcd.clear();
}
void loop() {
// Спрашиваем у часов, который час
DateTime now = rtc.now();
// Читаем показания с датчика
float h = dht.readHumidity();
float t = dht.readTemperature();
// Если датчик не отвечает, ругаемся
if (isnan(h) || isnan(t)) {
lcd.setCursor(0, 1);
lcd.print("Sensor Error :(");
return;
}
lcd.clear();
// Выводим время и дату (красиво, с нулями)
lcd.setCursor(0, 0);
if (now.hour() < 10) lcd.print("0");
lcd.print(now.hour());
lcd.print(":");
if (now.minute() < 10) lcd.print("0");
lcd.print(now.minute());
lcd.setCursor(8, 0);
lcd.print(now.day());
lcd.print("/");
lcd.print(now.month());
// Выводим температуру и влажность
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.print(t, 0);
lcd.print((char)223); // Рисуем значок градуса
lcd.print("C");
lcd.setCursor(8, 1);
lcd.print("H:");
lcd.print(h, 0);
lcd.print("%");
// Обновляем данные раз в 5 секунд
delay(5000);
}