from machine import Pin, PWM, I2C
from hx711 import *
from lcd_api import LcdApi
from i2c_lcd import I2cLcd
from dcmotor import DCMotor
from time import sleep
import utime
# ========== LOAD CELL + SERVO 360° ==========
hx = hx711(Pin(6), Pin(5)) # DT = GP6, SCK = GP5
hx.set_power(hx711.power.pwr_up)
hx.set_gain(hx711.gain.gain_128)
hx711.wait_settle(hx711.rate.rate_10)
servo360 = PWM(Pin(7)) # Servo 360° di GP7 (ubah agar tidak bentrok)
servo360.freq(50)
def set_servo360(direction):
if direction == 'stop':
servo360.duty_u16(4600) # netral
elif direction == 'cw':
servo360.duty_u16(7000)
elif direction == 'ccw':
servo360.duty_u16(2500)
# ========== LCD ==========
i2c = I2C(1, scl=Pin(3), sda=Pin(2), freq=400000) # I2C: SCL = GP3, SDA = GP2
lcd = I2cLcd(i2c, 0x27, 2, 16)
lcd.clear()
lcd.putstr("Load Cell + Servo")
sleep(2)
lcd.clear()
# ========== PIR + SERVO SUDUT ==========
pir_servo = Pin(14, Pin.IN) # PIR sensor sudut di GP14
servo_angle = PWM(Pin(16)) # Servo sudut di GP16
servo_angle.freq(50)
def set_servo_angle(angle):
duty = int(1638 + (angle / 180) * (8192 - 1638))
servo_angle.duty_u16(duty)
# ========== PIR + DC MOTOR + LED ==========
pir_motor = Pin(26, Pin.IN) # PIR sensor motor di GP26
led = Pin(15, Pin.OUT) # LED di GP15
motor_pin1 = Pin(9, Pin.OUT) # Motor IN1
motor_pin2 = Pin(10, Pin.OUT) # Motor IN2
enable = PWM(Pin(8)) # Motor EN di GP8
enable.freq(1000)
dc_motor = DCMotor(motor_pin1, motor_pin2, enable)
# ========== LOOP UTAMA ==========
try:
while True:
# --- Load Cell + Servo 360° ---
raw = hx.get_value()
weight = raw * 2.38 # Kalibrasi
lcd.clear()
lcd.putstr("Berat: {:.2f} g".format(weight))
print("Berat:", weight, "gram")
if weight > 500:
print("➡️ Berat > 500g: Servo searah")
set_servo360('cw')
sleep(1)
set_servo360('stop')
else:
print("⬅️ Berat <= 500g: Servo berlawanan")
set_servo360('ccw')
sleep(1)
set_servo360('stop')
# --- PIR + Servo Sudut ---
if pir_servo.value() == 1:
print("Gerakan terdeteksi - Servo ke 180°")
set_servo_angle(170)
else:
print("Tidak ada gerakan - Servo ke 0°")
set_servo_angle(0)
# --- PIR + DC Motor + LED ---
if pir_motor.value() == 1:
print('Gerakan terdeteksi! Motor berhenti, LED mati.')
dc_motor.stop()
led.value(1)
else:
print('Tidak ada gerakan. Motor jalan, LED menyala.')
dc_motor.forward(50)
led.value(0)
sleep(2)
except KeyboardInterrupt:
print("⛔ Program dihentikan")
set_servo360('stop')
servo360.deinit()
servo_angle.deinit()
dc_motor.stop()
led.value(0)
lcd.clear()
lcd.putstr("Program Stop")