184 lines
4.7 KiB
Markdown
184 lines
4.7 KiB
Markdown
# 🚀 ESP32 OPTIMIZATION REPORT
|
|
|
|
## MASALAH YANG DITEMUKAN:
|
|
|
|
### 1. ⚠️ HTTP TIMEOUT TERLALU LAMA
|
|
```cpp
|
|
SEBELUM: http.setTimeout(11000); // 11 DETIK!
|
|
SESUDAH: http.setTimeout(3000); // 3 DETIK (3.7x lebih cepat)
|
|
```
|
|
**Dampak**: Jika timeout, ESP32 freeze 11 detik → 3 detik
|
|
|
|
---
|
|
|
|
### 2. ⚠️ BLOCKING POLLING DI MAIN LOOP
|
|
**SEBELUM:**
|
|
```cpp
|
|
void loop() {
|
|
updateModeFromServer(); // ← BLOCK 2-11 detik SETIAP kali
|
|
// RFID detection tidak berjalan saat polling
|
|
}
|
|
```
|
|
|
|
**SESUDAH:**
|
|
```cpp
|
|
// ⭐ Timer-based polling (NON-BLOCKING)
|
|
if (millis() - lastModeUpdate < MODE_UPDATE_INTERVAL) return;
|
|
updateModeFromServer(); // ← Hanya jika timer tercapai
|
|
// RFID tetap responsif!
|
|
```
|
|
|
|
---
|
|
|
|
### 3. ⚠️ WIFI RECONNECTION LOGIC LAMBAT
|
|
```cpp
|
|
SEBELUM:
|
|
WiFi.disconnect(); // Disconnect dulu (lambat)
|
|
WiFi.begin(ssid, password);
|
|
|
|
SESUDAH:
|
|
WiFi.mode(WIFI_OFF); // Off total
|
|
delay(100);
|
|
WiFi.mode(WIFI_STA); // On ulang (lebih cepat)
|
|
WiFi.begin(ssid, password);
|
|
```
|
|
|
|
---
|
|
|
|
### 4. ⚠️ BLOCKING STATUS CHECKS
|
|
```cpp
|
|
SEBELUM:
|
|
if (WiFi.status() == WL_CONNECTED && !isAudioPlaying) {
|
|
updateModeFromServer(); // ← Walaupun cek tidak block, polling masih block
|
|
}
|
|
|
|
SESUDAH:
|
|
// Tambah flag untuk prevent concurrent polling
|
|
if (isPollingInProgress) return;
|
|
isPollingInProgress = true;
|
|
// ... polling
|
|
isPollingInProgress = false; // Mark selesai
|
|
```
|
|
|
|
---
|
|
|
|
## ✅ PERUBAHAN OPTIMASI:
|
|
|
|
| No | Perubahan | Sebelum | Sesudah | Dampak |
|
|
|----|-----------|---------|----------|--------|
|
|
| 1 | HTTP Timeout | 11000ms | 3000ms | ⚡ 3.7x lebih cepat |
|
|
| 2 | Connect Timeout | (none) | 3000ms | ⚡ Fail-fast jika koneksi gagal |
|
|
| 3 | Polling Pattern | Blocking loop | Timer-based | ⚡ Non-blocking, RFID responsif |
|
|
| 4 | Polling Interval | 2s (blocking) | 1.5s (non-blocking) | ⚡ 33% lebih sering cek |
|
|
| 5 | WiFi Reconnect | 10s interval | 5s interval | ⚡ 2x lebih cepat recover |
|
|
| 6 | JSON Parser | StaticJsonDocument | DynamicJsonDocument | ⚡ Lebih flexible |
|
|
| 7 | Loop Delay | (none) | 10ms | ⚡ Stabilitas & efficiency |
|
|
| 8 | RFID Timeout | 5000ms | 3000ms | ⚡ Fail-fast |
|
|
|
|
---
|
|
|
|
## 📊 HASIL YANG DIHARAPKAN:
|
|
|
|
### Response Time:
|
|
- **Mode Update**: 2-11s → **0.3-1.5s** (5-10x lebih cepat)
|
|
- **RFID Scan Response**: ~5s → **2-3s** (2x lebih cepat)
|
|
- **Overall Responsiveness**: Signifikan improvement
|
|
|
|
### Resource:
|
|
- **Memory**: Sedikit lebih banyak (polling flag) tapi tidak significant
|
|
- **WiFi**: Lebih efficient (connection reuse, proper timeout)
|
|
- **CPU**: Tidak akan freeze saat polling timeout
|
|
|
|
---
|
|
|
|
## 🔧 IMPLEMENTASI:
|
|
|
|
### Option 1: Copy-Paste Langsung
|
|
File sudah ada di: `ESP32_OPTIMIZED.ino`
|
|
|
|
Ganti kode lama Anda dengan kode baru ini.
|
|
|
|
### Option 2: Manual Apply Changes
|
|
Jika ingin manual, apply perubahan berikut di kode Anda:
|
|
|
|
1. **Tambah di deklarasi state:**
|
|
```cpp
|
|
unsigned long lastModeUpdate = 0;
|
|
const unsigned long MODE_UPDATE_INTERVAL = 1500;
|
|
bool isPollingInProgress = false;
|
|
```
|
|
|
|
2. **Ganti updateModeFromServer():**
|
|
```cpp
|
|
void updateModeFromServer() {
|
|
if (isPollingInProgress || isAudioPlaying) return;
|
|
if (millis() - lastModeUpdate < MODE_UPDATE_INTERVAL) return;
|
|
|
|
isPollingInProgress = true;
|
|
lastModeUpdate = millis();
|
|
|
|
HTTPClient http;
|
|
http.setReuse(true);
|
|
http.setTimeout(3000); // ← UTAMA: Kurangi dari 11000
|
|
http.setConnectTimeout(3000);
|
|
|
|
// ... rest of code
|
|
|
|
isPollingInProgress = false;
|
|
}
|
|
```
|
|
|
|
3. **Update loop():**
|
|
```cpp
|
|
void loop() {
|
|
keepWiFiAlive();
|
|
checkAudioStatus();
|
|
|
|
if (WiFi.status() == WL_CONNECTED && !isAudioPlaying) {
|
|
updateModeFromServer(); // Sekarang non-blocking!
|
|
}
|
|
|
|
if (!isAudioPlaying && (millis() - lastSuccessfulScan > scanDelay)) {
|
|
if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
|
|
handleRFID();
|
|
}
|
|
}
|
|
|
|
// ... display logic
|
|
|
|
delay(10); // ← Tambah delay kecil untuk stability
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## ⚠️ TESTING CHECKLIST:
|
|
|
|
- [ ] Upload kode baru ke ESP32
|
|
- [ ] Monitor Serial output (buka Serial Monitor 115200 baud)
|
|
- [ ] Cek response time RFID scan (seharusnya ~2-3 detik)
|
|
- [ ] Cek mode update responsiveness
|
|
- [ ] Cek WiFi reconnection behavior
|
|
- [ ] Test dengan multiple RFID scans berturut-turut
|
|
|
|
---
|
|
|
|
## 📝 CATATAN PENTING:
|
|
|
|
- Polling interval 1.5s berarti worst-case mode update delay adalah ~1.5 detik
|
|
- Jika perlu lebih realtime, bisa kurangi ke 1 detik
|
|
- HTTP timeout 3s sudah optimal untuk LAN - jangan lebih rendah
|
|
- Jika masih lambat, kemungkinan WiFi signal lemah atau server overload
|
|
|
|
---
|
|
|
|
## 🎯 NEXT STEPS:
|
|
|
|
Jika masih lambat setelah ini:
|
|
1. Check WiFi signal strength (RSSI)
|
|
2. Monitor server CPU/RAM usage
|
|
3. Enable Serial debug untuk lihat timing detil
|
|
4. Bisa gunakan WebSocket instead of polling (lebih advanced)
|
|
|
|
**Update saya setelah test!** 👍
|