Temperatur messen mit Pico W
(Darstellung auf Webserver im WLAN-Netz)
Bildbox 1 (klick hier)
Temperatur messen mit Pico W
(Darstellung auf Webserver im WLAN-Netz)
Bildbox 1 (klick hier)
Im Juni 2022 hat die Raspberry Pi Foundation die neue Version "Pico W" des Mikrocontroller-Bastelboard "Pico" mit WLAN herausgebracht. D.h. es lassen sich jetzt
auch innerhalb eines bestehenden Netzwerkes Projekte umsetzen, wie die Übermittlung von Messwerten per WLAN auf einen Webbrowser. Vorher musste man dafür
auf zusätzliche Hardware (meist von Waveshare) zurückgreifen. Deshalb jetzt hier das erste Beispiel, wie man mithilfe des internen Temperatursensors die Temperatur aufzeichnet,
oder an einen Webbrowser im Netzwerk übermittelt. Natürlich lassen sich auf die gleiche Weise auch anderen Messwerte (z.B. vom Pico-10DOF-MU wie
Druck, Beschleunigung oder Feuchtigkeit) verarbeiten.
Hardware
- Raspberry Pi Pico W
- Micro USB Kabel
Für dieses Projekt braucht man theoretisch noch nicht mal die beiden 20-poligen Stiftleisten (Header) an der Platine anlöten. Es
genügt einfach die Verbindung mit dem USB-Anschluss. Dabei aber unbedingt beachten, wie die Inbetriebnahme beim Pico erfolgt. Das habe ich z.B.
hier unter "Los gehts"
ausführlich beschrieben und es gibt dazu genügend Darstellungen im Netz.
Noch ein wichtiger Hinweis:
Der Pico W hat im Vergleich zum herkömmlichen Pico eine andere Firmware! Deshalb unbedingt z.B. von hier:
die aktuelle Firmware downloaden.
Los gehts
Zunächst werden die benötigten Pakete importiert, die SSID und das Passwort für Ihr Netzwerk hinzugefügt und eine Funktion
zur Herstellung der WLAN Verbindung eingegeben. Die Zeilen 24 bis 28 braucht es nicht wirklich, aber wenn der Pico-W später ohne Thonny mit
dem Programm als Datei main.py läuft, hat man so eine optische Rückkopplung, ob die Verbindung erfolgreich aufgebaut wurde. Blinkt die LED nicht,
ziehe ich den USB-Stecker und verbinde nach 2-3 Sekunden neu.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import network
import socket
import time
import machine
ssid = 'NAME OF YOUR WIFI NETWORK'
password = 'YOUR SECRET PASSWORD'
pico_led = machine.Pin("LED", machine.Pin.OUT)
sensor_temp = machine.ADC(4)
conversion_factor = 3.3 / (65535)
temperature = 0
def connect():
#Connect to WLAN
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
while wlan.isconnected() == False:
print('Waiting for connection...')
time.sleep(1)
ip = wlan.ifconfig()[0]
print(f'Connected on {ip}')
for i in range(5):
pico_led.value(1)
time.sleep(0.5)
pico_led.value(0)
time.sleep(0.5)
return ip
Die Funktion open_socket(ip) in den Zeilen 32 bis 38 sorgt dafür, dass der Server auf einem Client lauscht, der sich mit ihm
verbinden will. Um einen Socket zu öffnen, muss die IP-Adresse und eine Portnummer angegeben werden.
32
33
34
35
36
37
38
39
def open_socket(ip):
# Open a socket
address = (ip, 80)
connection = socket.socket()
connection.bind(address)
connection.listen(1)
return connection
Als nächstes wird eine einfache Webseite bereitgestellt. In diesem Zusammenhang sei nur so viel erläutert, dass der Wert der
Variable 'temperature' an die Funktion übergeben wird, damit ihn die Website ausgeben kann. Der Button 'form action="./aktuell"' aktualisiet
die Seite bei einem Click und zeigt somit wieder den aktuellen Temperaturwert an.
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
def webpage(temperature):
#Template HTML
html = f"""
<!DOCTYPE html>
<html>
<center>
<body bgcolor=e28743 leftmargin=100 rightmargin=100>
<h1>Pico W<hr>
<p>Onboard Temepatur:</p>
<p>gemessen {temperature} C</p><br>
<form action="./aktuell">
<input style='height: 100px; width: 200px; font-size: 24px' type="submit" value="aktualisieren" />
</form><br>
</body>
</center></h1>
</html>
"""
return str(html)
Nun wird der Webserver gestartet und die Verbindung zur Website hergestellt. Das zeigt das kurze Blinken der Onboard-LED an. In
den Zeilen 75 bis 77 wird der Variable 'temperature' der Wert des internen Sensors zugewiesen. Zeile 78 ruft die Webseite auf und
übergibt den Temperaturwert.
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
def serve(connection):
#Start a web server
pico_led.off()
while True:
client = connection.accept()[0]
request = client.recv(1024)
request = str(request)
try:
request = request.split()[1]
except IndexError:
pass
if request == '/aktuell?':
pico_led.on()
time.sleep(0.25)
pico_led.off()
reading = sensor_temp.read_u16() * conversion_factor
temperature = 27 - (reading - 0.706)/0.001721
temperature = int(temperature*10 +0.5)/10
html = webpage(temperature)
client.send(html)
client.close()
Am Programmende werden die Funktionen aufgerufen. Da die WLAN-Verbindung bestehen bleiben kann, auch wenn Sie den Code stoppen,
können Sie ein try/except hinzufügen, das den Raspberry Pi Pico W zurücksetzt, wenn das Skript gestoppt wird.
82
83
84
85
86
87
try:
ip = connect()
connection = open_socket(ip)
serve(connection)
except KeyboardInterrupt:
machine.reset()
So, damit ist der Code komplett. Vergessen Sie nicht in den Zeilen 6 und 7 den eigenen SSID-Namen und das eigene Password des Netzwerkes
einzugeben. Lassen Sie das Programm zuerst einmal im Thonny laufen, um die IP-Adresse des Webservers zu sehen. Anschließend kann die
IP-Adresse im Browser des Handys eingegeben werden, um die Temperatur anzuzeigen.
Wenn Sie mögen, können Sie das
vollständige Programm hier herunterladen
, entpacken und mit Thonny öffnen. Testen Sie das Programm und speichern dann die Datei mit der Bezeichnung 'main.py' direkt auf
dem Pico-W, damit sie unabhängig von Thonny sofort
beim Verbinden mit dem USB-Anschluss startet (siehe Hinweis oben: blinkt 5 mal bei erfolgreicher Verbindung mit dem WLAN).
Ich habe auch ein passendes Gehäuse für den Pico-W entworfen. Schauen Sie dazu mal
hier auf diese Seite.
Viel Spass und Erfolg beim Ausprobieren.
Zurück
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import network
import socket
import time
import machine
ssid = 'NAME OF YOUR WIFI NETWORK'
password = 'YOUR SECRET PASSWORD'
pico_led = machine.Pin("LED", machine.Pin.OUT)
sensor_temp = machine.ADC(4)
conversion_factor = 3.3 / (65535)
temperature = 0
def connect():
#Connect to WLAN
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
while wlan.isconnected() == False:
print('Waiting for connection...')
time.sleep(1)
ip = wlan.ifconfig()[0]
print(f'Connected on {ip}')
for i in range(5):
pico_led.value(1)
time.sleep(0.5)
pico_led.value(0)
time.sleep(0.5)
return ip
|
32
33
34
35
36
37
38
39
|
def open_socket(ip):
# Open a socket
address = (ip, 80)
connection = socket.socket()
connection.bind(address)
connection.listen(1)
return connection
|
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
def webpage(temperature):
#Template HTML
html = f"""
<!DOCTYPE html>
<html>
<center>
<body bgcolor=e28743 leftmargin=100 rightmargin=100>
<h1>Pico W<hr>
<p>Onboard Temepatur:</p>
<p>gemessen {temperature} C</p><br>
<form action="./aktuell">
<input style='height: 100px; width: 200px; font-size: 24px' type="submit" value="aktualisieren" />
</form><br>
</body>
</center></h1>
</html>
"""
return str(html)
|
Nun wird der Webserver gestartet und die Verbindung zur Website hergestellt. Das zeigt das kurze Blinken der Onboard-LED an. In den Zeilen 75 bis 77 wird der Variable 'temperature' der Wert des internen Sensors zugewiesen. Zeile 78 ruft die Webseite auf und übergibt den Temperaturwert.
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
def serve(connection):
#Start a web server
pico_led.off()
while True:
client = connection.accept()[0]
request = client.recv(1024)
request = str(request)
try:
request = request.split()[1]
except IndexError:
pass
if request == '/aktuell?':
pico_led.on()
time.sleep(0.25)
pico_led.off()
reading = sensor_temp.read_u16() * conversion_factor
temperature = 27 - (reading - 0.706)/0.001721
temperature = int(temperature*10 +0.5)/10
html = webpage(temperature)
client.send(html)
client.close()
|
82
83
84
85
86
87
|
try:
ip = connect()
connection = open_socket(ip)
serve(connection)
except KeyboardInterrupt:
machine.reset()
|
Wenn Sie mögen, können Sie das vollständige Programm hier herunterladen , entpacken und mit Thonny öffnen. Testen Sie das Programm und speichern dann die Datei mit der Bezeichnung 'main.py' direkt auf dem Pico-W, damit sie unabhängig von Thonny sofort beim Verbinden mit dem USB-Anschluss startet (siehe Hinweis oben: blinkt 5 mal bei erfolgreicher Verbindung mit dem WLAN).
Ich habe auch ein passendes Gehäuse für den Pico-W entworfen. Schauen Sie dazu mal
hier auf diese Seite.
Viel Spass und Erfolg beim Ausprobieren.
Zurück