From 758f7f189bec31aead179ca6eaa1966dc247f17f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20B=C3=BCrmann?= Date: Wed, 25 Mar 2026 10:42:08 +0100 Subject: [PATCH] main_backstage --- main_backstage.py | 131 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 main_backstage.py diff --git a/main_backstage.py b/main_backstage.py new file mode 100644 index 0000000..dad0111 --- /dev/null +++ b/main_backstage.py @@ -0,0 +1,131 @@ +from machine import Pin +import time +import network +import socket + +# ============================================================ +# WLAN ZUR PUPPE +# ============================================================ +SSID = "BABY_PUPPE" +PASSWORD = "TheaterBaby2026" +PUPPET_IP = "192.168.4.1" +UDP_PORT = 4210 +SHARED_SECRET = "babysecret" + +PING_INTERVAL_MS = 1000 +SEND_REPEAT_COUNT = 2 +SEND_REPEAT_DELAY_MS = 20 + +# ============================================================ +# BUTTONS +# ============================================================ +btn_cry = Pin(2, Pin.IN, Pin.PULL_UP) +btn_whim = Pin(3, Pin.IN, Pin.PULL_UP) +btn_gig = Pin(4, Pin.IN, Pin.PULL_UP) +btn_stop = Pin(5, Pin.IN, Pin.PULL_UP) +btn_poop = Pin(6, Pin.IN, Pin.PULL_UP) + +led = Pin("LED", Pin.OUT) + +DEBOUNCE_MS = 80 +last_ms = { + "cry": 0, + "whim": 0, + "gig": 0, + "stop": 0, + "poop": 0, +} + +seq = 0 +last_ping_ms = 0 + +def is_pressed(pin): + return pin.value() == 0 + +def allow(key): + now = time.ticks_ms() + if time.ticks_diff(now, last_ms[key]) > DEBOUNCE_MS: + last_ms[key] = now + return True + return False + +# ============================================================ +# WLAN CONNECT +# ============================================================ +wlan = network.WLAN(network.STA_IF) +wlan.active(True) +wlan.connect(SSID, PASSWORD) + +timeout = time.ticks_add(time.ticks_ms(), 10000) +while not wlan.isconnected(): + if time.ticks_diff(timeout, time.ticks_ms()) <= 0: + break + led.toggle() + time.sleep_ms(200) + +led.value(1 if wlan.isconnected() else 0) +print("STA config:", wlan.ifconfig()) + +sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + +def next_seq(): + global seq + seq += 1 + return seq + +def send_packet(cmd, packet_seq=None): + if packet_seq is None: + packet_seq = next_seq() + + payload = "{}|{}|{}".format(SHARED_SECRET, packet_seq, cmd) + sock.sendto(payload.encode("utf-8"), (PUPPET_IP, UDP_PORT)) + +def send_command(cmd): + packet_seq = next_seq() + + for _ in range(SEND_REPEAT_COUNT): + send_packet(cmd, packet_seq=packet_seq) + time.sleep_ms(SEND_REPEAT_DELAY_MS) + + # kurzes LED-Feedback + led.off() + time.sleep_ms(30) + led.on() + +def send_ping(): + packet_seq = next_seq() + send_packet("PING", packet_seq=packet_seq) + +# ============================================================ +# MAIN LOOP +# ============================================================ +while True: + if not wlan.isconnected(): + led.toggle() + time.sleep_ms(200) + continue + + # Heartbeat + now = time.ticks_ms() + if time.ticks_diff(now, last_ping_ms) > PING_INTERVAL_MS: + last_ping_ms = now + send_ping() + led.value(1) + + # STOP zuerst + if is_pressed(btn_stop) and allow("stop"): + send_command("STOP") + + if is_pressed(btn_cry) and allow("cry"): + send_command("CRY") + + if is_pressed(btn_whim) and allow("whim"): + send_command("WHIM") + + if is_pressed(btn_gig) and allow("gig"): + send_command("GIG") + + if is_pressed(btn_poop) and allow("poop"): + send_command("POOP") + + time.sleep_ms(5) \ No newline at end of file