from machine import Pin, ADC, I2C
import time
import network
import BlynkLib
from BlynkTimer import BlynkTimer
from pico_i2c_lcd import I2cLcd
# Konfigurasi WiFi
WIFI_SSID = 'Wokwi-GUEST'
WIFI_PASS = ''
# Token Blynk (sesuaikan dengan token proyek Anda)
BLYNK_AUTH = 'N1Ewf8ikUH_GNZd0YCbTFHfa0m18MXhu'
# Inisialisasi WiFi
wifi = network.WLAN(network.STA_IF)
if not wifi.isconnected():
print("Connecting to WiFi...")
wifi.active(True)
wifi.connect(WIFI_SSID, WIFI_PASS)
while not wifi.isconnected():
print(".", end="")
time.sleep(1)
print('\nConnected to WiFi, IP:', wifi.ifconfig()[0])
# Inisialisasi Blynk
blynk = BlynkLib.Blynk(BLYNK_AUTH, insecure=True)
timer = BlynkTimer()
# Inisialisasi sensor dan aktuator
ph_sensor = ADC(26) # Sensor pH
tds_sensor = ADC(27) # Sensor TDS
relay_ph_up = Pin(15, Pin.OUT)
relay_ph_down = Pin(16, Pin.OUT)
relay_nutrisi = Pin(17, Pin.OUT)
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)
lcd = I2cLcd(i2c, 0x27, 2, 16)
# Rentang pH dan TDS
PH_MIN, PH_MAX = 6.0, 7.0
TDS_MIN, TDS_MAX = 1260, 1610
# Fungsi pembacaan sensor
def read_ph():
return round((ph_sensor.read_u16() / 65535) * 14, 2)
def read_tds():
return int((tds_sensor.read_u16() / 65535) * 2000)
# Fungsi kontrol dan indikator LED
def control_and_update():
ph = read_ph()
tds = read_tds()
# Kontrol pH
if ph < PH_MIN:
relay_ph_up.value(1)
time.sleep(2)
relay_ph_up.value(0)
relay_ph_down.value(0)
blynk.virtual_write(2, 1) # LED pH Up ON
blynk.virtual_write(3, 0) # LED pH Down OFF
elif ph > PH_MAX:
relay_ph_up.value(0)
relay_ph_down.value(1)
time.sleep(2)
relay_ph_down.value(0)
blynk.virtual_write(2, 0) # LED pH Up OFF
blynk.virtual_write(3, 1) # LED pH Down ON
else:
relay_ph_up.value(0)
relay_ph_down.value(0)
blynk.virtual_write(2, 0) # LED pH Up OFF
blynk.virtual_write(3, 0) # LED pH Down OFF
# Kontrol TDS
if tds < TDS_MIN:
relay_nutrisi.value(1)
time.sleep(2)
relay_nutrisi.value(0)
blynk.virtual_write(4, 1) # LED Nutrisi ON
else:
relay_nutrisi.value(0)
blynk.virtual_write(4, 0) # LED Nutrisi OFF
# Tampilkan di LCD
lcd.clear()
lcd.putstr(f"pH: {ph}\nTDS: {tds} ppm")
print(f"pH: {ph}, TDS: {tds} ppm")
# Fungsi untuk mengirim data sensor ke Blynk
def upload_data():
ph = read_ph()
tds = read_tds()
blynk.virtual_write(0, ph) # V0 untuk pH
blynk.virtual_write(1, tds) # V1 untuk TDS
print(f"Uploaded: pH={ph}, TDS={tds}")
# Timer untuk mengontrol dan mengunggah data
timer.set_interval(3, control_and_update)
timer.set_interval(5, upload_data)
@blynk.on("connected")
def blynk_connected(ping):
print(f"Blynk connected (ping: {ping} ms)")
@blynk.on("disconnected")
def blynk_disconnected():
print("Blynk disconnected")
# Loop utama
while True:
blynk.run()
timer.run()
time.sleep(1)