#include <ESP32Servo.h>
#include "WiFi.h"
#include <HTTPClient.h>
#include <LiquidCrystal_I2C.h>
#define PIN_TRIG 14
#define PIN_ECHO 27
#define SERVO_PIN 18
Servo servo;
#define I2C_ADDR 0x3F
#define LCD_COLUMNS 20
#define LCD_LINES 4
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
void connect_wifi() {
const char* ssid = "Wokwi-GUEST";
const char* password = "";
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
}
void setup() {
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
servo.attach(SERVO_PIN);
Serial.begin(115200);
Serial.println("ESP32 Started!");
lcd.init();
lcd.backlight();
lcd.setCursor(1, 1);
lcd.print("Smart Trash Bin");
lcd.setCursor(2, 2);
lcd.print("STATUS: NOT FULL");
connect_wifi();
}
int distance;
bool bin_full;
void check_distance_and_write_servo() {
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
int duration = pulseIn(PIN_ECHO, HIGH);
if (distance != duration / 58) {
distance = duration / 58;
Serial.println("Distance: " + String(distance) + " cm.");
if (bin_full != distance <= 30 && distance >= 0) {
bin_full = distance <= 30 && distance >= 0;
Serial.print("Bin status: ");
if (bin_full) {
Serial.println("FULL [closing lid]");
servo.write(-90);
lcd.print("STATUS: FULL");
} else {
Serial.println("NOT FULL [opening lid]");
servo.write(90);
lcd.print("STATUS: NOT FULL");
}
}
}
}
void loop() {
check_distance_and_write_servo();
delay(1000);
}