#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#include <ESP32Servo.h>
// ================= PIN CONNECTIONS =================
// Ultrasonic sensor
#define TRIG_PIN 5
#define ECHO_PIN 18
// MQ-2 gas sensor
#define MQ2_PIN 34
// DHT22
#define DHT_PIN 4
#define DHT_TYPE DHT22
// OLED SSD1306
#define OLED_SDA 21
#define OLED_SCL 22
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
// Relay
#define RELAY_PIN 23
// Generator electricity LED
#define LED_PIN 25
// Buzzer
#define BUZZER_PIN 26
// Servo
#define SERVO_PIN 27
// ================= OBJECTS =================
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
DHT dht(DHT_PIN, DHT_TYPE);
Servo wasteServo;
// ================= SETTINGS =================
// Change these if required
#define WASTE_FULL_DISTANCE 10
#define GAS_THRESHOLD 1800
// Relay in Wokwi is normally active LOW
#define RELAY_ON LOW
#define RELAY_OFF HIGH
// ================= SETUP =================
void setup() {
Serial.begin(115200);
// Pins
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(MQ2_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
// Start outputs OFF
digitalWrite(RELAY_PIN, RELAY_OFF);
digitalWrite(LED_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
// Servo
wasteServo.attach(SERVO_PIN);
wasteServo.write(0);
// DHT
dht.begin();
// OLED
Wire.begin(OLED_SDA, OLED_SCL);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED not found!");
while (true) {
delay(100);
}
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(2);
display.setCursor(10, 5);
display.println("WASTE");
display.setCursor(10, 30);
display.println("ENERGY");
display.display();
delay(2000);
}
// ================= ULTRASONIC =================
float getDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH, 30000);
if (duration == 0) {
return 400;
}
float distance = duration * 0.0343 / 2.0;
return distance;
}
// ================= OLED DISPLAY =================
void showDisplay(float distance, int wastePercent,
int gasValue, float temperature,
float humidity, bool generatorON) {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println("WASTE TO ENERGY");
display.setCursor(0, 12);
display.print("Waste : ");
display.print(wastePercent);
display.println("%");
display.setCursor(0, 22);
display.print("Gas : ");
display.println(gasValue);
display.setCursor(0, 32);
display.print("Temp : ");
display.print(temperature, 1);
display.println(" C");
display.setCursor(0, 42);
display.print("Humid : ");
display.print(humidity, 0);
display.println("%");
display.setCursor(0, 53);
display.print("GEN: ");
if (generatorON) {
display.print("ON ");
display.print("45W");
} else {
display.print("OFF");
}
display.display();
}
// ================= LOOP =================
void loop() {
// Read sensors
float distance = getDistance();
int gasValue = analogRead(MQ2_PIN);
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// If DHT reading fails
if (isnan(temperature)) {
temperature = 0;
}
if (isnan(humidity)) {
humidity = 0;
}
// ================= WASTE LEVEL =================
// Assume bin depth = 40 cm
int wastePercent = map((int)distance, 40, 5, 0, 100);
wastePercent = constrain(wastePercent, 0, 100);
// ================= GAS / GENERATOR =================
bool generatorON = false;
if (gasValue >= GAS_THRESHOLD) {
generatorON = true;
// Generator ON
digitalWrite(RELAY_PIN, RELAY_ON);
// Electricity indicator ON
digitalWrite(LED_PIN, HIGH);
} else {
generatorON = false;
// Generator OFF
digitalWrite(RELAY_PIN, RELAY_OFF);
// Electricity indicator OFF
digitalWrite(LED_PIN, LOW);
}
// ================= WASTE FULL ALERT =================
if (wastePercent >= 90) {
digitalWrite(BUZZER_PIN, HIGH);
// Open waste-bin door
wasteServo.write(90);
} else {
digitalWrite(BUZZER_PIN, LOW);
// Close waste-bin door
wasteServo.write(0);
}
// ================= OLED =================
showDisplay(
distance,
wastePercent,
gasValue,
temperature,
humidity,
generatorON
);
// ================= SERIAL MONITOR =================
Serial.println("--------------------------------");
Serial.print("Waste Level : ");
Serial.print(wastePercent);
Serial.println("%");
Serial.print("Distance : ");
Serial.print(distance);
Serial.println(" cm");
Serial.print("Gas Level : ");
Serial.println(gasValue);
Serial.print("Temperature : ");
Serial.print(temperature);
Serial.println(" C");
Serial.print("Humidity : ");
Serial.print(humidity);
Serial.println("%");
Serial.print("Generator : ");
if (generatorON) {
Serial.println("ON - 45W");
} else {
Serial.println("OFF");
}
Serial.println("--------------------------------");
delay(1000);
}