ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
Simulate and program LEGO EV3 robots for FIRST LEGO League practice
AI summary · website content
EducationJavaScript · PythonGitHub @nathanp-techOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗A web app to program a LEGO® MINDSTORMS® EV3 robot with blocks, in the style of EV3 Classroom, and see the result live in a simulator. It is built for student practice and assessment. Nothing needs to be installed and no internet connection is required.
start.command. A window opens and shows:
https://xxxx.trycloudflare.com/. It works from any network, through a free Cloudflare tunnel with no account. The first launch downloads the tunnel tool into tools/.prof2026, or the TEACHER_CODE environment variable), only needed to open the dashboard from another computer.
The teacher dashboard opens in your browser with the link and a QR code. 📺 Show to the class displays them in large size for the projector.js/roster.js, one line per class, editable) (or scan the QR code), then choose:
passScore in js/config.js), the challenge is passed and the next one unlocks (Next challenge →). In the dashboard, Unlock next lets a stuck student move on.Lea_9B_EV3-work.json). Students can reopen it with Continue from my saved file, e.g. if the server is off.data/db/ on the teacher's computer (online: in the Upstash database).teacher.html)A third mode on the welcome screen, 🏆 FIRST LEGO League, lets students practise the robot game of the current FLL Challenge season, BIOGLOW (FIRST CANOPY).
api/_roster.json is only the default).js/roster.js is only the default).The app can also run on Vercel, with a fixed address (no computer to keep on, no tunnel).
api/index.py, the same API as server.py but storing the data in an Upstash Redis database (Vercel has no permanent disk). data/, tools/, server.py and the tests are not deployed (.vercelignore), and data/ and tools/ never go to GitHub (.gitignore).TEACHER_CODE (optional): the teacher password. Without it, the password is prof2026. Always asked online.KV_REST_API_URL / KV_REST_API_TOKEN: added automatically when the Upstash Redis database is connected (Storage tab).fra1, vercel.json); choose Frankfurt (eu-central-1) for the database too.python3 tests/vercel_local.py runs the app like on Vercel on this computer (teacher code 123456, temporary database in memory).git push to GitHub redeploys the site automatically.server.py and start.command still work for a lesson without internet hosting..lmsp files.| # | Category | Challenge | Sensors / skills |
|---|---|---|---|
| 1 | 🚗 Motion | First steps | drive 70 cm |
| 2 | 🚗 Motion | The square | loops, turns |
| 3 | 🚗 Motion | Park in the garage | forward, turn, forward |
| 4 | 👆 Touch | Touch and come back | touch sensor, motor position |
| 5 | 📏 Distance | Stop before the wall | ultrasonic |
| 6 | 📏 Distance | Turn at the wall | ultrasonic twice, turn |
| 7 | 🎨 Color | Stop on the line | color sensor |
| 8 | 🎨 Color | Detect the color | stop on the blue zone among several colors |
| 9 | 🎨 Color | Line following | color sensor, loops, conditions |
| 10 | 🎨 Color | Count the lines | stop on the 4th line: counting, variables |
| 11 | 🧠 Combined | Follow the color code | color decides the turn (if / else) |
| 12 | 🧠 Combined | Line, then wall | color then ultrasonic |
| 13 | 🧠 Combined | Bump three times | touch + color + loops |
| 14 | 🧠 Combined | Maze | planning, My Blocks |
| 15 | 🏆 Expert | Read the card | the card's color gives the line to stop on: variables, counting |
| 16 | 🏆 Expert | Find the odd color | remember the first color, stop on the different square: variables, comparisons |
| 17 | 🏆 Expert | Find the open gate | ultrasonic in 3 directions, variables, comparisons |
| 18 | 🏆 Expert | Follow the line to the wall | line following that ends with the ultrasonic sensor |
| 19 | 🏆 Expert | Sensor maze | corridor turning left or right at random: decisions, My Blocks |
No challenge needs the gyro sensor (turns are made with motor degrees). A challenge unlocks the next one in this order.
Answer key: in the teacher preview (🎓 Student view), 🔑 Solution shows the reference solution of the challenge (read-only, with "Load it into my program"). The solutions are written in tests/solutions_src.js and published in api/_solutions.json, which the server only sends with the teacher password (students never get it, even with the class code). After changing a solution, regenerate the file: open tests/gen_solutions.html through server.py on this computer and save the text shown into api/_solutions.json; tests/selftest.html checks that both are the same.
Challenges live in js/world.js (CHALLENGES array):
setup(rng) returns the mat, obstacles and start pose.step(ctx) tracks progress during a trial.evaluate(ctx) returns the scored criteria.Open tests/selftest.html through the server (for tests, run it with EV3_DATA_DIR=/tmp/ev3test python3 server.py 8765 so that the class data in data/ is never touched) to check that everything still works:
tests/solutions_src.js) that must score 100 %, and every challenge has a category;Two more pages, same way:
tests/variants.html: about 130 student-style solutions (different blocks, speeds, sensors, robot setups). Correct ones must pass the official check and stay robust on random practice layouts; the ones whose name starts with ✗ (hard-coded layouts, skipped tasks, ramming…) must fail. ?ch=<id> tests one challenge.tests/engine.html: the block engine (broadcast loops, disabled blocks, My Blocks inputs and names, commas in numbers, sound, special variable names).Challenges 1–10 (Motion, Touch, Distance, Color) have one fixed layout: Run and Check give the same score, and the program must really use the sensor of the challenge (needs), otherwise it gets no points. The advanced challenges 11–19 (Combined, Expert; the Maze excepted) get a new layout at each Run, and their check runs several trials on their checkSeeds (chosen so that the layouts really differ).
index.html / teacher.html student / teacher pages
js/sim.js physics, motors, sensors, robot configuration
js/blocks.js blocks, toolbox, theme
js/generator.js blocks → JavaScript
js/runtime.js execution (threads, events, robot API)
js/brick.js LCD, sound, status light
js/world.js mats and challenges
js/evaluator.js challenge grading
js/render.js simulator drawing
js/fll.js / js/fll3d.js FLL BIOGLOW table, missions, score / 3D view
js/portview.js Port View / configuration tiles
js/progress.js student progress, save file, live sync
js/classroom.js student side of the classroom tools (help, comments, class commands, exams, history)
js/teacher-classroom.js dashboard side of the classroom tools, class lists, backups, database usage
js/roster.js default class lists
js/analysis.js difficulty analysis for the report
js/config.js classroom settings (pass score, save reminder)
js/app.js / js/teacher.js student app / teacher dashboard
api/_core.py the API (shared): storage on disk (data/db/) or in Upstash Redis
api/index.py Vercel wrapper of the API
tests/apitest.py tests every API endpoint (python3 tests/apitest.py URL password)
tests/vercel_local.py runs the app like on Vercel, locally
server.py class server (app + live progress API + public link). Data in data/; data/ and tools/ are never served
lib/ Blockly 11, continuous toolbox, QR code, three.js (local, offline)
LEGO® and MINDSTORMS® are trademarks of the LEGO Group. This project is independent and not affiliated with the LEGO Group.