from machine import Pin, PWM, time_pulse_us
import time
# =========================
# LCD PINS
# =========================
rs = Pin(16, Pin.OUT)
en = Pin(17, Pin.OUT)
d4 = Pin(18, Pin.OUT)
d5 = Pin(19, Pin.OUT)
d6 = Pin(20, Pin.OUT)
d7 = Pin(21, Pin.OUT)
# =========================
# OUTPUTS
# =========================
led = Pin(14, Pin.OUT)
buzzer = Pin(5, Pin.OUT)
# =========================
# SERVO
# =========================
servo = PWM(Pin(4))
servo.freq(50)
def set_angle(angle):
min_us = 500
max_us = 2500
pulse = min_us + (max_us - min_us) * angle / 180
duty = int(pulse * 65535 / 20000)
servo.duty_u16(duty)
# =========================
# INPUTS
# =========================
switch = Pin(15, Pin.IN, Pin.PULL_DOWN)
dips = [
Pin(6, Pin.IN, Pin.PULL_UP),
Pin(7, Pin.IN, Pin.PULL_UP),
Pin(8, Pin.IN, Pin.PULL_UP),
Pin(9, Pin.IN, Pin.PULL_UP),
Pin(10, Pin.IN, Pin.PULL_UP),
Pin(11, Pin.IN, Pin.PULL_UP),
Pin(12, Pin.IN, Pin.PULL_UP),
Pin(13, Pin.IN, Pin.PULL_UP)
]
# =========================
# HC-SR04
# =========================
trig = Pin(2, Pin.OUT)
echo = Pin(3, Pin.IN)
# =========================
# LCD FUNCTIONS
# =========================
def pulse():
en.value(1)
time.sleep_us(40)
en.value(0)
time.sleep_us(40)
def send4(value):
d4.value((value >> 0) & 1)
d5.value((value >> 1) & 1)
d6.value((value >> 2) & 1)
d7.value((value >> 3) & 1)
pulse()
def send(value, mode):
rs.value(mode)
send4(value >> 4)
send4(value & 0x0F)
def cmd(c):
send(c, 0)
time.sleep_ms(2)
def write(text):
for ch in text:
send(ord(ch), 1)
def clear():
cmd(0x01)
def lcd_init():
time.sleep_ms(50)
send4(0x03)
time.sleep_ms(5)
send4(0x03)
time.sleep_ms(5)
send4(0x03)
time.sleep_ms(5)
send4(0x02)
cmd(0x28)
cmd(0x0C)
cmd(0x06)
cmd(0x01)
# =========================
# DISTANCE FUNCTION
# =========================
def get_distance():
trig.low()
time.sleep_us(2)
trig.high()
time.sleep_us(10)
trig.low()
duration = time_pulse_us(echo, 1, 30000)
if duration < 0:
return 999
distance = duration / 58
return distance
# =========================
# DIP SWITCH FUNCTION
# =========================
def read_dip():
value = ""
for d in dips:
value += str(1 - d.value())
return value
# =========================
# START LCD
# =========================
lcd_init()
set_angle(0)
# =========================
# MAIN LOOP
# =========================
while True:
if switch.value() == 0:
led.off()
buzzer.off()
set_angle(0)
clear()
write("SYSTEM OFF")
time.sleep(1)
continue
if read_dip() != "10000000":
led.off()
buzzer.off()
set_angle(0)
clear()
write("SET MODE")
time.sleep(1)
continue
dist = get_distance()
clear()
if dist < 30:
led.on()
buzzer.on()
set_angle(90)
write("ROOM OCCUPIED")
cmd(0xC0)
write("LIGHT ON")
else:
led.off()
buzzer.off()
set_angle(0)
write("ROOM EMPTY")
cmd(0xC0)
write("LIGHT OFF")
print("Distance:", dist)
time.sleep(1)ERC Warnings
flop1:CLK: Clock driven by combinatorial logic
flop3:CLK: Clock driven by combinatorial logic