Add ArtNetDMX Pico W firmware with dual DMX and docs.

Art-Net to two RS-485 outputs over Wi-Fi (AP or STA with SoftAP fallback), web UI, mDNS, and QLC+/ArtPoll notes for unicast on STA.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-11 00:00:23 +12:00
co-authored by Cursor
commit fea6dffa74
26 changed files with 3013 additions and 0 deletions
+2
View File
@@ -0,0 +1,2 @@
Note: runtime serves embedded copies from src/http_server.c.
Edit both places if you change the UI, or regenerate embeds from these files.
+26
View File
@@ -0,0 +1,26 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>ArtNetDMX</title>
<link rel="stylesheet" href="/style.css">
</head>
<body>
<header>
<h1>ArtNetDMX</h1>
<nav><a href="/" class="active">Channels</a><a href="/wifi">WiFi</a></nav>
<div id="status" class="status">…</div>
</header>
<main>
<div class="tabs">
<button type="button" id="tab0" class="active" data-u="0">Universe A</button>
<button type="button" id="tab1" data-u="1">Universe B</button>
<button type="button" id="clear">Clear</button>
<button type="button" id="full">All 255</button>
</div>
<div id="grid" class="grid"></div>
</main>
<script src="/app.js"></script>
</body>
</html>
+45
View File
@@ -0,0 +1,45 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>WiFi — ArtNetDMX</title>
<link rel="stylesheet" href="/style.css">
</head>
<body>
<header>
<h1>ArtNetDMX</h1>
<nav><a href="/">Channels</a><a href="/wifi" class="active">WiFi</a></nav>
<div id="status" class="status">…</div>
</header>
<main class="form-wrap">
<form id="wifiForm">
<label>Mode
<select name="mode" id="mode">
<option value="0">Access Point</option>
<option value="1">Station (AP fallback if join fails)</option>
</select>
</label>
<p class="hint">Station joins your LAN only. If join fails, SoftAP starts for recovery.</p>
<fieldset>
<legend>Station</legend>
<label>SSID<input name="sta_ssid" id="sta_ssid" maxlength="31"></label>
<label>Password<input name="sta_pass" id="sta_pass" type="password" maxlength="63"></label>
</fieldset>
<fieldset>
<legend>Access Point</legend>
<label>SSID<input name="ap_ssid" id="ap_ssid" maxlength="31"></label>
<label>Password<input name="ap_pass" id="ap_pass" type="password" maxlength="63"></label>
</fieldset>
<fieldset>
<legend>Art-Net universes</legend>
<label>Port A<input name="universe_a" id="universe_a" type="number" min="0" max="32767"></label>
<label>Port B<input name="universe_b" id="universe_b" type="number" min="0" max="32767"></label>
</fieldset>
<button type="submit">Save &amp; reboot</button>
<p class="hint">After save the device reboots into the selected mode. AP default: ArtNetDMX / artnetdmx @ 192.168.4.1</p>
</form>
</main>
<script src="/wifi.js"></script>
</body>
</html>