ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗A map quiz for learning the streets and arrondissements of Lyon. Find a street on a blank map, name a highlighted street, tap the right district, or browse the city in Explore mode. An optional timer adds a speed bonus.
It's a single static page with no backend or tracking, and only one external request (Google Fonts). Progress is kept in each visitor's browser.
| Find mode | Points |
|---|---|
| Right street | 100 |
| Another street within 250 m | 50 |
| Wrong street, right arrondissement | 20 |
| Anywhere else | 0 |
Name and Districts modes score 100 for right and 0 for wrong.
With the timer on, an answer within 3 seconds keeps full points. After that, points slide gradually to 70% at the buzzer, so a right answer is always worth at least 70. Wrong answers get no speed bonus, and running out of time scores 0. A street counts as "known" when its last score is 70 or more.
You need Python 3.8 or later (standard library only):
python3 scripts/build.py # writes dist/index.html
python3 -m http.server -d dist # then open http://localhost:8000
You can also open dist/index.html directly in a browser.
The Dockerfile builds the page in a Python stage and serves it with nginx on port 80.
docker build -t lyon-streets .
docker run --rm -p 8080:80 lyon-streets # http://localhost:8080
Dokploy: create an Application from this GitHub repository (or upload a zip of it with the Drop option). Set the build type to Dockerfile, with Dockerfile path Dockerfile and context ., then add a domain on port 80.
Any static host (GitHub Pages, Netlify, an S3 bucket…): run scripts/build.py and upload dist/index.html. It's the only file needed.
src/template.html the page (HTML, CSS, JS) with a __DATA__ placeholder
data/lyon-data.json processed street and district data (~200 KB)
scripts/build.py template + data -> dist/index.html
scripts/process.py raw OpenStreetMap export -> data/lyon-data.json
deploy/nginx.conf nginx config used by the Dockerfile
Dockerfile two-stage build: Python builds the page, nginx serves it
The data comes from OpenStreetMap through the Overpass API. The current file was exported on 19 October 2026.
On overpass-turbo.eu, run this query:
[out:json][timeout:180];
area["name"="Lyon"]["admin_level"="8"]->.lyon;
(
way(area.lyon)["highway"~"^(trunk|primary|secondary|tertiary|residential|unclassified|living_street|pedestrian)$"]["name"];
relation(area.lyon)["boundary"="administrative"]["admin_level"="9"];
);
out geom;
If it fails with "error (0)", the server is busy: change the Overpass server in Settings, for example to https://overpass.kumi.systems/api/.
Export the raw data as JSON (the file with an elements list), not GeoJSON. Save it as export.json in the project folder; .gitignore keeps it out of the repository.
Process it and rebuild:
python3 scripts/process.py export.json
python3 scripts/build.py
The street count in the header and the date in the footer update automatically.
Check the map. The Rhône and Saône are drawn from the arrondissement borders that run down the rivers, plus a few border segments chosen by OpenStreetMap way ID (RIVER_EXTRA_WAYS in process.py). If OSM editors have split or renumbered those, the script prints a warning and that stretch of river goes missing; update the IDs to fix it.
localStorage, so they don't sync between devices and are lost if the browser's site data is cleared.The code (src/, scripts/, deploy/, Dockerfile) is released under the MIT Licence.
The street and district data in data/ is derived from OpenStreetMap and is available under the Open Database Licence (ODbL) 1.0. See data/LICENSE.md.
Map data © OpenStreetMap contributors. The page shows this credit in its footer; keep it if you reuse the data.