<<

Initialisation ESP32 avec MicroPython et bonjour le monde

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.

Initialisation de l'ESP32

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.

Vérifier que le firmware est fonctionnel

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

Faire de l'ESP32 un serveur Web

Transférer le programme sur l'ESP

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.

Se connecter au Wifi.

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": ""
}

Le "serveur" web

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()

Source