Waveshare ESP32-S3 AMOLED
Overview
Use this skill to bring up Waveshare ESP32-S3 Touch AMOLED Arduino projects through arduino-cli, with reproducible CLI setup, vendor library handling, compile/upload commands, and serial validation.
Default Workflow
Inspect the hardware and local state:
- Run
arduino-cli version,arduino-cli core list, andarduino-cli board list. - Prefer
/dev/cu.usbmodem*on macOS; the known local port has been/dev/cu.usbmodem83101. - Search installed boards with
arduino-cli board listall | rg -i 'waveshare|amoled|esp32.?s3|touch'.
- Run
Align versions before debugging code:
- Use
esp32:esp32@3.3.5for Waveshareexamples/arduino(upstream renamed this fromexamples/Arduino-v3.3.5). - If
esp32:esp32@3.3.10is installed, expect the bundled GFX v1.6.4 library to fail aroundspiFrequencyToClockDiv; install 3.3.5 instead. - Even with
esp32:esp32@3.3.5, a freshly re-cloned vendor repo can still fail onspiFrequencyToClockDiv(nullptrtouint32_t) if the vendor bumpedGFX_Library_for_Arduinopast what that core's single-argspiFrequencyToClockDiv(uint32_t)supports — this is an upstream vendor/core mismatch, not a local misconfiguration; re-check both versions if it recurs. - Add the Espressif package URL if missing:
https://espressif.github.io/arduino-esp32/package_esp32_index.json.
- Use
Use the correct build surface:
- Vendor repo:
waveshareteam/ESP32-S3-Touch-AMOLED-1.75C. - Arduino examples/libraries:
examples/arduino(wasexamples/Arduino-v3.3.5in older vendor checkouts). - The current Espressif core exposes Waveshare AMOLED 1.43/1.64/1.8/1.91/etc., but not a dedicated 1.75C FQBN. For 1.75C, use generic
esp32:esp32:esp32s3plus explicit options and the 1.75Cpin_config.h.
- Vendor repo:
Compile serially:
- Do not run concurrent
arduino-cli compilejobs into the same cache/build path. - Use
--jobs 1,--clean, and a dedicated--build-pathfor reliable validation.
- Do not run concurrent
Upload and validate:
- Upload to the detected
/dev/cu.usbmodem*port. - On macOS, prefer raw serial capture with
stty -f "$PORT" 115200 cs8 -cstopb -parenb -ixon -ixoff -echofollowed bycat "$PORT". - Use
arduino-cli monitor --config baudrate=115200,dtr=on,rts=offonly as a fallback; it may open successfully but capture no bytes on this USB Serial/JTAG path. - Treat repeated sketch serial lines plus visible AMOLED output as the baseline pass condition.
- Upload to the detected
For visual display validation:
- Upload
sketches/display_ocr_checkwhen the project has it. - If OCR framing or orientation is uncertain, run
make camera-alignerfirst. Copy the generatedCAMERA_CROP='...' OCR_ROTATE=...environment values. - If the board appears upside down in the camera, prefer
DISPLAY_ROTATION=2 make visual-smokeso the sketch renders upright text for OCR. - Run
CAMERA_CROP='...' OCR_ROTATE=... DISPLAY_ROTATION=... make visual-smoketo capture one camera frame withffmpegand OCR it with macOS Vision. - For bright AMOLED overexposure or color mismatch, start with the calibration sketch:
DISPLAY_ROTATION=2 DISPLAY_BRIGHTNESS=96 OCR_PREPROCESS_MODE=color CAMERA_EXPOSURE_POINT=0.5,0.65 CAMERA_FOCUS_POINT=0.5,0.65 COLOR_SWATCH_CHECK=1 make visual-smoke. It renders largeOKtext plus red/green/blue/yellow swatches, then reports the largest connected color blocks, average RGB, centroids, and row/order geometry. - Use
make camera-color-check IMAGE=/path/to/raw.jpgto check red/green/blue/yellow swatches on an existing camera image without OCR. Tune withCOLOR_SWATCH_MIN_X_GAP,COLOR_SWATCH_MAX_Y_SPREAD, orCOLOR_SWATCH_GEOMETRY=0only when the camera angle demands it. - Use
CAMERA_RAW_IMAGE=/path/to/raw.jpg ./scripts/camera-ocr.shto retune crop, rotation, orOCR_PREPROCESS_MODEwithout recapturing. - Camera capture is bounded by
CAMERA_CAPTURE_TIMEOUT; if it times out before saving a frame, debug macOS camera availability or another app owning the camera before changing board firmware. - Run
make camera-readybefore expensive visual smokes when camera availability is uncertain; it uses Swift capture only and fails unless a frame is saved. Runmake camera-diagnosewhen capture fails; it records camera inventory, Swift AVFoundation status, related processes, and bounded video-only capture probes under.logs/. UseCAMERA_DIAGNOSE_FFMPEG=0when you want to avoid ffmpeg device enumeration. If Swift diagnostics reportrunning=true frames=0 drops=0, the capture session started but macOS/USB delivered no video buffers, so fix the host camera pipeline before rerunning board smokes. - Run
make camera-resetto restart macOS camera services and rerun the strict camera-ready check. It does not quit chat apps unlessCAMERA_RESET_QUIT_CHAT_APPS=1is set. - Pass only if OCR sees
OK; use the saved raw/processed images to debug focus, glare, rotation, or garbled output.
- Upload
For official demo bring-up:
- Run
make official-demosto list the Waveshare Arduino demo manifest. - Run
make official-build-allbefore debugging higher-level AI features; all official Arduino examples should compile first. - Run
make official-audio-preflightwhen audio should stay quiet; it compiles only the official ES7210/ES8311 demos and checks source/serial markers without uploading or using audio devices. - Run
make official-audio-physical-planto inspect the gated ES7210/ES8311 physical-audio plan without uploading or using audio devices. - Run
ALLOW_AUDIO=1 make official-audio-physical-smokeonly during an allowed audio window; ES7210 uses a host stimulus while serial capture is open, and ES8311 requires supervisedOFFICIAL_AUDIO_OUTPUT_CONFIRM=heard. - Run
make official-coveragefor a read-only audit of build artifacts, source presence, quiet audio marker readiness, and existing physical smoke logs across every official demo. - Run
SMOKE_SECONDS=8 make official-smoke DEMO=01-helloworldto upload the official display baseline and verify runtime serial output. - Run
OFFICIAL_VISUAL_SMOKE=1 OFFICIAL_OCR_EXPECTED="Hello World" SMOKE_SECONDS=8 make official-smoke DEMO=01-helloworldwhen camera OCR should run after the serial gate; treat saved frames with failed OCR as partial visual evidence. - Run
OFFICIAL_VISUAL_STABLE_MARKER=1 OFFICIAL_VISUAL_SMOKE=1 SMOKE_SECONDS=8 make official-smoke DEMO=01-helloworldfor a staged-only stableOKOCR marker on the official HelloWorld baseline; it leaves vendor source directories untouched and defaultsOCR_ROTATE=180for the current camera mount. - Official smoke uses
scripts/serial-capture.pyto open capture before RTS reset; keep this path for one-shot setup logs. 03-power-axp2101uses a staged-onlyOFFICIAL_POWER_WIFI_TIMEOUT_MSpatch in automation so invalid vendor Station credentials do not block AP, PMU, and LVGL initialization; treat the resultingSetup doneas PMU/LVGL evidence, not Station Wi-Fi proof.- The project runner stages vendor examples under
.arduino-build/official-sketches/<id>because several official.inofilenames do not match their parent folder names, whicharduino-clirequires.
- Run
For feature coverage auditing:
- Run
make feature-matrix-checkto verify all tracked feature directions have matching Makefile targets, scripts/sketches, docs, and Skill helper wiring. - Run
make feature-matrix-docafter changingconfig/feature-matrix.tsvto regeneratedocs/hardware-verification-matrix.md. - Run
make hardware-evidence-auditto identify lanes with missingVerified Locallysections or missing smoke-suite evidence. - Run
make hardware-evidence-docto regeneratedocs/hardware-evidence-audit.md. - Run
make visual-evidence-auditto identify lanes that lack recorded camera/OCR artifacts in their local evidence sections; it also reports the latestcamera-readypreflight andcamera-diagnoserecommendation when visual suite runs are blocked by the host camera. - Run
make visual-evidence-docto regeneratedocs/visual-evidence-audit.md. - Run
make goal-completion-auditfor the stricter requirement-level completion gate; usepython3 scripts/goal-completion-audit.py --strictonly when a non-zero result should fail CI or handoff. - Run
make goal-completion-docto regeneratedocs/goal-completion-audit.md. - Run
make evidence-indexfor a consolidated handoff map across strict completion, feature docs, hardware suite, visual OCR, and remaining-gate status. Runmake evidence-index-docto regeneratedocs/evidence-index.md. - Run
make remaining-gates-preflightto refresh the safe side of incomplete lanes without flashing XiaoZhi or using audio hardware, thenmake remaining-gates-docto regeneratedocs/remaining-gates-preflight.mdfrom the latest summary. It must still leave strict completion at 9/13 until approved physical/external/manual evidence exists. Web AI Button physical tap is recorded as skipped/manual-required by default unlessREMAINING_GATES_ARGS=--include-manualis passed. - Run
make remaining-gates-runbookto regeneratedocs/remaining-gates-supervised-runbook.mdbefore handing off the four remaining gates. It keeps the required approval, supervised command, expected evidence, and completion boundary visible for audio, XiaoZhi flash, and physical tap work. - Run
make hardware-smoke-listto inspect the default serialized non-audio smoke selection. - Run
make hardware-smoke-suite HARDWARE_SMOKE_ARGS="--target <id>"for a narrow serialized hardware lane; the default suite skips audio, conditional, and external lanes. If--with-visualis used, the suite runsmake camera-readybefore any target upload and aborts when the host camera cannot save a frame. - Run
make hardware-smoke-suite HARDWARE_SMOKE_ARGS="--target xiaozhi-ai --allow-external"for the non-destructive XiaoZhi firmware archive check; it does not flash firmware or use audio hardware. - Treat matrix status values as coverage metadata, not proof that a partial or external feature is complete.
- Run
For XiaoZhi AI bring-up:
- Run
make xiaozhi-latestto locate the latest officialwaveshare-esp32-s3-touch-amoled-1.75crelease asset. - Run
make xiaozhi-inspectbefore flashing; it should confirm the zip containsmerged-binary.bin. - Run
make xiaozhi-preflightfor the non-destructive readiness gate; it hashesmerged-binary.bin, reports esptool/serial/source/ESP-IDF readiness, and confirmsdestructive=0 audio=0. - Run
make xiaozhi-readinessfor the default no-audio readiness bundle. It runs preflight, source check, ESP-IDF env/build, and verifies the latest rollback image. SetXIAOZHI_READINESS_BACKUP=1immediately before an approved flash when the current board flash must be freshly captured. - If
make xiaozhi-preflightreportsrelease_source=cache, it used a local firmware zip because live release metadata failed; setXIAOZHI_RELEASE_CACHE_FALLBACK=0when live upstream freshness is required. - Run
make xiaozhi-backupbefore any XiaoZhi flash; it reads the current board flash to.vendor/xiaozhi/backups/and printsxiaozhi_backup_summary ... destructive=0 audio=0. The backup path defaults to--no-stubatXIAOZHI_BACKUP_BAUD=115200because long stub reads can stop on this USB Serial/JTAG path. - Run
BACKUP=<path> CONFIRM=--yes make xiaozhi-restoreonly when you intentionally want to write a saved flash image back to the board. - Run
make xiaozhi-flashonly when the user is ready to replace the current Arduino demo with XiaoZhi firmware. - After an approved XiaoZhi flash, run
make xiaozhi-runtime-checkbefore any audio interaction. It captures serial logs after an RTS reset, looks for XiaoZhi onboarding or activation markers, and reportsxiaozhi_runtime_summary ... destructive=0 audio=0. - Run
make xiaozhi-visual-checkfor a camera-only OCR gate, ormake xiaozhi-runtime-visual-checkfor serial plus AMOLED OCR after an approved flash. These gates do not use microphone or speaker hardware. - For source builds, run
make xiaozhi-source-clonethenmake xiaozhi-source-check; the local defaults selectCONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_AMOLED_1_75C=y. - Run
make xiaozhi-idf-envto prove the local ESP-IDF shell can be activated without flashing firmware or using audio hardware. - Run
make xiaozhi-idf-buildto compile XiaoZhi from source without flashing; the script printsxiaozhi_idf_build_summary ... destructive=0 audio=0on success. - The current source requires ESP-IDF
>=5.5.2; the local default is.vendor/esp-idf-v5.5.4with~/.espressif/python_env/idf5.5_py3.14_env.
- Run
For the self-developed cloud AI terminal:
- Run
make cloud-ai-buildto compile the board-side display/serial terminal. - Run
make cloud-ai-smoketo upload it and verify the host serial relay reachesAI_DISPLAYED. - Run
make cloud-ai-pipeline-smoketo upload it and verify the silent ASR -> LLM -> TTS serial pipeline reachesPIPELINE_DONE. - Run
make cloud-ai-cache-smoketo upload it and verify board-local NVS cache, session id, cloud request id, recoverable cloud error metrics, andSTATE?runtime status commands. - Run
CLOUD_AI_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 make cloud-ai-smokewhen the camera is positioned for OCR; serial verifiesAI OK, while OCR should at least see stableOK. - Treat this as the verified non-audio cloud terminal control-plane slice; pipeline smoke does not use microphone or speaker hardware. ES7210 microphone input and ES8311 speaker output still need dedicated audio stream validation in an allowed audio window.
- For the local web AI button:
- Run
make local-ai-serverto start the Mac-side HTTP AI trigger server. - Run
make web-ai-button-buildto compile the Wi-Fi + touch-button sketch. - Run
make web-ai-button-smoketo start the local server, upload the sketch, pass ignored.envWi-Fi credentials over serial, configure the board endpoint to the Mac LAN IP, and verifyWEB_AI_RESPONSE status=ok. - Run
make web-ai-button-tap-smokefor the supervised physical tap gate; it follows the same setup path but waits forWEB_AI_TOUCH_EVENT,WEB_AI_TRIGGER source=touch, andWEB_AI_RESPONSE status=okinstead of sending serialTRIGGER. - Use
WEB_AI_BUTTON_VISUAL_SMOKE=1 make web-ai-button-smokewhen camera OCR should also verify the board reaches the AI response screen. - Do not hard-code or commit SSIDs, passwords, local IPs, or AI command credentials. The default local server mode is mock; use
WEB_AI_SERVER_MODE=commandandAI_TRIGGER_COMMAND=...only for supervised local AI experiments. - This path is safe for late-night validation because it does not play audio or use the host microphone.
- For microphone/audio-front-end validation:
- Run
make audio-vad-buildto compile the ES7210 microphone probe. - Run
make audio-afe-readinesswhen audio should stay quiet and you only need machine-readable AFE readiness; it rebuilds and reports implemented source/build/checker readiness versus source-integration and physical-audio requirements. - Run
make audio-vad-preflightwhen audio should stay quiet; it rebuilds and checks artifacts, serial port, ES7210 source markers, checker options, andconfig/audio-afe-profile.tsvwithout uploading, playing stimulus, or opening audio devices. - Treat the AFE profile as coverage metadata: ES7210 capture and ESP-SR VAD are implemented, while AEC, noise suppression, and real WakeNet audio frames still require source integration and physical audio evidence.
- Run
make audio-vad-smoketo upload it, play a host-sidesaystimulus, and validate RMS/peak serial metrics. - Use
AUDIO_VAD_REQUIRE_SPEECH=1 make audio-vad-smokeonly when the host speaker is close enough for reliable VAD. - Use
AUDIO_VAD_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 make audio-vad-smokewhen camera OCR should verify the screen reachesOK.
- For speaker/audio-output validation:
- Run
make speaker-output-buildto compile the ES8311 speaker tone probe. - Run
make speaker-output-smoketo upload it, trigger a 1 kHz / 1.5 kHz tone over serial, and validate the output through host microphone capture. - Use
SPEAKER_AUDIO_DEVICE=<avfoundation audio index>when the default camera microphone is not close to the board speaker. - Use
SPEAKER_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 make speaker-output-smokewhen camera OCR should verify the screen reachesOK. - Do not run audible speaker or microphone smoke tests late at night unless the user explicitly asks for them.
- For PMU/IMU sensor validation:
- Run
make sensor-status-buildto compile the AXP2101 + QMI8658 status probe. - Run
make sensor-status-smoketo upload it and validate silent serial metrics from the PMU and IMU. - Use
SENSOR_STATUS_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 make sensor-status-smokewhen camera OCR should verify the screen reachesOK. - This path is safe for late-night validation because it does not play audio or use the host microphone.
- For battery and low-power lifecycle validation:
- Run
make power-lifecycle-buildto compile the AXP2101 power lifecycle probe. - Run
make power-lifecycle-smoketo upload it and validate DIM, STANDBY, ACTIVE, brightness, capacity, load-profile, wake, and runtime-estimate serial behavior. - Use
POWER_REQUIRE_BATTERY=1 make power-lifecycle-smokeonly when a battery is physically connected; the default smoke should not fail USB-only benches. - Use
POWER_LIFECYCLE_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 make power-lifecycle-smokewhen camera OCR should verify the screen reachesOK; the script defaults to color preprocessing plus centered focus/exposure for this probe because generic gray OCR can miss the white marker. - This path is safe for late-night validation because it does not play audio or use the host microphone. Its standby mode keeps serial alive and should not be treated as proof of true ESP32 deep sleep or measured current draw.
- For Wi-Fi connectivity validation:
- Run
make wifi-connectivity-buildto compile the ESP32-S3 Wi-Fi scan/join probe. - Run
make wifi-connectivity-smoketo upload it and validate Wi-Fi radio initialization plus scan completion without storing credentials. - Use
WIFI_TEST_SSID=... WIFI_TEST_PASSWORD=... make wifi-connectivity-smokeonly for a supervised join check; never commit SSIDs or passwords. - Use
WIFI_CONNECTIVITY_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 make wifi-connectivity-smokewhen camera OCR should verify the screen reachesOK. - This path is safe for late-night validation because it does not play audio or use the host microphone. The default serial log avoids printing SSID names.
- For touch controller validation:
- Run
make touch-status-buildto compile the CST92xx touch controller probe. - Run
make touch-status-smoketo upload it and validate the touch controller is online through serial status and AMOLED OCR. - Use
TOUCH_REQUIRE_EVENT=1 make touch-status-smokeonly when a human can touch the screen during the smoke window. - Use
TOUCH_STATUS_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 make touch-status-smokewhen camera OCR should verify the screen reachesOK.
- For combined non-audio app validation:
- Run
make interaction-dashboard-buildto compile the combined display, touch-controller, PMU, and IMU dashboard. - Run
make interaction-dashboard-smoketo upload it and drive page changes, serial-simulated IMU gesture handling, brightness, standby, and wake transitions without requiring a human tap. - Use
INTERACTION_DASHBOARD_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 make interaction-dashboard-smokewhen camera OCR should verify the final dashboard page reachesOK. - This path is safe for late-night validation because it does not play audio or use the host microphone.
- For dedicated IMU interaction validation:
- Run
make imu-interaction-buildto compile the QMI8658 wrist wake, shake switch, posture menu, and step counter probe. - Run
make imu-interaction-smoketo upload it and validate deterministic serial-injected IMU samples forWRIST_WAKE,SHAKE_SWITCH,POSE_MENU,STEP, andMENU_NEXT. - Use
IMU_INTERACTION_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 make imu-interaction-smokewhen camera OCR should verify the screen reachesOK; serial verifies the IMU event details. - This path is safe for late-night validation because it does not play audio, use the host microphone, or require physically shaking the board.
- For LVGL visual-agent validation:
- Run
make lvgl-visual-agent-buildto compile the repo-owned LVGL tabview app. - Run
make lvgl-visual-agent-smoketo upload it and validate LVGL initialization, display flush, CST92xx touch input registration, chat bubbles, cards, settings, agent thoughts, and tab/page changes over serial. - Use
LVGL_VISUAL_AGENT_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 DISPLAY_BRIGHTNESS=96 make lvgl-visual-agent-smokewhen camera OCR should verify the screen reaches the largeOKmarker; serial verifies LVGL tabview, touch registration, chat, cards, settings, and agent thoughts. - Treat this as the agent-specific LVGL UI slice; the official
05-lvgl-widgetsdemo remains the vendor baseline. - This path is safe for late-night validation because it does not play audio or use the host microphone.
- For desktop AI widget validation:
- Run
make desk-widget-buildto compile the serial-driven desktop widget. - Run
make desk-widget-smoketo upload it and validate CI/GitHub/alert/calendar/timer/AI-summary pages without network credentials. - Run
make desk-widget-relay-smoketo validate the host event adapter that maps mock, JSON, or HTTP events into the widget serial protocol. - Use
DESK_WIDGET_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 make desk-widget-smokewhen camera OCR should verify the screen reachesOK. - This path is safe for late-night validation because it does not play audio or use the host microphone.
- For IoT control panel validation:
- Run
make iot-panel-buildto compile the serial-driven Home Assistant / MQTT / HTTP control panel. - Run
make iot-panel-smoketo upload it and validate device state changes, explicitIOT_HAHome Assistant service calls, MQTT-style inbound updates, HTTP-style outbound actions, and scenes without Wi-Fi credentials. - Run
make iot-panel-relay-smoketo validate the host event adapter that maps mock, JSON, or HTTP smart-home events into the panel serial protocol, including board-sideIOT_HAoutput and theha=state counter. - Use
IOT_PANEL_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 make iot-panel-smokewhen camera OCR should verify the screen reaches the stableIOTmarker; serial verifies device, Home Assistant, MQTT, HTTP, and scene details. - This path is safe for late-night validation because it does not play audio or use the host microphone.
- For offline voice-control state-machine validation:
- Run
make offline-voice-buildto compile the WakeNet/MultiNet-facing serial harness. - Run
make offline-voice-smoketo upload it and validate pre-wake command rejection, wake events, command recognition, runtime command add/modify/delete, continuous mode, sleep/wake state, and local actions without using the microphone. - Use
OFFLINE_VOICE_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 OCR_ROTATE=180 make offline-voice-smokewhen camera OCR should verify the screen reaches the stableVOICEmarker. - Treat this as the deterministic control-plane gate before wiring real ESP-SR audio frames and models.
- This path is safe for late-night validation because it does not play audio or use the host microphone.
- For TinyML / IMU classifier validation:
- Run
make tinyml-imu-model-checkto validate the checked-in nearest-centroid model metadata and validation set. - Run
make tinyml-imu-buildto compile the QMI8658 TinyML classifier. - Run
make tinyml-imu-smoketo upload it, verify the board-reported model hash, disable live IMU mode, inject deterministic serial feature vectors, and verifyREST,TILT_LEFT,TILT_RIGHT,FACE_UP, andSHAKElabels. - Use
TINYML_IMU_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 OCR_ROTATE=180 make tinyml-imu-smokewhen camera OCR should verify the screen reaches the stableTINYmarker. - Treat this as a small TinyML automation model. The current embedded nearest-centroid classifier can be replaced by ESP-DL or a larger trained model later without removing the deterministic serial sample gate.
- This path is safe for late-night validation because it does not play audio or use the host microphone.
- For ESP-Claw / OpenClaw agent harness validation:
- Run
make esp-claw-agent-buildto compile the Arduino compatibility harness for the ESP-Claw/OpenClaw direction. - Run
make esp-claw-agent-smoketo upload it and validate local rule add, Lua-style rule loading, event sensing, rule decision, MCP-style tool registration/invocation, IM chat input, tagged memory put/get, and LLM fallback routing over serial. - Use
ESP_CLAW_AGENT_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 DISPLAY_BRIGHTNESS=96 make esp-claw-agent-smokewhen camera OCR should verify the screen reachesOK; serial verifies rules, MCP calls, IM chat, memory, and fallback actions. - Treat this as a deterministic compatibility harness, not the official ESP-Claw firmware image. It exists so automation can prove the agent loop before IM credentials, Wi-Fi, and full ESP-Claw source builds are introduced.
- This path is safe for late-night validation because it does not play audio or use the host microphone.
- For NES Contra emulator validation:
- Run
make nes-contra-preflightto inspect the local Contra disassembly checkout, cc65 tools, and user-supplied ROM state without modifying tracked files. - Run
make nes-contra-buildto compile the diagnostic emulator lane scaffold. - Run
make nes-contra-smoketo upload the scaffold and validateNES_CONTRA_READY,CAPS?,ROM?, serial input injection, and frame progress. - Use
NES_CONTRA_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 make nes-contra-smokewhen camera OCR should verify the largeOKmarker before real game pixels are used as evidence. - Treat this lane as partial until a reviewed emulator core boots a Mapper 2 ROM; do not commit Contra ROM bytes or generated ROM headers.
- For Skill automation wiring:
- Run
scripts/waveshare-arduino-cli.sh verify <project-dir>from this skill to prove the agent-facing entrypoint can inspect the toolchain, see the USB board, list official demos, and clean-compilecloud_ai_terminal,web_ai_button,audio_vad_probe,speaker_output_probe,sensor_status_probe,power_lifecycle_probe,wifi_connectivity_probe,touch_status_probe,interaction_dashboard,imu_interaction_probe,lvgl_visual_agent,desk_widget,iot_control_panel,offline_voice_control,tinyml_imu_classifier,esp_claw_agent, andnes_contra_emulator. - Run
scripts/waveshare-arduino-cli.sh feature-matrix <project-dir> checkto validate coverage metadata before claiming all tracked directions are wired. - Run
scripts/waveshare-arduino-cli.sh visual-evidence <project-dir> auditto check camera/OCR evidence coverage through the Skill helper. - Run
scripts/waveshare-arduino-cli.sh evidence-index <project-dir>to print the consolidated evidence map, or passdoc/markdownto regenerate or render it. - Run
scripts/waveshare-arduino-cli.sh ok-qoder-evidence <project-dir>to build, upload, serial-smoke, and camera-OCR the defaultOK Qoderhello sketch into a committed evidence pack underdocs/evidence/. - Run
make claude-skill-smokefrom this repo to ask the local Claude CLI to read the repo Skill and invoke this helper for the non-audio visual smoke path. The wrapper records Claude's transcript plus the command log under.logs/, andCLAUDE_SKILL_SMOKE_MODE=auditswitches to a no-upload feature-matrix check. verify/doctoris intentionally compile-only; it does not upload firmware or run camera OCR.- Run explicit hardware smokes when the user wants board validation:
CLOUD_AI_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 scripts/waveshare-arduino-cli.sh cloud-ai <project-dir> smokeCLOUD_AI_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 scripts/waveshare-arduino-cli.sh cloud-ai <project-dir> pipelinescripts/waveshare-arduino-cli.sh cloud-ai <project-dir> cachescripts/waveshare-arduino-cli.sh xiaozhi <project-dir> readinessWEB_AI_BUTTON_VISUAL_SMOKE=1 scripts/waveshare-arduino-cli.sh web-ai-button <project-dir> smokescripts/waveshare-arduino-cli.sh web-ai-button <project-dir> tap-smokescripts/waveshare-arduino-cli.sh audio-vad <project-dir> readinessAUDIO_VAD_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 scripts/waveshare-arduino-cli.sh audio-vad <project-dir> smokeSPEAKER_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 scripts/waveshare-arduino-cli.sh speaker-output <project-dir> smokeSENSOR_STATUS_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 scripts/waveshare-arduino-cli.sh sensor-status <project-dir> smokePOWER_LIFECYCLE_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 scripts/waveshare-arduino-cli.sh power-lifecycle <project-dir> smokeWIFI_CONNECTIVITY_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 scripts/waveshare-arduino-cli.sh wifi-connectivity <project-dir> smokeTOUCH_STATUS_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 scripts/waveshare-arduino-cli.sh touch-status <project-dir> smokeINTERACTION_DASHBOARD_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 scripts/waveshare-arduino-cli.sh interaction-dashboard <project-dir> smokeIMU_INTERACTION_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 scripts/waveshare-arduino-cli.sh imu-interaction <project-dir> smokeLVGL_VISUAL_AGENT_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 scripts/waveshare-arduino-cli.sh lvgl-visual-agent <project-dir> smokeDESK_WIDGET_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 scripts/waveshare-arduino-cli.sh desk-widget <project-dir> smokescripts/waveshare-arduino-cli.sh desk-widget <project-dir> relayIOT_PANEL_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 scripts/waveshare-arduino-cli.sh iot-panel <project-dir> smokescripts/waveshare-arduino-cli.sh iot-panel <project-dir> relayOFFLINE_VOICE_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 scripts/waveshare-arduino-cli.sh offline-voice <project-dir> smokeTINYML_IMU_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 scripts/waveshare-arduino-cli.sh tinyml-imu <project-dir> smokeNES_CONTRA_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 scripts/waveshare-arduino-cli.sh nes-contra <project-dir> smokeandESP_CLAW_AGENT_VISUAL_SMOKE=1 DISPLAY_ROTATION=2 DISPLAY_BRIGHTNESS=96 scripts/waveshare-arduino-cli.sh esp-claw-agent <project-dir> smoke.
Known 1.75C FQBN
Use this FQBN unless a future Espressif core adds a real 1.75C board profile:
esp32:esp32:esp32s3:USBMode=hwcdc,UploadMode=default,CDCOnBoot=cdc,CPUFreq=240,FlashMode=qio,FlashSize=16M,PartitionScheme=app3M_fat9M_16MB,PSRAM=opi,UploadSpeed=921600
If upload fails, retry with UploadSpeed=460800 before changing board families.
Helper Script
Use scripts/waveshare-arduino-cli.sh from this skill for a portable setup/build/upload/monitor wrapper when the target project does not already provide scripts.
Example:
/Users/phodal/.codex/skills/waveshare-esp32s3-amoled/scripts/waveshare-arduino-cli.sh setup /path/to/project
/Users/phodal/.codex/skills/waveshare-esp32s3-amoled/scripts/waveshare-arduino-cli.sh build /path/to/project
/Users/phodal/.codex/skills/waveshare-esp32s3-amoled/scripts/waveshare-arduino-cli.sh upload /path/to/project
If the project contains scripts/setup.sh, scripts/build.sh, scripts/upload.sh, or scripts/monitor.sh, prefer those project scripts because they encode project-local sketch paths.
For visual validation in this repo, prefer:
SMOKE_SECONDS=8 ./scripts/smoke.sh
make camera-aligner
make camera-diagnose
make camera-ready
make camera-reset
make ok-qoder-evidence
make feature-matrix-check
make feature-matrix-doc
make hardware-evidence-audit
make hardware-evidence-doc
make visual-evidence-audit
make visual-evidence-doc
make goal-completion-audit
make goal-completion-doc
make evidence-index
make evidence-index-doc
make remaining-gates-list
make remaining-gates-preflight
make remaining-gates-doc
make remaining-gates-runbook
make hardware-smoke-list
make hardware-smoke-suite
make visual-smoke
make official-demos
make official-build-all
make official-audio-preflight
make official-coverage
SMOKE_SECONDS=8 make official-smoke DEMO=01-helloworld
OFFICIAL_VISUAL_SMOKE=1 OFFICIAL_OCR_EXPECTED="Hello World" SMOKE_SECONDS=8 make official-smoke DEMO=01-helloworld
OFFICIAL_VISUAL_STABLE_MARKER=1 OFFICIAL_VISUAL_SMOKE=1 SMOKE_SECONDS=8 make official-smoke DEMO=01-helloworld
make xiaozhi-latest
make xiaozhi-inspect
make xiaozhi-preflight
make xiaozhi-readiness
make xiaozhi-backup
make xiaozhi-runtime-check
make xiaozhi-visual-check
make xiaozhi-runtime-visual-check
make xiaozhi-source-check
make xiaozhi-idf-env
make xiaozhi-idf-build
make cloud-ai-build
make cloud-ai-smoke
make cloud-ai-pipeline-smoke
make cloud-ai-cache-smoke
make local-ai-server
make web-ai-button-build
make web-ai-button-smoke
make web-ai-button-tap-smoke
make audio-vad-build
make audio-afe-readiness
make audio-vad-preflight
make audio-vad-smoke
make speaker-output-build
make speaker-output-smoke
make sensor-status-build
make sensor-status-smoke
make power-lifecycle-build
make power-lifecycle-smoke
make wifi-connectivity-build
make wifi-connectivity-smoke
make touch-status-build
make touch-status-smoke
make interaction-dashboard-build
make interaction-dashboard-smoke
make imu-interaction-build
make imu-interaction-smoke
make lvgl-visual-agent-build
make lvgl-visual-agent-smoke
make desk-widget-build
make desk-widget-smoke
make desk-widget-relay-smoke
make iot-panel-build
make iot-panel-smoke
make iot-panel-relay-smoke
make offline-voice-build
make offline-voice-smoke
make tinyml-imu-model-check
make tinyml-imu-build
make tinyml-imu-smoke
make esp-claw-agent-build
make esp-claw-agent-smoke
make nes-contra-preflight
make nes-contra-build
make nes-contra-smoke
/Users/phodal/.codex/skills/waveshare-esp32s3-amoled/scripts/waveshare-arduino-cli.sh verify /path/to/project
References
Read references/board.md when you need board facts, source links, library names, or troubleshooting notes.