ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
🎭 멀티진진가 (진짜 진짜 가짜) · made by 문수네집 학생들이 진짜 사실 5가지를 적으면 그중 하나를 그럴듯한 가짜로 바꿔, 반 전체가 "어느 것이 가짜일까?"를 맞히는 실시간 교실 게임입니다. QR로 입장하고 api.moonsunezip.com의 PostgreSQL REST API와 방 단위 WebSocket으로 동기화합니다. 화면은 index.html, 데이터 연결은 postgres-adapter.v1.js입니다. 방·학생·문제·투표는 임시 데이터입니다. made by 문수네집 — 🏠 문수네집 · 📷 인스타그램 · ✨ moonsune.zip ✅ 배포 완료 — 바로 사용 가능 • 데이터 원본: 홈서버 PostgreSQL (api.moonsunezip.com) • 배포: GitHub main 푸시 후 홈서버 자동 배포. Firebase 데이터 저장은 사용하지 않습니다.檢視完整 README ↗
학생들이 진짜 사실 5가지를 적으면 그중 하나를 그럴듯한 가짜로 바꿔, 반 전체가 "어느 것이 가짜일까?"를 맞히는 실시간 교실 게임입니다.
QR로 입장하고 api.moonsunezip.com의 PostgreSQL REST API와 방 단위 WebSocket으로 동기화합니다. 화면은 index.html, 데이터 연결은 postgres-adapter.v1.js입니다. 방·학생·문제·투표는 임시 데이터입니다.
made by 문수네집 — 🏠 문수네집 · 📷 인스타그램 · ✨ moonsune.zip
✅ 배포 완료 — 바로 사용 가능
👉 https://jinjinga.moonsunezip.com
- 데이터 원본: 홈서버 PostgreSQL (
api.moonsunezip.com)- 배포: GitHub
main푸시 후 홈서버 자동 배포. Firebase 데이터 저장은 사용하지 않습니다.
api.moonsunezip.com/v1/jinjinga/rooms/...의 학생·문제·투표별 행을 사용하며 별도 API·DB·서버·소켓을 만들지 않습니다. 100ms 이상 간격으로 생성하고 한 번에 1표씩 전송합니다. 기존 requestId 및 제한된 재시도를 유지합니다.검증: node --test demo-bots.test.mjs postgres-adapter.test.mjs. 50명 생성, 25명 투표, 50명 정답률 변화, 중복 클릭, 새로고침·방 이동, 학생별 제출 플래그 저장을 확인합니다. 브라우저 검증은 운영 API와 분리한 로컬 API 모형을 사용했습니다.
문제 방 만들기 → 주제 입력 + 가짜 방식 선택(AI / 직접 작성) → 방 생성○/○ 완료)발표 시작하기 → 학생 한 명씩 문제 슬라이드 표시정답 공개 → 가짜 강조 + 진짜값 + 정답률 → 다음 → 반복학생이 진짜 5개 중 하나를 골라 직접 비슷한 가짜로 바꿉니다. 작성 화면에 예시·팁이 자동으로 표시돼요:
AI·외부 API를 전혀 쓰지 않습니다. API 키·요금·네트워크 호출이 필요 없어 100% 무료로 동작합니다.
rooms/JJG_<코드>
├─ topic, state(writing|presenting|done)
├─ players/<pid> : name, submitted
├─ problems/<pid> : items[5], fakeIndex, realValue, submittedAt
├─ present : order[], idx, revealed
└─ votes/<주인pid>/<투표자pid> : 선택한 보기 index
기존 qr-bingo 보안 규칙(rooms/$room 읽기·쓰기 허용)을 그대로 사용하므로 규칙 수정이 필요 없습니다.
index.html — 앱 전체 (HTML/CSS/JS + Firebase + QR, 빌드 불필요)firebase.json, .firebaserc — 배포 설정 (hosting target: jinjinga → 사이트 jinjinga-class)다른 세션·다른 AI 에서 이 앱을 고치기 전에 이 섹션을 먼저 읽으세요. 서버 관리자가 관리하는 섹션입니다(마지막 갱신 2026-09-27). 앱 설명은 위쪽 본문을 보세요.
| 항목 | 값 |
|---|---|
| 주소 | https://jinjinga.moonsunezip.com |
| 서버 포트 | 3001 (PM2 이름 jinjinga) |
| 배포 브랜치 | main |
| 배포 방식 | 빌드 없음 — 저장소 루트의 index.html 등을 그대로 정적 서버가 제공 |
| 서버 위치 | C:\homeserver\apps\multijinjinga |
postgres-adapter.v1.js → https://api.moonsunezip.com/v1/jinjinga/…, 실시간은 wss://api.moonsunezip.com/v1/realtime?room=방코드 입니다(쿼리 이름은 room, code 아님). 실시간은 서버→화면 단방향이고, 보내는 것은 HTTP 로 합니다.jjg_* 테이블)는 임시 데이터입니다. PostgreSQL UNLOGGED 테이블이라 빠르지만, 24시간이 지나면 자동 삭제되고 서버가 비정상 종료되면 비워집니다. 선생님이 오래 남길 기능(문제 저장 등)은 /v1/documents 같은 영구 저장소를 쓰세요.firebase.json, pb-adapter.js 는 예전 흔적입니다. 새 코드에서 쓰지 마세요.127.0.0.1 에만 열리고, 외부 접속은 Cloudflare Tunnel 이 전담합니다(집 IP·포트 비노출, HTTPS 자동).git reset --hard origin/<브랜치> 로 코드를 통째로 덮어쓰고 → npm ci → npm run build → PM2 재시작 순서로 배포합니다.따라서:
package-lock.json 을 반드시 커밋하세요(npm ci 는 lock 파일이 없으면 실패합니다)..md 문서만 바꾼 push는 재시작 없음).| 규칙 | 이유 |
|---|---|
서버는 HOST, PORT 환경변수를 읽고 기본값을 127.0.0.1 로 | 주소를 0.0.0.0 으로 코드에 고정하면 서버 설정으로 바꿀 수 없음 |
| IP 당 제한을 걸지 마세요 | 학교는 전교생이 공인 IP 하나로 나갑니다. 윷놀이의 "IP당 방 6개" 제한이 학교 전체를 막았습니다 |
| 방 상태 전송 시각·타이머는 방마다 따로 | 전역 변수 하나로 두면 한 반의 활동이 다른 반 갱신을 밀어냅니다(줄다리기에서 최장 4초 멈춤) |
큰 상태를 자주 보내면 WebSocket 압축(perMessageDeflate) | 줄다리기 20개 반 기준 161Mbps → 3Mbps |
| 끊긴 학생이 60초 안에 같은 자리로 재접속할 수 있게 | 교실 와이파이는 자주 끊깁니다. 빈 방도 60초는 유지하세요 |
| 요청 처리 중 동기 파일 I/O·느린 OS 호출 금지 | Windows 에서 os.networkInterfaces() 1회 25ms → 30명 방에서 서버가 멈췄습니다 |
| 요청마다 목록 전체를 훑는 코드 금지 | 사용자가 늘수록 느려집니다(backend 처리량이 4분의 1이던 원인) |
| 비밀값(키·비밀번호)은 저장소에 넣지 않기 | 서버의 비밀값은 C:\homeserver\secrets 에 따로 있습니다 |
부하 목표: 한 학교 20개 반 동시 사용(약 600명). 전국 배포라 한글날처럼 특정 날에 몰립니다.
| 용도 | 주소 |
|---|---|
| 데이터 API (PostgreSQL) | https://api.moonsunezip.com — /v1/documents/doc·/query·/commit, /health |
| 데이터 실시간 알림 (서버→화면 단방향) | wss://api.moonsunezip.com/v1/realtime?room=방코드 · /v1/documents/realtime?scope=범위 |
| 공용 게임 서버 (메모리, 양방향) | wss://game.moonsunezip.com/v1/game?room=방코드&game=게임이름&name=이름 |
새 주소(서브도메인)나 새 포트가 필요하면 서버 쪽에서 Cloudflare 설정과 PM2 등록을 해야 합니다. 코드만 올려서는 열리지 않습니다.
이 저장소를 고치기 전에 moonsugugu/coderule 을 먼저 읽으세요. 사람과 AI 모두 지킵니다.
핵심 여섯 가지
메시지 크기(바이트) × 초당 횟수 × 받는 사람 수 × 8 ÷ 1,000,000 으로 완료 전에 잰다.
2026-10-02 고조선이 30명 방 하나에 22Mbps를 써서, 20개 반이 몰리자 집 업로드(약 170Mbps)가 막혀 모든 앱이 끊겼다.perMessageDeflate)을 켜고, 위치처럼 계속 바뀌는 값은 초당 5HOST·PORT 환경변수(기본 127.0.0.1), 요청 경로에 동기 I/O 금지..md 문서만 바꾼 push는 재시작 없이 반영된다)api.moonsunezip.com)가 맡는다. backend 가 쓰기를 적응형 대기열로 나눠 처리하고, 바쁜 동안 실시간 연결을 끊지 않는다. 화면은 쓰기 503 을 받으면 1~5초 간격으로 늘려 가며 다시 시도하고, 같은 요청을 곧바로 반복하지 않는다.이 저장소 점검(2026-10-02): 이미 규칙을 지키고 있습니다(api.moonsunezip.com 방 단위 실시간, 바뀐 행만 전달, 재접속 백오프 최대 15초).