import utime import ujson import network import urequests import machine from machine import Pin 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 print("Starting door alarm...") ssid = "HUAWEI-2EEt-2G" password = "hxtU2dvx" server = "https://192.168.100.16:5031" token = "" ultra_counter = 0 ultra_threshold = 3 # opened state from previous iteration previous_opened = False # TODO: add if open for more than 1 minute, send alert def connect(): print("Connecting...") wlan = network.WLAN(network.STA_IF) wlan.active(False) utime.sleep_ms(250) wlan.active(True) utime.sleep_ms(250) wlan.connect(ssid, password) utime.sleep_ms(100) i = 0 while not wlan.isconnected(): print(f"Waiting for connection{(i % 3 + 1) * "."}{3 * " "}", end="\r") i += 1 for _ in range(4): led.toggle() utime.sleep_ms(250) if i % 10 == 0: print("Attempting to restart connection...") wlan.connect(ssid, password) for i in range(10): led.toggle() utime.sleep_ms(50) print(f"Connected with IP {wlan.ifconfig()[0]}") # 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) try: r = urequests.post(f"{server}/write", headers={"Authorization": token, "Content-Type": "application/json"}, data=raw) print(f"State updated [{r.status_code}]") except Exception as e: print(f"Error occurred: {e}") 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 # T = 500ms f = 2 Hz while True: ultra() if i == 20: # every 10 seconds, blink for 100ms led.toggle() utime.sleep_ms(100) led.toggle() utime.sleep_ms(400) i = 0 else: utime.sleep_ms(500) i += 1