#include <WiFi.h>
#include <PubSubClient.h>
/* ========= WiFi Credentials ========= */
const char* ssidName = "Wokwi-GUEST";
const char* ssidPass = "";
/* ========= MQTT Broker Details ========= */
const char* brokerAddress = "broker.hivemq.com";
const int brokerPort = 1883;
const char* topicTemp = "vit/iot/temp";
const char* topicStatus = "vit/iot/status";
/* ========= Hardware Configuration ========= */
const int sensorPin = 34;
const int ledPin = 23;
/* ========= Objects ========= */
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
/* ========= Timing Control ========= */
unsigned long lastSentTime = 0;
const unsigned long sendInterval = 5000;
/* ========= Data Variables ========= */
float temperatureValue = 0.0;
int messageCount = 0;
/* ========= WiFi Connection ========= */
void startWiFi() {
Serial.print("Joining WiFi");
WiFi.begin(ssidName, ssidPass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print("*");
}
Serial.println("\nWiFi connected successfully");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
/* ========= MQTT Connection ========= */
void connectBroker() {
while (!mqttClient.connected()) {
Serial.print("Connecting to MQTT Broker... ");
String clientID = "ESP32_Client_";
clientID += String(random(1000, 9999));
if (mqttClient.connect(clientID.c_str())) {
Serial.println("Connected!");
String onlineMsg = "{\"device\":\"ESP32\",\"state\":\"active\"}";
mqttClient.publish(topicStatus, onlineMsg.c_str());
// Blink LED to indicate successful connection
for (int i = 0; i < 3; i++) {
digitalWrite(ledPin, HIGH);
delay(120);
digitalWrite(ledPin, LOW);
delay(120);
}
} else {
Serial.print("Failed, rc=");
Serial.print(mqttClient.state());
Serial.println(" retrying in 5 sec...");
delay(5000);
}
}
}
/* ========= Setup ========= */
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
startWiFi();
mqttClient.setServer(brokerAddress, brokerPort);
}
/* ========= Main Program Loop ========= */
void loop() {
if (!mqttClient.connected()) {
connectBroker();
}
mqttClient.loop();
// Read potentiometer
int adcValue = analogRead(sensorPin);
// Convert to temperature range (0 to 50 °C)
temperatureValue = (adcValue / 4095.0) * 50.0;
Serial.print("Temperature Reading: ");
Serial.print(temperatureValue, 1);
Serial.println(" °C");
unsigned long currentMillis = millis();
if (currentMillis - lastSentTime >= sendInterval) {
lastSentTime = currentMillis;
messageCount++;
String payload = "{";
payload += "\"temperature\":" + String(temperatureValue, 1) + ",";
payload += "\"messages\":" + String(messageCount) + ",";
payload += "\"millis\":" + String(currentMillis);
payload += "}";
Serial.println("Publishing Data...");
Serial.println(payload);
if (mqttClient.publish(topicTemp, payload.c_str())) {
Serial.println("Publish Success");
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
} else {
Serial.println("Publish Error");
}
Serial.println("=============================");
}
delay(1000);
}