Files
dollcontrol/main_backstage.py
T
2026-03-25 10:42:08 +01:00

131 lines
3.1 KiB
Python

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)