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

Minggu, 04 Januari 2026

Tutorial MicroPython ESP32 - WiFi Manager (Kompatibel ESP8266)

Pada artikel ini, Arduino Indonesia akan membahas cara menggunakan Wi-Fi Manager pada ESP32 dengan firmware MicroPython. Wi-Fi Manager memungkinkan Anda menghubungkan ESP32 ke berbagai Jaringan (Access Point) berbeda tanpa perlu mengubah kredensial secara manual di kode atau mengunggah ulang kode ke papan.

Cara Kerja Wi-Fi Manager

Dengan Wi-Fi Manager, Anda tidak perlu lagi menyimpan kredensial jaringan (SSID dan kata sandi) secara permanen dalam kode. ESP32 akan membuat Access Point (Mode AP) yang dapat Anda akses untuk mengonfigurasi kredensial jaringan, atau secara otomatis akan terhubung ke jaringan yang sudah pernah disimpan.



Berikut adalah alur prosesnya:

1.  Saat ESP32 boot untuk pertama kali, ia akan berperan sebagai Access Point (Mode AP).

2.  Anda dapat terhubung ke Access Point tersebut dengan menyambungkan perangkat ke jaringan WiFiManager, lalu akses alamat IP 192.168.4.1 melalui browser.

3.  Halaman web akan terbuka, memungkinkan Anda memilih dan mengonfigurasi jaringan yang tersedia.

4.  ESP32 akan menyimpan kredensial jaringan tersebut sehingga nantinya dapat terhubung ke jaringan itu (Mode Station).

5.  Setelah SSID dan kata sandi baru diatur, ESP32 akan me-restart, beralih ke Mode Station, dan mencoba terhubung ke jaringan yang telah disimpan.

6.  Jika koneksi berhasil, proses selesai. Jika gagal, ESP32 akan kembali ke mode Access Point untuk mengonfigurasi ulang kredensial jaringan.

 

Untuk mengatur Wi-Fi Manager pada ESP32 menggunakan MicroPython, kita akan menggunakan library WiFiManager karya tayfunulu. Di halaman GitHub library, Anda dapat menemukan diagram yang memberikan gambaran menyeluruh tentang cara kerjanya.



Baca juga: MicroPython OLED SSD1306 ESP32/ESP8266 - Cara Scroll Text dan Menggambar Bentuk

Library WiFiManager untuk MicroPython

Library untuk mengatur Wi-Fi Manager pada ESP32 tidak termasuk dalam paket standar MicroPython. Oleh karena itu, Anda perlu mengunggah library berikut ke papan ESP (simpan dengan nama wifimgr.py).

 

import network

import socket

import ure

import time


ap_ssid = "WifiManager"

ap_password = "tayfunulu"

ap_authmode = 3  # WPA2


NETWORK_PROFILES = 'wifi.dat'


wlan_ap = network.WLAN(network.AP_IF)

wlan_sta = network.WLAN(network.STA_IF)


server_socket = None



def get_connection():

    """return a working WLAN(STA_IF) instance or None"""


    # First check if there already is any connection:

    if wlan_sta.isconnected():

        return wlan_sta


    connected = False

    try:

        # ESP connecting to WiFi takes time, wait a bit and try again:

        time.sleep(3)

        if wlan_sta.isconnected():

            return wlan_sta


        # Read known network profiles from file

        profiles = read_profiles()


        # Search WiFis in range

        wlan_sta.active(True)

        networks = wlan_sta.scan()


        AUTHMODE = {0: "open", 1: "WEP", 2: "WPA-PSK", 3: "WPA2-PSK", 4: "WPA/WPA2-PSK"}

        for ssid, bssid, channel, rssi, authmode, hidden in sorted(networks, key=lambda x: x[3], reverse=True):

            ssid = ssid.decode('utf-8')

            encrypted = authmode > 0

            print("ssid: %s chan: %d rssi: %d authmode: %s" % (ssid, channel, rssi, AUTHMODE.get(authmode, '?')))

            if encrypted:

                if ssid in profiles:

                    password = profiles[ssid]

                    connected = do_connect(ssid, password)

                else:

                    print("skipping unknown encrypted network")

            else:  # open

                connected = do_connect(ssid, None)

            if connected:

                break


    except OSError as e:

        print("exception", str(e))


    # start web server for connection manager:

    if not connected:

        connected = start()


    return wlan_sta if connected else None



def read_profiles():

    with open(NETWORK_PROFILES) as f:

        lines = f.readlines()

    profiles = {}

    for line in lines:

        ssid, password = line.strip("\n").split(";")

        profiles[ssid] = password

    return profiles



def write_profiles(profiles):

    lines = []

    for ssid, password in profiles.items():

        lines.append("%s;%s\n" % (ssid, password))

    with open(NETWORK_PROFILES, "w") as f:

        f.write(''.join(lines))



def do_connect(ssid, password):

    wlan_sta.active(True)

    if wlan_sta.isconnected():

        return None

    print('Trying to connect to %s...' % ssid)

    wlan_sta.connect(ssid, password)

    for retry in range(200):

        connected = wlan_sta.isconnected()

        if connected:

            break

        time.sleep(0.1)

        print('.', end='')

    if connected:

        print('\nConnected. Network config: ', wlan_sta.ifconfig())

        

    else:

        print('\nFailed. Not Connected to: ' + ssid)

    return connected



def send_header(client, status_code=200, content_length=None ):

    client.sendall("HTTP/1.0 {} OK\r\n".format(status_code))

    client.sendall("Content-Type: text/html\r\n")

    if content_length is not None:

      client.sendall("Content-Length: {}\r\n".format(content_length))

    client.sendall("\r\n")



def send_response(client, payload, status_code=200):

    content_length = len(payload)

    send_header(client, status_code, content_length)

    if content_length > 0:

        client.sendall(payload)

    client.close()



def handle_root(client):

    wlan_sta.active(True)

    ssids = sorted(ssid.decode('utf-8') for ssid, *_ in wlan_sta.scan())

    send_header(client)

    client.sendall("""\

        <html>

            <h1 style="color: #5e9ca0; text-align: center;">

                <span style="color: #ff0000;">

                    Wi-Fi Client Setup

                </span>

            </h1>

            <form action="configure" method="post">

                <table style="margin-left: auto; margin-right: auto;">

                    <tbody>

    """)

    while len(ssids):

        ssid = ssids.pop(0)

        client.sendall("""\

                        <tr>

                            <td colspan="2">

                                <input type="radio" name="ssid" value="{0}" />{0}

                            </td>

                        </tr>

        """.format(ssid))

    client.sendall("""\

                        <tr>

                            <td>Password:</td>

                            <td><input name="password" type="password" /></td>

                        </tr>

                    </tbody>

                </table>

                <p style="text-align: center;">

                    <input type="submit" value="Submit" />

                </p>

            </form>

            <p>&nbsp;</p>

            <hr />

            <h5>

                <span style="color: #ff0000;">

                    Your ssid and password information will be saved into the

                    "%(filename)s" file in your ESP module for future usage.

                    Be careful about security!

                </span>

            </h5>

            <hr />

            <h2 style="color: #2e6c80;">

                Some useful infos:

            </h2>

            <ul>

                <li>

                    Original code from <a href="https://github.com/cpopp/MicroPythonSamples"

                        target="_blank" rel="noopener">cpopp/MicroPythonSamples</a>.

                </li>

                <li>

                    This code available at <a href="https://github.com/tayfunulu/WiFiManager"

                        target="_blank" rel="noopener">tayfunulu/WiFiManager</a>.

                </li>

            </ul>

        </html>

    """ % dict(filename=NETWORK_PROFILES))

    client.close()



def handle_configure(client, request):

    match = ure.search("ssid=([^&]*)&password=(.*)", request)


    if match is None:

        send_response(client, "Parameters not found", status_code=400)

        return False

    # version 1.9 compatibility

    try:

        ssid = match.group(1).decode("utf-8").replace("%3F", "?").replace("%21", "!")

        password = match.group(2).decode("utf-8").replace("%3F", "?").replace("%21", "!")

    except Exception:

        ssid = match.group(1).replace("%3F", "?").replace("%21", "!")

        password = match.group(2).replace("%3F", "?").replace("%21", "!")


    if len(ssid) == 0:

        send_response(client, "SSID must be provided", status_code=400)

        return False


    if do_connect(ssid, password):

        response = """\

            <html>

                <center>

                    <br><br>

                    <h1 style="color: #5e9ca0; text-align: center;">

                        <span style="color: #ff0000;">

                            ESP successfully connected to WiFi network %(ssid)s.

                        </span>

                    </h1>

                    <br><br>

                </center>

            </html>

        """ % dict(ssid=ssid)

        send_response(client, response)

        time.sleep(1)

        wlan_ap.active(False)

        try:

            profiles = read_profiles()

        except OSError:

            profiles = {}

        profiles[ssid] = password

        write_profiles(profiles)


        time.sleep(5)


        return True

    else:

        response = """\

            <html>

                <center>

                    <h1 style="color: #5e9ca0; text-align: center;">

                        <span style="color: #ff0000;">

                            ESP could not connect to WiFi network %(ssid)s.

                        </span>

                    </h1>

                    <br><br>

                    <form>

                        <input type="button" value="Go back!" onclick="history.back()"></input>

                    </form>

                </center>

            </html>

        """ % dict(ssid=ssid)

        send_response(client, response)

        return False



def handle_not_found(client, url):

    send_response(client, "Path not found: {}".format(url), status_code=404)



def stop():

    global server_socket


    if server_socket:

        server_socket.close()

        server_socket = None



def start(port=80):

    global server_socket


    addr = socket.getaddrinfo('0.0.0.0', port)[0][-1]


    stop()


    wlan_sta.active(True)

    wlan_ap.active(True)


    wlan_ap.config(essid=ap_ssid, password=ap_password)


    server_socket = socket.socket()

    server_socket.bind(addr)

    server_socket.listen(1)


    print('Connect to WiFi ssid ' + ap_ssid + ', default password: ' + ap_password)

    print('and access the ESP via your favorite web browser at 192.168.4.1.')

    print('Listening on:', addr)


    while True:

        if wlan_sta.isconnected():

            wlan_ap.active(False)

            return True


        client, addr = server_socket.accept()

        print('client connected from', addr)

        try:

            client.settimeout(5.0)


            request = b""

            try:

                while "\r\n\r\n" not in request:

                    request += client.recv(512)

            except OSError:

                pass


            # Handle form data from Safari on macOS and iOS; it sends \r\n\r\nssid=<ssid>&password=<password>

            try:

                request += client.recv(1024)

                print("Received form data after \\r\\n\\r\\n(i.e. from Safari on macOS or iOS)")

            except OSError:

                pass


            print("Request is: {}".format(request))

            if "HTTP" not in request:  # skip invalid requests

                continue


            # version 1.9 compatibility

            try:

                url = ure.search("(?:GET|POST) /(.*?)(?:\\?.*?)? HTTP", request).group(1).decode("utf-8").rstrip("/")

            except Exception:

                url = ure.search("(?:GET|POST) /(.*?)(?:\\?.*?)? HTTP", request).group(1).rstrip("/")

            print("URL is {}".format(url))


            if url == "":

                handle_root(client)

            elif url == "configure":

                handle_configure(client, request)

            else:

                handle_not_found(client, url)


        finally:

            client.close()

 

Ikuti langkah-langkah di bawah ini sesuai dengan IDE yang Anda gunakan:

- Mengunggah Library WiFiManager dengan uPyCraft IDE

- Mengunggah Library WiFiManager dengan Thonny IDE

Mengunggah Library WiFiManager dengan uPyCraft IDE

Bagian ini menjelaskan cara mengunggah library menggunakan uPyCraft IDE. Jika Anda menggunakan Thonny IDE, silakan langsung ke bagian berikutnya.

1. Buat file baru dengan menekan tombol New File.

 

2. Salin kode library WiFiManager ke dalam file tersebut.

3. Setelah menyalin kode, simpan file dengan menekan tombol Save.

 

 

4. Beri nama file tersebut "wifimgr.py" lalu tekan OK.

5. Klik tombol Download and Run.


File akan tersimpan dalam folder perangkat dengan nama "wifimgr.py", seperti yang ditunjukkan pada gambar di bawah ini.

 


Sekarang, Anda dapat menggunakan fungsi-fungsi dari library ini dalam kode Anda dengan melakukan impor library.

Mengunggah Library WiFiManager dengan Thonny IDE

Jika Anda menggunakan Thonny IDE, ikuti langkah-langkah berikut:

1. Salin kode library WiFiManager ke dalam file baru.

2. Simpan file tersebut dengan nama wifimgr.py.

3. Navigasi ke menu Device > Upload current script with the current name.



Selesai. Library telah berhasil diunggah ke papan Anda. Untuk memastikan proses unggah berhasil, ketik perintah berikut di Shell:

 

%lsdevice

 

Perintah tersebut akan menampilkan daftar file yang tersimpan di papan Anda. Pastikan file wifimgr.py termasuk dalam daftar tersebut.


Setelah library berhasil diunggah ke papan, Anda dapat menggunakan fungsionalitasnya dalam kode dengan mengimpor library tersebut.

Mengatur Wi-Fi Manager pada ESP32

Kode berikut mengimplementasikan Wi-Fi Manager pada ESP32. Kami akan menambahkan kemampuan Wi-Fi Manager ke proyek Web Server MicroPython yang sudah ada. Di akhir tutorial, Anda diharapkan dapat menerapkan Wi-Fi Manager ke proyek Anda sendiri.

Buat file main.py dan salin kode berikut.

 

import wifimgr

from time import sleep

import machine


try:

  import usocket as socket

except:

  import socket


led = machine.Pin(2, machine.Pin.OUT)


wlan = wifimgr.get_connection()

if wlan is None:

    print("Could not initialize the network connection.")

    while True:

        pass  # you shall not pass :D


# Main Code goes here, wlan is a working network.WLAN(STA_IF) instance.

print("ESP OK")


def web_page():

  if led.value() == 1:

    gpio_state="ON"

  else:

    gpio_state="OFF"

  

  html = """<html><head> <title>ESP Web Server</title> <meta name="viewport" content="width=device-width, initial-scale=1">

  <link rel="icon" href="data:,"> <style>html{font-family: Helvetica; display:inline-block; margin: 0px auto; text-align: center;}

  h1{color: #0F3376; padding: 2vh;}p{font-size: 1.5rem;}.button{display: inline-block; background-color: #e7bd3b; border: none; 

  border-radius: 4px; color: white; padding: 16px 40px; text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}

  .button2{background-color: #4286f4;}</style></head><body> <h1>ESP Web Server</h1> 

  <p>GPIO state: <strong>""" + gpio_state + """</strong></p><p><a href="/?led=on"><button class="button">ON</button></a></p>

  <p><a href="/?led=off"><button class="button button2">OFF</button></a></p></body></html>"""

  return html

  

try:

  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

  s.bind(('', 80))

  s.listen(5)

except OSError as e:

  machine.reset()


while True:

  try:

    if gc.mem_free() < 102000:

      gc.collect()

    conn, addr = s.accept()

    conn.settimeout(3.0)

    print('Got a connection from %s' % str(addr))

    request = conn.recv(1024)

    conn.settimeout(None)

    request = str(request)

    print('Content = %s' % request)

    led_on = request.find('/?led=on')

    led_off = request.find('/?led=off')

    if led_on == 6:

      print('LED ON')

      led.value(1)

    if led_off == 6:

      print('LED OFF')

      led.value(0)

    response = web_page()

    conn.send('HTTP/1.1 200 OK\n')

    conn.send('Content-Type: text/html\n')

    conn.send('Connection: close\n\n')

    conn.sendall(response)

    conn.close()

  except OSError as e:

    conn.close()

    print('Connection closed')

 

Penjelasan Kode

Kode ini didasarkan pada proyek web server MicroPython ESP32/ESP8266 sebelumnya. Kami hanya melakukan beberapa modifikasi untuk menambahkan Wi-Fi Manager.

 

Untuk menambahkan Wi-Fi Manager, Anda perlu mengimpor library yang telah diunggah sebelumnya ke papan Anda.

 

import wifimgr

Baris kode berikut menangani proses Wi-Fi Manager secara otomatis untuk Anda:

wlan = wifimgr.get_connection()

if wlan is None:

    print("Could not initialize the network connection.")

    while True:

        pass  # you shall not pass :D

 

Variabel wlan adalah instance dari network.WLAN(STA_IF) yang telah diinisialisasi oleh library. Artinya, Anda tidak perlu lagi menulis kode untuk mengatur ESP32 sebagai Station (mode klien WiFi). Saat ESP32 pertama kali diatur sebagai Access Point, ia meninggalkan socket yang terbuka. Hal ini dapat menyebabkan error dan mengakibatkan ESP32 crash. Untuk mencegahnya, kita menginisialisasi dan bind socket di dalam blok try dan except.

 

try:

  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

  s.bind(('', 80))

  s.listen(5)

except OSError as e:

  machine.reset()

 

Jika ada socket yang masih terbuka, kita akan mendapatkan OS Error, dan ESP32 akan di-reset dengan perintah machine.reset(). Tindakan ini akan "melupakan" socket yang terbuka tersebut.

 

Saat kode dijalankan untuk kedua kalinya, kredensial jaringan sudah tersimpan. Oleh karena itu, ESP32 tidak lagi berperan sebagai Access Point, tidak ada lagi masalah dengan socket yang terbuka, dan kode akan berjalan dengan lancar.

Menguji WiFiManager

Unggah file main.py ke ESP32 Anda. Setelah itu, tekan tombol RST (EN) pada papan ESP32 untuk menjalankan program.

 

Di Shell Python, Anda akan melihat pesan yang mirip dengan ini.


Itu berarti ESP32 telah berhasil diatur sebagai Access Point. Sekarang, Anda dapat terhubung ke Access Point tersebut untuk memilih jaringan dan memasukkan kredensial. Ikuti langkah-langkah berikut:

Di komputer atau smartphone Anda, buka pengaturan Wi-Fi dan sambungkan ke jaringan WifiManager.



Kata sandinya adalah tayfunulu. Anda dapat mengubah SSID dan kata sandi default tersebut pada kode library.



Setelah berhasil terhubung ke jaringan WiFiManager, buka browser dan ketikkan alamat 192.168.4.1. Halaman berikut akan dimuat:


Pilih jaringan Anda, masukkan kata sandi, lalu klik Submit. Setelah beberapa detik, Anda akan melihat pesan sukses.


 

Pesan ini berarti ESP32 Anda telah dikonfigurasi sebagai Station Wi-Fi dan terhubung ke jaringan lokal. Sekarang, untuk mengakses ESP32, kembali ke pengaturan Wi-Fi di komputer atau smartphone Anda dan sambungkan kembali ke jaringan Anda sendiri.

Di Shell Python, alamat IP ESP32 akan ditampilkan.


Buka browser Anda dan masukkan alamat IP tersebut. Anda akan mendapatkan akses ke web server berikut dan dapat mengontrol GPIO ESP32.



Baca juga: MicroPython ESP32/ESP8266 - Cara Mengontrol Modul Relay Menggunakan Web Server

Dalam praktik, hasil dan kendala yang ditemui bisa berbeda tergantung perangkat, konfigurasi, versi library, dan sistem yang digunakan.

0 on: "Tutorial MicroPython ESP32 - WiFi Manager (Kompatibel ESP8266)"