samedi 9 juillet 2022

Raspberry Pi Pico W: afficher les mesures d'un capteur sur une page web

Avec le nouveau Raspberry Pi Pico W, c'est maintenant possible de communiquer en WiFi puisque le fabricant a remplacé le logo en forme de framboise par une puce Infineon CYW4343.


Dans cet article, nous transformons le Raspberry Pi Pico W en serveur web, afin d'afficher dans une page web la valeur mesurée par un capteur.

Le Raspberry Pi Pico W sera programmé en Micropython. Il faut donc avoir préalablement installé le firmware Micropython de la façon habituelle: vous pressez le bouton BOOTSEL au moment où vous branchez le Raspberry Pi Pico W à un port USB, puis vous enregistrez le fichier uf2 approprié. Si vous n'êtes pas familier avec la programmation d'un Raspberry Pi Pico en Micropython, cet article d'introduction pourrait vous être utile.


En ce qui concerne le capteur, il s'agira pour l'instant d'un simple potentiomètre branché à la broche GP26 du Raspberry Pi Pico W. Ce sera facile d'adapter le script à d'autres capteurs selon vos besoins.


Voici le script en Micropython: le Raspberry Pi Pico se connecte d'abord à un réseau WiFi (vous devrez écrire le nom du réseau et le mot de passe dans le script pour que ça fonctionne). Ensuite, on créé une page web qui présente la valeur du potentiomètre (puisque j'avais plein d'espace sur la page web, j'ai présenté la valeur brute, le pourcentage et la conversion en volts). 

La page web est réglée pour se rafraîchir automatiquement toutes les 2 secondes, vous réglez évidemment cette fréquence selon vos besoins.

-
'''
On affiche dans une page web la valeur d'un potentiomètre
branché au Raspberry Pi Pico
Plus d'informations sur le blog:
https://electroniqueamateur.blogspot.com/2022/07/raspberry-pi-pico-w-afficher-les.html
'''
# importation des bibliothèques pertinentes
import machine
import socket
import network
import time
# écrivez le nom du réseau wifi et le mot de passe
ssid = 'nom_du_reseau'
password = 'mot_de_passe'
# potentiomètre branché à la broche GP26
pot = machine.ADC(26)
# Contenu de la page web, en html
# les accolades indiquent la position des valeurs numériques variables
html = """<!DOCTYPE html>
<html>
<head> <title>Raspberry Pi Pico W</title> <meta http-equiv=Refresh content=2></head>
<body> <h1>Valeur du potentiom&egrave;tre:</h1>
<h2> {} / 65535 </h2>
<h2> {} % </h2>
<h2> {} V </h2>
</body>
</html>
"""
# connexion au réseau wifi
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
max_wait = 10 # si pas connecté en 10 secondes, on abandonne
print('attente de la connection a ' + ssid, end='')
while max_wait > 0:
if wlan.status() < 0 or wlan.status() >= 3:
break
max_wait -= 1
print('.', end='')
time.sleep(1)
print ('')
if wlan.status() != 3:
raise RuntimeError('echec de la connexion a ' + ssid)
else:
print('connexion reussie')
status = wlan.ifconfig()
print( 'adresse ip = ' + status[0] )
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.bind(addr)
s.listen(1)
while True:
cl, addr = s.accept()
cl_file = cl.makefile('rwb', 0)
while True:
line = cl_file.readline()
if not line or line == b'\r\n':
break
# lecture du potentiomètre et conversion en pourcentage et en volts:
valeur = pot.read_u16()
pourcentage = valeur / 65535 * 100
volts = valeur / 65535 * 3.3
# construction de la page web (on insère les variables)
reponse = html.format(str(valeur), str("%.1f" % pourcentage), str("%.2f" % volts))
cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
cl.send(reponse)
cl.close()
-

Au démarrage du script, si la connexion au réseau wifi est réussie, le programme affiche l'adresse IP du Raspberry Pi Pico W.  Il s'agit de coller cette adresse dans un navigateur web pour accéder à la page web.


Si vous tournez le bouton du potentiomètre, la valeur affichée sera modifiée.



À lire également:

Yves Pelletier (Facebook)

1 commentaire:

  1. Bonjour,

    J'ai bien compris votre tuto, mais maintenant je bute pour pouvoir lire ces valeurs hors de chez moi. Comment communiquer cette page vers un hébergeur web ?

    RépondreSupprimer