from machine import Pin, I2C, ADC, PWM
from time import sleep
from dht import DHT22
from servo import Servo
from lcd_api import LcdApi
from i2c_lcd import I2cLcd
import time
# Inisialisasi perangkat
# Potensiometer sebagai simulasi sensor pH dan DO
potensio_ph = ADC(26)
potensio_do = ADC(27)
# Pin untuk ultrasonic sensor
trigger = Pin(2, Pin.OUT)
echo = Pin(3, Pin.IN)
# Pin untuk LED dan buzzer
led = Pin(4, Pin.OUT)
buzzer = Pin(5, Pin.OUT)
# LED array
led_pins = [Pin(i, Pin.OUT) for i in range(7, 17)]
# Servo motor
servo = Servo(Pin(6))
# Inisialisasi DHT22 sensor
sensor_dht = DHT22(Pin(15))
# Inisialisasi LCD
I2C_ADDR = 0x27
I2C_NUM_ROWS = 4
I2C_NUM_COLS = 20
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)
lcd = I2cLcd(i2c, I2C_ADDR, I2C_NUM_ROWS, I2C_NUM_COLS)
# Fungsi membaca jarak dari ultrasonic sensor
def get_distance():
trigger.low()
sleep(0.000002)
trigger.high()
sleep(0.00001)
trigger.low()
while echo.value() == 0:
pass
start = time.ticks_us()
while echo.value() == 1:
pass
end = time.ticks_us()
duration = time.ticks_diff(end, start)
distance = (duration * 0.0343) / 2
return distance
# Fungsi utama
while True:
# Membaca nilai potensiometer
ph_value = potensio_ph.read_u16()
do_value = potensio_do.read_u16()
# Konversi nilai sensor
ph_display = (ph_value / 65535.0) * 10
do_display = (do_value / 65535.0) * 10
# Logika sensor pH dan DO
if ph_display < 4:
servo.write(180)
buzzer.value(1)
led.value(0)
elif ph_display > 7:
servo.write(0)
buzzer.value(1)
led.value(1)
elif do_display < 3 or do_display > 5:
servo.write(0)
buzzer.value(1)
led.value(0)
else:
servo.write(0)
led.value(0)
buzzer.value(0)
# Membaca suhu dan kelembapan dari DHT22
sensor_dht.measure()
temperature = sensor_dht.temperature()
# Membaca jarak ultrasonic
distance = get_distance()
fertilizer_status = "HABIS" if distance > 10 else "TERSEDIA"
# Menampilkan data di LCD
lcd.clear()
lcd.putstr("PH Air : {:.2f}\n".format(ph_display))
lcd.putstr("Oxygen : {:.2f} mg\n".format(do_display))
lcd.putstr("Suhu : {:.2f} C\n".format(temperature))
lcd.putstr("Pupuk : {}".format(fertilizer_status))
sleep(1)