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)