/* Smart Bin Project 2025
Name: GUO CHAO
Class: DEEC1
Date: 20 JUL 2025
*/
#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <LiquidCrystal_I2C.h> // Include LCD library
// LCD Configuration (I2C address typically 0x27 or 0x3F)
LiquidCrystal_I2C lcd(0x27, 16, 2); // Set the LCD address and dimensions
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* hostname = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
const char* espClientName = "esp32Client_9951651U";
int PORTNUM = 1883;
// Bin status variables
String binStatus = "Initializing...";
int lastAdcValue = 0;
void setup_wifi() {
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
lcd.setCursor(0, 0);
lcd.print("Connecting WiFi");
lcd.setCursor(0, 1);
lcd.print("SSID: Wokwi-GUEST");
}
Serial.println();
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("Given IP by the router to ESP32 is ");
Serial.println(WiFi.localIP());
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("WiFi Connected");
lcd.setCursor(0, 1);
lcd.print("IP: ");
lcd.print(WiFi.localIP());
delay(2000);
}
void callback(String topic, byte* tpayLoad, unsigned int length) {
String payload;
for (int i = 0; i < length; i++) {
payload += (char)tpayLoad[i];
}
// Handle your topics and payload here
if (topic == "GUO/9951651U/GreenLED") {
if (payload == "On") {
digitalWrite(18, LOW);
lcd.setCursor(0, 1);
lcd.print("Green LED ON ");
}
else if (payload == "Off") {
digitalWrite(18, HIGH);
lcd.setCursor(0, 1);
lcd.print("Green LED OFF ");
}
}
else if (topic == "GUO/9951651U/YellowLED") {
if (payload == "On") {
digitalWrite(19, LOW);
lcd.setCursor(0, 1);
lcd.print("Yellow LED ON ");
}
else if (payload == "Off") {
digitalWrite(19, HIGH);
lcd.setCursor(0, 1);
lcd.print("Yellow LED OFF ");
}
}
else if (topic == "GUO/9951651U/RedLED") {
if (payload == "On") {
digitalWrite(23, LOW);
lcd.setCursor(0, 1);
lcd.print("Red LED ON ");
}
else if (payload == "Off") {
digitalWrite(23, HIGH);
lcd.setCursor(0, 1);
lcd.print("Red LED OFF ");
}
}
// Update LCD with MQTT command info
lcd.setCursor(0, 0);
lcd.print("MQTT Cmd: ");
lcd.print(topic.substring(0, 6));
delay(1000);
updateLCDStatus(); // Return to normal display
}
void MQTTSubscribe() {
client.subscribe("GUO/9951651U/GreenLED");
client.subscribe("GUO/9951651U/YellowLED");
client.subscribe("GUO/9951651U/RedLED");
}
void setup_MQTT() {
client.setServer(hostname, PORTNUM);
client.setCallback(callback);
}
void connectMQTT() {
while(!client.connected()) {
Serial.println("Connecting to MQTT ...");
lcd.clear();
lcd.print("Connecting MQTT");
if (client.connect(espClientName)) {
Serial.println("Connected");
lcd.setCursor(0, 1);
lcd.print("MQTT Connected");
delay(1000);
MQTTSubscribe();
}
else {
Serial.print("Failed with state ");
Serial.print(client.state());
lcd.setCursor(0, 1);
lcd.print("Failed: ");
lcd.print(client.state());
delay(2000);
}
}
}
void updateLCDStatus() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bin Status:");
lcd.setCursor(0, 1);
lcd.print(binStatus);
lcd.setCursor(13, 1);
lcd.print(lastAdcValue);
}
void setup() {
Serial.begin(9600);
// Initialize LCD
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Smart Bin System");
lcd.setCursor(0, 1);
lcd.print("Initializing...");
delay(2000);
setup_wifi();
setup_MQTT();
pinMode(18, OUTPUT); // Green LED
pinMode(19, OUTPUT); // Yellow LED
pinMode(23, OUTPUT); // Red LED
pinMode(25, INPUT); // Button
}
void loop() {
if (!client.connected()) {
connectMQTT();
}
client.loop();
int adcRes = analogRead(A5);
Serial.print("Analog Value: ");
Serial.println(adcRes);
lastAdcValue = adcRes;
// Publish ADC value
char payload[10];
snprintf(payload, sizeof(payload), "%d", adcRes);
client.publish("GUO/9951651U/ADC", payload);
if (adcRes >= 0 && adcRes <= 1000) {
digitalWrite(18, LOW);
digitalWrite(19, HIGH);
digitalWrite(23, HIGH);
binStatus = "Empty/Low ";
Serial.println("Green LED ON: Easy/Little-Trash");
}
else if (adcRes > 1000 && adcRes <= 3000) {
digitalWrite(18, HIGH);
digitalWrite(19, LOW);
digitalWrite(23, HIGH);
binStatus = "Half Full ";
Serial.println("Yellow LED ON: Alert/AlmostFull-Trash");
}
else if (adcRes > 3000 && adcRes <= 4095) {
if (digitalRead(25) == 0) {
digitalWrite(23, HIGH);
binStatus = "Reset Mode ";
Serial.println("Red LED OFF: RESET");
}
else {
digitalWrite(23, LOW);
digitalWrite(18, HIGH);
digitalWrite(19, HIGH);
binStatus = "FULL! Clean! ";
Serial.println("Red LED ON: Danger/Full-Trash");
}
}
else {
digitalWrite(18, LOW);
digitalWrite(19, LOW);
digitalWrite(23, HIGH);
binStatus = "Error ";
}
updateLCDStatus();
delay(2000);
}