# Pico 1 - LCD, Vibration Sensor & Buzzer
from machine import Pin, UART, I2C
from lcd_api import LcdApi
from i2c_lcd import I2cLcd
import utime
# ---------------------------
# PIN DEFINISI
# ---------------------------
UART_TX = 4 # GP4 (terima dari Pico 2)
UART_RX = 5 # GP5 (terima dari Pico 2)
# LCD
I2C_SDA = 0 # GP0
I2C_SCL = 1 # GP1
# Vibration Sensor
VIBRATION_PIN = 2 # GP2
# Buzzer
BUZZER_PIN = 3 # GP3
# ---------------------------
# INISIALISASI
# ---------------------------
uart = UART(0, baudrate=9600, tx=Pin(UART_TX), rx=Pin(UART_RX))
i2c = I2C(0, scl=Pin(I2C_SCL), sda=Pin(I2C_SDA), freq=400000)
lcd = I2cLcd(i2c, 0x27, 2, 16)
vibration = Pin(VIBRATION_PIN, Pin.IN)
buzzer = Pin(BUZZER_PIN, Pin.OUT)
# ---------------------------
# LOOP UTAMA
# ---------------------------
while True:
getar = vibration.value()
if uart.any():
try:
data = uart.readline().decode().strip()
if data:
tinggi, piezo = data.split(',')
tinggi = float(tinggi)
piezo = float(piezo)
# Tentukan status berdasarkan data
if piezo < 0.05:
status = "AMAN"
elif piezo >0.05 and piezo < 0.1:
status = "WASPADA"
else:
status = "BAHAYA"
# LCD Output
lcd.clear()
lcd.putstr("Getar:{}\n".format(getar))
lcd.putstr("Air:{:.1f} {}".format(tinggi, status))
# Buzzer Pattern
if status == "AMAN":
buzzer.value(0)
elif status == "WASPADA":
buzzer.value(1)
utime.sleep(0.1)
buzzer.value(0)
utime.sleep(0.4)
elif status == "BAHAYA":
for _ in range(3):
buzzer.value(1)
utime.sleep(0.2)
buzzer.value(0)
utime.sleep(0.2)
except Exception as e:
lcd.clear()
lcd.putstr("UART Error")
utime.sleep(0.5)
# Pico 2 - Sensor Piezoelektrik, Ultrasonik & Servo
from machine import Pin, UART, ADC, PWM
from hcsr04 import HCSR04
import utime
# ---------------------------
# PIN DEFINISI
# ---------------------------
PIEZO_PIN = 27 # GP26 (ADC0)
TRIG_PIN = 26 # GP6
ECHO_PIN = 7 # GP7
SERVO_PIN = 15 # GP15
UART_TX = 4 # GP4 (kirim ke Pico 1)
UART_RX = 5 # GP5 (tidak digunakan aktif)
# ---------------------------
# INISIALISASI
# ---------------------------
piezo = ADC(Pin(PIEZO_PIN))
ultrasonik = HCSR04(trigger_pin=TRIG_PIN, echo_pin=ECHO_PIN)
servo = PWM(Pin(SERVO_PIN))
servo.freq(50)
uart = UART(0, baudrate=9600, tx=Pin(UART_TX), rx=Pin(UART_RX))
# ---------------------------
# FUNGSI SERVO
# ---------------------------
def set_servo_angle(angle):
duty = int(1638 + (angle / 180) * (8192 - 1638))
servo.duty_u16(duty)
# ---------------------------
# LOOP UTAMA
# ---------------------------
while True:
try:
piezo_val = piezo.read_u16() / 65535 * 3.3 # volt
tinggi_air = ultrasonik.distance_cm()
# Kirim ke Pico 1
uart.write("{:.2f},{:.2f}\n".format(tinggi_air, piezo_val))
# Kontrol servo langsung
if tinggi_air > 18:
set_servo_angle(90)
else:
set_servo_angle(0)
utime.sleep(1)
except Exception as e:
utime.sleep(2)