Finalisasi proyek — error handling, UI polish, dokumentasi, dan demo akhir.
| Skenario | Penyebab | Solusi |
|---|---|---|
| WiFi disconnect | ESP32 terlalu jauh | Auto-reconnect + fallback ke BLE |
| MQTT broker down | Laptop mati / broker crash | Retry + switch ke WebSocket lokal |
| BLE disconnect | HP keluar range BLE | Reconnect attempt + UI feedback |
| JSON parse error | Data korup / partial | try-catch + skip invalid data |
| Sensor read fail | Kabel lepas / sensor rusak | Return NaN + tampilkan warning |
| Timeout | Koneksi lambat | Timeout 5 detik + retry |
Dart — Robust Connection Wrapperclass RobustConnection {
final ConnectionManager _manager;
int _retryCount = 0;
static const int maxRetries = 3;
RobustConnection(this._manager);
/// Send dengan retry
Future<bool> sendSafe(Map<String, dynamic> data) async {
for (int i = 0; i < maxRetries; i++) {
try {
if (!_manager.isConnected) {
await _manager.autoConnect();
}
_manager.send(data);
_retryCount = 0;
return true;
} catch (e) {
_retryCount++;
print('Send failed (attempt ${i + 1}): $e');
await Future.delayed(
Duration(seconds: (i + 1) * 2)); // exponential backoff
}
}
return false;
}
/// Listen data dengan auto-reconnect
void listenSafe({
required Function(Map<String, dynamic>) onData,
required Function(String) onError,
}) {
_manager.dataStream?.listen(
(data) {
try {
onData(data);
_retryCount = 0;
} catch (e) {
onError('Parse error: $e');
}
},
onError: (e) {
onError('Stream error: $e');
// Coba reconnect
Future.delayed(
const Duration(seconds: 3),
() => _manager.autoConnect(),
);
},
onDone: () {
onError('Connection closed');
Future.delayed(
const Duration(seconds: 3),
() => _manager.autoConnect(),
);
},
);
}
}
Final app mockup + UI polish checklist lengkap
| # | Test Case | Expected Result | Pass? |
|---|---|---|---|
| 1 | Buka app tanpa koneksi ESP32 | Tampilkan pesan "tidak terhubung" + retry button | ☐ |
| 2 | Connect via WiFi (WebSocket) | Badge hijau "WiFi ✓", data sensor muncul | ☐ |
| 3 | Toggle LED via app | LED fisik ESP32 hidup/mati | ☐ |
| 4 | Tutup WiFi di HP saat connected | Badge merah, coba reconnect otomatis | ☐ |
| 5 | Connect via Bluetooth BLE | Badge "BLE ✓", data sensor streaming | ☐ |
| 6 | Switch dari WiFi ke BLE | Seamless, data tetap mengalir | ☐ |
| 7 | Connect via MQTT | Badge "MQTT ✓", pub/sub bekerja | ☐ |
| 8 | Lihat history page | Chart menampilkan data tersimpan | ☐ |
| 9 | Matikan ESP32, nyalakan lagi | App auto-reconnect setelah beberapa detik | ☐ |
| 10 | Test dengan 2 HP terhubung | Kedua HP menerima data, sinkron | ☐ |
Markdown# Smart Environment Monitor 🌡️📱
## Deskripsi
Sistem IoT untuk monitoring suhu, kelembaban, dan cahaya
menggunakan ESP32 + Flutter. Mendukung multiple koneksi:
USB Serial, Bluetooth BLE, WiFi WebSocket, dan MQTT.
## Hardware
- ESP32 DevKit V1
- DHT11 (suhu + kelembaban) → Pin 15
- LDR + 10K resistor (cahaya) → Pin 34
- LED → Pin 2
- Relay module → Pin 4
## Wiring Diagram
(Sertakan foto atau diagram dari Minggu 10)
## Software stack
- **ESP32**: Arduino IDE, PlatformIO
- **Mobile**: Flutter 3.x + Dart
- **Packages**: http, web_socket_channel, flutter_blue_plus,
mqtt_client, provider, fl_chart, hive
- **Broker**: Mosquitto (lokal)
## Cara Menjalankan
1. Flash firmware ke ESP32 via Arduino IDE
2. Jalankan Mosquitto broker di laptop
3. `flutter run` di folder Flutter project
4. Connect HP ke WiFi "ESP32_SmartEnv"
5. Buka app → auto-detect koneksi
## Screenshots
(Screenshot dari HP — dashboard, controls, history, settings)
## Fitur
- [x] Multi-connection: USB, BLE, WiFi, MQTT
- [x] Auto-switch koneksi
- [x] Real-time sensor dashboard
- [x] LED & relay control
- [x] Data history + chart
- [x] Error handling + auto-reconnect
## Lisensi
MIT
Demo flow: ~15 menit — Setup → WiFi → BLE switch → MQTT → Wrap Up
| Fase | Minggu | Topik | Skill yang Didapat |
|---|---|---|---|
| Fase 1 Foundation | 1 | Setup Environment | Flutter + Arduino IDE + ESP32 board |
| 2 | Dart & Flutter UI | Widgets, StatefulWidget, setState | |
| 3 | ESP32 GPIO | Digital/Analog I/O, Serial Monitor | |
| Fase 2 USB Serial | 4 | Serial Protocol | JSON, ArduinoJson, dart:convert |
| 5 | USB OTG | usb_serial, AndroidManifest, LED kontrol | |
| 6 | Sensor Dashboard | fl_chart, real-time chart, multi-sensor | |
| Fase 3 Bluetooth | 7 | BT Classic | SPP, pairing, BluetoothSerial |
| 8 | Flutter BT App | flutter_bluetooth_serial, scan + connect | |
| 9 | BLE (GATT) | Services, Characteristics, Notify | |
| 10 | Smart Home BLE | Multi-sensor, error handling, reconnect | |
| Fase 4 WiFi/IoT | 11 | Web Server & AP | ESPAsyncWebServer, REST API |
| 12 | Flutter HTTP | http package, polling, JSON API | |
| 13 | WebSocket | Real-time bidirectional, auto-reconnect | |
| 14 | MQTT | Pub/Sub, Broker, PubSubClient, mqtt_client | |
| Fase 5 Project | 15 | Hybrid System | Multi-protocol, ConnectionManager, Provider |
| 16 | Polish & Demo | Error handling, testing, documentation |