ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Ekosistem belajar untuk anak disleksia usia SD di Indonesia: skrining lewat permainan, rekomendasi yang mudah dipahami orang tua, dan dasbor untuk memantau perkembangan anak. EJA adalah alat bantu skrining, bukan alat diagnosis. Hasilnya adalah bahan diskusi dengan psikolog klinis atau dokter anak tumbuh kembang. Bobot dan ambang skor masih asumsi awal yang belum divalidasi lewat pilot, jadi EJA tidak mengklaim akurasi deteksi. Anak disleksia berbahasa Indonesia sering terlambat terdeteksi, sementara skrining profesional mahal dan sulit dijangkau. EJA menyatukan tiga hal dalam satu alur:查看完整 README ↗
Ekosistem belajar untuk anak disleksia usia SD di Indonesia: skrining lewat permainan, rekomendasi yang mudah dipahami orang tua, dan dasbor untuk memantau perkembangan anak.
[!IMPORTANT] EJA adalah alat bantu skrining, bukan alat diagnosis. Hasilnya adalah bahan diskusi dengan psikolog klinis atau dokter anak tumbuh kembang. Bobot dan ambang skor masih asumsi awal yang belum divalidasi lewat pilot, jadi EJA tidak mengklaim akurasi deteksi.
Anak disleksia berbahasa Indonesia sering terlambat terdeteksi, sementara skrining profesional mahal dan sulit dijangkau. EJA menyatukan tiga hal dalam satu alur:
Hasil skrining tampil di dasbor orang tua. Progres modul belajar tersimpan per anak di browser. Dasbor orang tua menampilkan catatan latihan nyata dari browser yang sama; sinkronisasi monitoring lintas perangkat belum tersedia. Tes versi 2 tidak menghitung tingkat risiko disleksia.
Proyek ini dibuat untuk JOINTS UGM 2026.
Dari beranda, pilih Coba Belajar untuk membuka pilihan membaca, menulis, atau matematika tanpa akun. Alamat langsung: /demo/belajar. Coba Skrining membuka empat kegiatan tes versi 2 di /screening/demo. Di dalam latihan demo, gunakan Pilih kegiatan lain untuk kembali. Catatan demo belajar tersimpan hanya di browser, terpisah dari profil anak.
| Bagian | Status |
|---|---|
| Halaman publik (beranda, cara kerja, FAQ, dll.) | ✅ Selesai |
| Tes versi 2 (4 kegiatan, bukti per butir) | ✅ Prototipe; belum tervalidasi klinis |
| Laporan versi 2 | ✅ Catatan per butir; laporan risiko dan radar lama hanya arsip |
| Dasbor orang tua | ✅ Selesai, diuji dalam mode demo |
| Auth orang tua, profil anak, kunci dasbor | ✅ Email + password, callback konfirmasi dan kunci parent; database/RLS diuji pada Supabase, email konfirmasi masih perlu uji manual |
| Email notifikasi (cron) | ⚠️ Ada, belum pernah mengirim; tanpa kunci hanya dry-run |
| Modul belajar | ✅ Prototipe membaca, menulis A–Z/a–z/0–9, dan 2 materi matematika; progres masih lokal per anak |
| Masuk anak dengan PIN | ✅ Avatar + PIN, cooldown 5 percobaan, sesi terikat profil dan reset PIN oleh orang tua |
Buka /screening/demo. Empat kegiatan, satu tugas per layar:
| Kegiatan | Catatan |
|---|---|
| Bunyi kata | 6 soal gambar dengan bunyi awal yang sama; waktu mulai setelah audio selesai |
| Membaca | Teks dan 2 soal pemahaman dalam 60 detik (boleh tambah 30 detik, maksimal 3 kali), dilanjutkan 4 kata dan 2 kata rekaan tanpa batas waktu; ucapan kata dicatat pendamping |
| Sebut angka | 12 angka berurutan, pemeriksaan pengenalan angka dahulu, waktu dan posisi kesalahan dicatat terpisah |
| Dikte | 4 kata dengan jawaban ketik, tanpa pilihan kata, koreksi otomatis dan pemeriksaan ejaan browser dimatikan |
max(0.04, 4 × persentil-95 perubahan referensi) dalam satuan lebar mata dan bertahan ≥200 ms / ≥3 frame. Lonjakan singkat, celah frame >250 ms, perubahan kepala besar, serta gerakan kedua mata yang berlawanan disisihkan. Jendela 5 detik memakai jam tes yang sama dengan jawaban. Angka ini bukan hitungan saccade, regresi bacaan, atau batas gerakan normal/berlebihan; parameter belum divalidasi pada pembaca manusia.screening_assessments setelah migration 20261015090000_screening_assessments_v2.sql diterapkan. Penyimpanan gagal ditampilkan secara eksplisit; catatan lokal dipertahankan.lib/recommendations/content.ts. Jalankan npm run export:review untuk membuat docs/rekomendasi-untuk-ditinjau.md yang siap dikirim ke psikolog.pe ca han diterima untuk pecahan.features/learning/model/progress-model.ts mempelajari hasil tersimpan secara terpisah untuk membaca, menulis, pecahan, dan perkalian. Ini model probabilistik sederhana dengan pembaruan Bayesian; tidak memakai LLM, layanan AI berbayar, atau model diagnosis disleksia.Beta(1,1) diperbarui menjadi Beta(1+sukses, 1+belum berhasil), menggunakan paling banyak 20 sesi terbaru per kegiatan. Perkiraan sesi serupa adalah alpha/(alpha+beta). Interval kredibel 90% dihitung dari distribusi Beta; angka ditampilkan setelah minimal 3 sesi. Arah perubahan membandingkan jumlah target tercapai pada 3 sesi terbaru dengan 3 sesi sebelumnya./child/[childId]/belajar/perkembangan./child/demo/belajar/perkembangan lalu Lihat simulasi model. Data contoh ditandai jelas, hanya berlaku pada profil demo publik, dan tidak ditulis ke penyimpanan atau dicampur dengan hasil anak.Demo visual terpisah di /demo/wajah-mata menampilkan kamera besar, kontur wajah, kelopak mata, iris, seluruh titik opsional, dan pembesaran kedua mata. Halaman ini dapat dibuka tanpa akun dan tidak menjalankan kalibrasi atau tugas membaca. Video dan overlay memakai dimensi serta pencerminan yang sama. Tautannya tersedia pada demo belajar dan halaman eksperimen membaca.
Buka /child/demo/belajar/latihan/pola-membaca dari halaman demo atau latihan membaca. Kamera tidak diminta atau dimuat sebelum pengguna memberi persetujuan dan menekan Aktifkan kamera. Membaca biasa tetap dapat digunakan tanpa kamera.
Alur terarah memakai dua bacaan berbeda: bacaan biasa lalu bacaan dengan panduan satu bagian. Setiap bacaan memiliki dua soal pemahaman dan pemeriksaan lisan per bagian oleh pendamping (opsional). Nilai jawaban dihitung dari jawaban sesuai dibagi pertanyaan dinilai; pertanyaan dilewati tetap belum dinilai. Latihan tanpa kamera tetap menjalankan seluruh tugas.
MediaPipe Face Landmarker 0.10.32 mengekstrak titik mata/wajah secara lokal. Regresi ridge memetakan fitur mata/kepala ke layar dari 9 titik kalibrasi. Setelah itu, 6 titik terpisah memeriksa tiga persegi panjang bacaan yang benar-benar tampil, dua titik per bagian. Sampel pengecekan tidak melatih model. Sampel awal 400 ms dilewati dan setiap titik memerlukan minimal 6 frame. Kalibrasi gagal tetap mengizinkan latihan dan penilaian jawaban.
Semua aset model dan WASM disajikan dari public/models/face-landmarker dengan sumber, versi, SHA-256, dan lisensi Apache-2.0. Aset sekitar 25 MB di repositori; browser memuat model dan satu varian WASM saat kamera diaktifkan. Untuk menyiapkannya ulang, jalankan npm run gaze:assets. Tidak ada video yang diunggah, direkam, atau disimpan. Kalibrasi, fitur, dan sampel pandangan hanya di memori sesi.
Pengecekan bagian mensyaratkan ≥90% prediksi setiap titik berada di bagian yang benar; galat vertikal persentil-90 harus lebih kecil dari sepertiga tinggi bagian dan galat horizontal lebih kecil dari seperempat lebarnya. Posisi yang berada dekat batas dalam rentang galat tersebut tidak diberi label bagian. Hasil juga mensyaratkan ≥5 detik, mata terlacak ≥65% waktu, dan waktu terpetakan ≥40%. Jeda frame dibatasi 250 ms. Semua ambang ini adalah pilihan rekayasa prototipe, belum divalidasi pada anak.
Perkiraan kunjungan bagian memerlukan ≥400 ms dan minimal 3 frame yang konsisten. Perpindahan ke bagian sebelumnya dihitung hanya di antara kunjungan stabil dengan jeda ≤500 ms. Ini perpindahan antarbagian besar, bukan saccade, fiksasi per kata, kesalahan bacaan, atau ukuran perhatian. Membaca ulang dapat menjadi strategi biasa dan tidak dijadikan penalti atau indikator diagnosis.
| Hal | Cara |
|---|---|
| Data per akun | Row Level Security di semua tabel: orang tua hanya melihat data anaknya |
| Hash PIN anak | bcrypt, dan kolomnya tidak dapat dibaca klien (grant kolom) |
| Dasbor vs sesi anak | Cookie buka-kunci bertanda tangan HMAC. Bila dihapus, dasbor justru terkunci |
| Tujuan redirect | Hanya jalur di dalam situs (safeNext), mencegah open redirect |
| Kunci service | Hanya dipakai di cron server, tidak pernah di NEXT_PUBLIC_* |
| Audio | Tidak direkam atau disimpan |
| Email notifikasi | Tanpa level risiko atau skor; ada opsi mematikan |
| Bagian | Teknologi |
|---|---|
| Framework | Next.js 14 (App Router), React 18, TypeScript |
| Gaya & animasi | Tailwind CSS, Framer Motion, ikon lucide-react; gaya modul belajar diisolasi di features/learning/styles |
| Latar | Shader WebGL buatan sendiri |
| Backend & data | Supabase (PostgreSQL, Auth, RLS) lewat @supabase/ssr |
| Suara | Web Speech API bawaan peramban (id-ID) |
| Tes | Vitest, PGlite (Postgres in-process untuk menguji migrasi dan RLS) |
| Penerapan | Vercel (cron harian untuk email) |
.
├── app/
│ ├── (site)/ # halaman publik: beranda, cara kerja, FAQ, legal
│ ├── (auth)/ # /login, /daftar, /unlock
│ ├── dashboard/ # dasbor orang tua (ringkasan, anak, laporan, perbandingan)
│ ├── screening/ # permainan skrining + hasil demo
│ ├── child/ # beranda anak dan rute modul belajar
│ └── api/cron/ # pengiriman email notifikasi
├── components/ # auth, dashboard (radar, grafik), screening, site
├── features/learning/ # konten, komponen, penyimpanan lokal, font, dan CSS modul belajar
├── lib/
│ ├── screening/ # config, scoring, quality, soal
│ ├── recommendations/ # teks rekomendasi + penyusun laporan
│ ├── dashboard/ # tipe, metrik, pengambilan data, data contoh
│ ├── notifications/ # rencana email, pengirim
│ ├── auth/ # kunci dasbor, server action
│ └── supabase/ # klien browser, server, middleware, admin
├── supabase/
│ ├── migrations/ # skema, RLS, dan catatan tes versi 2
│ └── seed/ # data contoh untuk pengembangan
├── docs/ # teks rekomendasi untuk ditinjau psikolog
├── middleware.ts # sesi Supabase + penjaga /dashboard
└── scripts/
git clone https://github.com/LVNAx/EJA.git
cd EJA
npm install
npm run dev
Buka http://localhost:3000. Tanpa konfigurasi apa pun, EJA berjalan dalam mode demo: tidak butuh Supabase, dasbor memakai data contoh, dan formulir akun menampilkan pesan "belum aktif".
| Alamat | Isi |
|---|---|
/ | Beranda |
/screening/demo | Tes demo, hasilnya langsung tampil |
/dashboard | Ringkasan tiga anak contoh |
/dashboard/child/demo-rizky | Dasbor anak (kasus eskalasi ke Risiko Tinggi) |
/dashboard/child/demo-rizky/screening | Laporan skrining lengkap |
/dashboard/child/demo-nadia | Dasbor anak (Risiko Rendah, 6 hari tidak aktif) |
/dashboard/child/demo-bima | Kondisi kosong (belum skrining) |
/dashboard/compare | Perbandingan dua anak |
/child/demo-rizky | Dasbor anak dengan progres lokal dan akses aktivitas |
/child/demo-rizky/belajar | Beranda modul belajar |
/child/demo-rizky/belajar/latihan/menulis | Latihan menulis |
/child/demo-rizky/belajar/latihan/membaca | Latihan membaca |
Tautan ke
/dashboardbelum ada di navbar. Buka lewat alamat di atas.
Schema, RPC PIN dan bucket ilustrasi privat sudah terpasang pada project xnlnzdixcwuichejzgbg. Jalankan node scripts/setup-supabase.mjs lalu npm run dev untuk konfigurasi lokal. Ikuti panduan auth dan routing untuk pengaturan URL email, alur PIN, schema dan batasan progres lokal.
Salin .env.example menjadi .env.local lalu isi:
| Variabel | Fungsi |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | URL project Supabase |
NEXT_PUBLIC_SUPABASE_ANON_KEY | Kunci anon |
PARENT_UNLOCK_SECRET | Wajib di produksi. Menandatangani cookie buka-kunci (min. 16 karakter). Kosong di produksi = dasbor tidak terbuka |
SUPABASE_SERVICE_ROLE_KEY | Hanya untuk cron email. Melewati RLS, jangan di-commit |
CRON_SECRET | Melindungi /api/cron/notifications |
RESEND_API_KEY, EMAIL_FROM | Pengiriman email. Tanpa ini cron hanya dry-run |
NEXT_PUBLIC_SITE_URL | Tautan di dalam email |
GROQ_API_KEY | Penjelasan saran pendampingan dengan AI (Groq). Hanya di server; tanpa ini tombol menampilkan pesan belum aktif |
GROQ_MODEL | Opsional, bawaan openai/gpt-oss-120b |
Buat secret acak dengan:
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
Jalankan migrasi di SQL Editor Supabase, berurutan:
| Berkas | Isi |
|---|---|
0000_children.sql | Profil anak. Lewati bila tabel children sudah ada |
0001_screening_sessions.sql | Sesi skrining |
0002_learning_tracking.sql | Riwayat belajar, kuis, latihan, validitas sesi |
0003_notifications.sql | Status baca notifikasi dan log email |
20261004100821_parent_child_auth_curriculum.sql | Parent profiles, RPC PIN, kurikulum, progres, cache dan bucket |
20261004101050_optimize_family_rls.sql | Optimasi policy RLS dan indeks relasi |
Semuanya aman dijalankan ulang. Opsional untuk pengembangan: (jangan di produksi).
lib/speech/indonesian.ts, dengan pembatalan permintaan lama dan pemilihan suara Indonesia secara eksplisit.public/audio/id, sehingga stimulus tes tetap tersedia saat perangkat tidak mempunyai suara Indonesia. Berkas ini dibuat dengan suara Damayanti (id_ID), bukan rekaman manusia. Regenerasi pada macOS: node scripts/generate-indonesian-audio.mjs.| Perintah | Fungsi |
|---|---|
npm run dev | Server pengembangan |
npm run build / npm start | Build dan jalankan produksi |
npm run lint | ESLint |
npm run typecheck | Pemeriksaan tipe |
npm test | Vitest: skor, rekomendasi, metrik, kunci dasbor, middleware, notifikasi, dan migrasi + RLS di Postgres in-process |
npm run export:review | Ekspor teks rekomendasi untuk psikolog |
| Alamat | Pengguna | Keterangan |
|---|---|---|
/, /cara-kerja, /tentang, /faq, /kontak | Publik | Halaman informasi |
/privasi, /syarat, /disclaimer | Publik | Legal dan disclaimer medis |
/login, /daftar | Orang tua | Masuk dan daftar (persetujuan wajib) |
/auth/callback | Orang tua | Konfirmasi email PKCE/token hash |
/masuk-anak | Anak | Pilih avatar dan verifikasi PIN |
/unlock | Orang tua | Kata sandi ulang untuk membuka dasbor |
/dashboard | Orang tua | Ringkasan dan notifikasi |
/dashboard/child/new | Orang tua | Tambah profil anak |
/dashboard/child/[id] | Orang tua | Dasbor anak |
/dashboard/child/[id]/screening | Orang tua | Laporan skrining (?s=<id> untuk sesi lama) |
/dashboard/compare | Orang tua | Perbandingan dua anak |
/screening/[childId] | Anak | Empat permainan (tanpa menampilkan hasil) |
/child/[childId] | Anak | Beranda anak |
/child/[childId]/belajar | Anak | Modul belajar; latihan di bawah /latihan/* dan materi di bawah /materi/* |
GET /api/cron/notifications | Cron | Butuh Authorization: Bearer $CRON_SECRET |
draft.localStorage per anak dan browser. Catatan bantuan dapat dibaca orang tua pada browser yang sama; belum tersedia lintas perangkat. Tabel learning_sessions, quiz_results, dan practice_results belum diisi oleh modul ini; sinkronisasi ke tabel monitoring Supabase adalah pekerjaan berikutnya.Dibuat untuk JOINTS UGM 2026 oleh tim EJA. Daftar anggota ada di halaman /tentang.
Repositori: https://github.com/LVNAx/EJA
jawaban sesuai / butir dinilai × 100), dengan penanda sementara bila belum lengkap. Nilai bukan skor risiko. Saran latihan memilih bagian dengan proporsi kekeliruan terbesar, lalu kebutuhan bantuan atau bagian belum dinilai. Saran ini juga muncul di beranda belajar sampai tersedia hasil latihan berikutnya untuk keterampilan terkait; hasil tes tidak dicampur ke posterior Bayesian latihan yang memakai tugas berbeda.Kamera dihentikan pada akhir sesi, pembatalan, komponen dilepas, atau tab disembunyikan. Ukuran layar berubah saat pemetaan membatalkan pengamatan aktif. Latihan yang terputus harus diulang. Permintaan izin/model yang selesai setelah pembatalan dibersihkan. MediaPipe CPU dibatasi sekitar 10 inferensi per detik. Titik dan video dibuang; hanya ringkasan waktu, jumlah perpindahan, jawaban, serta bantuan disimpan, maksimal 10 sesi per anak pada browser ini. Belum disinkronkan ke Supabase.
Laporan memasangkan jawaban dengan waktu pada bagian yang terkait dan menyarankan bacaan pendek dengan panduan. Perbandingan dua bacaan tidak membuktikan efektivitas bantuan karena bacaan, soal, urutan, dan tingkat kesulitan belum dikendalikan. Tautan ?latihan=baris langsung menawarkan latihan dengan panduan. Saran terbaru juga muncul di beranda dan laporan perkembangan; tugas eksperimen tidak dicampur ke posterior Bayesian latihan lain, bintang, atau hasil skrining.
Pengujian otomatis memakai data sintetis untuk kalibrasi, getaran, sinyal hilang, dan urutan perpindahan, serta tracker simulasi untuk alur UI. Pengujian model nyata sebelumnya memeriksa pemuatan model dan penolakan video tanpa wajah. Ketepatan pada webcam dan pembaca manusia belum divalidasi; tidak ada skor risiko disleksia atau klaim ketepatan klinis. Dasar batas iris: Google Research; motivasi penelitian pola membaca: RADAR.
supabase/seed/dev_learning_seed.sql