#include <WiFi.h>
#include <MQTT.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttServer = "broker.emqx.io";
int port = 1883;
String stMac;
char mac[50];
char clientId[50];
WiFiClient net;
MQTTClient client;
const int ledPin = 2;
const int ldrPin = 33;
unsigned long previousMillis = 0;
const long interval = 2000;
// MQTT topics
const char* sensorTopic = "IoT/sensor";
const char* relayTopic = "IoT/control";
void messageReceived(String &topic, String &payload) {
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
Serial.println(payload);
// Handle LED control messages
if (topic == relayTopic) {
Serial.print("Changing output to ");
if (payload == "ON") {
Serial.println("ON");
digitalWrite(ledPin, HIGH);
} else if (payload == "OFF") {
Serial.println("OFF");
digitalWrite(ledPin, LOW);
}
}
}
void setup() {
Serial.begin(115200);
randomSeed(analogRead(0));
delay(10);
// Set LED pin as output
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW); // Initially off
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
wifiConnect();
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.println(WiFi.macAddress());
stMac = WiFi.macAddress();
stMac.replace(":", "_");
Serial.println(stMac);
// Setup MQTT
client.begin(mqttServer, port, net);
client.onMessage(messageReceived);
// Connect to MQTT broker
mqttReconnect();
}
void wifiConnect() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}
void mqttReconnect() {
Serial.print("Attempting MQTT connection...");
long r = random(1000);
sprintf(clientId, "clientId-%ld", r);
while (!client.connect(clientId)) {
Serial.print(".");
delay(1000);
}
Serial.println("\nconnected!");
client.subscribe(relayTopic);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
int ldrValue = analogRead(ldrPin);
int mappedValue = map(ldrValue, 0, 4096, 0, 100);
String sensorData = String(mappedValue);
publishSensorData(sensorData);
}
client.loop();
if (!client.connected()) {
mqttReconnect();
}
}
void publishSensorData(String data) {
Serial.print("Publishing sensor data: ");
Serial.println(data);
client.publish(sensorTopic, data);
}