#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
const char* WIFI_SSID = "Wokwi-GUEST";
const char* WIFI_PASS = "";
const char* MQTT_HOST = "broker.hivemq.com";
const int MQTT_PORT = 1883;
const char* TOPIC_TEMP = "iot/esp32/temperature";
const char* TOPIC_LED = "iot/esp32/led";
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastPublish = 0;
const int LED_PIN = 2;
void connectWiFi()
{
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
}
void onMessage(char* topic, byte* payload, unsigned int length) {
StaticJsonDocument<64> doc;
DeserializationError err = deserializeJson(doc, payload, length);
if (err) {
return;
}
if (String(topic) == TOPIC_LED) {
const char* value = doc["value"];
if (strcmp(value, "on") == 0) {
digitalWrite(LED_PIN, HIGH);
} else if (strcmp(value, "off") == 0) {
digitalWrite(LED_PIN, LOW);
}
}
}
void connectMQTT() {
while (!client.connected()) {
String clientId = "esp32-" + String(random(10000));
if (client.connect(clientId.c_str())) {
client.subscribe(TOPIC_LED);
}
delay(500);
}
}
float randomTemperature() {
return 20.0 + (random(0, 1000) / 1000.0) * 10.0;
}
void setup() {
Serial.begin(115200);
randomSeed(esp_random());
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
connectWiFi();
client.setServer(MQTT_HOST, MQTT_PORT);
client.setCallback(onMessage);
connectMQTT();
}
void loop() {
if (!client.connected()) {
connectMQTT();
}
client.loop();
if (millis() - lastPublish > 1000) {
lastPublish = millis();
float temp = randomTemperature();
StaticJsonDocument<64> doc;
doc["temperature"] = temp;
char buffer[64];
serializeJson(doc, buffer);
client.publish(TOPIC_TEMP, buffer);
Serial.println(buffer);
}
}