Costruisci la tua stazione meteorologica Raspberry Pi

Build Your Own Raspberry Pi Weather Station



Raspberry Pi Sense Hat è una scheda aggiuntiva che può essere utilizzata con i computer a scheda singola Raspberry Pi. Il Raspberry Pi Sense Hat ha un display LED 8×8 e un joystick a 5 pulsanti ed è dotato dei seguenti sensori:

  1. Giroscopio
  2. Accelerometro
  3. Magnetometro
  4. Temperatura
  5. Pressione barometrica
  6. Umidità

In questo articolo, ti mostrerò come creare un'applicazione web per una stazione meteorologica basata su API Python utilizzando il temperatura , pressione barometrica , e umidità sensori del Raspberry Pi Sense Hat. Per seguire questo articolo, avrai bisogno di quanto segue:







  1. Un Raspberry Pi 3 o Raspberry Pi 4 con connettività di rete.
  2. Un modulo Raspberry Pi Sense Hat.
  3. Un adattatore di alimentazione micro-USB (Raspberry Pi 3) o USB Type-C (Raspberry Pi 4)
  4. Una scheda microSD da 16 GB o 32 GB con sistema operativo Raspberry Pi.
  5. Un laptop o un computer desktop per l'accesso al desktop remoto VNC o l'accesso SSH al Raspberry Pi.

NOTA: In questo articolo, ci collegheremo al Raspberry Pi in remoto tramite VNC o SSH utilizzando la configurazione headless del Raspberry Pi. Se non desideri accedere al tuo Raspberry Pi in remoto tramite SSH o VNC, dovrai collegare un monitor, una tastiera e un mouse al tuo Raspberry Pi.



Per sapere come eseguire il flashing dell'immagine del sistema operativo Raspberry Pi su una scheda microSD, fare riferimento a Come installare e utilizzare Raspberry Pi Imager . Se hai bisogno di aiuto per installare il sistema operativo Raspberry Pi sul tuo Raspberry Pi, leggi Come installare il sistema operativo Raspberry Pi su Raspberry Pi 4 . Se hai bisogno di aiuto con la configurazione headless di Raspberry Pi, consulta Come installare e configurare il sistema operativo Raspberry Pi su Raspberry Pi 4 senza monitor esterno.



Collegamento di Raspberry Pi Sense Hat a Raspberry Pi

Il kit Raspberry Pi Sense Hat viene fornito con la scheda aggiuntiva Raspberry Pi Sense Hat, un'intestazione maschio-femmina a 40 pin e alcune viti e distanziali.





Prima di poter collegare la scheda Sense Hat al Raspberry Pi, è necessario collegare l'intestazione a 40 pin al Sense Hat. Collegare i pin maschio dell'intestazione maschio-femmina a 40 pin al Sense Hat come mostrato nelle immagini sottostanti.



I computer a scheda singola Raspberry Pi hanno 4 fori che possono essere utilizzati per collegare schede aggiuntive o una custodia. Per collegare la scheda aggiuntiva, inserisci le viti dal retro del Raspberry Pi, come mostrato nelle immagini sottostanti.

Quindi, collegare un distanziatore alla vite.

Dopo aver aggiunto tutte e quattro le viti e i distanziatori, il tuo Raspberry Pi dovrebbe apparire come quello mostrato nell'immagine qui sotto.

Collega il Raspberry Pi Sense Hat all'intestazione maschio GPIO a 40 pin del Raspberry Pi, come mostrato nelle immagini sottostanti.

NOTA: Fare attenzione quando si scollega il Raspberry Pi Sense Hat dall'intestazione GPIO a 40 pin Raspberry Pi per evitare di piegare i pin del GPIO Raspberry Pi.

Con le quattro viti rimanenti, fissa il Raspberry Pi Sense Hat, come mostrato nelle immagini sottostanti.

Accensione del Raspberry Pi

Ora che il Raspberry Pi Sense Hat è collegato al Raspberry Pi, inserisci la scheda microSD con il sistema operativo Raspberry Pi nello slot per schede microSD del Raspberry Pi, collega il cavo di alimentazione al Raspberry Pi e accendilo.

Installazione della libreria Python di Raspberry Pi Sense Hat

Per utilizzare Raspberry Pi Sense Hat sul Raspberry Pi, il cappello sensoriale La libreria Python deve essere installata sul sistema operativo Raspberry Pi. Il cappello sensoriale La libreria è disponibile nel repository ufficiale dei pacchetti del sistema operativo Raspberry Pi.

Per installare il Raspberry Pi cappello sensoriale Libreria Python sul sistema operativo Raspberry Pi, aggiorna prima la cache del repository del pacchetto APT con il seguente comando:

$ sudo apt update

Quindi, esegui il seguente comando:

$ sudo apt install sense-hat -y

Installazione della libreria Python di Flask Micro Web Framework

Useremo il framework Flask Python per creare la nostra applicazione meteo. Puoi installare Flask dal repository ufficiale dei pacchetti del sistema operativo Raspberry Pi con il seguente comando:

$ sudo apt install python3-flask -y

Creazione di una directory di progetto

È una buona idea creare una directory di progetto per organizzare i file di progetto. Per creare una directory di progetto ~/lavoro , usa il seguente comando:

$ mkdir ~/lavoro

Una volta creata la directory del progetto, accedere alla directory del progetto come segue:

$ cd ~/lavoro

Testare il cappello Sense Raspberry Pi

Per verificare se il Raspberry Pi Sense Hat funziona, possiamo scrivere un semplice script Python di prova. Puoi creare un nuovo script Python chiamato test.py con il nano editor di testo come segue:

$ nano test.py

Inserisci il seguente codice nel test.py file. Importazioni della riga 1 SensoCappello dal cappello_senso modulo, la riga 3 crea a SensoCappello oggetto e memorizza un riferimento nel senso variabile e le righe 5-6 impostano il colore di tutti i LED 8×8 su rosso. Una volta terminato, premere + X seguito da E e .

Puoi eseguire il test.py Script Python con il seguente comando:

$ python3 test.py

La matrice LED 8×8 dovrebbe illuminarsi di colore rosso come mostrato nell'immagine sottostante.

Per spegnere i LED del Sense Hat, esegui il pulsante chiaro() metodo senza alcun valore di colore nel test.py Script Python, come mostrato nello screenshot qui sotto, ed esegui il test.py Script Python di nuovo.

I LED del Sense Hat dovrebbero ora essere spenti, come mostrato nell'immagine qui sotto.

Se Sense Hat funziona correttamente, passa alla sezione successiva.

Ottenere dati meteo da Sense Hat

È possibile ottenere i dati del sensore dal Sense Hat molto facilmente utilizzando il cappello sensoriale Libreria Python. Per recuperare i dati del sensore dal Sense Hat, puoi creare un nuovo script Python read_sensor_data.py come segue:

$ nano read_sensor_data.py

Inserisci il seguente codice nel read_sensor_data.py File Python.

a partire dalcappello_sensoimportareSensoCappello
a partire dal tempo importaredormire
senso=SensoCappello()
senso.chiaro()
mentre Vero:
tempC=senso.ottieni_temperatura()
tempF=tempC *(9/5)+32
pressione=senso.get_pressione()
umidità=senso.get_humidity()

Stampa('Temperatura: %.2f°C/%.2f°F '%(tempC,tempF))
Stampa('Pressione: %.2f mb '%(pressione))
Stampa('Umidità: %.2f%% '%(umidità))
dormire(5)

Una volta terminato, premere + X seguito da E e .

Nel codice sopra, le righe 1 e 2 importano tutte le librerie richieste, la riga 4 crea a SensoCappello oggetto e la riga 5 spegne tutti i LED del Sense Hat utilizzando il tasto chiaro() metodo. Il ciclo while nella riga 7 è un ciclo infinito che eseguirà il codice nelle righe 8-16 per sempre.

Nella riga 8, il ottieni_temperatura() viene utilizzato per leggere i dati di temperatura (in gradi Celsius) dal sensore di umidità del Sense Hat. Nella riga 9, i dati della temperatura vengono convertiti da gradi Celsius a gradi Fahrenheit. Nella riga 10, il get_pressione() viene utilizzato per leggere i dati sulla pressione dell'aria (in millibar) dal sensore di pressione del Sense Hat. Nella riga 11, il get_umidità() viene utilizzato per leggere i dati di umidità (in %) dal sensore di umidità del Sense Hat.

Le righe 13–15 vengono utilizzate per stampare i dati del sensore sulla console e la riga 16 viene utilizzata per attendere 5 secondi prima di leggere nuovamente i dati del sensore.

Puoi eseguire il read_sensor_data.py Script Python come segue:

$ python3 read_sensor_data.py

Una volta eseguito lo script, i dati del sensore verranno stampati sulla console.

Ora che possiamo leggere i dati del sensore dal Sense Hat, premi + C per interrompere il programma.

Creazione di un'app Web per una stazione meteorologica

In questa sezione, ti mostreremo come utilizzare il framework web Python Flask per creare un'API meteo e un'applicazione meteo. L'applicazione meteo accederà all'API dei dati meteo e mostrerà i dati meteo in tempo reale. Tutto il codice discusso in questa sezione è disponibile su GitHub all'indirizzo shovon8 / lampone-pi-sense-hat-weather-app .

Per prima cosa, crea un server.py Script Python nella directory del progetto come segue:

$ nano server.py

Inserisci il seguente codice nel server.py File Python.

a partire dalborracciaimportareBorraccia
a partire dalborracciaimportarejsonify
a partire dalborracciaimportarerender_template
a partire dalborracciaimportareurl_for
a partire dalcappello_sensoimportareSensoCappello
app=Borraccia(__nome__)
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0
senso=SensoCappello()
senso.chiaro()
insieme aapp.test_request_context():
url_for('statico',nome del file='stile.css')
url_for('statico',nome del file='app.js')
@app.rotta('/fuoco')
deffuoco():
tempC=senso.ottieni_temperatura()
tempF=tempC *(9/5)+32
pressione=senso.get_pressione()
pressionePsi=pressione *0.0145038
pressioneP=pressione *100
umidità=senso.get_humidity()

Restituzionejsonify({
'temperatura':{ 'C': tempC, 'F': tempF},
'pressione':{ 'mb': pressione, 'hPa': pressione,
'psi': pressionePsi, 'P': pressione P},
'umidità': umidità
})
@app.rotta('/')
defcasa():
Restituzionerender_template('./home.html')

Quindi, premere + X seguito da E e per salvare il server.py Script Python.

Nel codice sopra, le righe 1-5 importano tutte le librerie richieste, la riga 7 crea un'app Flask, la riga 11 crea un oggetto SenseHat e la riga 12 spegne tutti i LED del Sense Hat. La riga 8 disabilita la memorizzazione nella cache Web per l'app Flask. Poiché questa app è leggera, non è necessaria la memorizzazione nella cache. Se desideri modificare l'app, disabilitare la cache web renderà i test molto più semplici.

Le righe 18-31 leggono i dati del sensore dal Sense Hat e restituiscono i dati API in formato JSON sulla richiesta HTTP GET nel /fuoco terminale del server web. Le righe 37-39 restituiscono la home page dell'app web meteo sul / terminale del server web. La homepage è resa dal home.html file, che dovrebbe essere nel modelli/ directory della directory del progetto.

Le righe 14–16 sono utilizzate per consentire l'accesso al stile.css e app.js file statici. Questi file dovrebbero essere in statico/ directory della directory del progetto. Il stile.css il file è usato per modellare il home.html homepage e il app.js viene utilizzato per richiedere i dati API dal /fuoco endpoint e aggiornare i dati meteo sul home.html pagina ogni 5 secondi.

Crea il statico/ e modelli/ directory nella directory del progetto come segue:

$ mkdir -v {statico,modelli}

Creare un home.html file nel modelli/ directory come segue:

$ nano templates/home.html

Inserisci il seguente codice nel home.html file.


< html >
< testa >
< meta nome='finestra' contenuto='larghezza=larghezza-dispositivo, scala-iniziale=1.0'>
< titolo >Stazione meteo Raspberry Pi</ titolo >
< collegamento rel='foglio di stile' genere='testo/css'
href='{{ url_for('static', file) }}'/>
</ testa >
< corpo >
< div ID='contenuto'>
< h1 >Stazione meteo Raspberry Pi</ h1 >

< div classe='dati-contenuto'>
< h2 >Temperatura</ h2 >
< div classe='riga dati'>
< div classe='cella dati' ID='tempC'>
...
</ div >
< div classe='cella dati' ID='tempF'>
...
</ div >
</ div >
</ div >

< div classe='dati-contenuto'>
< h2 >Pressione</ h2 >
< div classe='riga dati'>
< div classe='cella dati' ID='pressione Mb'>
...
</ div >
< div classe='cella dati' ID='pressione Psi'>
...
</ div >
</ div >
< div classe='riga dati'>
< div classe='cella dati' ID='pressioneHpa'>
...
</ div >
< div classe='cella dati' ID='pressioneP'>
...
</ div >
</ div >
</ div >

< div classe='dati-contenuto'>
< h2 >Umidità</ h2 >
< div classe='riga dati'>
< div classe='cella dati' ID='umidità'>
...
</ div >
</ div >
</ div >
</ div >

< sceneggiatura genere='testo/javascript' src='{{ url_for('static', file) }}'></ sceneggiatura >
</ corpo >
</ html >

Quindi, premere + X seguito da E e per salvare il home.html file.

Creare un stile.css file nel statico/ directory come segue:

$ nano static/style.css

Inserisci i seguenti codici nel stile.css file.

@importare URL('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
* {
imbottitura: 0;
margine: 0;
famiglia di font: 'Robot', sans-serif;
}
corpo{
sfondo: # 737373;
}
h1{
Schermo: bloccare;
colore: #79DC7B;
allineare il testo: centro;
carattere-peso: 400;
sfondo: # 000;
imbottitura: 0,5 em 0;
}
h2{
Schermo: bloccare;
sfondo: # 000;
colore: #F F F;
allineare il testo: centro;
carattere-peso: 400;
dimensione del font: 1em;
}
.dati-contenuto {
margine: 10px;
frontiera: 2px solido Nero;
raggio di confine: 5px;
colore di sfondo: #79DC7B;
}
.data-row {
Schermo:flettere;
direzione di flessione:riga;
}
.dati-cella {
larghezza: 100%;
altezza: 80px;
Schermo:flettere;
allinea-oggetti: centro;
giustifica-contenuto: centro;
carattere-peso: grassetto;
dimensione del font: 1.5 em;
colore: # 006902;
}
.dati-cella:passa il mouse {
sfondo: # FFE891;
colore: # AA8600;
cursore: puntatore;
}

Quindi, premere + X seguito da E e per salvare il stile.css file.

Creare un app.js file nel statico/ directory come segue:

$ nano statico/app.js

Inserisci il seguente codice nel app.js file.

finestra.addEventListener('carico',principale);
funzioneprincipale() {
funzionegetAPIData() {
dovehttp= nuovoXMLHttpRequest();

http.onreadystatechange = funzione() {
Se(questo.prontoStato === 4 && questo.stato === 200) {
aggiornare(JSON.analizzare(questo.testorisposta));
}
}

http.aprire('OTTENERE', '/fuoco', vero);
http.Inviare();
}


funzioneaggiornare(apiData) {
dovetempC=documento.getElementById('tempC');
dovetempF=documento.getElementById('tempF');
dovepressioneMb=documento.getElementById('pressione Mb');
dovepressionePsi=documento.getElementById('pressione Psi');
dovepressioneHpa=documento.getElementById('pressioneHpa');
dovepressioneP=documento.getElementById('pressioneP');
doveumidità=documento.getElementById('umidità');

tempC.innerHTML =parseFloat(apiData.temperatura.C).aFisso(2) + '°C';
tempF.innerHTML =parseFloat(apiData.temperatura.F).aFisso(2) + '°F';

pressioneMb.innerHTML =parseFloat(apiData.pressione.mb).aFisso(2) + 'mb';
pressione Psi.innerHTML =parseFloat(apiData.pressione.psi).aFisso(2) + 'psi';
pressioneHpa.innerHTML =parseFloat(apiData.pressione.hPa).aFisso(2) + 'hPa';
pressione P.innerHTML =parseFloat(apiData.pressione.P).aFisso(2) + ' P';

umidità.innerHTML =parseFloat(apiData.umidità).aFisso(2) + '%';
}


funzioneapp() {
finestra.setInterval(funzione() {
getAPIData();
}, 5000);
}

app();
}

Quindi, premere + X seguito da E e per salvare il app.js file.

Qui, la linea 1 esegue il principale() funzione al termine del caricamento della pagina Web. Nel principale() funzione, il getAPIData() la funzione recupera i dati dell'API meteo utilizzando AJAX e chiama il aggiornare() funzione (nella riga 10) una volta che i dati sono stati recuperati con successo. Il aggiornare() la funzione aggiorna l'elemento della pagina Web utilizzando i dati dell'API.

Nella riga 20, il document.getElementById() viene utilizzato per ottenere il riferimento dell'elemento della pagina Web con l'id tempC . La riga 28 viene utilizzata per sostituire il contenuto dell'elemento della pagina Web che ha l'id tempC con la temperatura (in Celsius) dall'API. Allo stesso modo, i contenuti di tutti gli elementi web (righe 21-26) vengono sostituiti con i rispettivi dati API.

Nel app() funzione, il getAPIData() viene chiamato ogni 5 secondi (5000 millisecondi) per mantenere aggiornati i dati meteo nell'app meteo. Infine, nella riga 46, il app() viene eseguita la funzione.

Per testare l'app Web, inserisci il seguente comando:

$ FLASK_APP=server.py flask run --host=0.0.0.0

L'app meteo dovrebbe essere eseguita sulla porta 5000 (per impostazione predefinita).

Per verificare se l'API Weather funziona, esegui il seguente comando:

$ curl -s http://localhost:5000/api | json_pp

Come puoi vedere, i dati dell'API Weather vengono stampati sulla console. Pertanto, l'API funziona.

Per testare l'app Meteo, visita http://localhost:5000 da un browser web Chromium. L'app Meteo dovrebbe essere caricata sul browser web, ma inizialmente non dovrebbero essere visualizzati dati meteo.

Dopo alcuni secondi, l'app meteo dovrebbe terminare il recupero dei dati meteo dall'API e visualizzarli.

In qualsiasi momento, puoi premere + C per arrestare il server web.

Creazione del servizio Systemd per l'app Web Weather

In questa sezione, ti mostreremo come creare un file di servizio systemd per l'app meteo in modo che si avvii automaticamente all'avvio.

Per prima cosa, crea un servizio-stazione.meteo file nella directory del progetto come segue:

$ nano weather-station.service

Inserisci le seguenti righe di codice nel servizio-stazione.meteo file.

[Unità]
Description=App Web della stazione meteo Raspberry Pi che utilizza il cappello Sense Raspberry Pi
Dopo=rete.obiettivo

[Servizio]
Directorydilavoro=/casa/pi/lavoro
Ambiente=FLASK_APP=server.py
Ambiente=FLASK_ENV=produzione
ExecStart=/usr/bin/flask run --host=0.0.0.0
StandardOutput=eredita
StandardError=eredita
Riavvia=sempre
Utente=pi

[Installare]
WantedBy=multi-user.target

Quindi, premere + X seguito da E e per salvare il servizio-stazione.meteo file.

Copia il servizio-stazione.meteo file per il /etc/systemd/system/ directory con il seguente comando:

$ sudo cp -v weather-station.service /etc/systemd/system/

Ricaricare i demoni systemd per rendere effettive le modifiche come segue:

$ sudo systemctl daemon-reload

Il Stazione metereologica Il servizio systemd dovrebbe essere inattivo al momento, come mostrato nello screenshot qui sotto.

$ sudo systemctl status weather-station.service

Inizia il Stazione metereologica servizio con il seguente comando:

$ sudo systemctl start weather-station.service

Come puoi vedere, il Stazione metereologica il servizio è ora in esecuzione.

$ sudo systemctl status weather-station.service

Ora che il Stazione metereologica servizio funziona, puoi aggiungerlo all'avvio del sistema del sistema operativo Raspberry Pi con il seguente comando:

$ sudo systemctl enable weather-station.service

Riavvia il tuo Raspberry Pi con il seguente comando:

$ sudo reboot

Una volta che il tuo Raspberry Pi si avvia, il Stazione metereologica servizio dovrebbe essere in esecuzione, come mostrato nello screenshot qui sotto.

$ sudo systemctl status weather-station.service

Accesso all'app Meteo da altri dispositivi

Per accedere all'app meteo da altri dispositivi della tua rete domestica, devi conoscere l'indirizzo IP del tuo Raspberry Pi. Puoi trovare l'indirizzo IP del tuo Raspberry Pi 4 dall'interfaccia di gestione web del tuo router di casa. Nel nostro caso, l'indirizzo IP è 192.168.0.103, ma questo indirizzo sarà diverso per te, quindi assicurati di sostituire questo indirizzo con il tuo in tutti i passaggi successivi.

Se hai accesso alla console Raspberry Pi, puoi eseguire il seguente comando per trovare anche l'indirizzo IP.

$ hostname -I

Una volta che conosci l'indirizzo IP del tuo Raspberry Pi, puoi accedervi da qualsiasi dispositivo nella tua rete domestica. Come mostrato nello screenshot qui sotto, abbiamo avuto accesso all'app meteo da uno smartphone Android.

Conclusione

In questo articolo, ti abbiamo mostrato come utilizzare il Raspberry Pi Sense Hat per costruire una stazione meteorologica Raspberry Pi. Abbiamo usato il cappello sensoriale Libreria Python per estrarre i dati meteo dal Raspberry Pi Sense Hat. Quindi, abbiamo utilizzato il micro framework web Flask Python per creare un'API meteo e un'applicazione web. L'app Web ottiene i dati meteo dall'API meteo ogni 5 secondi per mantenere l'app Web aggiornata con i dati meteo più recenti.