#include <WiFi.h>
#include <PubSubClient.h>
// WiFi Configuration
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT Configuration
const char* mqtt_server = "broker.mqttgo.io";
const char* clientID = "";
const int mqtt_port = 1883;
const char* topic_voltage = "Voltage"; // Topic for voltage data
const char* topic_resistance = "Resistance"; // Topic for resistance data
const char* topic_command = "Command"; // Topic for receiving commands
const char* topic_M1 = "M1";
WiFiClient espClient;
PubSubClient client(espClient);
// Light Sensor Configuration
#define LIGHT_SENSOR_PIN 36 // ESP32 pin GIOP36 (ADC0)
#define LED_PIN 2 // GPIO for LED
const float GAMMA = 0.7;
const float RL10 = 33;
long lastMsg = 0;
float voltage = 0.0;
float resistance = 0.0;
// Function to connect to WiFi
void connect_wifi() {
delay(10);
WiFi.begin(ssid, password);
Serial.println("Connecting to WiFi...");
int retry_count = 0;
while (WiFi.status() != WL_CONNECTED && retry_count < 20) {
delay(500);
Serial.print(".");
retry_count++;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\nWiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
} else {
Serial.println("\nFailed to connect to WiFi");
Serial.println("Rebooting...");
delay(5000);
ESP.restart(); // Reboot the ESP32 if it can't connect
}
}
// MQTT callback function
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived in topic: ");
Serial.println(topic);
String data = "";
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
data += (char)payload[i];
}
Serial.println("\n-----------------------");
// Handle incoming commands
if (String(topic) == topic_command) {
if (data == "ON") {
digitalWrite(LED_PIN, HIGH);
Serial.println("LED turned ON");
} else if (data == "OFF") {
digitalWrite(LED_PIN, LOW);
Serial.println("LED turned OFF");
} else {
Serial.println("Unknown command received");
}
}
}
// Function to reconnect to MQTT broker
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect(clientID)) {
Serial.println("MQTT connected");
client.subscribe(topic_command);
client.subscribe(topic_voltage);
client.subscribe(topic_resistance);
client.subscribe(topic_M1);
Serial.println("Subscribed to command topic");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
// Function to read sensor and calculate voltage and resistance
void readSensor() {
int analogValue = analogRead(LIGHT_SENSOR_PIN);
voltage = analogValue / 4096.0 * 3.3; // Calculate voltage
resistance = 2000 * voltage / (1 - voltage / 3.3); // Calculate resistance
Serial.print("Analog Value = ");
Serial.println(analogValue);
Serial.print("Voltage = ");
Serial.println(voltage);
Serial.print("Resistance = ");
Serial.println(resistance);
// Control LED based on voltage
if (voltage > 2.0) {
digitalWrite(LED_PIN, HIGH);
Serial.println("Voltage is high, LED ON");
} else {
digitalWrite(LED_PIN, LOW);
Serial.println("Voltage is low, LED OFF");
}
}
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
connect_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) { // Ensure MQTT connection
reconnect();
}
client.loop();
readSensor(); // Read sensor data
long now = millis();
if (now - lastMsg > 5000) { // Publish data every 5 seconds
lastMsg = now;
// Publish voltage
String voltageMessage = String(voltage, 2); // Format with 2 decimal places
client.publish(topic_voltage, voltageMessage.c_str());
Serial.print("Published Voltage: ");
Serial.println(voltageMessage);
// Publish resistance
String resistanceMessage = String(resistance, 2); // Format with 2 decimal places
client.publish(topic_resistance, resistanceMessage.c_str());
Serial.print("Published Resistance: ");
Serial.println(resistanceMessage);
}
}