#include <LiquidCrystal_I2C.h>
#include <HX711.h>
#include <WiFi.h>
#include <PubSubClient.h>
/* -------- PIN DEFINITIONS -------- */
#define LC_DATA_PIN 27
#define LC_SCLK_PIN 26
#define RELAY_PIN 25
#define LED_PIN 18
#define POWER_PIN 32
/* -------- LOAD LIMIT -------- */
#define LOAD_LIMIT 3.6 // kg
/* -------- WIFI CREDENTIALS -------- */
const char* ssid = "Wokwi-GUEST";
const char* password = ""; // ✅ fixed
/* -------- MQTT BROKER -------- */
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
/* -------- OBJECTS -------- */
LiquidCrystal_I2C lcd(0x27, 16, 2);
HX711 scale;
float loadValue;
const float analogScale = 3.3/4095;
bool isPowerOn = false;
/* -------- MQTT CONNECT FUNCTION -------- */
void connectMQTT() {
while (!client.connected()) {
Serial.print("Connecting to MQTT...");
if (client.connect("ESP32_Vehicle_Load_01")) {
Serial.println("Connected to MQTT Cloud");
} else {
delay(1000);
}
}
}
/* -------- SETUP -------- */
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
pinMode(LED_PIN, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(POWER_PIN, INPUT);
digitalWrite(LED_PIN, LOW);
digitalWrite(RELAY_PIN, HIGH);
scale.begin(LC_DATA_PIN, LC_SCLK_PIN);
scale.set_scale(420.0);
scale.tare();
/* -------- WIFI CONNECTION -------- */
WiFi.begin(ssid, password);
lcd.setCursor(0,0);
lcd.print("Connecting WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
lcd.clear();
lcd.print("WiFi Connected");
delay(1000);
/* -------- MQTT SETUP -------- */
client.setServer(mqtt_server, 1883);
connectMQTT();
}
/* -------- LOOP -------- */
void loop() {
if (!client.connected()) {
connectMQTT();
}
client.loop();
lcd.clear();
isPowerOn = (analogRead(POWER_PIN) * analogScale) >= 1;
loadValue = scale.get_units(5);
if (loadValue < 0) loadValue = 0;
lcd.setCursor(0,0);
lcd.print("Load: ");
lcd.print(loadValue);
lcd.print("kg");
Serial.print("Load: ");
Serial.println(loadValue);
// Publish load to cloud
client.publish("vehicle/load", String(loadValue).c_str());
if (loadValue > LOAD_LIMIT) {
lcd.setCursor(0,1);
lcd.print("OVERLOAD!");
digitalWrite(LED_PIN, HIGH);
if(!isPowerOn)
digitalWrite(RELAY_PIN, LOW);
client.publish("vehicle/status", "OVERLOAD");
}
else {
lcd.setCursor(0,1);
lcd.print("Normal Load");
digitalWrite(LED_PIN, LOW);
digitalWrite(RELAY_PIN, HIGH);
client.publish("vehicle/status", "NORMAL");
}
delay(1000);
}
GDS