ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
A toddler-friendly learning playground for iPad (and phones). Pure
HTML/CSS/JS, no framework, no build step, no external assets. Add to
the home screen to play offline.
Open index.html in any modern browser. For service-worker / "add to
home screen" support, serve over HTTP (e.g. python3 -m http.server).
Tuned for a 3-year-old: no reading required, small counting numbers,
big tap targets. The home screen surfaces the six games he plays most,
each opening straight into play. Everything else lives one tap away
behind the More card.查看完整 README ↗A toddler-friendly learning playground for iPad (and phones). Pure HTML/CSS/JS, no framework, no build step, no external assets. Add to the home screen to play offline.
Open index.html in any modern browser. For service-worker / "add to
home screen" support, serve over HTTP (e.g. python3 -m http.server).
Tuned for a 3-year-old: no reading required, small counting numbers, big tap targets. The home screen surfaces the six games he plays most, each opening straight into play. Everything else lives one tap away behind the More card.
Six headline games:
The More drawer holds themed hub cards, each opening a small menu:
Sandboxes (open-ended, no scoring):
Collection:
Back means back: every hop into a hub or game is a history entry, so the browser or Android Back button and the iOS swipe-back gesture step back inside the playground (game → hub → menu, or close Settings) instead of leaving it. Home jumps straight to the menu and unwinds the entries it skips, so Back from the menu still leaves the app. Escape on a game or hub screen goes Home too (after putting down a held tool).
Keyboard + screen readers: every tile, tool, choice and score badge
is a named button — and so is every animal, pot, balloon, hole, cloud
and sun you can tap: onTap() turns any plain tap target into a
focusable role="button", so the sandbox and arcade games can be
played with Tab and Enter. The Farm, Train and Garden skies used to
hide their sun and clouds (aria-hidden then onTap), which skipped
that upgrade — they are real named buttons now, and the sun's name
follows day and night ("Moon", or "Stars" once the spoken line is
"Stars!"). Names carry state where it matters ("Pot 2: seed planted,
water it", "Hole 4: mole!", "cow, counted" in Count, "Red, used" in
Color Mix, "roof, red" in Coloring, "bee, matched" in Memory, "duck, found" in
Find It!). Opening a game moves focus
onto that screen (a labelled region); Home puts it back on the tile you
came from. Mode tabs expose their pressed state, and so do the toggles — the
Song buttons in Piano and Music Studio and Train's Go / Stop say
whether they are on; Memory cards say "Hidden card" until flipped. When a quiz round rebuilds its choices or a
popped balloon disappears, focus moves to the next control in the game
instead of falling back to the top of the page, so Tab + Enter play
keeps its place.
"Hidden card" until flipped. Connect-the-dots' SVG dots are buttons
too, named "Dot 3, next" / "Dot 2, connected", and so are Coloring's
regions ("roof", "left top wing"); Story Time turns the page from its
"keep going" button or Enter on the screen.
seed planted, water it", "Hole 4: mole!"). Match's example picture is
a button named like the prompt ("Find the dog"), so Tab and Enter
hear it again — a role="img" here used to skip the button upgrade.
Opening a game moves focus onto that screen (a labelled region); Home
puts it back on the tile you came from. Mode tabs expose their pressed
state; Memory cards say "Hidden card" until flipped.
came from. Mode tabs expose their pressed state; Doodle's brushes,
sizes and Stamp do too (and Stamp says "Draw!" when the 8-second
stamp window ends). Memory cards say "Hidden card" until flipped.
Captions / live region: see Settings above.
Reduced motion: with the OS "reduce motion" preference on, or the in-app Less motion setting, CSS animations collapse and the sparkle / confetti particle bursts are skipped entirely. Pop! balloons hold still where they appear instead of drifting, in three lanes and at most three at a time (they used to jump straight off the top and be unpoppable).
manifest.json + sw.js cache every asset so the
playground keeps working when the iPad's offline. The worker refreshes
assets in the background and fetches the page network-first, so a
deploy is picked up on the next open without editing sw.js
(tests/sw-update.js checks this in Chromium).lib/tutorial.js shows a one-time hint the first time
the kid opens each game (it listens for the lawson:screen event that
show() fires). Taps pass straight through the hint to the game and
dismiss it; leaving the screen dismisses it too.lib/audio.js) so the Settings volume slider is one knob for
the whole app.games/*.js and registers on
window.Lawson.games. Shared utilities — audio (lib/audio.js),
high-score storage (lib/storage.js), sticker collection
(lib/achievements.js), tutorials (lib/tutorial.js) — are in lib/.The API key stays on the server (ELEVENLABS_API_KEY on the Vercel
project). /api/tts also reads ELEVENLABS_VOICE_ID (default
EXAVITQu4vr4xnSDxMaL, Sarah) and ELEVENLABS_MODEL (default
eleven_flash_v2_5; eleven_turbo_v2_5 is the other allowed model).
Free ElevenLabs accounts can call premade default voices only. Sarah and
Lily (pFZP5JQG7iQjIQuC4Bku) work. A library voice id is ignored, because
those requests return 402 paid_plan_required. Leave
ELEVENLABS_VOICE_ID on Sarah so live lines match the prebuilt clips.
Set TTS_PROVIDER=fish with FISH_API_KEY and FISH_REFERENCE_ID to
swap in Fish Audio. The page does not change.
Fixed lines (prompts, cheers that do not name the child, story pages, character sounds) are generated once and served as static MP3s:
npm run tts:build
The script reads ELEVENLABS_API_KEY from the environment or .env,
skips clips that already exist, and stops cleanly on an auth or quota
error so it can be re-run. See .env.example.
Smoke + visual baseline checks for every game live in tests/.
npm ci && npx playwright install chromium # once
npm test # everything below, in order
node tests/sw-assets.js # sw.js ASSETS matches index.html and disk (no browser)
node tests/voice.js # speech engine + caption event (no browser)
node tests/tts.js # ElevenLabs route, premade voices, static clips
npm run tts:build # pre-generate storyteller MP3s (needs ELEVENLABS_API_KEY)
node tests/story.js # Story Time pacing (no browser)
node tests/garden-sky.js # Garden sky: sun and clouds are named buttons, clouds rest in view under reduced motion (no browser)
node tests/match.js # Match example is a named button that re-hears the prompt (no browser)
node tests/doodle.js # Doodle tool pressed state + stamp timeout (no browser)
node tests/memory.js # Memory last-card name before the win cheer (no browser)
node tests/dino.js # Baby Dino cheer pacing (no browser)
node tests/pop.js # Pop! ABC: letter heard before the next goal (no browser)
node tests/whack.js # Whack! ABC: hit heard before the next goal (no browser)
node tests/train.js # Train: station heard before the passenger (no browser)
node tests/scene.js # Sticker Scene: name then welcome (no browser)
node tests/piano.js # Piano Song: first note waits for the name (no browser)
node tests/music.js # Music Studio Song: first note waits for the name (no browser)
node tests/garden.js # Garden sun: "Sunshine!" before "Sunshine power!" (no browser)
node tests/listen.js # Listen leftover opening clue (no browser)
node tests/train-sky.js # Train sky: sun and clouds are named buttons (no browser)
node tests/farm-sky.js # Farm sky: sun and clouds are named buttons (no browser)
node tests/farm-pond.js # Farm pond: ducks are named buttons (no browser)
node tests/smoke.js # errors-free / renders / restart-safe
node tests/smoke.js --baseline # + diff every screen against tests/baseline/
node tests/smoke.js --update-baseline # accept new baselines after UI changes
node tests/a11y.js # axe-core (light, dark, phone, iPad) + keyboard / modal / captions / overlay checks
node tests/sw-update.js # service worker picks up a deploy without a cache bump; offline boot
npm run lint runs ESLint over the app and tests; CI (.github/workflows/test.yml)
runs lint and every suite on each PR.
See tests/README.md for details (needs Playwright + Chromium).
games/myname.js with an IIFE that registers
window.Lawson.games.myname = { screen, start, stop }.<section id="mynameGame" class="screen"> in index.html
and a tile in the relevant hub (or the home menu).index.html and add the path
to ASSETS in sw.js (node tests/sw-assets.js checks the list;
the cache name never changes).tests/smoke.js (GAMES array) and refresh
the baseline with node tests/smoke.js --update-baseline.aria-label for
emoji-only buttons) and run node tests/a11y.js — it picks the new
game up automatically from window.Lawson.games.Timing: Take it slow in Settings halves the pace of every timed game (WCAG 2.2.1), so nothing disappears before a slower hand gets there.
Contrast: all text meets WCAG AA (4.5:1) in light and dark mode —
checked on every screen by tests/a11y.js with axe-core.
Tap instead of drag (WCAG 2.2 §2.5.7): every drag has a single-tap path. In Garden and Farm, tap a tool to pick it up (it lifts and bobs), then tap the plant or animal — the tool hops over, does its job and snaps back; tap it again, press Escape or leave the screen to put it down. In Baby Dino a tap on the soap, shower or towel performs the whole motion, and the two tools that are not for the current phase (dimmed on screen) are marked disabled so a screen reader hears why a press does nothing; in Ice Cream a tap on a tub scoops that flavour straight onto the cone and a tap on a topping drops it on the stack; in Sticker Scene a tap on a tray sticker drops it in the middle of the picture. Enter on a focused tool, then on a target, does the same — including the tray stickers and toppings, which are drag sources: Enter on a placed sticker hears it again and Delete removes it (the keyboard stand-in for the long press).
Touch targets: every control meets WCAG 2.2's 24px target-size rule at phone and iPad sizes, and nothing (mascots, toasts, captions) ever floats on top of Home, the tabs, the badges or the tiles.
Pinch-zoom is deliberately disabled so a toddler's second finger can't zoom the playground away; the UI is already very large.