ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
중학교 1학년 정보 수업용 한붓그리기(오일러 경로) 학습 게임. 학생은 몇 판 실패한 뒤 "왜 어떤 도형은 되고 어떤 도형은 안 되지?"에 도달하고, 교사는 그 순간 홀수점 개념을 꺼낸다. 게임이 곧 도입 활동이 되는 구조다. • 기술 스택: React 18 + Vite 6 + Tailwind CSS 4 / Firebase(Firestore + 익명 인증) / Vercel • 대상 기기: 스마트폰 세로 우선, 태블릿·노트북 병행 • 설계 문서: PRD, PLAN.md, REVIEW.md Firebase 설정 없이도 모든 스테이지가 플레이된다(기록은 이 기기에만 저장). 랭킹·대시보드를 쓰려면 아래 설정을 마친다. 프로젝트 ID는 euler-path-game이다. 2026-09-01 기준 남은 작업은 5번 하나다.檢視完整 README ↗
중학교 1학년 정보 수업용 한붓그리기(오일러 경로) 학습 게임. 학생은 몇 판 실패한 뒤 "왜 어떤 도형은 되고 어떤 도형은 안 되지?"에 도달하고, 교사는 그 순간 홀수점 개념을 꺼낸다. 게임이 곧 도입 활동이 되는 구조다.
npm install
npm run dev # http://localhost:5173
Firebase 설정 없이도 모든 스테이지가 플레이된다(기록은 이 기기에만 저장). 랭킹·대시보드를 쓰려면 아래 설정을 마친다.
| 명령 | 하는 일 |
|---|---|
npm run dev | 개발 서버 |
npm run build | 타입 검사 + 프로덕션 빌드 |
npm test | 유닛테스트 (그래프 이론 · 점수 · 스테이지 데이터 검증) |
npm run lint | ESLint |
npm run typecheck | 타입 검사만 |
프로젝트 ID는 euler-path-game이다. 2026-09-01 기준 남은 작업은 5번 하나다.
accounts:signUp이 정상적으로 idToken을 반환한다).env를 만들고 .env.example을 채운다.설정이 끝났는지 확인하려면
/teacher→ 연결 상태 점검을 누른다. 익명 인증·설정 읽기·기록 읽기를 차례로 확인하고, 실패하면 콘솔에서 눌러야 할 항목을 알려 준다.
cp .env.example .env
# VITE_FIREBASE_* 값과 VITE_TEACHER_PIN(6자리)을 채운다
가장 간단한 방법은 콘솔에 붙여넣는 것이다 — CLI 설치가 필요 없다.
Firebase 콘솔 → Firestore Database → 규칙 탭 → 전체를 firestore.rules 내용으로 교체 → 게시
CLI를 쓴다면:
npm install -g firebase-tools
firebase login
firebase deploy --only firestore:rules,firestore:indexes
규칙 파일 상단 주석에 알려진 한계와 더 단단히 잠그는 방법이 적혀 있으니 배포 전에 읽을 것.
미리 만들 필요 없다. 대시보드 탭을 처음 열면 콘솔이 "이 색인을 만드세요" 링크를 띄우므로
클릭하면 된다. 미리 만들고 싶다면 firestore.indexes.json에 필요한 4개가 들어 있다.
students, plays — 학생이 처음 플레이할 때 자동으로 생긴다.config/global — 규칙을 배포한 뒤 /teacher를 한 번 열면 앱이 기본값으로 만든다.만들어지는 기본값은 다음과 같고, activeStages가 빈 배열이면 "전부 활성"으로 해석한다.
{
"dashboardVisible": true,
"nameMasking": false,
"activeStages": [],
"oddViewUnlocked": false
}
.env와 같은 키를 넣는다.
VITE_TEACHER_PIN을 빼먹으면 /teacher가 안내 문구만 띄운다.vercel.json이 SPA 리라이트와 X-Robots-Tag: noindex를 잡아 준다.검색 노출은
robots.txt,<meta name="robots">,X-Robots-Tag세 겹으로 막아 두었다.
10307)와 이름 입력 → 시작.
같은 학번·이름으로 다시 들어오면 이전 기록을 그대로 이어서 한다.
첫 화면 맨 위의 이어서 하기 버튼과 "지금 여기" 표시가 다음에 할 미션을 가리킨다.← 레벨 선택(또는 휴대폰 뒤로 가기)으로 되돌아온다.| 단계 | 알려주는 것 | 감점 |
|---|---|---|
| 1단계 | 시작점이 들어 있는 넓은 범위를 반짝인다 (점의 약 65%) | -20 |
| 2단계 | 범위를 더 좁혀서 반짝인다 (약 40%) | -40 |
| 3단계 | 시작점 후보 2개만 콕 집어 반짝인다 | -80 |
다시하기 버튼과 홀수점 보기는 학생이 스스로 고민하도록 감춰 두었다. 홀수점 보기는 교사가 "홀수점 보기 열기"를 켰을 때만 나타난다. 실패 복구는 붓을 뗐을 때 캔버스에 뜨는 다시 그리기로 한다(3초 뒤 저절로도 된다).
미션은 레벨당 10개씩이다 — 1~6레벨, 레벨당 10개씩 모두 60개(L1-01 ~ L6-10) 이고 이게 전부다. 앞 스테이지를 깨야 다음이 열린다. 60개 전부 작성자가 원본 그림과 대조해 검수를 마쳤고(2026-09-06), 모두 홀수점이 0개 또는 2개라 한 붓에 그려진다.
/teacher| 기능 | 설명 |
|---|---|
| 프레젠테이션 뷰 | 대형 화면용. 상위 10명 + 학급 진행률만 크게 |
| 연결 상태 점검 | 기록이 저장되지 않을 때 원인(설정 누락 / 규칙 / 네트워크)을 짚어 준다 |
| 대시보드 공개 | 끄면 학생 화면에서 대시보드 메뉴가 사라진다 |
| 이름 마스킹 | 켜면 김민수 → 김O수 (기본 꺼짐 — 대시보드에 전체 이름이 보인다) |
| 홀수점 보기 열기 | 기본은 꺼짐(학생 화면에 버튼이 아예 없다). 켜면 홀수점 보기 버튼이 나타난다. 수업 흐름상 "정리 1"에서 켠다 |
| 스테이지 활성화 | 진도에 맞춰 2레벨을 잠가 둘 수 있다 |
| CSV 내보내기 | 학번·이름·학급·총점·스테이지별 기록 (Excel용 BOM 포함) |
| 개별 기록 삭제 | 오입력 학번 정리용 |
PIN은 코드에 없다. 환경변수 VITE_TEACHER_PIN으로만 주입된다.
| 단계 | 시간 | 활동 |
|---|---|---|
| 도입 | 5분 | 종이에 봉투 도형 그려보기, 접속 안내 |
| 전개 1 | 12분 | L1-01~L1-06. "왜 어떤 건 되고 어떤 건 안 되지?" |
| 정리 1 | 5분 | 홀수점 개념 설명 → 교사 모드에서 홀수점 보기 열기 켜기 |
| 전개 2 | 12분 | L1-07~L1-10. 시작점을 골라야 함을 체험 |
| 전개 3 | 8분 | L2-01~. 선이 많아져도 규칙은 같다 |
| (여유) | — | 먼저 끝낸 학생은 3레벨(L3-01~L3-10)로 |
| 정리 2 | 3분 | 프레젠테이션 뷰로 학급 통계 확인 |
스테이지는 DB가 아니라 src/data/stages.json에 있다. 고치고 배포하면 끝이다.
{
"id": "S08",
"order": 8,
"tier": 2, // 1 = 홀수점 0개, 2 = 홀수점 2개, 3 = 복합·판별
"name": "니콜라우스의 집",
"type": "DRAW", // DRAW | JUDGE
"parTimeSec": 50,
"nodes": [{ "id": "A", "x": 20, "y": 85 }], // viewBox "0 0 100 100" 기준
"edges": [{ "id": "e1", "from": "A", "to": "B", "curve": 0 }], // curve: 다중 간선 곡률
"hintText": "…",
"clearMessage": "…",
"unlockedBy": "S07"
}
고친 뒤 반드시 npm test를 돌린다. 다음을 자동으로 검사한다.
tier와 실제 오일러 판정의 일치solve(), AC-04)src/
data/stages.json 스테이지 데이터 (레벨당 10개)
data/stages.ts 로더 + 개발 모드 자가 검사
lib/
graph.ts 차수·홀수점·연결성·오일러 판정·Hierholzer·힌트
geometry.ts 간선 SVG 경로 (직선 / 2차 베지어)
generator.ts 도전 회로·경로 도형 생성 — 설계 시점 도구
scoring.ts 점수·별점 산식
format.ts 학번 검증, 이름 마스킹, 시간 표기, CSV
firebase.ts 동적 import 기반 초기화 + 익명 인증
repository.ts students/plays/config 읽고 쓰기 + 오프라인 큐
storage.ts 안전한 localStorage 래퍼
hooks/
useGameEngine.ts 진행 상태, undo 스택, 막힘 감지
usePointerDraw.ts 포인터 → 노드 히트 테스트
components/
GameCanvas.tsx SVG 렌더링
StageCard.tsx ConceptCard.tsx Countdown.tsx Toast.tsx
Dashboard/DashboardTabs.tsx
decor/ 배경 일러스트 (3레벨 판별 미션용, 현재 미사용)
pages/ Entry, StageSelect, Play, JudgeBoard, Result, Dashboard, Teacher
state/ SessionContext(Provider) + sessionStore(context·훅)
students 컬렉션 → 우측 점 세 개 → 컬렉션 삭제plays 컬렉션도 같은 방법으로 삭제기록은 참여 동기 부여용이며 수행평가 점수와 직접 연동하지 않는다. 클라이언트에서 점수를 계산하는 구조라 기록 조작이 원리적으로 가능하다는 점을 학생에게도 미리 알린다 (PRD 6.4).