print("This is an automatic soil hydrator\n")

#Import necessary library
from machine import Pin, SoftI2C, PWM, ADC #SoftI2C=SDA/SCL #Path with modulation
from utime import sleep
import dht #Import DHT22 library
import servo_motor #Import Servo Motor library
import oled_ssd1306 #Import OLED library

#Declaring pin connections
led_red = Pin(15, Pin.OUT)
led_green = Pin(2, Pin.OUT)
oled = SoftI2C(scl=Pin(22), sda=Pin(21))
buzzer = PWM(Pin(13), Pin.OUT)
sensor = dht.DHT22(Pin(14))
pot = ADC(Pin(12))
motor = PWM(Pin(5, mode=Pin.OUT))

#Defining the spec/variables
oled_width = 128 #based on spec
oled_height = 64 #based on spec
oled = oled_ssd1306.SSD1306_I2C(oled_width, oled_height, oled)
pot.atten(ADC.ATTN_11DB)
motor.freq(50)

#Default view before triggers
while True:
    sensor.measure()
    temp = sensor.temperature()
    hum = sensor.humidity()
    pot_value = pot.read()
    buzzer.init(freq=1, duty=0)
    motor.duty(40)
    print("Temperature: %3.1f C" %temp)
    print("Humidity: %3.1f %%" %hum)
    print("Soil Condition: ", pot_value, "\n")

#Trigger where temperature above 35 celcius
    if temp > 35:
        led_red.off()
        motor.duty(115)
        oled.fill(0)
        oled.show()
        oled.text('Valve Open', 20, 40)
        oled.text('Soil Hydrating', 10, 20)
        oled.show()
        sleep(2)
        oled.fill(0)
        oled.show()
        oled.text("Temperature:", 15, 0)
        oled.text(str(temp), 45, 11)
        oled.text("Humidity:", 25, 22)
        oled.text(str(hum), 45, 33)
        oled.text("Moist:", 40, 44)
        oled.text(str(pot_value), 50, 55)
        oled.show()
        print("Water Valve Open")
        print("Soil is hydrating")
        print("\n------------------------------\n")
        for (i) in range (12):
            led_green.on()
            sleep(0.1)
            buzzer.init(freq=1000, duty=512)
            sleep(0.1)
            led_green.off()
            sleep(0.1)
            buzzer.init(freq=1, duty=0)
            sleep(0.1)

#Trigger when humidity below 50%
    elif hum < 50:
        led_red.off()
        motor.duty(115)
        oled.fill(0)
        oled.show()
        oled.text('Valve Open', 20, 40)
        oled.text('Soil Hydrating', 10, 20)
        oled.show()
        sleep(2)
        oled.fill(0)
        oled.show()
        oled.text("Temperature:", 15, 0)
        oled.text(str(temp), 45, 11)
        oled.text("Humidity:", 25, 22)
        oled.text(str(hum), 45, 33)
        oled.text("Moist:", 40, 44)
        oled.text(str(pot_value), 50, 55)
        oled.show()
        print("Water Valve Open")
        print("Soil is hydrating")
        print("\n------------------------------\n")
        for (i) in range (12):
            led_green.on()
            sleep(0.1)
            buzzer.init(freq=1000, duty=512)
            sleep(0.1)
            led_green.off()
            sleep(0.1)
            buzzer.init(freq=1, duty=0)
            sleep(0.1)

#Trigger to represent soil is dry (Potentiometer below 1365)
    elif pot_value < 1365:
        led_red.off()
        motor.duty(115)
        oled.fill(0)
        oled.show()
        oled.text('Valve Open', 20, 40)
        oled.text('Soil Hydrating', 10, 20)
        oled.show()
        sleep(2)
        oled.fill(0)
        oled.show()
        oled.text("Temperature:", 15, 0)
        oled.text(str(temp), 45, 11)
        oled.text("Humidity:", 25, 22)
        oled.text(str(hum), 45, 33)
        oled.text("Moist:", 40, 44)
        oled.text(str(pot_value), 50, 55)
        oled.show()
        print("Water Valve Open")
        print("Soil is hydrating")
        print("\n------------------------------\n")
        for (i) in range (12):
            led_green.on()
            sleep(0.1)
            buzzer.init(freq=1000, duty=512)
            sleep(0.1)
            led_green.off()
            sleep(0.1)
            buzzer.init(freq=1, duty=0)
            sleep(0.1)

#Condition where the soil does not need to be hyrated
    else:
        led_red.on()
        motor.duty(40)
        oled.fill(0)
        oled.show()
        oled.text('Valve Close', 20, 20)
        oled.text('Soil Hydrated <3', 0, 40)
        oled.show()
        sleep(2)
        oled.fill(0)
        oled.show()
        oled.text("Temperature:", 15, 0)
        oled.text(str(temp), 45, 11)
        oled.text("Humidity:", 25, 22)
        oled.text(str(hum), 45, 33)
        oled.text("Moist:", 40, 44)
        oled.text(str(pot_value), 50, 55)
        oled.show()
        print("Soil hydrated")
        print("Water Valve Close")
        print("\n------------------------------\n")
    sleep(2)