#include <WiFi.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <WebServer.h>
// Nastavenie LCD displeja (16x2)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// WiFi údaje – pre simuláciu vo Wokwi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Nastavenie DHT senzora (vo Wokwi je simulovaný DHT22)
#define DHTPIN 33
#define DHTTYPE DHT22 // Ak máš fyzicky DHT11, zmeň na DHT11, ale vo Wokwi použi DHT22
DHT dht(DHTPIN, DHTTYPE);
// LED – pripojená na GPIO 26
const int ledPin = 26;
String ledState = "OFF";
// Inicializácia webového servera na porte 80
WebServer server(80);
// Premenné pre senzor
float temperature = 0.0;
float humidity = 0.0;
// Časové intervaly na meranie (2 sekundy)
unsigned long lastReadTime = 0;
const long readInterval = 2000;
//
// Funkcia obsluhujúca hlavnú stránku webového servera
//
void handleRoot() {
// Pri načítaní stránky osviežime snímky z DHT senzora
temperature = dht.readTemperature();
humidity = dht.readHumidity();
String html = "<!DOCTYPE html><html><head><meta name='viewport' content='width=device-width, initial-scale=1'>";
html += "<style>body {font-family: Arial; text-align: center; margin-top: 50px;} ";
html += "table {margin: 0 auto; border-collapse: collapse;}";
html += "table, th, td {border: 1px solid #333; padding: 10px;}";
html += "button {padding: 10px 20px; font-size: 16px; margin: 10px;}</style></head><body>";
html += "<h1>ESP32 Web Server</h1>";
// Tlačidlo na ovládanie LED – ak je LED vypnutá, zobrazí sa možnosť ju zapnúť, inak vypnúť.
if (ledState == "OFF") {
html += "<p><a href='/led/on'><button>Zapni LED</button></a></p>";
} else {
html += "<p><a href='/led/off'><button>Vypni LED</button></a></p>";
}
// Tabuľka s údajmi zo senzora a stavom LED
html += "<table>";
html += "<tr><th>Parameter</th><th>Hodnota</th></tr>";
html += "<tr><td>Teplota (°C)</td><td>" + String(temperature, 1) + "</td></tr>";
html += "<tr><td>Vlhkosť (%)</td><td>" + String(humidity, 1) + "</td></tr>";
html += "<tr><td>Stav LED</td><td>" + ledState + "</td></tr>";
html += "</table>";
html += "</body></html>";
server.send(200, "text/html", html);
}
//
// Funkcie pre ovládanie LED
//
void handleLedOn() {
digitalWrite(ledPin, HIGH);
ledState = "ON";
// Po zmene stavu presmerujeme späť na hlavnú stránku
server.sendHeader("Location", "/");
server.send(303);
}
void handleLedOff() {
digitalWrite(ledPin, LOW);
ledState = "OFF";
server.sendHeader("Location", "/");
server.send(303);
}
//
// Nastavenie v setup()
//
void setup() {
Serial.begin(115200);
// Inicializácia LCD displeja
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Teplota: --.- C");
lcd.setCursor(0, 1);
lcd.print("Vlhkost: --.- %");
// Inicializácia LED
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
// Inicializácia DHT senzora
dht.begin();
// Pripojenie na WiFi
Serial.println("Pripajam sa na WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi pripojene.");
Serial.print("IP adresa: ");
Serial.println(WiFi.localIP());
// Nastavenie webového servera
server.on("/", handleRoot);
server.on("/led/on", handleLedOn);
server.on("/led/off", handleLedOff);
server.begin();
Serial.println("WebServer spusteny.");
}
//
// Hlavná slučka programu
//
void loop() {
server.handleClient();
// Obnovovanie údajov zo senzora každé 2 sekundy
if (millis() - lastReadTime > readInterval) {
lastReadTime = millis();
temperature = dht.readTemperature();
humidity = dht.readHumidity();
// Aktualizácia LCD displeja – zobrazujeme len teplotu a vlhkosť
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Teplota: " + String(temperature, 1) + " C");
lcd.setCursor(0, 1);
lcd.print("Vlhkost: " + String(humidity, 1) + " %");
}
}