import machine
import network
from machine import Pin, SoftI2C ,ADC  
from lcd_api import LcdApi  
from i2c_lcd import I2cLcd  
from time import sleep 
from servo import Servo
from hcsr04 import HCSR04
from blynkLib import Blynk


BLYNK_AUTH_TOKEN = "4WLYv3MoesdlDoxo540VYLucEHSPeyxm"

motor = Servo(pin=15)
soil = ADC(Pin(32))
irsensor= Pin(26, Pin.IN)
h=20
min_moisture=0
max_moisture=4095
#soil.atten(ADC.ATTN_11DB) #Full range: 3.3v
soil.width(ADC.WIDTH_12BIT)#range 0 to 4095

wifi= network.WLAN(network.STA_IF) 
wifi.active(True) 
wifi.connect("Mohitnarutogod","spox2684") 
#wifi.connect("Wokwi-GUEST","") 
while not wifi.isconnected(): 
    pass 
print("Wifi Connected Successfully") 
 
blynk= Blynk(BLYNK_AUTH_TOKEN) 
 


I2C_ADDR = 0x27
totalRows = 2  
totalColumns = 16
 
i2c = SoftI2C(scl=Pin(22), sda=Pin(21), freq=10000)#initializing the I2C method for ESP32  
lcd = I2cLcd(i2c, I2C_ADDR, totalRows, totalColumns) 

wetsensor = HCSR04(trigger_pin=12,echo_pin=13,echo_timeout_us=100000)
drysensor = HCSR04(trigger_pin=19,echo_pin=18,echo_timeout_us=100000)

def dry_cap(drylevel):
    distancedry= drysensor.distance_cm()
    drylevel = int(((h - (distancedry-7)) / h) * 100)
    return drylevel
def wet_cap(wetlevel):
    distancewet= wetsensor.distance_cm()
    wetlevel = int(((h - (distancewet-7)) / h) * 100)
    return wetlevel
 

blynk.on("V0",dry_cap) 
blynk.on("V1",wet_cap) 

while True:
    blynk.run() 
    sleep(0.1)
    distancewet= wetsensor.distance_cm()
    distancedry= drysensor.distance_cm()
    wetlevel = int(((h - (distancewet-7)) / h) * 100)
    drylevel = int(((h - (distancedry-6.5)) / h) * 100)
    sleep(2)
    lcd.clear()
    lcd.move_to(0,0)
    lcd.putstr("Wet Waste:")
    lcd.putstr(str(wetlevel))
    lcd.putstr(" %")
    lcd.move_to(0,1)
    lcd.putstr("Dry Waste:")
    lcd.putstr(str(drylevel))
    lcd.putstr(" %")
    moisture = soil.read()
    if(irsensor.value()==0):
        
        if(moisture<=4000 and wetlevel<90):
            lcd.clear()
            lcd.putstr("Wet Garbage")
            lcd.move_to(0,1)
            lcd.putstr("Detected")
            motor.move(130)
            sleep(2)
            motor.move(90)
        elif(moisture>4000 and drylevel<90):
            lcd.clear()
            lcd.putstr("Dry Garbage")
            lcd.move_to(0,1)
            lcd.putstr("Detected")
            motor.move(50)
            sleep(2)
            motor.move(90)
        elif(moisture<=4000 and wetlevel>=90):
            lcd.clear()
            lcd.putstr("Wet Garbage ")
            lcd.move_to(0,1)
            lcd.putstr("Is Full")

        elif(moisture>4000 and drylevel>=90):
            lcd.clear()
            lcd.putstr("Dry Garbage")
            lcd.move_to(0,1)
            lcd.putstr("Is Full")