Pendahuluan
Di artikel NVS + WiFiManager (#12) kita sudah menyiapkan ESP32 agar WiFi dan MQTT bisa dikonfigurasi tanpa hardcode. Node sensor di kebun, gudang, atau atap rumah tidak praktis jika setiap perbaikan bug mengharuskan buka casing + kabel USB.
OTA (Over-The-Air) memungkinkan kamu mengunggah firmware baru lewat WiFi — dari Arduino IDE atau script CI — setelah flash awal via USB. Artikel ini menutup Jalur A (hardware & sensor): deep sleep (#11) → NVS (#12) → BME280 (#13) → OLED (#14) → OTA (#15).
Prasyarat: Paham koneksi WiFi (#4), familiar dengan web server ESP32 (#6), dan sudah implementasi WiFiManager + NVS (#12). Stack sensor OLED (#14) boleh digabung nanti.
Yang Kamu Butuhkan
- ESP32 DevKit (flash minimal 4 MB)
- Kabel USB — hanya untuk flash pertama
- PC + Arduino IDE di jaringan WiFi yang sama dengan ESP32
- Library WiFiManager (tzapu) — dari artikel #12
Apa itu OTA?
| Metode update | Kelebihan | Kekurangan |
|---|---|---|
| USB serial | Paling andal untuk development | Butuh akses fisik ke board |
| OTA via WiFi | Update node terpasang jauh dari PC | Butuh partition khusus + keamanan |
ESP32 menyimpan firmware di dua slot partition: app0 (jalan sekarang) dan app1 (slot download). Saat OTA selesai, bootloader pindah ke firmware baru.
Partition Table OTA
Di Arduino IDE → Tools → Partition Scheme, pilih skema yang mendukung OTA, misalnya:
- Default 4MB with spiffs — cukup untuk sketch kecil + OTA
- Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS) — jika sketch besar (BME280 + OLED + MQTT)
Penting: Ganti partition sebelum flash pertama OTA. Jika sudah upload tanpa slot OTA, flash ulang via USB dengan skema yang benar.
Install Library
Ikuti setup Arduino IDE & board ESP32 (#2) jika belum.
- WiFiManager (tzapu) — provisioning WiFi
- ArduinoOTA — sudah included di core ESP32 Arduino
Board: esp32 by Espressif (v3.x).
Kode Lengkap: WiFiManager + ArduinoOTA
Sketch minimal OTA — ubah FIRMWARE_VERSION tiap rilis untuk memverifikasi update berhasil.
#include <WiFi.h>
#include <WiFiManager.h>
#include <ArduinoOTA.h>
#define FIRMWARE_VERSION "1.0.0"
void setupOTA() {
ArduinoOTA.setHostname("kindo-esp32-node");
ArduinoOTA.setPassword("kindo_ota_2026");
ArduinoOTA.onStart([]() {
Serial.println("OTA mulai...");
});
ArduinoOTA.onEnd([]() {
Serial.println("\nOTA selesai — reboot...");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("Progress: %u%%\r", (progress * 100) / total);
});
ArduinoOTA.onError([](ota_error_t err) {
Serial.printf("OTA error[%u]: ", err);
if (err == OTA_AUTH_ERROR) Serial.println("Auth gagal");
else if (err == OTA_BEGIN_ERROR) Serial.println("Begin gagal");
else if (err == OTA_CONNECT_ERROR) Serial.println("Connect gagal");
else if (err == OTA_RECEIVE_ERROR) Serial.println("Receive gagal");
else if (err == OTA_END_ERROR) Serial.println("End gagal");
});
ArduinoOTA.begin();
Serial.print("OTA siap — versi firmware: ");
Serial.println(FIRMWARE_VERSION);
Serial.print("Hostname: kindo-esp32-node.local | IP: ");
Serial.println(WiFi.localIP());
}
void setup() {
Serial.begin(115200);
delay(500);
WiFiManager wm;
wm.setConfigPortalTimeout(180);
if (!wm.autoConnect("KindoESP32-Setup")) {
ESP.restart();
}
setupOTA();
}
void loop() {
ArduinoOTA.handle();
delay(10);
}
Penjelasan Bagian Kritis
ArduinoOTA.begin()— daftarkan layanan OTA di port UDP setelah WiFi terhubungArduinoOTA.handle()— wajib dipanggil diloop()secara rutinsetHostname()— muncul sebagaikindo-esp32-nodedi Arduino IDE → PortssetPassword()— lindungi OTA; contoh di sketch untuk demo — di produksi simpan lewat NVS (#12)FIRMWARE_VERSION— naikkan ke"1.0.1"untuk uji OTA berhasil- Partition OTA — sketch harus muat di setengah flash (slot app)
Uji Coba (Step-by-Step)
- Arduino IDE → Tools → Partition Scheme → pilih skema dengan OTA
- Upload sketch via USB (flash pertama)
- Serial Monitor 115200 — catat IP dan pesan
OTA siap - Ubah
FIRMWARE_VERSIONmenjadi"1.0.1"(tanpa ubah logic lain) - Arduino IDE → Tools → Port → pilih
kindo-esp32-node at 192.168.x.x(network port) - Upload lagi — masukkan password OTA saat diminta
- ESP32 reboot — Serial Monitor menampilkan versi 1.0.1
Pro tip: Jika network port tidak muncul, pastikan PC dan ESP32 di subnet WiFi sama, firewall Windows mengizinkan Arduino IDE, dan hostname tidak bentrok dengan perangkat lain.
Gabung dengan Stack Seri 2
OTA bisa ditambahkan ke sketch BME280 + OLED (#14) atau deep sleep (#11):
- Panggil
ArduinoOTA.handle()diloop()utama (node USB/adaptor) - Untuk deep sleep: OTA hanya aktif saat bangun — atau sediakan mode maintenance (GPIO tombol tahan = tidak tidur + OTA aktif)
- Jangan buka portal WiFiManager setiap boot — hanya saat provisioning (#12)
Tips & Troubleshooting
- Network port tidak muncul: Cek WiFi sama, reboot ESP32, coba upload via IP manual (plugin espota)
- OTA_AUTH_ERROR: Password OTA salah — cocokkan
setPassword()dengan prompt Arduino IDE - Sketch too big: Pilih partition lebih besar atau kurangi fitur (OLED/MQTT) untuk slot OTA
- OTA gagal setengah jalan: Jangan cabut listrik; ESP32 rollback ke app0 jika download corrupt
- Portal WiFiManager tiap boot: NVS WiFi ter-reset — lihat troubleshooting #12; coba
wm.resetSettings()lalu provisioning ulang - Compile error WiFiManager: Update tzapu ke 2.x; board esp32 v3.x
- WiFi 2.4 GHz: ESP32 tidak support jaringan 5 GHz saja
Keamanan & Produksi
- Wajib pakai
ArduinoOTA.setPassword()— jangan deploy OTA tanpa auth di LAN pelanggan - Untuk update via internet (bukan LAN), pertimbangkan HTTPS OTA atau tunnel VPN — di luar scope artikel ini
- Simpan password OTA di NVS (pola #12) — jangan hardcode di repo publik
- Node lapangan dengan broker Mosquitto pribadi (#16) — publish topic metadata versi firmware setelah OTA
Langkah Selanjutnya (Seri 2)
- Gabungkan OTA + OLED (#14) + BME280 (#13) untuk node sensor lengkap
- Artikel #21: Home Assistant — integrasi ESP32 via MQTT
- Artikel #17: MQTT TLS — amankan broker di internet
- Capstone greenhouse (#39) — stack lapangan dengan OTA maintenance
Dengan OTA, node ESP32 di Jalur A siap di-maintain tanpa kabel USB. Lanjutkan di halaman artikel Koding Indonesia.