{"id":29595304,"url":"https://github.com/zulfikriyahya/attendance-machine","last_synced_at":"2026-02-15T03:10:48.990Z","repository":{"id":305021180,"uuid":"1021654665","full_name":"zulfikriyahya/attendance-machine","owner":"zulfikriyahya","description":"Sistem presensi digital berbasis ESP32-C3 menggunakan RFID (RC522) dan OLED SSD1306 yang terhubung ke API Laravel melalui WiFi. Cocok digunakan untuk keperluan presensi siswa/pegawai di sekolah atau instansi lain dengan sistem backend yang sudah berjalan.","archived":false,"fork":false,"pushed_at":"2025-07-17T20:37:38.000Z","size":22,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-17T22:06:36.556Z","etag":null,"topics":["esp32","laravel","rest-api"],"latest_commit_sha":null,"homepage":"https://attendance.zedlabs.id","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zulfikriyahya.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-17T18:21:10.000Z","updated_at":"2025-07-17T20:27:28.000Z","dependencies_parsed_at":"2025-07-18T00:20:20.526Z","dependency_job_id":"e91ba3bc-3ced-4643-b06f-d0ae843c1627","html_url":"https://github.com/zulfikriyahya/attendance-machine","commit_stats":null,"previous_names":["zulfikriyahya/attendance-machine"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/zulfikriyahya/attendance-machine","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zulfikriyahya%2Fattendance-machine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zulfikriyahya%2Fattendance-machine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zulfikriyahya%2Fattendance-machine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zulfikriyahya%2Fattendance-machine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zulfikriyahya","download_url":"https://codeload.github.com/zulfikriyahya/attendance-machine/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zulfikriyahya%2Fattendance-machine/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266087790,"owners_count":23874519,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["esp32","laravel","rest-api"],"created_at":"2025-07-20T08:07:19.436Z","updated_at":"2026-02-15T03:10:48.983Z","avatar_url":"https://github.com/zulfikriyahya.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Sistem Presensi Pintar Berbasis IoT (Hybrid Edition)\n\n**Attendance Machine** adalah solusi presensi cerdas berbasis _Internet of Things_ (IoT) yang dirancang untuk mengatasi tantangan infrastruktur jaringan yang tidak stabil. Dibangun di atas mikrokontroler ESP32-C3, sistem ini menerapkan arsitektur _Hybrid_ yang menggabungkan kemampuan pemrosesan daring (_online_) dan luring (_offline_) secara mulus.\n\nSistem ini beroperasi dengan filosofi _Self-Healing_ dan _Store-and-Forward_, menjamin integritas data kehadiran tanpa kehilangan (_zero data loss_) melalui mekanisme antrean terpartisi (_Partitioned Queue System_), sinkronisasi otomatis, dan **operasi latar belakang yang tidak mengganggu pengguna** (_Non-Intrusive Background Operations_).\n\n---\n\n## Visi dan Misi Proyek\n\nProyek ini bertujuan mendigitalisasi, mengautomatisasi, dan mengintegrasikan data kehadiran lembaga pendidikan dan instansi pemerintahan dengan sistem yang tangguh (_resilient_) dan **user-friendly**. Fokus utamanya adalah menghapus hambatan teknis akibat gangguan jaringan, menciptakan transparansi data, mempermudah pelaporan administratif melalui ekosistem digital terintegrasi, serta memberikan **pengalaman pengguna yang mulus tanpa gangguan proses teknis**.\n\n---\n\n## Arsitektur Sistem\n\nSistem dirancang sebagai gerbang fisik data kehadiran yang agnostik terhadap status konektivitas dengan prioritas pada responsivitas dan user experience.\n\n### Mekanisme Operasional Utama\n\n1. **Identifikasi:** Pengguna memindai kartu RFID pada perangkat.\n2. **Validasi Lokal:** Perangkat melakukan verifikasi _debounce_ dan pengecekan duplikasi data dalam interval waktu tertentu (default: 30 menit) langsung pada penyimpanan lokal untuk mencegah input ganda.\n3. **Manajemen Penyimpanan (Queue System):** Data tidak dikirim langsung satu per satu, melainkan masuk ke dalam sistem antrean berkas CSV (`queue_X.csv`). Data dipecah menjadi berkas-berkas kecil (maksimal 25 rekaman per berkas) untuk menjaga stabilitas memori RAM mikrokontroler.\n4. **Sinkronisasi Latar Belakang (_Background Sync_):** Sistem secara berkala (setiap 5 menit) memeriksa keberadaan berkas antrean. Jika koneksi internet tersedia, data dikirim secara _batch_ ke server **tanpa menampilkan proses atau mengganggu pengguna**. Berkas lokal dihapus secara otomatis hanya jika server memberikan respons sukses (HTTP 200).\n5. **Reconnect Otomatis (_Silent Auto-Reconnect_):** Jika WiFi terputus, sistem mencoba reconnect setiap 5 menit secara otomatis dan diam-diam di latar belakang. Setelah kembali online, sistem otomatis melakukan sync data offline yang tertunda.\n6. **Manajemen OLED Cerdas:** Layar OLED otomatis mati pada jam tertentu untuk hemat daya dan memperpanjang umur display, namun tetap menyala sementara saat ada tapping kartu.\n7. **Integrasi Hilir:** Server memproses data _batch_ untuk keperluan notifikasi WhatsApp, laporan digital, dan analisis kehadiran.\n\n---\n\n## Spesifikasi Teknis\n\n### Perangkat Keras\n\nSistem ini menggunakan arsitektur bus SPI bersama (_Shared SPI Bus_) untuk efisiensi pin pada ESP32-C3.\n\n| Komponen             | Spesifikasi              | Fungsi Utama                                                               |\n| :------------------- | :----------------------- | :------------------------------------------------------------------------- |\n| **Unit Pemroses**    | ESP32-C3 Super Mini      | Manajemen logika utama, konektivitas WiFi, dan sistem berkas.              |\n| **Sensor Identitas** | RFID RC522 (13.56 MHz)   | Pembacaan UID kartu presensi (Protokol SPI).                               |\n| **Penyimpanan**      | Modul MicroSD (SPI)      | Penyimpanan antrean data offline (CSV) dan log sistem.                     |\n| **Antarmuka Visual** | OLED 0.96 inci (SSD1306) | Visualisasi status koneksi, jam, dan penghitung antrean (_Queue Counter_). |\n| **Indikator Audio**  | Buzzer Aktif 5V          | Umpan balik audio untuk status sukses, gagal, atau kesalahan sistem.       |\n| **Catu Daya**        | 5V USB / 3.7V Li-ion     | Sumber daya operasional.                                                   |\n\n### Pinout ESP32-C3\n\n| Komponen       | Pin Modul | Pin ESP32-C3 | Protokol | Catatan                        |\n| :------------- | :-------- | :----------- | :------- | :----------------------------- |\n| **Bus SPI**    | SCK       | GPIO 4       | SPI      | Jalur Clock (Shared)           |\n|                | MOSI      | GPIO 6       | SPI      | Jalur Data Master Out (Shared) |\n|                | MISO      | GPIO 5       | SPI      | Jalur Data Master In (Shared)  |\n| **RFID RC522** | SDA (SS)  | GPIO 7       | SPI      | Chip Select RFID               |\n|                | RST       | GPIO 3       | Digital  | Reset Hardware                 |\n| **SD Card**    | CS        | GPIO 1       | SPI      | Chip Select SD Card            |\n| **OLED**       | SDA       | GPIO 8       | I2C      | Data Display                   |\n|                | SCL       | GPIO 9       | I2C      | Clock Display                  |\n| **Buzzer**     | (+)       | GPIO 10      | PWM      | Indikator Audio                |\n\n\u003e **Penting:** Pastikan implementasi perangkat keras mendukung penggunaan GPIO 4, 5, dan 6 secara paralel untuk dua perangkat SPI berbeda.\n\n---\n\n## Fitur Perangkat Lunak (Firmware)\n\n### Core Features\n\n- **Offline-First Capability:** Prioritas penyimpanan data lokal saat jaringan tidak tersedia atau tidak stabil.\n- **Partitioned Queue System:** Manajemen memori tingkat lanjut yang memecah penyimpanan data menjadi berkas-berkas kecil untuk mencegah _buffer overflow_ pada mikrokontroler.\n- **Smart Duplicate Prevention:** Algoritma _sliding window_ yang memindai indeks antrean lokal untuk menolak pemindaian kartu yang sama dalam periode waktu yang dikonfigurasi (default: 30 menit).\n- **Bulk Upload Efficiency:** Mengoptimalkan penggunaan _bandwidth_ dengan mengirimkan himpunan data dalam satu permintaan HTTP POST.\n- **Hybrid Timekeeping:** Sinkronisasi waktu presisi menggunakan NTP saat daring, dan estimasi waktu berbasis RTC internal saat luring.\n- **Deep Sleep Scheduling:** Manajemen daya otomatis untuk menonaktifkan sistem di luar jam operasional (default: 18:00–05:00).\n\n### Advanced Features (v2.2.2+)\n\n- **Silent Background Sync:** Sinkronisasi data berjalan di latar belakang tanpa feedback visual atau audio yang mengganggu.\n- **Non-Intrusive Reconnect:** Auto-reconnect WiFi tanpa menampilkan loading screen atau progress bar.\n- **Zero-Interruption UX:** Pengguna dapat melakukan tapping RFID kapan saja tanpa terblokir oleh proses background.\n- **Thread-Safe Operations:** Implementasi dual-flag system (`isSyncing`, `isReconnecting`) untuk mencegah race condition.\n- **Smart Display Management:** Layar OLED hanya menampilkan informasi penting (status, waktu, queue counter) tanpa distraksi proses teknis.\n- **Legacy Storage Support:** Dukungan penuh untuk SD Card lama (128MB–256MB) menggunakan pustaka SdFat.\n\n### WiFi Optimization Features (v2.2.3+)\n\n- **Maximum TX Power (19.5 dBm):** Jangkauan sinyal WiFi yang lebih jauh dan penetrasi lebih baik melalui penghalang.\n- **Modem Sleep Mode:** Efisiensi daya tanpa mengorbankan responsivitas jaringan.\n- **Signal-Based AP Selection:** Koneksi otomatis ke Access Point dengan sinyal terkuat (`WIFI_CONNECT_AP_BY_SIGNAL`).\n- **Persistent Connection:** Konfigurasi WiFi tersimpan di flash memory untuk boot yang lebih cepat.\n- **RSSI Monitoring:** Tampilan kekuatan sinyal (dBm) saat startup untuk keperluan diagnostik.\n\n### OLED Auto Dim (v2.2.4+)\n\n- **Scheduled Display Control:** OLED otomatis mati pukul 08:00 dan nyala kembali pukul 14:00 (dapat dikonfigurasi).\n- **Smart Wake-up on Tap:** Display menyala sementara saat ada kartu yang di-tap, lalu kembali mati sesuai jadwal.\n- **Power Saving:** Mengurangi konsumsi daya display hingga 25% dan memperpanjang umur OLED 30–40%.\n- **Seamless Operation:** Proses tapping RFID tetap berjalan normal meskipun display mati.\n\n---\n\n## Konfigurasi Sistem\n\nParameter operasional utama didefinisikan pada bagian awal kode sumber:\n\n```cpp\n// Konfigurasi Jaringan\nconst char WIFI_SSID_1[]     PROGMEM = \"SSID_WIFI_1\";\nconst char WIFI_SSID_2[]     PROGMEM = \"SSID_WIFI_2\";\nconst char WIFI_PASSWORD_1[] PROGMEM = \"PasswordWifi1\";\nconst char WIFI_PASSWORD_2[] PROGMEM = \"PasswordWifi2\";\nconst char API_BASE_URL[]    PROGMEM = \"https://zedlabs.id\";\nconst char API_SECRET_KEY[]  PROGMEM = \"SecretAPIToken\";\nconst char NTP_SERVER_1[]    PROGMEM = \"pool.ntp.org\";\nconst char NTP_SERVER_2[]    PROGMEM = \"time.google.com\";\nconst char NTP_SERVER_3[]    PROGMEM = \"id.pool.ntp.org\";\nconst long GMT_OFFSET_SEC    = 25200; // WIB (UTC+7)\n\n// Konfigurasi Antrean\nconst int MAX_RECORDS_PER_FILE      = 25;       // Optimasi RAM untuk ESP32-C3\nconst int MAX_QUEUE_FILES           = 2000;     // Kapasitas total 50.000 record\nconst unsigned long SYNC_INTERVAL   = 300000;   // Sinkronisasi setiap 5 menit (background)\n\n// Konfigurasi Validasi\nconst unsigned long MIN_REPEAT_INTERVAL = 1800; // Debounce 30 menit untuk kartu sama\n\n// Konfigurasi Reconnect\nconst unsigned long RECONNECT_INTERVAL  = 300000;  // Auto-reconnect setiap 5 menit\nconst unsigned long TIME_SYNC_INTERVAL  = 3600000; // Time sync setiap 1 jam\n\n// Konfigurasi Sleep Mode\nconst int SLEEP_START_HOUR = 18;  // Pukul 18:00 - Mesin Mati\nconst int SLEEP_END_HOUR   = 5;   // Pukul 05:00 - Mesin Nyala\n\n// Konfigurasi OLED Auto Dim (v2.2.4)\nconst int OLED_DIM_START_HOUR = 8;  // Pukul 08:00 - OLED Mati\nconst int OLED_DIM_END_HOUR   = 14; // Pukul 14:00 - OLED Nyala\n\n// Konfigurasi Display\nconst unsigned long DISPLAY_UPDATE_INTERVAL = 1000; // Update setiap 1 detik\n```\n\n---\n\n## Mekanisme Antrean (Queue Logic)\n\n1. **Segmentasi:** Data disimpan dalam berkas kecil (`queue_N.csv`) berisi maksimal 25 baris untuk mencegah _buffer overflow_.\n2. **Rotasi:** Saat berkas `queue_N` penuh, sistem otomatis membuat `queue_N+1`.\n3. **Sliding Window Duplicate Check:** Hanya memeriksa berkas antrean aktif dan 1 berkas sebelumnya — menjaga performa cepat meskipun data tersimpan sangat besar.\n4. **Sinkronisasi Background:**\n   - Sistem mencari berkas antrean yang ada secara sekuensial.\n   - Data dibaca, diparsing ke JSON, dan dikirim ke server tanpa feedback visual.\n   - Jika server merespons HTTP 200, berkas `queue_N` dihapus dari SD Card.\n   - Jika gagal, berkas dipertahankan untuk percobaan berikutnya.\n   - Proses ini **tidak mengganggu** operasi tapping RFID.\n\n---\n\n## Background Operations Architecture\n\n### Filosofi Desain\n\nSistem menerapkan prinsip **\"Invisible Infrastructure\"** — semua operasi teknis (network, sync, reconnect) harus tidak terlihat oleh pengguna akhir. User experience fokus pada satu hal: **tap kartu → lihat feedback → selesai**.\n\n### Flow Diagram\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│                     USER INTERACTION                        │\n│                                                             │\n│  [Tap RFID Card] → [Save to Queue] → [Success Feedback]     │\n│                                                             │\n└─────────────────────────────────────────────────────────────┘\n                              ▲\n                              │ Non-blocking\n                              │\n┌─────────────────────────────────────────────────────────────┐\n│                  BACKGROUND OPERATIONS                      │\n│                                                             │\n│  ┌─────────────────┐         ┌──────────────────┐           │\n│  │ WiFi Reconnect  │◄────────┤  Every 5 minutes │           │\n│  │   (Silent)      │         └──────────────────┘           │\n│  └────────┬────────┘                                        │\n│           │                                                 │\n│           ▼                                                 │\n│  ┌─────────────────┐         ┌──────────────────┐           │\n│  │ Data Sync       │◄────────┤  Auto-triggered  │           │\n│  │   (Silent)      │         │  after online    │           │\n│  └─────────────────┘         └──────────────────┘           │\n│                                                             │\n└─────────────────────────────────────────────────────────────┘\n```\n\n### Implementasi Flag Thread-Safety\n\n```cpp\n// Global flags untuk mencegah operasi paralel\nbool isSyncing      = false; // Mencegah sync bersamaan\nbool isReconnecting = false; // Mencegah reconnect bersamaan\n```\n\n---\n\n## OLED Auto Dim Schedule\n\n| Waktu         | Status OLED | Keterangan                          |\n| :------------ | :---------- | :---------------------------------- |\n| 00:00 – 07:59 | ON          | Display aktif untuk presensi pagi   |\n| 08:00 – 13:59 | OFF         | Display mati untuk hemat daya       |\n| 14:00 – 17:59 | ON          | Display aktif untuk presensi sore   |\n| 18:00 – 04:59 | SLEEP MODE  | Mesin deep sleep (termasuk display) |\n\n\u003e Display tetap menyala sementara saat ada tapping RFID meskipun dalam periode dim.\n\n---\n\n## API Specification\n\n### Endpoint Sinkronisasi (Bulk)\n\n- **URL:** `/api/presensi/sync-bulk`\n- **Method:** `POST`\n- **Header:** `Content-Type: application/json`, `X-API-KEY: [SECRET_KEY]`\n- **Payload:**\n  ```json\n  {\n    \"data\": [\n      {\n        \"rfid\": \"UID_KARTU\",\n        \"timestamp\": \"YYYY-MM-DD HH:MM:SS\",\n        \"device_id\": \"ESP32_MAC_ADDR\",\n        \"sync_mode\": true\n      }\n    ]\n  }\n  ```\n- **Respons:** Server harus mengembalikan **HTTP 200 OK** untuk mengonfirmasi penerimaan data. Kode lain akan menyebabkan perangkat menyimpan kembali data dan mencoba pengiriman ulang di siklus berikutnya.\n\n### Endpoint Health Check\n\n- **URL:** `/api/presensi/ping`\n- **Method:** `GET`\n- **Header:** `X-API-KEY: [SECRET_KEY]`\n- **Respons:** HTTP 200 jika server aktif dan siap menerima data.\n\n---\n\n## Kompatibilitas Kartu SD\n\nBerkat implementasi `SdFat`, sistem mendukung berbagai jenis kartu memori:\n\n- **SDSC** (Standard Capacity) ≤ 2GB, termasuk kartu lama 128MB/256MB.\n- **SDHC** (High Capacity) 4GB – 32GB.\n- Format sistem berkas: **FAT16** dan **FAT32**.\n\n---\n\n## Prasyarat Instalasi Perangkat Lunak\n\nInstall pustaka berikut melalui Arduino Library Manager:\n\n1. **SdFat** oleh Bill Greiman (Versi 2.x) — **Wajib**, menggantikan pustaka `SD` bawaan Arduino.\n2. **MFRC522** (GithubCommunity) — Driver RFID.\n3. **Adafruit SSD1306** \u0026 **Adafruit GFX** — Driver tampilan OLED.\n4. **ArduinoJson** — Serialisasi JSON.\n5. **WiFi**, **HTTPClient**, **Wire**, **SPI** — Pustaka inti ESP32.\n\n---\n\n## Struktur Repositori\n\n```text\n.\n├── firmware/\n│   ├── v1.0.0/     # Versi Awal (Online Only)\n│   ├── v2.0.0/     # Versi Hibrida Awal (Single CSV)\n│   ├── v2.1.0/     # Queue System Base\n│   ├── v2.2.0/     # Ultimate: SdFat, Legacy Card Support\n│   ├── v2.2.1/     # Auto-Reconnect \u0026 Bug Fixes\n│   ├── v2.2.2/     # Background Operations \u0026 Enhanced UX\n│   ├── v2.2.3/     # WiFi Signal Optimization\n│   └── v2.2.4/     # OLED Auto Dim\n└── LICENSE\n```\n\n---\n\n## Technical Specifications\n\n### Queue System\n\n| Parameter             | Nilai          |\n| :-------------------- | :------------- |\n| Max Records per File  | 25             |\n| Max Queue Files       | 2.000          |\n| Total Capacity        | 50.000 records |\n| Sync Interval         | 300 detik      |\n| Duplicate Check       | 1.800 detik    |\n\n### WiFi Configuration\n\n| Parameter          | Nilai                      |\n| :----------------- | :------------------------- |\n| TX Power           | 19.5 dBm (maksimal)        |\n| Sleep Mode         | WIFI_PS_MAX_MODEM          |\n| Sort Method        | WIFI_CONNECT_AP_BY_SIGNAL  |\n| Persistent         | Enabled                    |\n| Auto-Reconnect     | Enabled                    |\n| Reconnect Interval | 300 detik (5 menit)        |\n\n### Display \u0026 Power\n\n| Parameter              | Nilai                     |\n| :--------------------- | :------------------------ |\n| Display Update         | 1.000 ms (1 detik)        |\n| RSSI Bars              | 4 levels                  |\n| OLED Auto Dim          | 08:00 – 14:00 (default)   |\n| Deep Sleep             | 18:00 – 05:00 (default)   |\n| Modem Sleep            | WIFI_PS_MAX_MODEM         |\n\n### RSSI Interpretation\n\n| RSSI          | Kualitas         |\n| :------------ | :--------------- |\n| ≥ -50 dBm     | Sangat Kuat      |\n| -67 dBm       | Kuat (4 bar)     |\n| -70 dBm       | Baik (3 bar)     |\n| -80 dBm       | Cukup (2 bar)    |\n| -90 dBm       | Lemah (1 bar)    |\n| \u003c -90 dBm     | Sangat Lemah     |\n\n---\n\n## Troubleshooting\n\n**Masalah: WiFi sering disconnect**\nPastikan perangkat dalam jangkauan yang cukup (RSSI di atas -70 dBm). Periksa interferensi pada frekuensi 2.4 GHz dan stabilitas power supply (minimal 5V 1A).\n\n**Masalah: Sync lambat atau terblokir**\nPastikan tidak ada `showOLED()` atau `playTone()` di dalam fungsi `chunkedSync()` atau `syncAllQueues()`. Semua feedback visual harus dihapus untuk operasi background yang optimal.\n\n**Masalah: Double sync/reconnect**\nPeriksa implementasi flag `isSyncing` dan `isReconnecting`. Flag harus di-set sebelum operasi dimulai dan di-clear setelah selesai.\n\n**Masalah: OLED tidak mati/menyala sesuai jadwal**\nPastikan waktu sistem sudah tersinkronisasi dengan NTP server. Periksa nilai `OLED_DIM_START_HOUR` dan `OLED_DIM_END_HOUR` di konfigurasi.\n\n**Masalah: Display tidak update status online/offline**\nPastikan `updateStandbySignal()` membaca variabel `isOnline` yang selalu diperbarui di loop utama.\n\n---\n\n## Performance Metrics\n\n| Metrik                     | Nilai                      |\n| :------------------------- | :------------------------- |\n| Tap-to-Feedback Latency    | \u003c 200ms                    |\n| Background Sync Frequency  | Setiap 5 menit             |\n| Auto-Reconnect Interval    | Setiap 5 menit             |\n| Queue Capacity             | 50.000 records             |\n| Time Sync Accuracy         | ±1 detik (NTP)             |\n| Power (Active)             | ~150mA                     |\n| Power (Deep Sleep)         | \u003c 5mA                      |\n\n---\n\n## Riwayat Perubahan (Changelog)\n\n### v2.2.4 (Desember 2025) — OLED Auto Dim\n- Scheduled Display Control: OLED otomatis mati pukul 08:00, nyala pukul 14:00\n- Smart Wake-up: Display menyala sementara saat ada kartu yang di-tap\n- Power Saving: Pengurangan konsumsi daya hingga 25%\n- OLED Longevity: Perpanjangan umur display hingga 30–40%\n- Implementasi flag `oledIsOn` untuk tracking status display\n\n### v2.2.3 (Desember 2025) — WiFi Signal Optimization\n- Maximum TX Power: Set WiFi TX Power ke 19.5 dBm untuk jangkauan maksimal\n- Modem Sleep Mode: Implementasi WIFI_PS_MAX_MODEM untuk efisiensi daya\n- Signal-Based AP Selection: Koneksi otomatis ke AP dengan sinyal terkuat\n- Persistent Mode: WiFi persistent dan auto-reconnect untuk stabilitas\n- RSSI Display: Tampilan kekuatan sinyal saat startup untuk monitoring\n- Optimized Queue Config: MAX_RECORDS_PER_FILE ke 25, MAX_QUEUE_FILES ke 2000\n\n### v2.2.2 (Desember 2025) — Background Operations\n- Background WiFi Reconnect: Reconnect otomatis setiap 5 menit tanpa tampilan\n- Background Bulk Sync: Sinkronisasi data offline di latar belakang\n- Dual Process Flags: Implementasi `isSyncing` dan `isReconnecting`\n- Silent Operations: Semua operasi network tanpa feedback visual/audio\n- Enhanced UX: Display fokus pada informasi penting (status, waktu, queue counter)\n\n### v2.2.1 (Desember 2025) — Stability \u0026 Auto-Reconnect\n- Penambahan Fitur Autoconnect WiFi\n- Perbaikan Bug System Versi 2.2.0\n\n### v2.2.0 (Desember 2025) — Ultimate Edition\n- Migrasi ke `SdFat`\n- Dukungan kartu memori legacy (128MB+)\n- Optimasi buffer memori\n- Perbaikan visual interface\n\n### v2.1.0 — Queue System Foundation\n- Pengenalan sistem antrean multi-file\n- Sliding window duplicate check\n\n### v2.0.0 — Hybrid Architecture\n- Implementasi mode offline dasar (single CSV)\n\n### v1.0.0 — Initial Release\n- Rilis awal (Online only)\n\n---\n\n## Peta Jalan Pengembangan (Roadmap)\n\n1. **Versi 1.x** — Presensi Daring Dasar.\n2. **Versi 2.x** — Sistem Hibrida, Queue Offline Terpartisi, Sinkronisasi Massal, Auto Reconnect, Legacy Storage, Background Operations, WiFi Optimization, OLED Auto Dim.\n3. **Versi 3.x** — Integrasi Biometrik (Sidik Jari) sebagai metode autentikasi sekunder.\n4. **Versi 4.x** — Ekspansi fungsi menjadi Buku Tamu Digital dan Integrasi PPDB.\n5. **Versi 5.x** — Ekosistem Perpustakaan Pintar (Sirkulasi Mandiri).\n6. **Versi 6.x** — IoT Gateway \u0026 LoRaWAN untuk area tanpa jangkauan seluler/WiFi.\n\n---\n\n## Best Practices\n\n1. **Penempatan Perangkat:** Letakkan pada lokasi dengan sinyal WiFi yang baik (RSSI di atas -70 dBm). Gunakan RSSI display saat startup untuk monitoring.\n2. **Power Supply:** Gunakan power supply stabil 5V 1A minimum untuk menghindari brownout saat transmisi WiFi daya maksimal.\n3. **Multiple Access Points:** Jika deployment menggunakan beberapa AP, pastikan semua memiliki SSID dan password yang sama agar sistem dapat memilih AP terbaik otomatis.\n4. **Background Process:** Biarkan background sync dan reconnect berjalan otomatis. Tidak perlu intervensi manual.\n5. **Jangan Tambah Feedback Visual di Background:** Semua operasi dalam `periodicSync()` dan `connectToWiFiBackground()` harus silent.\n6. **Jadwal OLED:** Sesuaikan `OLED_DIM_START_HOUR` dan `OLED_DIM_END_HOUR` dengan pola aktivitas presensi di lokasi deployment.\n\n---\n\n## Lisensi\n\nHak Cipta 2025 Yahya Zulfikri. Kode sumber ini dilisensikan di bawah MIT License untuk penggunaan pendidikan dan pengembangan profesional.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzulfikriyahya%2Fattendance-machine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzulfikriyahya%2Fattendance-machine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzulfikriyahya%2Fattendance-machine/lists"}