#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h> //kniznica pre pracu s MQTT
#include <Wire.h> // pridaj knižnicu I2C
#include <LiquidCrystal_I2C.h> // pridaj knižnicu I2C dispeja
#include <DHTesp.h> // importuje knižnicu DHT11
DHTesp MojSenzor; //vytvoří objekt MojSenzor s názvom MojSenzor
LiquidCrystal_I2C lcd(0x27,16,2);
WiFiClient wifiClient; //objekt wificlient, ktory sluzi ako parameter
PubSubClient mqttClient(wifiClient); //pre PubSubClient
const char* ssid = "Wokwi-GUEST";//definovanie wifi
const char* password = "";
char *mqttServer = "broker.hivemq.com"; //definovanie MQTT servera a 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);
if (mqttClient.connect(clientId.c_str())) { //ak je spojenie k maklerovy uspesne, tak
Serial.println("Connected.");
// subscribe to topic
mqttClient.subscribe("aded/message"); //odber spravy
mqttClient.subscribe("add/message");
}
}
}
//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];
}
Serial.println();
if(topic=="aded/new"){
Serial.print("Changing Room lamp to ");
if((char)message[0] == '1' ){
digitalWrite(26, HIGH);
lcd.setCursor(0,0);
lcd.print("L1:1");
Serial.print("on");
}
else if((char)message[0] == '0'){
digitalWrite(26, LOW);
lcd.setCursor(0,0);
lcd.print("L1:0");
Serial.print("off");
}
Serial.println();
}
else if(topic=="add/new"){
Serial.print("Changing Room lamp to ");
if((char)message[0] == '1' ){
digitalWrite(27, HIGH);
lcd.setCursor(0,1);
lcd.print("L2:1");
Serial.print("on");
}
else if((char)message[0] == '0'){
digitalWrite(27, LOW);
lcd.setCursor(0,1);
lcd.print("L2:0");
Serial.print("off");
}
Serial.println();
}
}
void setup() {
lcd.init();
lcd.backlight();
Serial.begin(115200);
lcd.setCursor(0,0);
lcd.print("L1:0");
lcd.setCursor(0,1);
lcd.print("L2:0");
MojSenzor.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); //regestracia fukcie spatneho volania
}
void loop() {
if (!mqttClient.connected()){ //pripojenie ESP32 s maklerom, inak reconnect()
reconnect();
mqttClient.loop();
long now = millis();
long previous_time = 0;
if (now - previous_time > 3000) {// publikovanie sprav kazde 3 sek
previous_time = now;
TempAndHumidity data = MojSenzor.getTempAndHumidity();
lcd.setCursor(4,0);
lcd.print("Temp: " + String(data.temperature, 2) + "oC");
lcd.setCursor(4,1);
lcd.print("Humi*: " + String(data.humidity, 1) + "%");
float temperature = data.temperature;
float hu = data.humidity;
char tempString[8];
char huString[8];
Serial.print("hu: ");
dtostrf(hu, 1, 2, huString);
Serial.println(huString);
mqttClient.publish("add/hu", huString);
dtostrf(temperature, 1, 2, tempString); //prevod float na string,1-min sirka pola, 2-poc des miest
Serial.print("Temperature: ");
Serial.println(tempString); //tempString
mqttClient.publish("add/temperature", tempString); //zverejnenie udaja teplota v danej teme
delay(1000) ; // nutne pre citanie na seriovom monitore
}
}
}