L'objectif de cette note est de configurer un ESP32 avec MicroPython et d'en faire un serveur HTTP qui sert une unique page affichant "Bonjour le Monde !" La configuration se fera via un fichier json.
Pour cela, nous allons avoir besoin des outils esptool, picocom et ampy :
yay -S esptool picocom adafruit-ampy
Nous aurons aussi besoin du firmware de l'ESP32, là ça dépend de la version de l'ESP. On trouve le firmware sur cette page : https://micropython.org/download/?port=esp32
Il faudra ajouter l'utilisateur courant au groupe uccp. Selon la saveur de Linux cela peut être le groupe dialout
sudo usermod -a -G uucp user
Ensuite, on efface le précédent firmware :
esptool erase_flash
Et on pousse le firmware sur l'ESP :
esptool --baud 460800 write_flash 0x1000 ESP32_GENERIC-20251209-v1.27.0.bin
Il faudra peut-être préciser le port avec l'option --port /dev/ttyUSB0 (à adapter) s'il ne le trouve pas tout seul.
Dans un premier temps nous allons nous connecter à l'ESP avec screen :
picocom -b 115200 /dev/ttyUSB0
Puis appuyer sur le bouton reset de l'ESP, ce qui devrait amener à une invite du genre :
MicroPython v1.27.0 on 2025-12-09; Generic ESP32 module with ESP32
Type "help()" for more information.
>>>
Il est alors possible de passer quelques commandes en python :
print("Bonjour le monde !")
Pour se déconnecter de l'ESP, il faut faite CTLR + a, CTRL + x
Actuellement l'ESP contient un fichier : boot.py celui-ci ne contient qu'un commentaire.
Il y a deux fichiers importants à déposer sur l'ESP : - boot.py : exécuté à chaque démarrage de l'ESP, ou après un retour de veille prolongée. - main.py : executé après boot.py,
Pour récupérer un fichier :
ampy --port /dev/ttyUSB0 get boot.py
pour déposer un fichier :
ampy --port /dev/ttyUSB0 put main.py
📢 : Ampy ne peut pas fonctionner en même temps que screen.
Tout se passe dans le fichier boot.py. Cela fonctionnerait aussi bien dans le fichier main.py, mais le fichier boot.py est plutôt dédié à l'initialisation.
import network
import json
conf_file = 'conf.json'
def read_json_file(file: str):
""" Read json conf file """
ofile = open(file, 'r')
return json.load(ofile)
def do_connect(ssid: str, key: str):
""" Connect to an AP """
import machine, network
wlan = network.WLAN()
wlan.active(True)
if not wlan.isconnected():
print('connecting to network...')
wlan.connect(ssid, key)
while not wlan.isconnected():
machine.idle()
print('network config:', wlan.ipconfig('addr4'))
def boot():
conf = read_json_file(conf_file)
do_connect(ssid=conf['ssid'], key=conf['key'])
boot()
Deux fonctions :
- la première read_json_file permet de charger les paramètres depuis le fichier de conf au format json.
- la deuxième do_connect permet de se connecter au wifi et d'afficher l'IP
Le fichier de configuration est sous la forme :
{
"ssid": "MON_SUPER_SSID",
"key": ""
}
Ici c'est le fichier main.py qui fait tout.
import socket
html = """
<html>
<head>
<title>Bonjour le monde !</title>
</head>
<body>
<h1>Bonjour le monde !</h1>
</body>
</html>
"""
def main():
""" Fonction principale """
s = socket.socket()
socket_addr = socket.getaddrinfo('0.0.0.0', 80, 0, socket.SOCK_STREAM)[0][-1]
s.bind(socket_addr)
s.listen()
print('listening on', socket_addr)
while True:
conn, addr = s.accept()
print('client connected from', addr)
conn.recv(512)
conn.send('HTTP/1.1 200 OK\n')
conn.send('Content-Type: text/html\n')
conn.send('Connection: close\n\n')
conn.sendall(html)
conn.close()
main()