๐ฅ 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 config | ON ืชืืื |
| ๐ Relay fail-safe (GP15) | NC = ืืฆืืื ืืืคืขืืช ื-default; Pico ืืืื โ ืืฆืืื ON | ON ืชืืื |
| NEW ๐ Auto-Watchdog | ping TCP ืIP ืืืฆืืื ืื N ืฉื ืืืช; M ืืฉืืืช ืืจืฆืฃ โ power-cycle | OFF (configurable) |
| NEW ๐จ MQTT trigger | subscribe ื-cam/reset ืขื ื-PC mosquitto (LAN); ืืืืขื โ reset | OFF (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 W | WiFi, MicroPython 1.22+ | ~30โช |
| ืืืืื Relay 1-ืขืจืืฅ opto-isolated (5V) | SRD-05VDC, ืืืขืื 10A/30VDC | ืืื ืคืฉืื + ืืืืื |
| ืืคืชืืจ ืืืืฅ momentary | NO (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 | ืืืืื ืืืืจ 100ms | STA connecting |
| ืืืืืจ WiFi โ idle | ืืืืง ืงืืืข | ืฉืจืช web ืคืขืื |
| AP Config Mode | ืืืืื ืืืื | AP "PicoCamReset" ืคืขืื |
| Power-Cycle (reset) | strobe ืืืืจ 100ms | ืืฉืื ืื ืืชืง |
| Watchdog check | double-flash ืงืฆืจ | ืืืืง connectivity ืืืฆืืื |
| ืืื WiFi โ button mode | LED ืืืื | ืจืง ืืคืชืืจ ืคืืขื |
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 tests | CPython harness (_test_harness.py) |
| HTML render โ AP + STA pages | โ
12/12 checks | CPython harness |
| MQTT CONNECT/SUBSCRIBE packet bytes | โ
7/7 checks | struct pack + byte-level verify |
| CONNACK parse logic | โ
| ืืืกืื ืืืคืจื MQTT 3.1.1 |
| Form body parser + percent-decode | โ
7/7 checks | CPython 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 ืื ืืืืจ ืืืจื boot | WiFi ื ืืฉื โ ืืืืง 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