#include <WiFi.h>
#include <PubSubClient.h>
#include <math.h>
// ======================================
// WiFi Details
// ======================================
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ======================================
// MQTT Broker
// ======================================
const char* mqtt_server =
"broker.hivemq.com";
// ======================================
// ESP32 Pins
// ======================================
#define VOLTAGE_PIN 34
#define CURRENT_PIN 35
#define TEMP_PIN 32
WiFiClient espClient;
PubSubClient client(espClient);
// ======================================
// MQTT Reconnect
// ======================================
void reconnect()
{
while (!client.connected())
{
Serial.println("Connecting MQTT...");
String clientId =
"ESP32Client-" +
String(random(1000));
if (client.connect(clientId.c_str()))
{
Serial.println("✅ MQTT Connected");
}
else
{
Serial.print("❌ MQTT Failed : ");
Serial.println(client.state());
delay(2000);
}
}
}
// ======================================
// Setup
// ======================================
void setup()
{
Serial.begin(115200);
// ----------------------------------
// Connect WiFi
// ----------------------------------
Serial.println("Connecting WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("\n✅ WiFi Connected");
// ----------------------------------
// MQTT Server
// ----------------------------------
client.setServer(
mqtt_server,
1883
);
}
// ======================================
// Loop
// ======================================
void loop()
{
// ----------------------------------
// MQTT Reconnect
// ----------------------------------
if (!client.connected())
{
reconnect();
}
client.loop();
// ==================================
// Read Voltage Pot
// ==================================
int voltageADC =
analogRead(VOLTAGE_PIN);
float voltage =
map(
voltageADC,
0,
4095,
150,
260
);
// ==================================
// Read Current Pot
// ==================================
int currentADC =
analogRead(CURRENT_PIN);
float current =
map(
currentADC,
0,
4095,
0,
25
);
// ==================================
// Read NTC Sensor
// ==================================
int tempADC = analogRead(TEMP_PIN);
// Convert ADC to Voltage
float voltageNTC =
tempADC * (3.3 / 4095.0);
// Thermistor Parameters
const float BETA = 3950;
float resistance =
10000 * (
voltageNTC /
(3.3 - voltageNTC)
);
// Steinhart-Hart Equation
float temperature =
1 / (
log(resistance / 10000) / BETA +
1.0 / 298.15
) - 273.15;
// ==================================
// Create CSV Data
// ==================================
String data =
String(voltage) + "," +
String(current) + "," +
String(temperature);
// ==================================
// Publish MQTT
// ==================================
client.publish(
"power/system",
data.c_str()
);
// ==================================
// Serial Monitor Output
// ==================================
Serial.println("--------------------------------");
Serial.print("Voltage : ");
Serial.print(voltage);
Serial.println(" V");
Serial.print("Current : ");
Serial.print(current);
Serial.println(" A");
Serial.print("Temperature : ");
Serial.print(temperature);
Serial.println(" C");
Serial.print("MQTT Data : ");
Serial.println(data);
Serial.println("✅ MQTT Published");
// ==================================
// Delay
// ==================================
delay(5000);
}