from machine import Pin, ADC, PWM
import utime
from dht import DHT22
from pico_i2c_lcd import I2cLcd
# Konfigurasi pin
potensio_ph = ADC(27)
potensio_do = ADC(26)
ultrasonic_trigger = Pin(21, Pin.OUT)
ultrasonic_echo = Pin(20, Pin.IN)
led = Pin(13, Pin.OUT)
buzzer1 = (Pin(14))
servo_pin = PWM(Pin(16))
servo_pin.freq(50)
led_pins = [Pin(2,3,4,5,6,7,8,9,10,11, Pin.OUT)]
# Inisialisasi I2C untuk LCD
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=400000)
lcd = I2cLcd(i2c, 0x27, 2, 16)
# Inisialisasi DHT sensor
dht_sensor = DHT22(Pin(22))
# Fungsi untuk mengatur servo
def set_servo_angle(angle):
duty = int((angle / 180) * 1023)
servo_pin.duty_u16(duty)
# Fungsi untuk membaca jarak dari sensor ultrasonik
def read_distance():
ultrasonic_trigger.low()
utime.sleep_us(2)
ultrasonic_trigger.high()
utime.sleep_us(10)
ultrasonic_trigger.low()
while ultrasonic_echo.value() == 0:
signal_off = utime.ticks_us()
while ultrasonic_echo.value() == 1:
signal_on = utime.ticks_us()
time_passed = utime.ticks_diff(signal_on, signal_off)
distance = (time_passed * 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 ke rentang float (1.0 - 10.0)
ph_display = (ph_value / 65535.0) * 10
do_display = (do_value / 65535.0) * 10
# Logika kontrol PH dan DO
if ph_display < 4:
set_servo_angle(180)
led1.value(1)
buzzer1.duty_u16(512)
buzzer1.freq(1000)
led2.value(0)
elif ph_display > 7:
set_servo_angle(0)
led1.value(1)
buzzer1.duty_u16(512)
buzzer1.freq(1000)
led2.value(1)
buzzer2.duty_u16(512)
buzzer2.freq(1500)
elif do_display < 3 or do_display > 5:
set_servo_angle(0)
led1.value(1)
buzzer1.duty_u16(512)
buzzer1.freq(1000)
led2.value(0)
else:
set_servo_angle(0)
led1.value(0)
led2.value(0)
buzzer1.duty_u16(0)
buzzer2.duty_u16(0)
# Membaca sensor DHT
dht_sensor.measure()
temperature = dht_sensor.temperature()
# Membaca jarak
distance = read_distance()
fertilizer_status = "TERSEDIA" if distance <= 10 else "HABIS"
# Menampilkan data di terminal (atau LCD jika sudah dihubungkan)
print("PH Air: {:.2f}".format(ph_display))
print("Oxygen: {:.2f} mg".format(do_display))
print("Suhu: {:.2f} C".format(temperature))
print("Pupuk: {}".format(fertilizer_status))
# Menampilkan data di LCD
lcd.clear()
lcd.putstr("PH: {:.2f} ".format(ph_display))
lcd.putstr("O2: {:.2f}mg\n".format(do_display))
lcd.putstr("Temp: {:.2f}C ".format(temperature))
lcd.putstr("Pupuk: {}".format(fertilizer_status))
# Mengatur LED berdasarkan suhu
led_level = int((temperature - 20) / 30 * len(led_pins))
for i, led in enumerate(led_pins):
led.value(1 if i < led_level else 0)
utime.sleep(1)