from machine import Pin
import time
# ---------------- MOTOR ----------------
step = Pin(11, Pin.OUT)
direction = Pin(12, Pin.OUT)
enable = Pin(13, Pin.OUT)
enable.off()
# ---------------- SENSORS ----------------
pir = Pin(6, Pin.IN)
trig = Pin(7, Pin.OUT)
echo = Pin(8, Pin.IN)
# ---------------- HX711 ----------------
hx_dt = Pin(9, Pin.IN)
hx_sck = Pin(10, Pin.OUT)
# ---------------- LCD ----------------
rs = Pin(0, Pin.OUT)
e = Pin(1, Pin.OUT)
d4 = Pin(2, Pin.OUT)
d5 = Pin(3, Pin.OUT)
d6 = Pin(4, Pin.OUT)
d7 = Pin(5, Pin.OUT)
# ---------------- LCD ----------------
def pulse():
e.on()
time.sleep_us(1)
e.off()
time.sleep_us(100)
def send4(n):
d4.value(n & 1)
d5.value((n >> 1) & 1)
d6.value((n >> 2) & 1)
d7.value((n >> 3) & 1)
pulse()
def cmd(c):
rs.off()
send4(c >> 4)
send4(c & 0x0F)
time.sleep_ms(2)
def data(c):
rs.on()
send4(ord(c) >> 4)
send4(ord(c) & 0x0F)
def text(t):
for i in t:
data(i)
def lcd_init():
time.sleep_ms(20)
cmd(0x02)
cmd(0x28)
cmd(0x0C)
cmd(0x06)
cmd(0x01)
# ---------------- DISTANCE (SAFE) ----------------
def distance():
trig.off()
time.sleep_us(2)
trig.on()
time.sleep_us(10)
trig.off()
timeout = 30000
start_wait = time.ticks_us()
while echo.value() == 0:
if time.ticks_diff(time.ticks_us(), start_wait) > timeout:
return 999
start = time.ticks_us()
while echo.value() == 1:
if time.ticks_diff(time.ticks_us(), start) > timeout:
return 999
end = time.ticks_us()
t = time.ticks_diff(end, start)
dist = t / 58
#print("RAW DIST:", dist)
return dist
# ---------------- HX711 SAFE READ ----------------
def read_raw():
count = 0
timeout = 100000
start_wait = time.ticks_us()
# HX711 ready bekle (SAFE)
while hx_dt.value() == 1:
if time.ticks_diff(time.ticks_us(), start_wait) > timeout:
print("HX711 TIMEOUT")
return 0
for i in range(24):
hx_sck.on()
time.sleep_us(1)
count = count << 1
hx_sck.off()
time.sleep_us(1)
if hx_dt.value():
count += 1
# gain pulse
hx_sck.on()
time.sleep_us(1)
hx_sck.off()
if count & 0x800000:
count -= 1 << 24
return count
# ---------------- WEIGHT (STABLE) ----------------
def weight():
raw = read_raw()
if raw == 0:
return 0
kg = raw / 40000 # stabil ölçek (kalibrasyon gibi düşün)
#print("RAW:", raw, "KG:", kg)
return kg
# ---------------- INIT ----------------
lcd_init()
opened = False
# ---------------- LOOP ----------------
while True:
motion = pir.value()
dist = distance()
w = weight()
ok_motion = (motion == 1)
ok_dist = (dist <= 50)
ok_weight = (w >= 0.315)
#print("M:", motion, "D:", dist, "W:", w)
cmd(0x01)
time.sleep_ms(2)
if ok_motion and ok_dist and ok_weight:
text("GIRIS ONAYLANDI")
if not opened:
direction.on()
for i in range(200):
step.on()
time.sleep_ms(2)
step.off()
time.sleep_ms(2)
opened = True
else:
text("GIRIS RED")
cmd(0xC0)
if not ok_motion:
text("Hareket yok")
elif not ok_dist:
text("Uzaklik >50cm")
elif not ok_weight:
text("Agirlik <30kg")
opened = False
time.sleep(0.5)ERC Warnings
flop1:CLK: Clock driven by combinatorial logic