# IMPORT LIBRARY/MODULE
from machine import Pin, ADC, PWM, I2C
import time
import dht
import OLED_LIB
# PIN DECLARATION
soil_moisture = ADC(Pin(12))
soil_moisture.atten(ADC.ATTN_11DB)
dht_sensor = dht.DHT22(Pin(13))
i2c = I2C(scl=Pin(23), sda=Pin(22))
oled = OLED_LIB.SSD1306_I2C(128, 64, i2c)
water_servo = PWM(Pin(25), freq=50)
sunscreen_servo = PWM(Pin(32), freq=50)
relay = Pin(2, Pin.OUT)
leds = {
"blue": Pin(19, Pin.OUT),
"green": Pin(27, Pin.OUT),
"yellow": Pin(26, Pin.OUT),
"red": Pin(4, Pin.OUT)
}
BUZZER = PWM(Pin(14, Pin.OUT))
button = Pin(33, Pin.IN, Pin.PULL_UP)
# FOR SERVO (Water Flow)
def set_water_servo_angle(angle):
duty = int(40 + (angle / 180) * 115)
water_servo.duty(duty)
# FOR SERVO (Sunscreen)
def set_sunscreen_servo_angle(angle):
duty = int(40 + (angle / 180) * 115)
sunscreen_servo.duty(duty)
# FOR INDICATORS LED
def turn_off_leds():
for led in leds.values():
led.off()
# FOR BYPASS BUTTON
def button_behavior():
oled.fill_rect(0, 30, 128, 34, 0)
oled.text("Watering in", 18, 40)
oled.text("progress.", 25, 50)
oled.show()
for i in range(3):
BUZZER.freq(700)
BUZZER.duty(70)
time.sleep(0.5)
BUZZER.duty(0)
time.sleep(0.5)
for _ in range(3):
leds["red"].on()
time.sleep(0.5)
leds["red"].off()
time.sleep(0.5)
leds["red"].on()
set_water_servo_angle(90)
relay.on()
# PROGRAM FOR SUNSCREEN SHADE NET
def control_sunscreen(temperature):
if temperature <35 :
set_sunscreen_servo_angle(0)
elif temperature <37:
set_sunscreen_servo_angle(45)
else:
set_sunscreen_servo_angle(90)
# MAIN PROGRAM
while True:
moisture_level = soil_moisture.read() / 4095 * 100
dht_sensor.measure()
temperature = dht_sensor.temperature()
oled.fill(0)
oled.text("Moisture: {:.1f}%".format(moisture_level), 0, 0)
oled.text("Temp: {:.1f}C".format(temperature), 0, 10)
control_sunscreen(temperature)
if button.value() == 0:
button_behavior()
else:
oled.fill_rect(0, 30, 128, 34, 0)
turn_off_leds()
if moisture_level > 75:
leds["blue"].on()
set_water_servo_angle(0)
relay.off()
oled.text("Soil Too Wet.", 12, 30)
oled.text("No Watering", 18, 40)
oled.text("Needed", 35, 50)
elif moisture_level >50:
leds["green"].on()
set_water_servo_angle(0)
relay.off()
oled.text("Optimal Moisture", 0, 40)
oled.text("level.", 40, 50)
elif moisture_level >25:
leds["yellow"].on()
set_water_servo_angle(45)
relay.on()
oled.text("Soil Moisture Low.", 0, 30)
oled.text("Watering in", 18, 40)
oled.text("Progress.", 25, 50)
else:
leds["red"].on()
for i in range(3):
BUZZER.freq(700)
BUZZER.duty(70)
time.sleep(0.5)
BUZZER.duty(0)
time.sleep(0.5)
set_water_servo_angle(90)
relay.on()
oled.text("Soil too dry.", 13, 30)
oled.text("Watering in", 18, 40)
oled.text("progress.", 25, 50)
oled.show()
time.sleep(1)
Loading
esp32-devkit-v1
esp32-devkit-v1