#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h> //kniznica pre pracu s MQTT
#include <DHTesp.h> // importuje knižnicu DHT
DHTesp MojSenzor; //vytvori objekt DHT22 s názvom MojSenzor
WiFiClient wifiClient; //objekt wificlient, kt sluzi ako parameter
PubSubClient mqttClient(wifiClient); //pre PubSubClient
const char* ssid = "Wokwi-GUEST";
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("room/message"); //odber spravy z maklera topik- room/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=="room/message"){
Serial.print("Changing Room lamp to ");
if((char)message[0] == '1' ){
digitalWrite(26, HIGH);
Serial.print("on");
}
else if((char)message[0] == '0'){
digitalWrite(26, LOW);
Serial.print("off");
}
Serial.println();
//messageTemp = "";
}
}
void setup() {
Serial.begin(115200);
pinMode(26, OUTPUT);
MojSenzor.setup(33, DHTesp::DHT22);
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();
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: ");
Serial.println(tempString); //tempString
mqttClient.publish("room/temperature", tempString); //zverejnenie udaja teplota v danej teme
float humidity = (data.humidity);
char humString[8];
dtostrf(humidity, 1, 2, humString); //prevod float na string,1-min sirka pola, 2-poc des miest
Serial.print("Humidity: ");
Serial.println(humString); //humString
mqttClient.publish("room/humidity", humString); //zverejnenie udaja teplota v danej teme
delay(1000); // nutne pre citanie na seriovom monitore
}