#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
unsigned long previousMillis = 0;
const int interval = 2000;
int redLedState = LOW;
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
const char* mqtt_topic = "3091637K/y_led";
WiFiClient espClient;
PubSubClient client(espClient);
const char* espClientName = "3091637K";
// Pin configuration (updated for your diagram)
const int RED_LED_PIN = 5; // red LED connected to GPIO5
const int YELLOW_LED_PIN = 17; // yellow LED connected to GPIO17
const int POT_PIN = 36; // VP pin (ADC1_0) corresponds to GPIO36
bool voltageExceeded85 = false;
bool voltageDroppedBelow83 = false;
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("\nWiFi connected.");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(const char* topic, byte* payload, unsigned int length) {
Serial.print("Message received in topic: ");
Serial.println(topic);
Serial.print("Data: ");
String message = "";
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
message += (char)payload[i];
}
Serial.println();
if (String(topic) == mqtt_topic) {
if (message.equalsIgnoreCase("on")) {
digitalWrite(YELLOW_LED_PIN, HIGH);
} else if (message.equalsIgnoreCase("off")) {
digitalWrite(YELLOW_LED_PIN, LOW);
}
}
}
void MQTTSubscribe() {
client.subscribe(mqtt_topic);
Serial.println("Subscribed to topic: " + String(mqtt_topic));
}
void setup_MQTT() {
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void connectMQTT() {
while (!client.connected()) {
Serial.print("Connecting to MQTT broker...");
if (client.connect(espClientName)) {
Serial.println("connected.");
MQTTSubscribe();
} else {
Serial.print("failed with state ");
Serial.print(client.state());
delay(2000);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(RED_LED_PIN, OUTPUT);
pinMode(YELLOW_LED_PIN, OUTPUT);
pinMode(POT_PIN, INPUT);
setup_wifi();
setup_MQTT();
}
void loop() {
if (!client.connected()) {
connectMQTT();
}
client.loop();
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
redLedState = !redLedState;
digitalWrite(RED_LED_PIN, redLedState);
int adcValue = analogRead(POT_PIN);
float voltage = (adcValue / 4095.0) * 3.3;
char voltageStr[10];
dtostrf(voltage, 1, 2, voltageStr);
client.publish("3091637K/voltage", voltageStr);
float maxVoltage = 5.0;
float threshold85 = 0.85 * maxVoltage;
float threshold83 = 0.83 * maxVoltage;
if (voltage > threshold85 && !voltageExceeded85) {
client.publish("3091637K/alert", "Voltage exceeded 85%");
voltageExceeded85 = true;
voltageDroppedBelow83 = false;
} else if (voltage < threshold83 && !voltageDroppedBelow83) {
client.publish("3091637K/alert", "Voltage dropped below 83%");
voltageDroppedBelow83 = true;
voltageExceeded85 = false;
}
}
}