#include <WiFi.h>
#include <time.h>
#include <Wire.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 7 * 3600;
const int daylightOffset_sec = 0;
#define DHT_PIN 4
#define DHT_TYPE DHT22
#define SDA_PIN 21
#define SCL_PIN 22
DHT dht(DHT_PIN, DHT_TYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
unsigned long lastRead = 0;
void connectWiFi() {
Serial.print("WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
}
String getTimeString() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
return "--:--:--";
}
char buffer[10];
strftime(buffer, sizeof(buffer), "%H:%M:%S", &timeinfo);
return String(buffer);
}
String getDateString() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
return "--.--";
}
char buffer[10];
strftime(buffer, sizeof(buffer), "%d.%m", &timeinfo);
return String(buffer);
}
void setup() {
Serial.begin(115200);
dht.begin();
Wire.begin(SDA_PIN, SCL_PIN);
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Weather station");
delay(2000);
connectWiFi();
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
lcd.clear();
}
void loop() {
if (millis() - lastRead > 2000) {
lastRead = millis();
float temp = dht.readTemperature();
float hum = dht.readHumidity();
if (isnan(temp) || isnan(hum)) {
Serial.println("DHT error");
return;
}
String timeStr = getTimeString();
String dateStr = getDateString();
Serial.print("Time: ");
Serial.print(timeStr);
Serial.print(" Date: ");
Serial.print(dateStr);
Serial.print(" Temp: ");
Serial.print(temp);
Serial.print("C Hum: ");
Serial.print(hum);
Serial.println("%");
lcd.clear();
lcd.setCursor(0,0);
lcd.print(timeStr);
lcd.print(" ");
lcd.print(dateStr);
lcd.setCursor(0,1);
lcd.print("T:");
lcd.print(temp,1);
lcd.print("C ");
lcd.print("H:");
lcd.print(hum,0);
lcd.print("%");
}
}