Blog Archive

Arduino Indonesia. Gambar tema oleh Storman. Diberdayakan oleh Blogger.

Supported by Electronics 3 in 1

1. Jasa pencetakan PCB single layer dengan harga paling murah.

(Metode Pembuatan dengan Transfer Toner)
>PCB design sendiri (siap cetak) : Rp.150,-/Cm2
>PCB design dari kami : Rp.250,-/Cm2

(Metode Sablon Full Masking dan Silk Screen minimal pemesanan 100 Pcs)
>PCB design sendiri (siap cetak) : Rp.200,-/Cm2
>PCB design dari kami : Rp.250,-/Cm2

2. Jasa perancangan, perakitan, dan pembuatan trainer pembelajaran elektronika untuk SMK dan Mahasiswa.

3. Jasa perancangan, perakitan, dan pembuatan berbagai macam kontroller, sensor, aktuator, dan tranduser.
>Design Rangkaian / Sistem Elektronika
>Design Rangkaian / Sistem Instrumentasi
>Design Rangkaian / Sistem Kendali
>Kerjasama Riset (data atau peralatan)
>Kerjasama Produksi Produk-Produk KIT Elektronika
>Produksi Instrumentasi Elektronika

4. Jasa Pembuatan Proyek, Tugas Akhir, Tugas Laboratorium, PKM, Karya Ilmiah, SKRIPSI, dll

Like My Facebook

Popular Posts

Jumat, 19 Desember 2025

ESP32/ESP8266 - Pembaruan OTA MicroPython melalui Server PHP

Dalam proyek ini, kami akan memberikan contoh implementasi pembaruan OTA (over-the-air) pada papan ESP32/ESP8266 yang menjalankan kode MicroPython menggunakan server PHP. Secara teknis, Anda akan membuat sebuah server PHP yang berfungsi sebagai repositori untuk mengunggah kode baru yang akan dieksekusi pada ESP. Ketika pembaruan atau kode baru tersedia, ESP akan secara otomatis mengunduh kode tersebut, melakukan reboot, dan menjalankan kode yang telah diperbarui.

Gambaran Proyek

Pembaruan OTA (Over-the-Air) adalah metode untuk mengunggah firmware baru ke papan ESP32 atau ESP8266 melalui koneksi Wi-Fi, tanpa bergantung pada komunikasi serial. Fungsi ini sangat krusial dalam skenario di mana akses fisik ke perangkat tidak memungkinkan.

 

Terdapat berbagai pendekatan untuk melakukan pembaruan OTA. Meskipun telah tersedia contoh implementasi menggunakan Arduino IDE, tutorial ini akan berfokus pada pembuatan server PHP sebagai host untuk kode baru atau versi yang diperbarui. ESP akan melakukan polling secara berkala ke server untuk memeriksa ketersediaan pembaruan. Jika ada versi kode yang lebih baru, ESP akan mengunduh dan menginstalnya secara otomatis. Alur kerja sistem ini dapat dilihat pada diagram berikut:



Alur Kerja Sistem

1. Papan ESP32 atau ESP8266 menjalankan tugas-tugas yang telah diprogram.

2. Secara paralel, Anda mengunggah berkas Python baru yang ingin dijalankan ke server PHP (misalnya di Raspberry Pi).

3. ESP memeriksa pembaruan secara berkala dengan mengirim permintaan ke URL `get_ESP_data.php` untuk mencari keberadaan program baru (`program.py`).

4. Jika ada berkas baru yang tersedia, ESP akan mengunduhnya ke sistem file internal, kemudian melakukan reboot.

5. Setelah restart, ESP akan langsung menjalankan skrip Python yang baru diunggah.

6. Di awal eksekusi, skrip baru tersebut berisi perintah untuk mengakses URL `delete_ESP_data.php` guna menghapus berkas dari server PHP, karena kode terbaru telah berjalan.

7. Saat Anda mengunggah kode baru lagi, siklus ini berulang. Catatan penting: Setiap berkas Python baru harus juga memuat instruksi untuk menghapus berkas sebelumnya dari server dan untuk terus memeriksa pembaruan.

Metode Alternatif:

Berikut adalah metode alternatif yang tidak memerlukan penghapusan berkas sebelumnya dan memungkinkan pembaruan untuk beberapa papan sekaligus. Pada metode ini, ESP32 atau ESP8266 tetap menjalankan tugas yang telah ditentukan, dengan beberapa perbedaan kunci:

1. Manajemen Versi: Setiap berkas yang diunggah ke server disertai dengan nomor versi pada namanya (contoh: `program_v2.1.py`).

2. Penautan Dinamis: URL untuk memeriksa pembaruan diambil langsung dari dalam program yang sedang berjalan, yang seharusnya mengindikasikan nama berkas versi selanjutnya yang akan dicari.

3. Tanpa Penghapusan: Tidak diperlukan penghapusan berkas lama karena setiap versi memiliki nama unik. Hal ini memungkinkan beberapa papan ESP yang menjalankan kode yang sama untuk memperbarui diri secara independen, sekaligus menghilangkan kebutuhan akan skrip `delete_ESP_data.php`.

4. Ketersediaan File: File pendukung untuk metode ini disediakan di bagian akhir tutorial.

Pengembangan Lebih Lanjut:

Untuk sistem yang lebih robust, pendekatan yang lebih baik adalah dengan membuat basis data SQL pada server. Basis data ini dapat berisi rekaman untuk setiap perangkat ESP dengan field seperti:

- ID (dapat menggunakan alamat MAC),

- Versi firmware yang sedang berjalan,

- Waktu pembaruan terakhir (instruksi detail tidak disertakan dalam tutorial ini).

Dengan struktur ini, skrip PHP dapat disesuaikan untuk:

1. Meminta ID perangkat.

2. Menyediakan pembaruan yang sesuai.

3. Memperbarui rekaman data untuk ESP yang melakukan permintaan.

Pemrograman MicroPython


Dalam tutorial ini, kita akan memprogram papan ESP32/ESP8266 menggunakan MicroPython. Papan Anda harus telah di-flash dengan firmware MicroPython dan Anda perlu memiliki IDE MicroPython untuk memprogramnya. Kami akan menggunakan Thonny IDE, tetapi Anda dapat menggunakan perangkat lunak lain yang kompatibel dengan MicroPython.

- Memulai dengan MicroPython di ESP32 dan ESP8266

- Memilih IDE MicroPython untuk ESP32 dan ESP8266

- Meng-flash Firmware MicroPython menggunakan IDE yang Dipilih

PHP Server


ESP akan berkomunikasi dengan server PHP secara berkala untuk memeriksa ketersediaan pembaruan (berkas baru yang berisi kode MicroPython). Anda dapat membuat server PHP lokal pada perangkat seperti Raspberry Pi, atau alternatifnya, membuat server PHP di cloud (menggunakan layanan hosting dan nama domain) yang dapat diakses dari mana saja.

Server PHP Lokal

Untuk contoh ini, kita akan membuat server PHP lokal pada Raspberry Pi. Oleh karena itu, Anda juga memerlukan Raspberry Pi untuk mengikuti tutorial ini:

- Siapkan Papan Raspberry Pi: Lihat rekomendasi Raspberry Pi Starter Kit terbaik.

- Setup Dasar Raspberry Pi: Setelah memiliki Raspberry Pi, ikuti panduan ini untuk menyiapkannya:

    - Instal Raspberry Pi OS.

    - Konfigurasi Koneksi Wi-Fi.

    - Aktifkan dan Hubungkan via SSH.

- Upload File ke Server: Anda juga memerlukan cara untuk mengunggah file ke server PHP dari jarak jauh. Kami akan menggunakan FileZilla, tetapi Anda bisa menggunakan metode lain yang sesuai.

    - Unduh FileZilla Client di sini.

Instruksi untuk membuat server PHP lokal sendiri akan dijelaskan dalam tutorial ini.

Server PHP di Cloud

Sebagai alternatif, Anda dapat membuat server PHP di cloud menggunakan layanan web hosting dan nama domain, seperti Bluehost atau DigitalOcean. Tutorial ini tidak memberikan panduan khusus untuk ini, namun jika Anda telah familiar dengan manajemen server hosting, Anda dapat mengadaptasi langkah-langkahnya dengan mudah.

Membuat Server PHP

Dalam tutorial ini, kita akan membuat server PHP lokal pada Raspberry Pi. Sebagai opsi, Anda juga dapat membuat server PHP di cloud (instruksi tidak disertakan).

Sebelum melanjutkan, pastikan Anda telah:

1.  Menginstal Raspberry Pi OS.

2.  Mengonfigurasi koneksi Wi-Fi.

3.  Mengaktifkan dan dapat terhubung via SSH.

Anda dapat menjalankan perintah-perintah berikut ini langsung pada Raspberry Pi yang dikonfigurasi sebagai komputer desktop, atau melalui koneksi SSH.

Memperbarui dan Meningkatkan Sistem

Jalankan perintah berikut untuk memperbarui sistem Raspberry Pi Anda. Proses ini memerlukan waktu beberapa menit.

 

pi@raspberrypi:~ $ sudo apt update && sudo apt upgrade -y

 

Mengubah Izin Akses (Permissions) untuk Pengguna `pi`

Langkah ini diperlukan agar pengguna `pi` memiliki hak untuk memodifikasi file di dalam direktori server web.

 

pi@raspberrypi:~ $ sudo chown pi:pi

 

Menginstal Apache2

Selanjutnya, install Apache2. Apache2 adalah perangkat lunak server web yang paling banyak digunakan. Untuk menginstalnya pada Raspberry Pi, jalankan perintah berikut:

 

pi@raspberrypi:~ $ sudo apt install apache2 -y

 

Selesai! Apache kini telah terinstal. Untuk menguji instalasi, arahkan ke direktori `/var/www/html` dan lihat daftar file di dalamnya:

 

pi@raspberrypi:~ $ cd /var/www/html

pi@raspberrypi:/var/www/html $ ls -al

index.html

 

Di dalam folder tersebut, seharusnya terdapat sebuah file `index.html`. Untuk membuka halaman tersebut di browser, Anda perlu mengetahui alamat IP Raspberry Pi. Gunakan perintah berikut:

 

pi@raspberrypi:/var/www/html $ hostname -I

 


Dalam kasus saya, alamat IP Raspberry Pi adalah 192.168.1.86. Jika Anda membuka alamat IP Raspberry Pi Anda di browser mana pun dalam jaringan lokal yang sama, halaman web seperti berikut akan muncul (contoh: http://192.168.1.86):

Menginstal PHP di Raspberry Pi

PHP adalah bahasa scripting sisi server. PHP (Hypertext Preprocessor) digunakan untuk mengembangkan aplikasi web dinamis. Sebuah file PHP berisi tag `<?php ... ?>` dan diakhiri dengan ekstensi `.php`. Untuk menginstal PHP di Raspberry Pi, jalankan perintah berikut:

 

pi@raspberrypi:/var/www/html $ sudo apt install php -y

 

Anda dapat menghapus file `index.html` dan membuat skrip PHP untuk menguji instalasi:

 

pi@raspberrypi:/var/www/html $ sudo rm index.html

pi@raspberrypi:/var/www/html $ sudo nano index.php

 

Dalam file `index.php` Anda, tambahkan kode berikut untuk menampilkan pesan "hello world":

 

<?php echo "hello world"; ?>

 


Untuk menyimpan file, tekan Ctrl+X, kemudian Y, dan terakhir tekan Enter untuk keluar.

 

Terakhir, mulai ulang layanan Apache2:

 

pi@raspberrypi:/var/www/html $ sudo service apache2 restart

 

Untuk menguji apakah Apache2 dapat melayani file `.php`, buka alamat IP Raspberry Pi di browser. 

 

Jika berhasil, halaman akan menampilkan pesan "hello world" dari skrip `index.php` yang telah dibuat sebelumnya.

 


Jika semua berfungsi dengan baik, Anda dapat menghapus file `index.php` dari direktori `/var/www/html`:

 

pi@raspberrypi:/var/www/html $ sudo rm index.php

 

Membuat Server PHP – `get_ESP_data.php`

Sekarang, buat sebuah file bernama `get_ESP_data.php`.

 

pi@raspberrypi: sudo nano get_ESP_data.php

 

Masukkan kode PHP berikut:

 

<?php

  $file = $_GET['file'];

  $dir = getcwd();

  $file = $dir.'/'.$file;

  $myfile = fopen($file, "r") or die("FAIL");

  echo file_get_contents($file);

  fclose($m

yfile);

?>

 

Tekan Ctrl+X, lalu Y, dan tekan Enter untuk keluar sekaligus menyimpan file.

 

Skrip di atas berfungsi untuk membaca file pembaruan (kode baru yang diunggah ke direktori yang sama) dan mengirimkan isinya sebagai respons terhadap permintaan dari ESP saat fungsi `check_for_updates` dipanggil, seperti yang akan kita lihat nanti.

Membuat Server PHP – `delete_ESP_data.php`

Buat file lain dengan nama `delete_ESP_data.php`.

 

pi@raspberrypi: sudo nano delete_ESP_data.php

 

Masukkan kode PHP berikut:

 

<?php

  $file = $_GET['file'];

  $dir = getcwd();

  $file = $dir.'/'.$file;

  unlink($file);

?>

 

Tekan Ctrl+X, lalu Y, dan tekan Enter untuk keluar dan menyimpan file.

 

File ini akan menghapus file pembaruan dari server PHP setelah berhasil diunduh oleh ESP.

Selesai. Server PHP telah dibuat dan siap mengirimkan file baru ke ESP serta menghapusnya sesuai dengan permintaan yang berbeda.

Memprogram ESP32/ESP8266

Sebelum melanjutkan, pastikan papan Anda telah di-flash dengan firmware MicroPython.

Untuk menguji server PHP dan mengintegrasikannya dengan papan ESP guna melakukan pembaruan OTA, kami akan memberikan contoh sederhana. Contoh ini memerlukan tiga file: `boot.py`, `main.py`, dan `program.py`.

boot.py

Gunakan IDE MicroPython pilihan Anda, buat file bernama `boot.py` dengan konten berikut dan unggah ke papan ESP Anda.

 

try:

  import usocket as socket

except:

  import socket


try:

  import urequests as requests

except:

  import requests

import os 

import sys

import esp

esp.osdebug(None)

import gc

gc.collect()

from utime import sleep

from utime import sleep_ms

import network


OTA = 0

 

File ini mengimpor library yang diperlukan untuk koneksi jaringan. Ia juga membuat variabel boolean bernama `OTA` yang menunjukkan apakah sudah waktunya untuk melakukan pembaruan OTA (mengunduh file baru dari server PHP).

 

OTA = 0

 

ESP akan menjalankan `boot.py` terlebih dahulu. Saat pertama kali dijalankan, belum ada pembaruan yang tersedia, sehingga kita atur variabel `OTA` ke nilai 0.

main.py

Buat file bernama `main.py` dengan konten berikut dan unggah ke papan ESP Anda. Anda perlu memodifikasi file ini untuk menyertakan kredensial jaringan (SSID dan password) Anda serta URL server PHP untuk pembaruan.

 

"""

OTA updater for ESP32 running Micropython by David Flory.

Tutorial: https://randomnerdtutorials.com/esp32-esp8266-micropython-ota-updates/


This is a simple way to run a python program on the ESP32 and download updates or a different program

to run from an HTTP server, either from the web or your local network.


Put all the imports needed for internet in boot, plus a global variable called OTA

The main file creates the internet connection then runs whatever program is required. I call the program 'program.py'


program.py is the main program, and can be whatever you want. The only requisite for this to work with OTA is that

it must be imported into the module 'main' and it must check periodically for updates.

The Program should have a function that can be called by 'main' to start it.


We can overwrite program.py while it is running, because it has been imported on boot into the namespace of 'main'.

All that is required is a reboot after a new Program.py is downloaded. In this case the deep sleep function will reboot the ESP32.


"""

#When prog.py finishes, if OTA = True, main downloads it and overwrites program.py, then effectively reboots.

#If OTA is false main just exits.


#this is the program to be executed. Note we do not use the '.py' extension.

import program


import machine #needed for the deep sleep function


#URLs for the updates

#replace with your PHP server URL or local IP address (Raspberry Pi IP Address)

upd_url="http://192.168.1.XXX/get_ESP_data.php?file=program.py"



#change your wifi credentials here. 

ssid = 'REPLACE_WITH_YOUR_SSID'

password = 'REPLACE_WITH_YOUR_PASSWORD'


print('OTA is ' + str(OTA))#debug


#here we set up the network connection

station = network.WLAN(network.STA_IF)

station.active(False)

station.active(True)

#station.config(reconnects = 5)


station.connect(ssid,password)


while station.isconnected() == False:

  pass


#print board local IP address

print(station.ifconfig())


if OTA == 0:

    print('starting program')

    OTA = program.mainprog(OTA)

    

#mainprog() is the starting function for my program. OTA is set to 0 on boot so the first time this code

#is run, it sets up the network connection and then runs the program.

#The following code only runs when program.py exits with OTA = 1


if OTA == 1:

    print('Downloading update')

    #download the update and overwrite program.py

    response = requests.get(upd_url)

    x = response.text.find("FAIL")

    if x > 15:

        #download twice and compare for security

        x = response.text

        response = requests.get(upd_url)

        if response.text == x:

            f = open("program.py","w")

            f.write(response.text)

            f.flush()

            f.close

            

            #soft reboot 

            print('reboot now')

            machine.deepsleep(5000)

 

Berikut adalah ringkasan fungsi dari file ini:

1.  Menghubungkan papan ESP ke internet.

2.  Menjalankan tugas program Anda (apa pun yang Anda definisikan dalam file `program.py`, yang akan kita lihat nanti).

3.  Setelah tugas selesai, jika ada pembaruan tersedia, ESP akan mengunduhnya dan menimpa file `program.py` yang ada.

4.  Setelah itu, ESP masuk ke mode deep sleep selama beberapa detik.

5.  Setelah bangun dari deep sleep, proses dimulai kembali dengan kode yang baru diunduh (pembaruan OTA berhasil).

Baris berikut mengimpor file `program.py` - ini adalah program yang akan dieksekusi, yang berisi tugas-tugas yang Anda inginkan untuk dijalankan oleh ESP. Perhatikan bahwa kita tidak menggunakan ekstensi `.py` saat mengimpornya.

 

import program

 

Kemudian, impor modul `machine` yang diperlukan untuk fungsi deep sleep.

 

import machine

 

Modifikasi variabel `upd_url` dengan alamat IP atau URL server PHP Anda. Dalam kasus saya, alamat server PHP di Raspberry Pi adalah 192.168.1.86, sehingga `upd_url` harus diatur sebagai berikut:

 

upd_url="http://192.168.1.86/get_ESP_data.php?file=program.py"

 

Masukkan kredensial jaringan Anda (SSID dan password) ke dalam variabel berikut, agar ESP dapat terhubung ke jaringan Anda.

 

ssid = 'REPLACE_WITH_YOUR_SSID'

password = 'REPLACE_WITH_YOUR_PASSWORD'

 

Baris berikut mencetak status terkini dari variabel `OTA` untuk keperluan debugging.

 

print('OTA is ' + str(OTA))

 

Potongan kode berikut menghubungkan papan ESP ke jaringan lokal Anda dan mencetak alamat IP yang diperoleh:

 

#here we set up the network connection

station = network.WLAN(network.STA_IF)

station.active(False)

station.active(True)

station.config(reconnects = 5)


station.connect(ssid,password)


while station.isconnected() == False:

  pass


#print board local IP address

print(station.ifconfig())

 

Terakhir, kode memeriksa nilai variabel `OTA`. Jika nilainya 0, maka program utama yang berisi tugas-tugas Anda (`main.py`) akan dijalankan.

 

`mainprog()` adalah fungsi awal untuk program kita. Variabel `OTA` diatur ke 0 saat boot, sehingga pada eksekusi pertama kali, kode ini akan menyiapkan koneksi jaringan dan kemudian menjalankan program.

 

if OTA == 0:

    print('starting program')

    OTA = program.mainprog(OTA)

 

Kode berikut hanya akan dijalankan ketika `program.py` selesai dieksekusi dengan status `OTA = 1`. Bagian kode ini mengambil konten dari `program.py` yang berada di server PHP dan menyimpannya di papan ESP dengan nama file `program.py`, sehingga menimpa file `program.py` yang saat ini ada. Setelah itu, ESP akan masuk ke mode tidur (deep sleep) selama lima detik (seperti soft reboot). Saat papan ESP melakukan reboot berikutnya, ia akan menjalankan kode baru tersebut.

 

if OTA == 1:

    print('Downloading update')

    #download the update and overwrite program.py

    response = requests.get(upd_url)

    x = response.text.find("FAIL")

    if x > 15:

        #download twice and compare for security

        x = response.text

        response = requests.get(upd_url)

        if response.text == x:

            f = open("program.py","w")

            f.write(response.text)

            f.flush()

            f.close

            

            #soft reboot 

            print('reboot now')

            machine.deepsleep(5000)

 

program.py

Buat sebuah file bernama `program.py`. Modifikasi kodenya untuk menyertakan alamat IP server lokal Anda. Kemudian, unggah file tersebut ke papan ESP Anda.

 

Ini adalah program sederhana untuk mendemonstrasikan fungsionalitas pembaruan OTA yang bekerja sama dengan `main.py`. Program ini bisa sesederhana atau serumit yang Anda inginkan, namun harus mengandung fungsi-fungsi berikut: `check_for_updates()`, `mainprog()`, dan `program_tasks()`.

 

"""

A simple program to demonstrate OTA update functionality in conjunction with main.py

The program can be as simple or complicated as you like, but must contain these functions.

The variable 'url' should be the full web address to the location of the update file and the PHP script which

returns it. below is the PHP script, named 'get_ESP_data.php'.


<?php

    $file = $_GET['file'];

    $dir = getcwd();

    $file = $dir.'/'.$file;

    $myfile = fopen($file, "r") or die("FAIL");

    echo file_get_contents($file);

    fclose($myfile);

?>


The script reads the update file and echo's it back in response to the request made by the

'check_for_updates' function.


Here is the delete script for deleting the updates.

<?php

    $file = $_GET['file'];

    $dir = getcwd();

    $file = $dir.'/'.$file;

    unlink($file);

?>


"""

import urequests

from utime import sleep

#The URL to use to get updates, full path to the PHP script (Raspberry Pi IP Address). The update file must be in the same

#directory as the PHP script.

#REPLACE WITH YOUR RASPBERRY PI IP ADDRESS

upd_url="http://192.168.1.XXX/get_ESP_data.php?file=program.py"

del_url = "http://192.168.1.XXX/delete_ESP_data.php?file=program.py"


def check_for_updates(OTA):

    try:

        #print ('Checking for updates')

        response = urequests.get(upd_url)

        x = response.text.find("FAIL")

        if x > 15:

            OTA = 1

            print('There is an update available')

            return(OTA)

        else:

            print('There are no updates available.')

            return(OTA)


    except:

        print('unable to reach internet')

        return(OTA)



def mainprog(OTA):

    print('Mainprog - OTA is' + str(OTA))

    #This is the entry point for your program code

    #first delete any update files on server. The reasoning here is that if this program is an update we

    #do not want to download it again. If this program is not an update, it is unlikely there will be an

    #update present anyway. If we do not delete it, the program will keep on updating on every loop and rebooting.

    response = urequests.get(del_url)

    print('Program start')

    while OTA == 0:

        program_tasks()

        OTA = check_for_updates(OTA)

        if OTA == 1:

           return(OTA)

        print('OTA = ' + str(OTA))


def program_tasks():

    #do program tasks. If continuous loop, use counter or sleep to pass some time between

    #update checks. At your designated point, check for updates.

    sleep(2)

    print('Tasks completed, entering loop 2')

    sleep(2)

    print('Tasks completed, entering loop 3')

    sleep(2)

    print('Tasks completed, entering loop 4')

    sleep(2)

    print('Tasks completed, entering loop 5')

    sleep(2)

    print('5 loops completed, checking for updates')

 


Pertama, impor modul apa pun yang mungkin diperlukan untuk tugas Anda. Anda harus menyertakan pustaka `urequests` agar ESP dapat melakukan permintaan ke server PHP.

 

import urequests

from utime import sleep

 

Perbarui variabel berikut dengan memasukkan alamat IP server PHP lokal Anda atau URL server web cloud Anda. Hanya ubah bagian yang berisi alamat IP. Sisa URL harus tetap seperti yang ditunjukkan.

 

upd_url="http://192.168.1.86/get_ESP_data.php?file=program.py"

del_url = "http://192.168.1.86/delete_ESP_data.php?file=program.py"

 

Fungsi `check_for_updates()` memeriksa ketersediaan pembaruan dengan melakukan permintaan ke `upd_url`. Fungsi ini mengembalikan nilai variabel `OTA`: 0 jika tidak ada pembaruan, atau 1 jika ada pembaruan:

 

def check_for_updates(OTA):

    try:

        #print ('Checking for updates')

        response = urequests.get(upd_url)

        x = response.text.find("FAIL")

        if x > 15:

            OTA = 1

            print('There is an update available')

            return(OTA)

        else:

            print('There are no updates available.')

            return(OTA)


    except:

        print('unable to reach internet')

        return(OTA)

 

Fungsi `mainprog()` adalah titik masuk (entry point) untuk kode program Anda (fungsi ini dipanggil di dalam file `main.py`).

 

def mainprog(OTA):

    print('Mainprog - OTA is' + str(OTA))

    response = urequests.get(del_url)

    print('Program start')

    while OTA == 0:

        program_tasks()

        OTA = check_for_updates(OTA)

        if OTA == 1:

           return(OTA)

        print('OTA = ' + str(OTA))

 

Pertama, fungsi ini menghapus semua file pembaruan di server dengan melakukan permintaan ke `del_url`. Alasannya adalah: jika program ini adalah sebuah pembaruan, kita tidak ingin mengunduhnya lagi. Jika program ini bukan sebuah pembaruan, kecil kemungkinan ada file pembaruan yang tersisa. Jika kita tidak menghapusnya, program akan terus memperbarui diri pada setiap putaran dan melakukan reboot.

 

Terakhir, fungsi `program_tasks()` seharusnya berisi tugas-tugas yang ingin Anda lakukan dengan papan ESP, seperti membaca sensor, pencatatan data (data logging), mengontrol keluaran (output), atau tugas lainnya. Untuk penyederhanaan, kita hanya mencetak pesan di shell MicroPython.

 

def program_tasks():

    #do program tasks. If continuous loop, use counter or sleep to pass some time between

    #update checks. At your designated point, check for updates.

    sleep(2)

    print('Tasks completed, entering loop 2')

    sleep(2)

    print('Tasks completed, entering loop 3')

    sleep(2)

    print('Tasks completed, entering loop 4')

    sleep(2)

    print('Tasks completed, entering loop 5')

    sleep(2)

    print('5 loops completed, checking for updates')

 

Jika Anda menggunakan perulangan berkelanjutan (continuous loop), gunakan penghitung (counter) atau jeda waktu (sleep) untuk memberikan interval antara pengecekan pembaruan. Pada titik yang telah Anda tentukan, lakukan pengecekan pembaruan.

 

Jika belum, unggah semua file sebelumnya ke papan ESP Anda dengan urutan: `boot.py`, `main.py`, dan `program.py`. Reset papan Anda agar kode mulai berjalan. Pesan berikut akan dicetak di shell (ini berasal dari fungsi `program_tasks`).

 


Biarkan papan tetap terhubung ke komputer agar kita dapat melihat di shell apakah pembaruan berhasil dan untuk memudahkan pemahaman cara kerjanya. Contoh ini semata untuk tujuan demonstrasi, karena tujuan OTA sebenarnya adalah agar Anda tidak perlu selalu menghubungkan papan ke komputer.

Demonstrasi: Pembaruan OTA

Sekarang, buat file baru yang juga bernama `program.py` dan simpan di komputer Anda. File ini akan berisi kode yang diperbarui. Dalam contoh ini, kita hanya akan mengubah pesan yang dicetak di Shell. Kode ini akan kita unggah ke papan ESP secara over-the-air melalui server PHP.

 

import urequests

from utime import sleep

#The URL to use to get updates, full path to the PHP script (Raspberry Pi IP Address). The update file must be in the same

#directory as the PHP script.

#REPLACE WITH YOUR RASPBERRY PI IP ADDRESS

upd_url="http://192.168.1.XXX/get_ESP_data.php?file=program.py"

del_url = "http://192.168.1.XXX/delete_ESP_data.php?file=program.py"


def check_for_updates(OTA):

    try:

        #print ('Checking for updates')

        response = urequests.get(upd_url)

        x = response.text.find("FAIL")

        if x > 15:

            OTA = 1

            print('There is an update available')

            return(OTA)

        else:

            print('There are no updates available.')

            return(OTA)


    except:

        print('unable to reach internet')

        return(OTA)



def mainprog(OTA):

    print('Mainprog - OTA is' + str(OTA))

    #This is the entry point for your program code

    #first delete any update files on server. The reasoning here is that if this program is an update we

    #do not want to download it again. If this program is not an update, it is unlikely there will be an

    #update present anyway. If we do not delete it, the program will keep on updating on every loop and rebooting.

    response = urequests.get(del_url)

    print(response)

    print('Program start')

    while OTA == 0:

        program_tasks()

        OTA = check_for_updates(OTA)

        if OTA == 1:

           return(OTA)

        print('OTA = ' + str(OTA))


def program_tasks():

    #do program tasks. If continuous loop, use counter or sleep to pass some time between

    #update checks. At your designated point, check for updates.

    sleep(2)

    print('Updated Program 2, entering loop 2')

    sleep(2)

    print('Updated Program 2, entering loop 3')

    sleep(2)

    print('Updated Program 2, entering loop 4')

    sleep(2)

    print('Updated Program 2, entering loop 5')

    sleep(2)

    print('5 loops completed, checking for updates')

 

Catatan: Dalam penerapan praktis, pastikan kode Anda berfungsi dengan baik sebelum melakukan pembaruan over-the-air. Jika kode baru menyebabkan crash, Anda mungkin perlu menghubungkan kembali papan ke komputer untuk memperbaiki masalah.

 

Untuk mengunggah program baru ke server PHP, kita akan menggunakan FileZilla. Anda dapat menggunakan metode lain yang sesuai - yang penting file `program.py` harus ditempatkan di direktori yang sama dengan file PHP yang telah kita buat sebelumnya. Jika Anda mengikuti semua langkah tutorial, file harus ditempatkan di direktori `/var/www/html`.

Untuk membangun koneksi ke Raspberry Pi, gunakan pengaturan berikut (default):

- Host: `raspberrypi`

- Username: `pi`

- Password: `raspberry`

- Port: `22`

 


Setelah mengunggah file baru menggunakan FileZilla, ESP akan mendeteksi adanya file baru dan mengunduhnya. Kemudian, ESP akan masuk ke mode deep sleep, dan mulai menjalankan kode yang baru diunduh. Kode baru ini akan mencetak pesan yang berbeda dari sebelumnya.



Metode Alternatif

Seperti yang telah disebutkan sebelumnya, berikut adalah metode alternatif yang tidak memerlukan penghapusan file sebelumnya dan memungkinkan pembaruan untuk beberapa papan sekaligus.

1. Papan ESP32 atau ESP8266 menjalankan tugas-tugas yang telah Anda definisikan.

2. File yang Anda unggah memiliki nomor versi pada namanya.

3. URL untuk pembaruan diambil langsung dari program baru yang Anda unggah (harus menunjukkan nama file versi berikutnya yang akan dipanggil).

4. Anda tidak perlu menghapus file apa pun karena semua versi memiliki nama unik. Dengan demikian, beberapa papan yang menjalankan kode yang sama dapat memperbarui diri sendiri karena kita tidak lagi menghapus file dari kode, sehingga file `delete_ESP_data.php` dapat dihapus.

5. Pengguna perlu menghapus file mereka sendiri secara berkala setelah semua papan telah diperbarui.

File-file dari contoh sebelumnya telah dimodifikasi untuk metode alternatif ini. Berikut adalah file-file yang diperlukan:

- `boot.py` (sama seperti contoh sebelumnya)

- `main.py`

- `program1.py`

- `program2.py`










Siap Untuk Membuat Proyek Impianmu Menjadi Kenyataan?

Klik di sini untuk chat langsung via WhatsApp dan dapatkan dukungan langsung dari tim ahli kami! 

 

0 on: "ESP32/ESP8266 - Pembaruan OTA MicroPython melalui Server PHP"