#import libraries/module
from machine import Pin, PWM, ADC, SoftI2C
import ultrasonic_library
import oled_library
from utime import sleep
#Pin Declaration
trig_pin = Pin(25, Pin.IN)
echo_pin = Pin(26, Pin.IN)
buzzer_pin = PWM(Pin(23, Pin.OUT))
red_led = Pin(19, Pin.OUT)
green_led = Pin(5, Pin.OUT)
yellow_led = Pin(18, Pin.OUT)
pir_pin = Pin(13, Pin.IN)
servo = PWM(Pin(17), freq = 50)
mq2_pin = ADC(Pin(34))
mq2_pin.atten(ADC.ATTN_11DB) # Full range 0-3.3V
plastic_led = Pin(4, Pin.OUT)
organic_led = Pin(0, Pin.OUT)
landfill_led = Pin(16, Pin.OUT)
SCL_Pin = Pin(22, Pin.OUT)
SDA_Pin = Pin(21, Pin.OUT)
OLED_Pin = SoftI2C(scl = SCL_Pin, sda = SDA_Pin)
#Parameter Declaration
count_people = 0
#Object Declaration
#Object_name = library_name.class_name(......)
fill_level = ultrasonic_library.HCSR04(trigger_pin = trig_pin, echo_pin = echo_pin, echo_timeout_us=500*2*30)
screen = oled_library.SSD1306_I2C( width = 128 , height = 64, i2c = OLED_Pin)
#main program
def set_servo_angle(angle):
duty = int(((angle / 180) * 2 + 0.5) / 20 * 1023)
servo.duty(duty)
while True:
measure_filllevel = fill_level.distance_cm() #output is in number
print("The Bin Fill Level is", measure_filllevel, "cm")
motion_status = pir_pin.value()
gas_value = mq2_pin.read()
print("Gas value:", gas_value)
# Reset LEDs
plastic_led.off()
landfill_led.off()
organic_led.off()
#condition to check the bin level fill
if measure_filllevel < 40:
green_led.on()
buzzer_pin.init(freq = 800 , duty = 0)
#display screen for users
screen.fill(0)
screen.text("Bin Fill Level: ", 3, 0, 1)
screen.text(str(measure_filllevel), 10, 10, 1)
screen.text("cm", 80, 10, 1)
screen.text("Bin is empty", 3,20,1)
screen.show()
elif 40 < measure_filllevel <= 100:
green_led.off()
red_led.off()
yellow_led.on()
sleep(0.1)
yellow_led.off()
buzzer_pin.init(freq = 800 , duty = 0)
sleep(0.1)
#display screen for users
screen.fill(0)
screen.text("Bin Fill Level: ", 3, 0, 1)
screen.text(str(measure_filllevel), 10, 10, 1)
screen.text("cm", 80, 10, 1)
screen.text("Bin is Med Full", 3,20,1)
screen.show()
else:
red_led.on()
buzzer_pin.init(freq = 2500 , duty = 512)
sleep(0.1)
buzzer_pin.init(freq = 2500 , duty = 0)
sleep(0.1)
#display screen for users
screen.fill(0)
screen.text("Bin Fill Level: ", 3, 0, 1)
screen.text(str(measure_filllevel), 10, 10, 1)
screen.text("cm", 80, 10, 1)
screen.text("Bin is Full", 3,20,1)
screen.show()
#condition to check motion to open the bin
if motion_status == 1: #means object detected
set_servo_angle(90) # Rotate servo to 90 degrees
sleep(2)
set_servo_angle(0)
red_led.on()
sleep(0.2)
red_led.off()
sleep(0.2)
count_people = count_people + 1
print("Frequency of object detected -->", count_people)
else:
set_servo_angle(90) # Stay at rest
sleep(0.2)
red_led.off()
#condition to check type of waste
if gas_value < 1500:
organic_led.off()
landfill_led.off()
plastic_led.on()
print("Plastic Waste")
screen.fill(0)
screen.text("Type of Waste: ", 3, 0, 1)
screen.text("Plastic waste", 3,30,1)
screen.show()
elif 1500 <= gas_value < 3000:
organic_led.off()
plastic_led.off()
landfill_led.on()
print("Landfill Waste")
screen.fill(0)
screen.text("Type of Waste: ", 3, 0, 1)
screen.text("Landfill waste", 3,30,1)
screen.show()
elif 3000 <= gas_value < 4000:
organic_led.on()
landfill_led.off()
plastic_led.off()
print("Organic waste")
screen.fill(0)
screen.text("Type of Waste: ", 3, 0, 1)
screen.text("Organic waste", 3,30,1)
screen.show()
else:
buzzer_pin.init(freq = 2500 , duty = 512)
sleep(0.1)
buzzer_pin.init(freq = 2500 , duty = 0)
sleep(0.1)
print("Unknown Waste Detected!")
screen.fill(0)
screen.text("Type of Waste: ", 3, 0, 1)
screen.text("Unknown waste", 3,30,1)
screen.show()
sleep(1)