import time
from machine import Pin, I2C, PWM
from hx711 import HX711
from pico_i2c_lcd import PicoI2cLcd
# Konfigurasi Pin Raspberry Pi Pico W
DT_PIN = 14
SCK_PIN = 15
BUZZER_PIN = 16
I2C_SDA = 0
I2C_SCL = 1
# Ambang Batas Overload (4.999 Gram)
THRESHOLD_GRAM = 4999.0
# Inisialisasi Buzzer (PWM)
buzzer = PWM(Pin(BUZZER_PIN))
buzzer.duty_u16(0) # Buzzer mati secara default
def buzzer_on(freq=2500):
buzzer.freq(freq)
buzzer.duty_u16(32768) # Duty cycle 50%
def buzzer_off():
buzzer.duty_u16(0)
# Inisialisasi LCD I2C (16x2)
i2c = I2C(0, sda=Pin(I2C_SDA), scl=Pin(I2C_SCL), freq=400000)
devices = i2c.scan()
I2C_ADDR = devices[0] if devices else 0x27
lcd = PicoI2cLcd(i2c, I2C_ADDR, 2, 16)
# -------------------------------------------------------------
# 1. LOADING AWAL BOOT
# -------------------------------------------------------------
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr(" Sistem kerja ")
lcd.move_to(0, 1)
lcd.putstr(" Overload Lift ")
time.sleep(3) # Menampilkan loading awal selama 3 detik
# -------------------------------------------------------------
# 2. INISIALISASI & KALIBRASI SENSOR (TARE)
# -------------------------------------------------------------
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr(" Kalibrasi Lift ")
lcd.move_to(0, 1)
lcd.putstr("Mereset Nol... ")
hx = HX711(d_out=DT_PIN, sck=SCK_PIN)
CALIBRATION_FACTOR = 420.0 # Skala standar Wokwi untuk load cell 5kg
hx.tare()
hx.set_scale(CALIBRATION_FACTOR)
lcd.clear()
# -------------------------------------------------------------
# 3. LOOP UTAMA PEMBACAAN BEBAN
# -------------------------------------------------------------
while True:
try:
# Membaca berat dari sensor dan konversi ke gram
weight_kg = hx.get_units(times=3)
weight_gram = weight_kg * 1000.0
# Menghindari tampilan nilai minus akibat fluktuasi kecil
if weight_gram < 0:
weight_gram = 0.0
# Pengecekan Kondisi Overload (>= 4999 gram)
if weight_gram >= THRESHOLD_GRAM:
buzzer_on(2500) # Buzzer berbunyi
# Tampilan LCD saat Overload & Lift Stop
lcd.move_to(0, 0)
lcd.putstr(" OVERLOAD! ")
lcd.move_to(0, 1)
lcd.putstr("Sistem Lift Stop")
else:
buzzer_off() # Buzzer tidak berbunyi
# Tampilan LCD kembali ke perhitungan beban normal
lcd.move_to(0, 0)
lcd.putstr("Lift: BERJALAN ")
lcd.move_to(0, 1)
lcd.putstr(f"Beban: {weight_gram:.1f}g ")
time.sleep(0.2)
except KeyboardInterrupt:
buzzer_off()
print("Program dihentikan.")
break
except Exception as e:
print("Error:", e)
time.sleep(1)Loading
pi-pico-w
pi-pico-w