Streaming dei dati dei sensori tramite WiFi con Raspberry Pi Pico W
Avete mai desiderato trasmettere i dati dei sensori con il vostro Raspberry Pi Pico W?
Uno dei migliori utilizzi del Raspberry Pi Pico W riguarda la sua capacità di servire una pagina web. Ciò significa che è possibile utilizzarlo per monitorare i dati dei sensori dal proprio telefono, a patto che ci si trovi nel raggio d'azione della rete WiFi. Questo progetto fornirà una semplice base su come monitorare i dati di accelerazione e creare un dado digitale che si attiva quando si tocca il sensore ADXL343.
Video
Parti necessarie
Che cos'è l'ADXL343?
L'ADXL343 di Analog Devices è il seguito del suo predecessore, l'ADXL345.
Il sensore può misurare tre assi di misura e ha quattro impostazioni di sensibilità: +-2g, +-4g, +-8g o +-16g. La gamma più bassa offre una maggiore risoluzione per i movimenti lenti, mentre quella più alta è adatta per il tracciamento ad alta velocità.
L'ADXL343 dispone anche di una libreria CircuitPython che possiamo utilizzare in MicroPython, rendendo molto più facile iniziare.
Per poter eseguire lo streaming dei dati del sensore con il Pico W è necessario che i connettori siano saldati sia sull'ADXL343 che sul Pico W.
Collegamento dell'ADXL343 al Pico W
Sono quattro i pin da collegare al Raspberry Pi.
Collegare il VIN ad un pin Uscita a 3,3 V sul Raspberry Pi Pico W;
Collegare il GND a un pin di massa del Pico W;
Collegare il SDA pin a GPIO0;
Collegare il SCL pin a GPIO1.
Flashing del firmware MicroPython per Raspberry Pi Pico W
Per prima cosa, è necessario flashare il firmware MicroPython sul Pico W, se non lo si è già fatto.
Quindi, tenere premuto il pulsante BOOTSEL e collegare il Pico al computer. Dovrebbe apparire una nuova unità. Copiare il file .UF2 scaricato su tale unità.
Configurare Thonny per Raspberry Pi Pico W
Aprire Thonny. Se non l'avete scaricato, prendetelo qui.
Impostare l'interprete su MicroPython (Raspberry Pi Pico) in basso a sinistra della finestra dell'IDE Thonny.
Copiare le librerie sul Pico W
Scaricate qui le librerie e i file dal nostro repo Github.
È possibile scaricare un file ZIP accedendo a questo link e facendo clic sul pulsante verde "Codice" e facendo clic su Scarica lo ZIP.
Una volta scaricato, decomprimetelo in un posto che ricorderete.
Quindi, nell'IDE Thonny, fare clic su Visualizza > File per vedere il proprio file system e quello di Pico W.
Navigare nei file decompressi ed entrare nella cartella MicroPython > II Pico W Sensor Server. Copiate tutto sul vostro Pico W facendo clic con il tasto destro del mouse su ogni elemento e facendo clic su "Upload to /".
Modifica del codice
Per far sì che il Raspberry Pi Pico si connetta alla rete WiFi, è necessario aprire il sito segreti.py e modificare il ssid e pwe il valore della password. Inserire l'SSID (nome) della rete nel primo e la password nel secondo. Salvare il file.
Il indice.html è la pagina web che verrà servita. La riga "<p>X AccX | Y AccY | Z AccZ</p>" e <p>Risultato DiceVal</p> saranno sostituiti con i dati del sensore durante l'esecuzione del progetto.
Collegare il Raspberry Pi Pico al WiFi
Il main.py è il luogo in cui avviene l'azione.
Queste linee lo collegano alla rete WiFi. Non dimenticate di cambiare la stringa in rp2.paese se il vostro Paese non è la Germania (DE).
# Set country to avoid possible errors
rp2.country('DE')
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
# If you need to disable powersaving mode
# wlan.config(pm = 0xa11140)
# See the MAC address in the wireless chip OTP
mac = ubinascii.hexlify(network.WLAN().config('mac'),':').decode()
print('mac = ' + mac)
# Other things to query
# print(wlan.config('channel'))
# print(wlan.config('essid'))
# print(wlan.config('txpower'))
# Load login data from different file for safety reasons
ssid = secrets['ssid']
pw = secrets['pw']
wlan.connect(ssid, pw)
Il LED a bordo lampeggerà tre volte se la connessione WiFi è avvenuta con successo, grazie a queste righe di codice. Verrà inoltre stampato un messaggio e l'indirizzo IP che può essere visualizzato in Thonny. Questo indirizzo IP è utile per accedere al server in seguito.
led = machine.Pin('LED', machine.Pin.OUT)
for i in range(wlan.status()):
led.on()
time.sleep(0.2)
led.off()
time.sleep(0.2)
print('Connected')
status = wlan.ifconfig()
print('ip = ' + status[0])
In caso di errore, il LED lampeggia in base al valore del codice di errore.
Significato degli errori
- 0 = Collegamento interrotto
- 1 = Collegamento unito
- 2 = Collegamento NoIp
- 3 = Collegamento
- -1 = Link Fail
- -2 = Collegamento NoNet
- -3 = Link BadAuth
Collegare Pico W all'ADXL343
Questa riga inizializza un oggetto I2C:
# Initialize I2C
# busio.I2C(SCL, SDA)
i2c = busio.I2C(board.GP1, board.GP0)
Quindi, queste due linee creano l'accelerometro e abilitano il rilevamento del tocco (per la lettura dei dadi).
# Create Accelerometer object
accelerometer = adafruit_adxl34x.ADXL343(i2c)
accelerometer.enable_tap_detection()
È ora di eseguire il codice
Per eseguire il codice, premete il pulsante Esegui in Thonny, che è il pulsante con l'icona di riproduzione in un pulsante verde sulla barra degli strumenti superiore.
Quindi, collegarsi all'indirizzo IP del Raspberry Pi Pico W. Se la shell di Thonny è aperta, è possibile visualizzarla. In alternativa, è possibile accedere al router e scoprire l'indirizzo IP di Pico W.
Il Pico W esegue un server HTTP con una connessione socket e si mette in ascolto delle connessioni, definite qui:
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.bind(addr)
s.listen(1)
Quando ci si connette all'indirizzo IP di Pico W, viene attivato questo codice che aggiorna index.html con i dati più recenti ogni secondo.
cl, addr = s.accept()
print('Client connected from', addr)
cl_file = cl.makefile('rwb', 0)
while True:
line = cl_file.readline()
if not line or line == b'\r\n':
break
response = get_html('index.html')
data = accelerometer.acceleration
tapped = accelerometer.events['tap']
response = response.replace('AccX', str(data[0]))
response = response.replace('AccY', str(data[1]))
response = response.replace('AccZ', str(data[2]))
if tapped:
dice_val = str(random.randint(1,6))
response = response.replace('DiceVal', dice_val)
cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
cl.send(response)
cl.close()
Come si può vedere, sostituisce AccX, AccY e AccZ con i dati del sensore.
Se il sensore viene toccato, viene stampato un numero intero casuale da 1 a 6 nella stringa "DiceVal" della pagina HTML.
Cosa c'è dopo?
Questa esercitazione rappresenta un modo semplice per trasmettere i dati dei sensori a una pagina web con il vostro Raspberry Pi Pico W.
In realtà, questo è il codice che si può utilizzare anche per altri sensori.
La metodologia rimane la stessa. È necessario trovare le librerie corrette per i sensori, quindi modificare main.py e index.html in modo che possano ottenere i dati del sensore e inviare i valori corretti alla pagina web.
Ci sono molti altri progetti che si possono intraprendere, come ad esempio un sensore di temperatura e umidità o forse un progetto di qualità dell'aria con un DHT22 o un DHT22. BME688o un sensore di luminosità con una resistenza alla luce.
Sarebbe sicuramente bello utilizzare le funzionalità di HTML5 per vedere come viene fatto HTML5.
I dati potrebbero essere semplicemente trasmessi come stringa su una porta tramite TCP/UDP piuttosto che in un formato di pagina web, in modo da poter essere letti da un altro computer (per creare indicatori o altro)?
qualcosa come
192.168.1.24:9060
AccX, 7,923, AccY, 1,093, AccZ, -5,452
AccX, 6,423, AccY, 1,241, AccZ, -8,769
Mal angenommen man hätte einen Pico W, der in einer Dauerschleife läuft und Messwerte erfasst; wie können diese Messwerte von einem anderen Pico W über WLAN abgefragt werden?
In deinem Beispielcode es es so, das der Pico W etwas macht, wenn er über HTML angesprochen wird. Nel mio caso ho realizzato una cosa del genere, come una
"getvaluefromotherpico(192.178.2.44, variablename)" - si legge che il dispositivo può essere utilizzato in un'altra schermata e che le informazioni annesse alla rete WLAN possono essere modificate in un altro modo, ad esempio tramite un'interruzione.
Come si può fare?
Grazie e buon lavoro
Ingo
L'altro Pico può essere utilizzato in un'altra situazione, e le sue funzioni per le API REST del primo Pico possono essere modificate?
Capisco il problema, ma non è del tutto chiaro?
Se si tratta di un progetto commerciale, possiamo sempre offrire una consulenza tecnica attiva 🙂
come posso inviare questi dati a thinspeak?
guten Tag, ho un problema simile. Con curl o wget non funziona. Vorrei che i messaggi del Pico sul mio Raspi4 fossero visualizzati e più tardi grafisch darstellen e statistisch auswerten. ???
Non c'è un modulo chiamato network se si aggiunge il modulo netwrk da thonny si lamenta l'assenza di un modulo chiamato socket lol