/* 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
LiquidCrystal_I2C lcd(0x27, 16, 2); // 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;
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("IP: ");
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(char* topic, byte* payload, unsigned int length) {
String topicStr = String(topic);
String payloadStr;
for (int i = 0; i < length; i++) {
payloadStr += (char)payload[i];
}
if (topicStr == "GUO/9951651U/GreenLED") {
digitalWrite(18, payloadStr == "On" ? LOW : HIGH);
lcd.setCursor(0, 1);
lcd.print("Green LED ");
lcd.print(payloadStr);
lcd.print(" ");
} else if (topicStr == "GUO/9951651U/YellowLED") {
digitalWrite(19, payloadStr == "On" ? LOW : HIGH);
lcd.setCursor(0, 1);
lcd.print("Yellow LED ");
lcd.print(payloadStr);
lcd.print(" ");
} else if (topicStr == "GUO/9951651U/RedLED") {
digitalWrite(23, payloadStr == "On" ? LOW : HIGH);
lcd.setCursor(0, 1);
lcd.print("Red LED ");
lcd.print(payloadStr);
lcd.print(" ");
}
lcd.setCursor(0, 0);
lcd.print("MQTT Cmd: ");
lcd.print(topicStr.substring(0, 6));
delay(1000);
updateLCDStatus();
}
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: ");
Serial.println(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);
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;
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 ";
} else if (adcRes > 1000 && adcRes <= 3000) {
digitalWrite(18, HIGH);
digitalWrite(19, LOW);
digitalWrite(23, HIGH);
binStatus = "Half Full ";
} else if (adcRes > 3000 && adcRes <= 4095) {
if (digitalRead(25) == 0) {
digitalWrite(23, HIGH);
binStatus = "Reset Mode ";
} else {
digitalWrite(23, LOW);
digitalWrite(18, HIGH);
digitalWrite(19, HIGH);
binStatus = "FULL! Clean! ";
}
} else {
digitalWrite(18, LOW);
digitalWrite(19, LOW);
digitalWrite(23, HIGH);
binStatus = "Error ";
}
updateLCDStatus();
delay(2000);
}