159 lines
3.2 KiB
Python
159 lines
3.2 KiB
Python
import utime
|
|
import ujson
|
|
import network
|
|
import requests
|
|
from machine import Pin
|
|
|
|
control_button = Pin(16, Pin.IN)
|
|
led = Pin(15, Pin.OUT)
|
|
|
|
trigger = Pin(2, Pin.OUT)
|
|
echo = Pin(3, Pin.IN)
|
|
|
|
sound = 340 * 100 # m/s * centi = cm/s
|
|
threshold = 15 # cm
|
|
|
|
exit_standby_counter = 0
|
|
exit_standby_threshold = 3
|
|
|
|
# start in standby mode, break if user holds button for 3s
|
|
print("Starting in standby mode...")
|
|
while True:
|
|
if control_button.value():
|
|
exit_standby_counter += 1
|
|
else:
|
|
exit_standby_counter = 0
|
|
|
|
if exit_standby_counter >= exit_standby_threshold:
|
|
break
|
|
|
|
led.toggle()
|
|
utime.sleep_ms(1000)
|
|
|
|
|
|
def show_ok():
|
|
led.low()
|
|
for _ in range(10):
|
|
led.toggle()
|
|
utime.sleep_ms(100)
|
|
led.low()
|
|
|
|
|
|
print("Starting door alarm...")
|
|
show_ok()
|
|
|
|
ssid = "HUAWEI-2EEt-2G"
|
|
password = "hxtU2dvx"
|
|
server = "http://192.168.100.4:1323"
|
|
token = "test123"
|
|
|
|
ultra_counter = 0
|
|
ultra_threshold = 3
|
|
# opened state from previous iteration
|
|
previous_opened = False
|
|
|
|
|
|
def connect():
|
|
print("Connecting...")
|
|
wlan = network.WLAN(network.STA_IF)
|
|
wlan.active(True)
|
|
wlan.connect(ssid, password)
|
|
|
|
i = 0
|
|
while not wlan.isconnected():
|
|
print(f"Waiting for connection{(i % 3 + 1) * "."}", end="\r")
|
|
i += 1
|
|
for _ in range(4):
|
|
led.toggle()
|
|
utime.sleep_ms(250)
|
|
|
|
print(f"Connected with IP {wlan.ifconfig()[0]}")
|
|
show_ok()
|
|
|
|
# update server to default value
|
|
send_req(False)
|
|
|
|
|
|
def send_req(opened: bool):
|
|
print("Updating state...", end="\r")
|
|
|
|
data = {"opened": opened}
|
|
raw = ujson.dumps(data)
|
|
r = requests.post(f"{server}/write",
|
|
headers={"Authorization": token, "Content-Type": "application/json"},
|
|
data=raw)
|
|
print(f"State updated [{r.status_code}]")
|
|
|
|
|
|
def ultra():
|
|
global ultra_counter, previous_opened
|
|
|
|
trigger.low()
|
|
utime.sleep_us(2)
|
|
trigger.high()
|
|
utime.sleep_us(10)
|
|
trigger.low()
|
|
|
|
# echo goes high as soon as sound wave is sent
|
|
# and returns to low once sound gets back
|
|
while echo.value() == 0:
|
|
sent_time = utime.ticks_us() # us
|
|
|
|
while echo.value() == 1:
|
|
received_time = utime.ticks_us() # us
|
|
|
|
delta_time = received_time - sent_time # us
|
|
distance = delta_time / 1_000_000 * sound / 2
|
|
print(f"distance: {distance} cm")
|
|
|
|
if distance < threshold:
|
|
# door closed
|
|
led.low()
|
|
ultra_counter = 0
|
|
|
|
# was it closed just now?
|
|
if previous_opened:
|
|
send_req(False)
|
|
previous_opened = False
|
|
else:
|
|
# door opened
|
|
led.high()
|
|
ultra_counter += 1
|
|
|
|
# was it opened just now?
|
|
if not previous_opened:
|
|
send_req(True)
|
|
previous_opened = True
|
|
|
|
|
|
connect()
|
|
|
|
i = 0
|
|
exit_counter = 0
|
|
exit_threshold = 6
|
|
while True:
|
|
ultra()
|
|
|
|
if i == 6:
|
|
led.toggle()
|
|
utime.sleep_ms(200)
|
|
led.toggle()
|
|
utime.sleep_ms(300)
|
|
i = 0
|
|
else:
|
|
utime.sleep_ms(500)
|
|
|
|
i += 1
|
|
|
|
if control_button.value():
|
|
exit_counter += 1
|
|
else:
|
|
exit_counter = 0
|
|
if exit_counter >= exit_threshold:
|
|
print("Entering glide mode...")
|
|
break
|
|
|
|
while True:
|
|
led.toggle()
|
|
utime.sleep_ms(1000)
|