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)