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.