//Timotej Hanuliak
#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h> //kniznica pre pracu s MQTT
#include <LiquidCrystal_I2C.h>
#include <DHTesp.h>
DHTesp sss;
LiquidCrystal_I2C lcd(0x27,16,2);
WiFiClient wifiClient; //objekt wificlient, ktory sluzi ako parameter
PubSubClient mqttClient(wifiClient); //pre PubSubClient
const char* ssid = "Wokwi-GUEST"; //prihlasenie do WOKWI wifi siete
const char* password = "";
char *mqttServer = "broker.hivemq.com"; //definovanie MQTT servera a jeho portu
int mqttPort = 1883;
void reconnect() { //spojenie maklera MQTT s klientom ESP32
Serial.println("Connecting to MQTT Broker...");
while (!mqttClient.connected()) {
Serial.println("Reconnecting to MQTT Broker..");
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX); // vytvorenie a pridelenie ID našho klienta ESP32
if (mqttClient.connect(clientId.c_str())) { //ak je spojenie k maklerovy uspesne, tak prihlasime
Serial.println("Connected.");
// subscribe to topic
mqttClient.subscribe("room/svetlojedna"); //odber spravy z maklera topik- room/message
mqttClient.subscribe("room/svetlodva");
}
}
}
//funkcia spatneho volania
void callback(String topic, byte* message, unsigned int length) {
Serial.print("Callback - ");
Serial.print(topic);
Serial.println("Message:");
String messageTemp;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
messageTemp += (char)message[i];
}
//riadenie lediek
Serial.println();
if(topic=="room/svetlojedna"){
Serial.print("Changing Room lamp to ");
lcd.home();
lcd.print(topic);lcd.print(" ");
if((char)message[0] == '1' ){
lcd.print(" svetlojedna - on ");
digitalWrite(26, HIGH);
Serial.print("on");
}
else if((char)message[0] == '0'){
lcd.print(" svetlojedna - off ");
digitalWrite(26, LOW);
Serial.print("off");
}
Serial.println();
//messageTemp = "";
}
if(topic=="room/svetlodva"){
lcd.home();
Serial.print("Changing Room lamp to ");
if((char)message[0] == '1' ){
lcd.print(" svetlodva - on ");
digitalWrite(27, HIGH);
Serial.print("on");
}
else if((char)message[0] == '0'){
lcd.print(" svetlodva - off ");
digitalWrite(27, LOW);
Serial.print("off");
}
Serial.println();
//messageTemp = "";
}
}
//spustenie všetkého potrebného
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight(); // zapnúť podsvietenie
sss.setup(33, DHTesp::DHT22);
pinMode(26, OUTPUT);
pinMode(27, OUTPUT);
WiFi.begin(ssid, password); //pripojenie k WiFi
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("Connected to Wi-Fi");
mqttClient.setServer(mqttServer, mqttPort); //inicializacia MQTT brokera,parameter server a port
mqttClient.setCallback(callback); //registracia fukcie spatneho volania
}
void loop() {
TempAndHumidity data = sss.getTempAndHumidity();
if (!mqttClient.connected()) //pripojenie ESP32 s maklerom, inak reconnect()
reconnect();
mqttClient.loop();
long now = millis();
long previous_time = 0;
//zapisovanie a získavanie teploty
if (now - previous_time > 3000) // publikovanie sprav kazde 3 sek
previous_time = now;
float temperature = (data.temperature);
char tempString[8];
dtostrf(temperature, 1, 2, tempString); //prevod float na string,1-min sirka pola, 2-poc des miest
Serial.print("Temperature: ");
lcd.home();
lcd.print("led: ");
lcd.setCursor(0, 1);
lcd.print("teplota: ");
lcd.print(tempString);
lcd.print(" ");
Serial.println(tempString); //tempString
mqttClient.publish("room/temperature", tempString); //zverejnenie udaja teplota v danej teme
delay(1000); // nutne pre citanie na seriovom monitore
}