Danu Andrean, 01 Jun 2025

OTA, Update Firmware Otomatis Lewat Wifi Dengan Mudah

Penjelasan Gambar

Pernah kebayang gimana caranya update firmware ESP32 tanpa harus colok kabel USB lagi? 🤯 Yup, sekarang kamu bisa update firmware secara OTA (Over-the-Air) lewat jaringan WiFi. Cocok banget buat proyek IoT yang susah dijangkau atau sudah dipasang permanen di lapangan.

Di artikel ini, aku akan membagikan program sederhana yang memungkinkan perangkat ESP32 kamu mengecek versi firmware terbaru dan memperbaruinya secara otomatis jika diperlukan.

Apa itu OTA (Over-the-Air) Update?

OTA adalah proses memperbarui firmware microcontroller lewat jaringan, tanpa perlu koneksi fisik. Dalam dunia IoT, fitur ini sangat penting karena kita bisa melakukan perawatan jarak jauh, hemat waktu dan tenaga!

Alur Percobaan

perhatikan setiap langkah dengan teliti ya, kita akan menggunakan localhost sebagai percobaan.

Upload Program Lengkap Dibawah ke ESP32

upload program seperti biasa ke esp32, tunggu sampai selesai

Export Program BIN

klik di Sketch -> Export Compiled Binary

Penjelasan Gambar

Copy BIN ke Server dan buat file version

silahkan copy file.bin hasil dari yang sudah kita export ke folder server kita. dan juga buat file dengan nama version.txt yang berisi versi dari program kita seperti dibawah ini

Penjelasan Gambar

Kode Lengkap

#include <WiFi.h>
#include <HTTPClient.h>
#include <Update.h>

const char* ssid = "host";
const char* password = "password";
const char* ota_server = "http://ip/";

String ota_bin = String(ota_server) + "ota/ota.ino.bin";
String ota_version = String(ota_server) +"ota/version.txt";


#define FW_VERSION "0.0.1"

void setup() {
  Serial.begin(115200);

  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }

  Serial.println("Connected to WiFi");

}

void loop() {

  Serial.println("Checking for update...");

  String latest_version = fetch_latest_version(ota_version);

  if (is_new_version_available(FW_VERSION, latest_version)) {
    Serial.printf("New version available: %s\n", latest_version.c_str());
    perform_ota_update(); // lanjut update OTA
  } else {
    Serial.println("Firmware is up to date.");
  }

  Serial.print("version -> ");
  Serial.println(FW_VERSION);

  delay(5000);
}

bool is_new_version_available(const String& current_version, const String& new_version) {
  return current_version != new_version; // bisa buat lebih kompleks untuk server
}

String fetch_latest_version(const String& url) {
  HTTPClient http;
  http.begin(url);
  int httpCode = http.GET();
  if (httpCode == HTTP_CODE_OK) {
    String version = http.getString();
    version.trim();
    http.end();
    return version;
  }
  http.end();
  return "";
}

void perform_ota_update() {
  Serial.println("Starting OTA update...");

  HTTPClient http;
  http.begin(ota_bin);

  // Start the update process
  if (Update.begin(UPDATE_SIZE_UNKNOWN)) {
    Serial.println("Downloading...");

    // Start the download
    int httpCode = http.GET();
    if (httpCode == HTTP_CODE_OK) {
      WiFiClient& stream = http.getStream();
      uint8_t buffer[1024];
      int bytesRead;

      // Write the stream to the Update library in chunks
      while ((bytesRead = stream.readBytes(buffer, sizeof(buffer))) > 0) {
        if (Update.write(buffer, bytesRead) != bytesRead) {
          Serial.println("Error during OTA update. Please try again.");
          Update.end(false); // false parameter indicates a failed update
          return;
        }
      }

      // End the update process
      if (Update.end(true)) {
        Serial.println("OTA update complete. Rebooting...");
        ESP.restart();
      } else {
        Serial.println("Error during OTA update. Please try again.");
        Update.end(false); // false parameter indicates a failed update
      }
    } else {
      Serial.println("Failed to download firmware.");
      Update.end(false); // false parameter indicates a failed update
    }
  } else {
    Serial.println("Failed to start OTA update.");
  }

  // End HTTP client
  http.end();
}
Konsep Program

Program ini bekerja dengan cara:

  • Terhubung ke WiFi
  • Mengecek versi firmware terbaru di server
  • Jika ada versi lebih baru dari firmware saat ini, ESP32 akan:
  • Mengunduh file .bin
  • Melakukan update
  • Restart otomatis
Inisialisasi Path Server dan Version
const char* ota_server = "http://ip/";

String ota_bin = String(ota_server) + "ota/ota.ino.bin";
String ota_version = String(ota_server) +"ota/version.txt";

#define FW_VERSION "0.0.1"

ESP32 akan membandingkan FW_VERSION lokal dengan isi dari version.txt di server.

Jika ada perbedaan versi, maka fungsi perform_ota_update() akan dijalankan untuk mengunduh firmware dan memperbarui ESP32 secara langsung.

Mengecek Versi Terbaru

String fetch_latest_version(const String& url) {
  HTTPClient http;
  http.begin(url);
  int httpCode = http.GET();
  if (httpCode == HTTP_CODE_OK) {
    String version = http.getString();
    version.trim();
    http.end();
    return version;
  }
  http.end();
  return "";
}
Fungsi ini membaca versi terbaru dari file teks di server.

Update Firmware
if (Update.begin(UPDATE_SIZE_UNKNOWN)) {
  // Streaming data dan menulis ke memori flash
}

Firmware baru diunduh menggunakan HTTP dan ditulis ke flash memory menggunakan library Update.

Jika semua sukses, ESP32 akan restart dan menjalankan firmware baru.

Penutup

Dengan OTA, kamu bisa:

  • Menghemat waktu
  • Menghindari bongkar pasang alat
  • Menjadikan sistem IoT kamu lebih profesional dan scalable

Kalau kamu lagi ngerjain proyek ESP32, fitur ini WAJIB dicoba!. selamat mencoba! 🚀🚀🚀



#esp32 #arduino #elektronik