import time
from time import ticks_us, sleep
import machine
from machine import Pin, ADC, PWM, I2C
from pico_i2c_lcd import I2cLcd
#Konfigurasi Pin in
pot_ph = ADC(Pin(26))
pot_suhu = ADC(Pin(27))
pot_do = ADC(Pin(28))
echo = Pin(7, Pin.IN)
#Konfigurasi Pin Out
heater = Pin(16, Pin.OUT)
kuning = Pin(17, Pin.OUT)
hijau = Pin(18, Pin.OUT)
trig = Pin(6, Pin.OUT)
servo = PWM(Pin(15))
servo.freq(50)
pompa = PWM(Pin(2))
pompa.freq(1000)
Pin(3, Pin.OUT).low()
aerator = PWM(Pin(4))
aerator.freq(1000)
Pin(5, Pin.OUT).low()
#Konfigurasi LCD I2C
I2C_ADDR = 0x27
I2C_NUM_ROWS = 4
I2C_NUM_COLS = 20
i2c = I2C(0, sda=machine.Pin(0), scl=machine.Pin(1), freq=400000)
lcd = I2cLcd(i2c, I2C_ADDR, I2C_NUM_ROWS, I2C_NUM_COLS)
#Inisialisasi tampilan LCD
def initial_message():
lcd.clear()
lcd.setCursor(0, 0)
lcd.Print("Sistem Kontrol ")
lcd.setCursor(0, 1)
lcd.Print("Kualitas Air Pada")
lcd.setCursor(0, 2)
lcd.Print("Budidaya Ikan")
lcd.setCursor(0, 3)
lcd.Print("Bandeng")
sleep(2)
lcd.clear()
initial_message()
#Fungsi potensio pembaca nilai pH, suhu, DO
def baca_adc_rata2(adc_obj, sampel=10):
total = 0
for _ in range(sampel):
nilai_16bit = adc_obj.read_u16()
nilai_12bit = nilai_16bit >> 4 # Konversi 16-bit → 12-bit
total += nilai_12bit
rata = total // sampel
return rata
# Fungsi konversi ke tegangan
def konversi_tegangan(nilai_adc, vref=3.3):
return (nilai_adc / 4095) * vref
def konversi_ph(nilai_adc):
return (nilai_adc / 4095) * 14 + 1
def konversi_suhu(nilai_adc):
return (nilai_adc / 4095) * 30 + 10
def konversi_do(nilai_adc):
return (nilai_adc / 4095) * 10 + 0
# --- Fungsi untuk Mengukur Jarak ---
def get_distance_cm():
trig.value(0)
time.sleep_us(2)
trig.value(1)
time.sleep_us(10)
trig.value(0)
# Mengukur durasi pulsa HIGH pada pin Echo
pulse_start_time = time.ticks_us()
while echo.value() == 0:
pulse_start_time = time.ticks_us()
pulse_end_time = time.ticks_us()
while echo.value() == 1:
pulse_end_time = time.ticks_us()
duration = time.ticks_diff(pulse_end_time, pulse_start_time)
# Hitung jarak dalam cm (durasi / 58)
distance = duration / 58.0
# Batasi nilai jarak agar tidak terlalu ekstrem
if distance > 400:
distance = 400
if distance < 0:
distance = 0
return distance
# Fungsi servo
def move_servo(angle):
duty = int((angle / 180.0) * 4915) + 1638
servo.duty_u16(duty)
def pompa_on():
pompa.duty_u16(65535)
def pompa_off():
pompa.duty_u16(0)
def aerator_on():
aerator.duty_u16(65535)
def aerator_off():
aerator.duty_u16(0)
# Loop utama
# ================================
while True:
jarak_terukur = get_distance_cm()
jarak_pupuk = 10
if jarak_terukur > jarak_pupuk:
pupuk = ('Habis')
else:
pupuk = ('Tersedia')
nilai_adc = baca_adc_rata2(pot_ph, sampel=10)
ph = konversi_ph(nilai_adc)
nilai_adc = baca_adc_rata2(pot_suhu, sampel=10)
suhu = konversi_suhu(nilai_adc)
nilai_adc = baca_adc_rata2(pot_do, sampel=10)
do = konversi_do(nilai_adc)
lcd.clear()
lcd.Print("pH : {:.2f}\n".format(ph))
lcd.Print("Suhu : {:.2f}C\n".format(suhu))
lcd.Print("DO : {:.2f}mg/L\n".format(do))
lcd.Print("Pupuk : {}".format(pupuk))
sleep(2) # Lakukan pengukuran dan update setiap 1 detik