/*
Exercise 9 - MQTT Publisher
ESP32 + Potentiometer
*/
#include <WiFi.h>
#include <PubSubClient.h>
// ------------------- WiFi -------------------
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ------------------- MQTT -------------------
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
const char* topic_temperature = "vit/iot/temp";
const char* topic_status = "vit/iot/status";
// ------------------- Pins -------------------
#define POT_PIN 34
#define LED_PIN 23
// ------------------- Variables -------------------
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
const long interval = 5000; // publish every 5 seconds
int msgCount = 0;
float temperature = 0;
// ------------------- Setup -------------------
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
Serial.println("EXERCISE 9 - MQTT PUBLISHER");
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Connected ✓");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
client.setServer(mqtt_server, mqtt_port);
}
// ------------------- Reconnect Function -------------------
void reconnect() {
while (!client.connected()) {
Serial.print("Connecting to MQTT...");
String clientId = "ESP32_Publisher_";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println(" Connected ✓");
Serial.println("Client ID: " + clientId);
// Publish online status
client.publish(topic_status, "{\"status\":\"online\",\"device\":\"publisher\"}");
} else {
Serial.print(" Failed, rc=");
Serial.print(client.state());
Serial.println(" Retrying in 5 seconds...");
delay(5000);
}
}
}
// ------------------- Main Loop -------------------
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
unsigned long now = millis();
if (now - lastMsg > interval) {
lastMsg = now;
// Read potentiometer
int potValue = analogRead(POT_PIN);
// Convert to temperature (0–50°C)
temperature = map(potValue, 0, 4095, 0, 500) / 10.0;
msgCount++;
// Create JSON payload
String payload = "{";
payload += "\"temp\":" + String(temperature, 1) + ",";
payload += "\"count\":" + String(msgCount) + ",";
payload += "\"time\":" + String(millis());
payload += "}";
Serial.println("\n--- PUBLISHING ---");
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Payload: ");
Serial.println(payload);
// Publish
if (client.publish(topic_temperature, payload.c_str())) {
Serial.println("Publish Successful ✓");
// Blink LED
digitalWrite(LED_PIN, HIGH);
delay(200);
digitalWrite(LED_PIN, LOW);
} else {
Serial.println("Publish Failed ✗");
}
}
}