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 updateKelebihanKekurangan
USB serialPaling andal untuk developmentButuh akses fisik ke board
OTA via WiFiUpdate node terpasang jauh dari PCButuh 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 terhubung
  • ArduinoOTA.handle() — wajib dipanggil di loop() secara rutin
  • setHostname() — muncul sebagai kindo-esp32-node di Arduino IDE → Ports
  • setPassword() — 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)

  1. Arduino IDE → Tools → Partition Scheme → pilih skema dengan OTA
  2. Upload sketch via USB (flash pertama)
  3. Serial Monitor 115200 — catat IP dan pesan OTA siap
  4. Ubah FIRMWARE_VERSION menjadi "1.0.1" (tanpa ubah logic lain)
  5. Arduino IDE → Tools → Port → pilih kindo-esp32-node at 192.168.x.x (network port)
  6. Upload lagi — masukkan password OTA saat diminta
  7. 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() di loop() 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.