๐ŸŽฅ PicoW Camera Auto-Reset v2 โ€” Enhanced Edition

ืื™ืคื•ืก ืžืฆืœืžื” ืžืจื—ื•ืง: relay power-cycle + watchdog ืื•ื˜ื•ืžื˜ื™ + MQTT + WiFi-config ื‘ืœื—ื™ืฆืช ื›ืคืชื•ืจ. ALMAWARE ยท from-scratch ยท MicroPython stdlib only.

ืชื•ื›ืŸ ืขื ื™ื™ื ื™ื / Contents

ืžื” ื–ื” ืขื•ืฉื”

ืžืฆืœืžื” ืชืงื•ืขื” (ื›ื—ื•ืœ ืžื”ื‘ื”ื‘ / ืื™ืŸ LAN) โ†’ ืœื—ื™ืฆื” ืื—ืช ืžื”ื“ืคื“ืคืŸ, ื”ื•ื“ืขืช MQTT, ืื• ื›ืคืชื•ืจ ืคื™ื–ื™ โ†’ ื”-Pico ืžื ืชืง ืืช ื”ื—ืฉืžืœ ืœ-6 ืฉื ื™ื•ืช ื•ืžื—ื–ื™ืจ = ืื™ืคื•ืก ืงืฉื™ื—. Watchdog ืื•ื˜ื•ืžื˜ื™ ืžืืคืก ืื ื”ืžืฆืœืžื” ืœื ืขื•ื ื” โ€” ื‘ืœื™ ืื ืฉื™ื.

ืชื›ื•ื ื•ืช ื—ื“ืฉื•ืช v2

ืชื›ื•ื ื”ืคื™ืจื•ื˜ื‘ืจื™ืจืช ืžื—ื“ืœ
๐ŸŒ ื›ืคืชื•ืจ Reset ื‘-Webื“ืฃ HTTP ื‘-:80 ืขื ื›ืคืชื•ืจ ื’ื“ื•ืœ, status, ื•ืžื™ื“ืขON ืชืžื™ื“
๐Ÿ”˜ ื›ืคืชื•ืจ ืคื™ื–ื™ (GP14)ืœื—ื™ืฆื” ืงืฆืจื” โ†’ reset; ืื—ื–ืงื” 3s โ†’ AP configON ืชืžื™ื“
๐Ÿ”Œ Relay fail-safe (GP15)NC = ืžืฆืœืžื” ืžื•ืคืขืœืช ื‘-default; Pico ื›ื‘ื•ื™ โ†’ ืžืฆืœืžื” ONON ืชืžื™ื“
NEW ๐Ÿ‘ Auto-Watchdogping TCP ืœIP ื”ืžืฆืœืžื” ื›ืœ N ืฉื ื™ื•ืช; M ื›ืฉืœื•ืช ื‘ืจืฆืฃ โ†’ power-cycleOFF (configurable)
NEW ๐Ÿ“จ MQTT triggersubscribe ืœ-cam/reset ืขืœ ื”-PC mosquitto (LAN); ื”ื•ื“ืขื” โ†’ resetOFF (configurable)
NEW โš™๏ธ WiFi-Config AP modeืื—ื–ืงืช ื›ืคืชื•ืจ ~3s โ†’ Pico ื”ื•ืคืš ืœ-AP "PicoCamReset" โ†’ ื“ืฃ ื”ื’ื“ืจื•ืช โ†’ ืฉืžื™ืจื” + rebootื–ืžื™ืŸ ืชืžื™ื“
NEW ๐Ÿ’พ config.jsonื›ืœ ื”ื”ื’ื“ืจื•ืช ื‘-JSON ืขืœ ื”-Pico; ื ื™ืชืŸ ืœืขืจื•ืš ืž-Thonny ื‘ืœื™ re-flashื‘ืจื™ืจื•ืช ืžื—ื“ืœ ื‘ื˜ื•ื—ื•ืช
NEW ๐Ÿ”† ื“ืคื•ืกื™ LEDื—ื™ื‘ื•ืจ / ืžื—ื•ื‘ืจ / ืžืืคืก / AP mode โ€” ื›ืœ ืžืฆื‘ ืขื ื“ืคื•ืก ืฉื•ื ื”ON ืชืžื™ื“

ืจืฉื™ืžืช ืจื›ื™ื‘ื™ื (BOM)

ืจื›ื™ื‘ืคื™ืจื•ื˜ื”ืขืจื”
Raspberry Pi Pico WWiFi, MicroPython 1.22+~30โ‚ช
ืžื•ื“ื•ืœ Relay 1-ืขืจื•ืฅ opto-isolated (5V)SRD-05VDC, ืžื’ืขื™ื 10A/30VDCื”ื›ื™ ืคืฉื•ื˜ + ืžื‘ื•ื“ื“
ื›ืคืชื•ืจ ืœื—ื™ืฅ momentaryNO (Normally Open), ื—ื™ื‘ื•ืจ GP14โ†’GNDื—ื•ื‘ื” ืœAP-config
ื—ื•ื˜ื™ jumper + ืกืคืง-ื”ื›ื•ื— ืฉืœ ื”ืžืฆืœืžื”ืžื“ื•ื“ ืžืชื—+ื–ืจื!ืจื•ื‘ PTZ: 12V 1โ€“2A

ื—ื™ื•ื•ื˜

Pico W Relay module Camera power supply ------- ------------ ------------------- VBUS (5V) ---------> VCC GND ---------> GND GP15 ---------> IN COM ----+---- (+V from PSU) GP14 --[button]-- GND NC ----+---- (+V to camera) (NO stays disconnected โ€” not used) NC = Normally Closed = camera gets power by DEFAULT. Energize relay (GP15=1) โ†’ NC opens โ†’ camera POWER OFF โ†’ hard reset. If Pico dies or loses power: relay de-energizes โ†’ NC closes โ†’ camera stays ON. This is the fail-safe.
โš ๏ธ ื‘ื˜ื™ื—ื•ืช: ื•ื“ื ืฉื”-relay ืขื•ืžื“ ื‘ืžืชื—+ื–ืจื (ืžื•ื“ื•ืœ ืจื’ื™ืœ = 10A/30VDC โ€” ืžืกืคื™ืง ืœ-12V/2A). ื—ื‘ืจ ืขืœ ืงื• ื”-+V ื“ืจืš NC+COM ื‘ืœื‘ื“. ืืœ ืชื—ื‘ืจ 220V โ€” ืจืง DC ืžืกืคืง-ื”ื›ื•ื—.

ื“ืคื•ืกื™ LED

ืžืฆื‘ื“ืคื•ืกืชื™ืื•ืจ
ืžืชื—ื‘ืจ ืœ-WiFiื”ื‘ื”ื•ื‘ ืžื”ื™ืจ 100msSTA connecting
ืžื—ื•ื‘ืจ WiFi โ€” idleื“ื•ืœืง ืงื‘ื•ืขืฉืจืช web ืคืขื™ืœ
AP Config Modeื”ื‘ื”ื•ื‘ ืื™ื˜ื™AP "PicoCamReset" ืคืขื™ืœ
Power-Cycle (reset)strobe ืžื”ื™ืจ 100msื—ืฉืžืœ ืžื ื•ืชืง
Watchdog checkdouble-flash ืงืฆืจื‘ื•ื“ืง connectivity ืœืžืฆืœืžื”
ืื™ืŸ WiFi โ€” button modeLED ื›ื‘ื•ื™ืจืง ื›ืคืชื•ืจ ืคื•ืขืœ

config.json โ€” ื”ื’ื“ืจื•ืช

ื”ืขืชืง ืืช config.json.example ืœ-config.json ืขืœ ื”-Pico (ื“ืจืš Thonny), ืขืจื•ืš ืœืคื™ ื”ืฆื•ืจืš. ื›ืœ ืฉื“ื” ืื•ืคืฆื™ื•ื ืœื™ โ€” ื”ืงื•ื“ ืžืฉืชืžืฉ ื‘ื‘ืจื™ืจื•ืช ืžื—ื“ืœ ื‘ื˜ื•ื—ื•ืช.

{
  "wifi_ssid": "YOUR_HOME_WIFI",
  "wifi_pass": "YOUR_WIFI_PASSWORD",
  "off_seconds": 6,

  "watchdog_enabled": false,      // OFF by default โ€” turn ON ืœืื—ืจ ืฉื”ื’ื“ืจืช ip ื ื›ื•ืŸ
  "watchdog_ip": "192.168.1.89",  // IP ื”ืžืฆืœืžื” (Semicom = 192.168.1.89)
  "watchdog_interval_s": 30,      // ื‘ื“ื•ืง ื›ืœ 30 ืฉื ื™ื•ืช
  "watchdog_fail_count": 3,       // 3 ื›ืฉืœื•ืช ื‘ืจืฆืฃ โ†’ power-cycle

  "mqtt_enabled": false,          // OFF by default
  "mqtt_host": "192.168.1.100",   // IP ื”ืžื—ืฉื‘ (mosquitto)
  "mqtt_port": 1883,
  "mqtt_topic": "cam/reset",
  "mqtt_client_id": "picow-cam-reset",

  "ap_ssid": "PicoCamReset",
  "ap_pass": ""                   // AP ืคืชื•ื— โ€” ื”ื•ืกืฃ ืกื™ืกืžื” ืœืื‘ื˜ื—ื”
}
watchdog_enabled: false ื‘ื›ื•ื•ื ื” โ€” watchdog loops ืฉื’ื•ื™ื™ื ื™ื›ื•ืœื™ื ืœืืคืก ืืช ื”ืžืฆืœืžื” ื‘ืจืฆืฃ ืื ื”-IP ืฉื’ื•ื™. ื”ื’ื“ืจ ืืช ื”-IP, ื‘ื“ื•ืง ืฉื”ืžืฆืœืžื” ืขื•ื ื” ื‘ืฆื•ืจื” ื™ื“ื ื™ืช (ping ืžื”ืžื—ืฉื‘), ื•ืื– ืฉื ื” ืœ-true ื‘-Thonny.

ื”ืชืงื ื” ืฆืขื“-ืฆืขื“

1. ื”ื•ืจื“ MicroPython ืœPico W: https://micropython.org/download/RPI_PICO_W/ (ื”ื’ืจืกื” ื”ืขื“ื›ื ื™ืช โ€” flash ื›-UF2 ืชื•ืš ืื—ื–ืงืช BOOTSEL)

2. ืคืชื— Thonny IDE โ†’ Tools โ†’ Options โ†’ Interpreter โ†’ "MicroPython (Raspberry Pi Pico)" โ†’ ื‘ื—ืจ port

3. ืคืชื— ืืช D:\CLAUDE\picow-cam-reset\config.json.example, ืขืจื•ืš ืืช ื”-SSID/password ื•ืฉื ื” ืฉื ืœ-config.json

4. ื‘-Thonny: File โ†’ Open โ†’ ืงื•ื‘ืฅ ืžืงื•ืžื™ โ†’ config.json โ†’ Save โ†’ Raspberry Pi Pico โ†’ config.json

5. ื—ื–ื•ืจ ืขืœ ืฉืœื‘ 4 ืขื main.py โ€” ืฉืžื•ืจ ื›-main.py ืขืœ ื”-Pico

6. ื—ื‘ืจ ืืช ื”-relay ืœืคื™ ื”ื—ื™ื•ื•ื˜. ืฉื™ื NC+COM ืขืœ ืงื• ื”-+V ืฉืœ ืกืคืง ื”ืžืฆืœืžื”

7. ื”ื“ืœืง โ€” ื”-LED ื™ื”ื‘ื”ื‘ ืžื”ื™ืจ ืขื“ ื—ื™ื‘ื•ืจ WiFi, ื•ืื– ื™ื™ืฉืืจ ื“ื•ืœืง ืงื‘ื•ืข

8. ืžืฆื ืืช ื”-IP ื‘-router (ื—ืคืฉ "Pico") ืื• ื‘-Thonny Shell: import network; w=network.WLAN(0); print(w.ifconfig())

9. ืคืชื— http://<pico-ip>/ ืžื”ื˜ืœืคื•ืŸ/PC โ†’ ืœื—ืฅ "๐Ÿ” ืืคืก ืžืฆืœืžื”"

Watchdog ืื•ื˜ื•ืžื˜ื™ NEW

ื”-Watchdog ืขื•ืฉื” TCP ping (ืคื•ืชื— socket ืœ-port 80 ืขืœ IP ื”ืžืฆืœืžื”) ื›ืœ watchdog_interval_s ืฉื ื™ื•ืช.
ืื ื”ืžืฆืœืžื” ืœื ืขื•ื ื” watchdog_fail_count ืคืขืžื™ื ื‘ืจืฆืฃ โ†’ auto power-cycle.

ืœื”ืคืขื™ืœ: ื‘-config.json ืฉื ื” "watchdog_enabled": true ื•ื•ื“ื ืฉื”-IP ื ื›ื•ืŸ.
ืื‘ื—ื•ืŸ: ื”-LED ืขื•ืฉื” double-flash ื‘ื›ืœ ื‘ื“ื™ืงื” (ื’ืœื•ื™).
โš ๏ธ ืœืคื ื™ ื”ืคืขืœื”: ื•ื•ื“ื ืžื”ืžื—ืฉื‘ ืฉื”-IP ื ื›ื•ืŸ: ping 192.168.1.89. IP ืฉื’ื•ื™ = reset ื‘ืจืฆืฃ.
# config.json โ€” watchdog ืžื•ืคืขืœ
{
  "watchdog_enabled": true,
  "watchdog_ip": "192.168.1.89",
  "watchdog_interval_s": 30,
  "watchdog_fail_count": 3
}

MQTT Trigger NEW

ื”-Pico ืžืชื—ื‘ืจ ืœ-mosquitto ืฉืจืฅ ืขืœ ื”ืžื—ืฉื‘ (LAN, port 1883) ื•ืžืื–ื™ืŸ ืœ-topic cam/reset.
ื›ืฉืžื’ื™ืขื” ื”ื•ื“ืขื” (ื›ืœ payload) โ†’ power-cycle ืžื™ื™ื“ื™.

ื”-MQTT ืžื™ื•ืฉื ื‘-pure socket (MQTT 3.1.1) โ€” ืื™ืŸ ืชืœื•ืช ื‘-umqtt.simple. ืื ื”broken ื”ื•ื ื›ื‘ื•ื™, ื”-MQTT fallbacks off ืœืœื crash.

ื”ืคืขืœื”

1. ื•ื“ื ืฉืžืฉืชืžืฉ ื‘-mosquitto ืขืœ ื”ืžื—ืฉื‘:
mosquitto -v (ืื• ื‘daemon: services.msc โ†’ mosquitto)

2. ื‘-config.json: "mqtt_enabled": true, "mqtt_host": "192.168.1.100" (ื”ื—ืœืฃ ื‘IP ื”ืžื—ืฉื‘)

3. ืœืฉืœื•ื— trigger ืžื”ืžื—ืฉื‘:

ื‘ื“ื™ืงืช MQTT ืžื”ืžื—ืฉื‘

# ืฉืœื— reset ืžื”-PC (mosquitto_pub)
mosquitto_pub -h 127.0.0.1 -t cam/reset -m reset

# ืื• ืž-Python (ื‘ื›ืœ ืžื—ืฉื‘ ืขืœ ื”ืจืฉืช):
import socket, struct
def mqtt_publish(host, topic, msg="reset"):
    pkt = bytearray([0x10,0x00,0x00,0x04])+b"MQTT"+bytes([4,2,0,60])
    cid = b"pc-sender"
    pkt += struct.pack("!H", len(cid))+cid
    pkt[1] = len(pkt)-2
    s = socket.create_connection((host,1883), timeout=5)
    s.sendall(bytes(pkt)); s.recv(4)          # CONNACK
    t,m = topic.encode(), msg.encode()
    pub = bytes([0x30,0x00])+struct.pack("!H",len(t))+t+m
    pub = bytearray(pub); pub[1]=len(pub)-2
    s.sendall(bytes(pub)); s.close()
mqtt_publish("127.0.0.1", "cam/reset")

WiFi-Config AP Mode NEW

ื‘ืœื™ Thonny ื•ื‘ืœื™ re-flash. ืื ืฉื™ื ื™ืช router / SSID / ืกื™ืกืžื”:

ื‘ื–ืžืŸ ืจื™ืฆื”: ืื—ื•ื– ืืช GP14 ~3 ืฉื ื™ื•ืช โ†’ LED ื™ืชื—ื™ืœ ื”ื‘ื”ื•ื‘ ืื™ื˜ื™ โ†’ Pico ื”ื•ืคืš ืœ-AP
ื‘boot: ืื—ื•ื– ืืช GP14 ื‘ื–ืžืŸ ื”ื”ื“ืœืงื” ~1.5 ืฉื ื™ื•ืช โ†’ ื™ืฉื™ืจื•ืช ืœ-AP mode

1. ื—ื‘ืจ ืืช ื”ื˜ืœืคื•ืŸ/ืžื—ืฉื‘ ืœ-WiFi PicoCamReset
2. ืคืชื— http://192.168.4.1/
3. ืžืœื SSID + Password ื—ื“ืฉื™ื (+ watchdog IP, ืฉื ื™ื•ืช ื›ื™ื‘ื•ื™, MQTT host)
4. ืœื—ืฅ "๐Ÿ’พ ืฉืžื•ืจ ื•ืืชื—ืœ" โ†’ Pico ืžืชื—ื‘ืจ ืœ-WiFi ื”ื—ื“ืฉ
โš ๏ธ ื”-AP ืคืชื•ื— ื‘ื‘ืจื™ืจืช ืžื—ื“ืœ. ื‘ื“ื™ืจื” ืขื ืฉื›ื ื™ื โ€” ื”ื•ืกืฃ "ap_pass": "my-secret" ืœ-config.json.

ืžื” ื ื‘ื“ืง ยท ืžื” ืฆืจื™ืš ื—ื•ืžืจื”

ืคืจื™ื˜ื ื‘ื“ืงืฉื™ื˜ื”
Syntax / ASTโœ… ืขื‘ืจpython -m py_compile main.py (CPython)
config.json load/save/merge/corruptโœ… 4/4 testsCPython harness (_test_harness.py)
HTML render โ€” AP + STA pagesโœ… 12/12 checksCPython harness
MQTT CONNECT/SUBSCRIBE packet bytesโœ… 7/7 checksstruct pack + byte-level verify
CONNACK parse logicโœ…ื›ื™ืกื•ื™ ื‘ืžืคืจื˜ MQTT 3.1.1
Form body parser + percent-decodeโœ… 7/7 checksCPython harness
Relay GPIO behaviorโšก ื—ื•ืžืจื” ื‘ืœื‘ื“NC/COM ืขืœ 12V โ€” ืœื‘ื“ื•ืง ื‘flash ืจืืฉื•ืŸ
WiFi STA connectโšก ื—ื•ืžืจื” ื‘ืœื‘ื“network.WLAN = MicroPython API
Physical button IRQ / hold detectionโšก ื—ื•ืžืจื” ื‘ืœื‘ื“timing-based โ€” ื™ื›ื•ืœ ืœื“ืจื•ืฉ ื›ื™ื•ื•ืŸ ืขื“ื™ืŸ ืฉืœ ืกืฃ ื”-3s
MQTT live broker connectionโšก ื—ื•ืžืจื” ื‘ืœื‘ื“ืฆืจื™ืš Pico W + mosquitto ืขืœ LAN
AP mode (network.AP_IF)โšก ื—ื•ืžืจื” ื‘ืœื‘ื“MicroPython API โ€” ืขื‘ื“ ื‘demos ืจื‘ื™ื
machine.reset() after saveโšก ื—ื•ืžืจื” ื‘ืœื‘ื“MicroPython only
ื‘ื™ืงื•ืจืช ืคื ื™ืžื™ืช: ื”ืœื•ื’ื™ืง ืฉืœ watchdog/MQTT/AP ืชื•ื›ื ืŸ ืœ-loop ื™ื—ื™ื“ (serve()) ืขื timeout ืงืฆืจ ืขืœ socket.accept(). ื›ืœ ื”ืคืขื•ืœื•ืช non-blocking-ish. ืื watchdog+MQTT+web ื›ื•ืœื ืคืขื™ืœื™ื โ€” cycle time ืขื“ ~2s ื‘ื’ืœืœ TCP ping timeout. ื ื™ืชืŸ ืœืงืฆืจ watchdog_interval ืœ-60s+ ืœWifi ืขืžื•ืก.

ืฉืืœื•ืช ื ืคื•ืฆื•ืช

ืฉืืœื”ืชืฉื•ื‘ื”
ื”ืžืฆืœืžื” ืœื ื—ื•ื–ืจืช ืœืื—ืจ resetื”ื’ื“ืœ off_seconds (6โ†’10). ื‘ื“ื•ืง ืฉื”-relay ืขื•ื‘ื“ (ืฉืžืข click).
LED ืœื ืžืื™ืจ ืื—ืจื™ bootWiFi ื ื›ืฉืœ โ€” ื‘ื“ื•ืง SSID/pass ื‘config.json. ื‘-no-WiFi mode LED ื›ื‘ื•ื™ ื‘ื›ื•ื•ื ื”.
Watchdog ืžืืคืก ื‘ืจืฆืฃIP ืฉื’ื•ื™. ื‘-Thonny: "watchdog_enabled": false โ†’ ืฉื ื” IP โ†’ ื‘ื“ื•ืง ping ืžื—ืฉื‘ โ†’ ื”ืคืขืœ ืฉื•ื‘.
MQTT ืœื ืžืชื—ื‘ืจื•ื“ื mosquitto ืจืฅ: mosquitto_pub -h 127.0.0.1 -t test -m hi. ื•ื“ื IP ื ื›ื•ืŸ ื‘config. Firewall?
AP mode ืœื ืžื•ืคื™ืขืื—ื•ื– ืืช ื”ื›ืคืชื•ืจ ืืจื•ืš ื™ื•ืชืจ (3s). ืื ื”Pico ื‘-no-WiFi mode โ†’ boot hold 1.5s.
ื›ืคืชื•ืจ ืคื•ืขืœ ืคืขืžื™ื™ืื”ื•ืกืฃ debounce: ืฉื ื” if held > 0.05 ืœ-if held > 0.15 ื‘-serve()
ืงื‘ืฆื™ื:
D:\CLAUDE\picow-cam-reset\main.py โ€” firmware (ื”ืขืชืง ืœ-Pico)
D:\CLAUDE\picow-cam-reset\config.json.example โ€” ืชื‘ื ื™ืช ื”ื’ื“ืจื•ืช
D:\CLAUDE\picow-cam-reset\_test_harness.py โ€” ื‘ื“ื™ืงื•ืช CPython
D:\CLAUDE\picow-cam-reset\guide.html โ€” ื”ืžื“ืจื™ืš ื”ื–ื” (ืคืชื— ื‘ื“ืคื“ืคืŸ โ†’ Ctrl+P โ†’ ืฉืžื•ืจ ื›-PDF)

ืœื–ื›ืจื” ืฉืœ ืขืœืžื” ื–ืดืœ โ€” iddoperez.ai