#include <WiFi.h>
#include <PubSubClient.h>
#define TRIG_PIN 5
#define ECHO_PIN 18
#define GREEN_LED 14
#define YELLOW_LED 12
#define RED_LED 13
#define BUZZER_PIN 27
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
String binID = "bin1"; // change for other bins
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
}
void reconnect() {
while (!client.connected()) {
if (client.connect(binID.c_str())) {
} else {
delay(2000);
}
}
}
float getDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
return duration * 0.034 / 2;
}
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RED_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
setup_wifi();
client.setServer(mqtt_server, 1883);
}
void loop() {
if (!client.connected()) reconnect();
client.loop();
float distance = getDistance();
int level = map(distance, 2, 100, 100, 0);
String topicLevel = "waste/" + binID + "/level";
String topicStatus = "waste/" + binID + "/status";
client.publish(topicLevel.c_str(), String(level).c_str());
// RESET OUTPUTS
digitalWrite(RED_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(GREEN_LED, LOW);
digitalWrite(BUZZER_PIN, LOW);
if (level > 80) {
digitalWrite(RED_LED, HIGH);
digitalWrite(BUZZER_PIN, HIGH);
client.publish(topicStatus.c_str(), "FULL");
} else if (level > 40) {
digitalWrite(YELLOW_LED, HIGH);
client.publish(topicStatus.c_str(), "MEDIUM");
} else {
digitalWrite(GREEN_LED, HIGH);
client.publish(topicStatus.c_str(), "EMPTY");
}
delay(3000);
}