Construïu la vostra pròpia estació meteorològica Raspberry Pi

Build Your Own Raspberry Pi Weather Station



Raspberry Pi Sense Hat és un complement que es pot utilitzar amb ordinadors de placa única Raspberry Pi. El Raspberry Pi Sense Hat té una pantalla LED de 8 × 8 i un joystick de 5 botons i ve equipat amb els següents sensors:

  1. Giroscopi
  2. Acceleròmetre
  3. Magnetòmetre
  4. Temperatura
  5. Pressió baromètrica
  6. Humitat

En aquest article, us mostraré com crear una aplicació web d'estació meteorològica basada en l'API de Python mitjançant el fitxer temperatura , pressió baromètrica , i humitat sensors del barret Raspberry Pi Sense. Per seguir aquest article, necessitareu el següent:







  1. Un Raspberry Pi 3 o Raspberry Pi 4 amb connectivitat de xarxa.
  2. Un mòdul Raspberry Pi Sense Hat.
  3. Un adaptador d'alimentació micro-USB (Raspberry Pi 3) o USB tipus C (Raspberry Pi 4).
  4. Una targeta microSD de 16 o 32 GB amb sistema operatiu Raspberry Pi.
  5. Un ordinador portàtil o un ordinador d’escriptori per a accés remot a escriptori VNC o accés SSH al Raspberry Pi.

NOTA: En aquest article, ens connectarem al Raspberry Pi remotament mitjançant VNC o SSH mitjançant la configuració sense cap del Raspberry Pi. Si no voleu accedir al vostre Raspberry Pi remotament mitjançant SSH o VNC, haureu de connectar un monitor, un teclat i un ratolí al vostre Raspberry Pi.



Per obtenir informació sobre com fer passar la imatge del sistema operatiu Raspberry Pi en una targeta microSD, consulteu Com instal·lar i utilitzar Raspberry Pi Imager. Si necessiteu ajuda per instal·lar el sistema operatiu Raspberry Pi al vostre Raspberry Pi, llegiu Com instal·lar el sistema operatiu Raspberry Pi a Raspberry Pi 4 . Si necessiteu ajuda amb la configuració sense cap de Raspberry Pi, consulteu Com instal·lar i configurar el sistema operatiu Raspberry Pi al Raspberry Pi 4 sense monitor extern.



Connexió de Raspberry Pi Sense Hat a Raspberry Pi

El kit Raspberry Pi Sense Hat inclou el tauler complement Raspberry Pi Sense Hat, una capçalera home-a-femella de 40 pins i alguns cargols i separadors.





Abans de connectar la placa Sense Hat al Raspberry Pi, heu de connectar la capçalera de 40 pins al Sense Hat. Connecteu els pins masculins de la capçalera home-dona de 40 pins al Sense Hat, tal com es mostra a les imatges següents.



Els ordinadors de placa única Raspberry Pi tenen 4 forats que es poden utilitzar per connectar taulers addicionals o una funda. Per connectar el tauler complementari, inseriu els cargols de la part posterior del Raspberry Pi, tal com es mostra a les imatges següents.

A continuació, connecteu un espaiador al cargol.

Un cop afegiu els quatre cargols i separadors, el vostre Raspberry Pi hauria de ser semblant al que es mostra a la imatge següent.

Connecteu el Raspberry Pi Sense Hat a la capçalera masculina GPIO de 40 pins del Raspberry Pi, tal com es mostra a les imatges següents.

NOTA: Aneu amb compte mentre desconnecteu el Raspberry Pi Sense Hat de la capçalera GPIO de 40 pins de Raspberry Pi per evitar doblar els pins del Raspberry Pi GPIO.

Amb els quatre cargols restants, subjecteu el Raspberry Pi Sense Hat, tal com es mostra a les imatges següents.

Encenent el Raspberry Pi

Ara que el Raspberry Pi Sense Hat està connectat al Raspberry Pi, introduïu la targeta microSD amb el sistema operatiu Raspberry Pi a la ranura de la targeta microSD del Raspberry Pi, connecteu el cable d’alimentació al Raspberry Pi i engegueu-lo.

Instal·lació de la biblioteca Python de Raspberry Pi Sense Hat

Per utilitzar Raspberry Pi Sense Hat al Raspberry Pi, el barret de sentit La biblioteca Python s'ha d'instal·lar al sistema operatiu Raspberry Pi. El barret de sentit La biblioteca està disponible al dipòsit oficial de paquets del sistema operatiu Raspberry Pi.

Per instal·lar el Raspberry Pi barret de sentit Biblioteca Python al sistema operatiu Raspberry Pi, actualitzeu primer la memòria cau del dipòsit de paquets APT amb l'ordre següent:

$ sudo apt actualització

A continuació, executeu l'ordre següent:

$ Sudo apt install sense-hat -i

Instal·lació de la biblioteca Python de Flask Micro Web Framework

Utilitzarem el marc Flask Python per crear la nostra aplicació meteorològica. Podeu instal·lar Flask des del dipòsit oficial de paquets de Raspberry Pi OS amb l'ordre següent:

$ sudo apt install python3-flask -y

Creació d’un directori de projectes

És una bona idea crear un directori de projectes per organitzar els fitxers del projecte. Per crear un directori de projectes ~ / treballar , utilitzeu l'ordre següent:

$ mkdir ~ / work

Un cop creat el directori del projecte, aneu al directori del projecte de la manera següent:

$ cd ~ / treball

Prova del barret Sense Raspberry Pi

Per comprovar si el Raspberry Pi Sense Hat funciona, podem escriure un script de Python senzill. Podeu crear un nou script Python anomenat test.py amb el nano editor de text de la següent manera:

$ nano test.py

Introduïu el següent codi al fitxer test.py dossier. Importacions de la línia 1 SenseHat des del sens_hat mòdul, la línia 3 crea un SenseHat object i emmagatzema una referència a sentit variable, i les línies 5-6 estableixen el color de tots els LED de 8 × 8 a vermell. Un cop hàgiu acabat, premeu + X Seguit per I i .

Podeu executar el fitxer test.py Script Python amb l'ordre següent:

$ python3 test.py

La matriu LED de 8 × 8 hauria de brillar en color vermell, tal com es mostra a la imatge següent.

Per apagar els LED del Sense Hat, executeu el fitxer clear () sense cap valor de color al fitxer test.py Script Python, tal com es mostra a la captura de pantalla següent, i executeu el fitxer test.py Script Python de nou.

Ara els LED del Sense Hat haurien d’estar apagats, tal com es mostra a la imatge següent.

Si el Sense Hat funciona correctament, aneu a la secció següent.

Obtenir dades meteorològiques de Sense Hat

Podeu obtenir dades del sensor del Sense Hat molt fàcilment utilitzant el fitxer barret de sentit Biblioteca Python. Per recuperar les dades del sensor del Sense Hat, podeu crear un nou script Python read_sensor_data.py com segueix:

$ nano read_sensor_data.py

Introduïu el següent codi al fitxer read_sensor_data.py Fitxer Python.

des desens_hatimportacióSenseHat
des de temps importaciódormir
sentit=SenseHat()
sentit.clar()
mentre És cert:
tempC=sentit.get_temperature()
tempF=tempC *(9/5)+32
pressió=sentit.get_pressure()
humitat=sentit.obtenir_humitat()

imprimir('Temperatura:% .2f ° C /%. 2f ° F. n'%(tempC,tempF))
imprimir('Pressió:% .2f mb n'%(pressió))
imprimir('Humitat:% .2f %% n n'%(humitat))
dormir(5)

Un cop hàgiu acabat, premeu + X Seguit per I i .

Al codi anterior, les línies 1 i 2 importen totes les biblioteques necessàries, la línia 4 crea un fitxer SenseHat objecte, i la línia 5 apaga tots els LED del Sense Hat mitjançant el fitxer clear () mètode. El bucle while de la línia 7 és un bucle infinit que executarà el codi de les línies 8-16 per sempre.

A la línia 8, el fitxer get_temperature () s’utilitza el mètode per llegir les dades de temperatura (en graus Celsius) del sensor d’humitat del Sense Hat. A la línia 9, les dades de temperatura es converteixen de graus Celsius a graus Fahrenheit. A la línia 10, el fitxer get_pressure () s’utilitza un mètode per llegir les dades de pressió de l’aire (en mil·libars) del sensor de pressió del Sense Hat. A la línia 11, el fitxer get_humidity () s’utilitza el mètode per llegir les dades d’humitat (en%) del sensor d’humitat del Sense Hat.

Les línies 13-15 s’utilitzen per imprimir les dades del sensor a la consola i la línia 16 s’espera durant 5 segons abans de tornar a llegir les dades del sensor.

Podeu executar el fitxer read_sensor_data.py Script Python de la següent manera:

$ python3 read_sensor_data.py

Un cop executat l'script, les dades del sensor s'imprimiran a la consola.

Ara que podem llegir les dades del sensor del Sense Hat, premeu + C per aturar el programa.

Creació d’una aplicació web de l’estació meteorològica

En aquesta secció, us mostrarem com utilitzar el framework web Python Flask per crear una API meteorològica i una aplicació meteorològica. L’aplicació meteorològica accedirà a l’API de dades meteorològiques i mostrarà les dades meteorològiques en temps real. Tot el codi comentat en aquesta secció està disponible a GitHub a shovon8 / raspberry-pi-sense-hat-weather-app .

En primer lloc, creeu un fitxer server.py Script Python al directori del projecte de la següent manera:

$ nano server.py

Introduïu el següent codi al fitxer server.py Fitxer Python.

des dematràsimportacióFlascó
des dematràsimportaciójsonify
des dematràsimportaciórender_template
des dematràsimportacióurl_for
des desens_hatimportacióSenseHat
aplicació=Flascó(__nom__)
aplicacióconfig['SEND_FILE_MAX_AGE_DEFAULT'] = 0
sentit=SenseHat()
sentit.clar()
ambaplicaciótest_request_context():
url_for('estàtic',nom de l'arxiu='style.css')
url_for('estàtic',nom de l'arxiu='app.js')
@aplicacióruta('/ foc')
deffoc():
tempC=sentit.get_temperature()
tempF=tempC *(9/5)+32
pressió=sentit.get_pressure()
pressióPsi=pressió *0.0145038
pressióP=pressió *100
humitat=sentit.obtenir_humitat()

tornarjsonify({
'temperatura':{ 'C': tempC, 'F': tempF},
'pressió':{ 'Mb': pressió, 'hPa': pressió,
'psi': pressurePsi, 'P': pressióP},
'humitat': humitat
})
@aplicacióruta('/')
defa casa():
tornarrender_template('./Home.html')

A continuació, premeu + X Seguit per I i per desar el fitxer server.py Script Python.

Al codi anterior, les línies 1 a 5 importen totes les biblioteques necessàries, la línia 7 crea una aplicació Flask, la línia 11 crea un objecte SenseHat i la línia 12 apaga tots els LED del Sense Hat. La línia 8 desactiva la memòria cau web de l'aplicació Flask. Com que aquesta aplicació és lleugera, no cal fer memòria cau. Si voleu modificar l’aplicació, desactivar la memòria cau de la web us facilitarà les proves.

Les línies 18–31 llegeixen les dades del sensor del Sense Hat i retornen les dades de l’API en format JSON a la sol·licitud HTTP GET a la / foc punt final del servidor web. Les línies 37–39 retornen la pàgina d'inici de l'aplicació web meteorològica a / punt final del servidor web. La pàgina principal es representa des del fitxer home.html , que hauria d'estar al fitxer plantilles / directori del directori del projecte.

Les línies 14-16 s’utilitzen per permetre l’accés al fitxer style.css i app.js fitxers estàtics. Aquests fitxers haurien d'estar al fitxer estàtic / directori del directori del projecte. El style.css fitxer s'utilitza per donar estil al fitxer home.html pàgina inicial i el fitxer app.js s'utilitza per sol·licitar les dades de l'API al fitxer / foc punt final i actualitzeu les dades meteorològiques a home.html pàgina cada 5 segons.

Creeu el fitxer estàtic / i plantilles / al directori del projecte de la següent manera:

$ mkdir -v {estàtic, plantilles}

Crea un home.html arxiu al fitxer plantilles / directori de la següent manera:

$ nano templates / home.html

Introduïu el següent codi al fitxer home.html dossier.


< html >
< cap >
< meta nom='finestra gràfica' contingut='ample = amplada del dispositiu, escala inicial = 1,0'>
< títol >Estació meteorològica Raspberry Pi</ títol >
< enllaç rel='full d'estil' tipus='text / css'
href='{{url_for (' static ', filename =' style.css ')}}'/>
</ cap >
< cos >
< div identificador='contingut'>
< h1 >Estació meteorològica Raspberry Pi</ h1 >

< div classe='dades-contingut'>
< h2 >Temperatura</ h2 >
< div classe='fila de dades'>
< div classe='data-cell' identificador='tempC'>
...
</ div >
< div classe='data-cell' identificador='tempF'>
...
</ div >
</ div >
</ div >

< div classe='dades-contingut'>
< h2 >Pressió</ h2 >
< div classe='fila de dades'>
< div classe='data-cell' identificador='pressureMb'>
...
</ div >
< div classe='data-cell' identificador='pressurePsi'>
...
</ div >
</ div >
< div classe='fila de dades'>
< div classe='data-cell' identificador='pressureHpa'>
...
</ div >
< div classe='data-cell' identificador='pressióP'>
...
</ div >
</ div >
</ div >

< div classe='dades-contingut'>
< h2 >Humitat</ h2 >
< div classe='fila de dades'>
< div classe='data-cell' identificador='humitat'>
...
</ div >
</ div >
</ div >
</ div >

< guió tipus='text / javascript' src='{{url_for (' static ', filename =' app.js ')}}'></ guió >
</ cos >
</ html >

A continuació, premeu + X Seguit per I i per desar el fitxer home.html dossier.

Crea un style.css arxiu al fitxer estàtic / directori de la següent manera:

$ nano static / style.css

Introduïu els següents codis al fitxer style.css dossier.

@import url('Https://fonts.googleapis.com/css2?family=Roboto&display=swap');
* {
encoixinat: 0;
marge: 0;
font-family: 'Robot', sans-serif;
}
cos{
antecedents: # 737373;
}
h1{
visualització: bloc;
color: # 79DC7B;
alinear text: centre;
font-pes: 400;
antecedents: # 000;
encoixinat: 0,5 em 0;
}
h2{
visualització: bloc;
antecedents: # 000;
color: #fff;
alinear text: centre;
font-pes: 400;
mida de la font: 1em;
}
.data-content {
marge: 10 píxels;
frontera: 2 píxels sòlid negre;
radi de frontera: 5 píxels;
color de fons: # 79DC7B;
}
fila de dades {
visualització:flexionar;
direcció flex:fila;
}
.data-cell {
amplada: 100%;
alçada: 80 px;
visualització:flexionar;
alinear-elements: centre;
justificar-contingut: centre;
font-pes: atrevit;
mida de la font: 1,5em;
color: # 006902;
}
.data-cell:planegeu {
antecedents: # FFE891;
color: # AA8600;
cursor: punter;
}

A continuació, premeu + X Seguit per I i per desar el fitxer style.css dossier.

Crea un app.js arxiu al fitxer estàtic / directori de la següent manera:

$ nano static / app.js

Introduïu el següent codi al fitxer app.js dossier.

finestra.addEventListener('carregar',principal);
funcióprincipal() {
funciógetAPIData() {
onhttp= nouXMLHttpRequest();

http.onreadystatechange = funció() {
si(això.readyState === 4 && això.estat === 200) {
actualització(JSON.analitzar(això.text de resposta));
}
}

http.obert('ACONSEGUIR', '/ foc', cert);
http.enviar();
}


funcióactualització(apiData) {
ontempC=document.getElementById('tempC');
ontempF=document.getElementById('tempF');
onpressióMb=document.getElementById('pressureMb');
onpressióPsi=document.getElementById('pressurePsi');
onpressióHpa=document.getElementById('pressureHpa');
onpressióP=document.getElementById('pressióP');
onhumitat=document.getElementById('humitat');

tempC.HTML interior =parseFloat(apiData.temperatura.C).fixat(2) + '° C';
tempF.HTML interior =parseFloat(apiData.temperatura.F).fixat(2) + '° F';

pressióMb.HTML interior =parseFloat(apiData.pressió.mb).fixat(2) + 'Mb';
pressióPsi.HTML interior =parseFloat(apiData.pressió.psi).fixat(2) + 'psi';
pressióHpa.HTML interior =parseFloat(apiData.pressió.hPa).fixat(2) + 'hPa';
pressióP.HTML interior =parseFloat(apiData.pressió.Pàg).fixat(2) + 'P';

humitat.HTML interior =parseFloat(apiData.humitat).fixat(2) + '%';
}


funcióaplicació() {
finestra.setInterval(funció() {
getAPIData();
}, 5000);
}

aplicació();
}

A continuació, premeu + X Seguit per I i per desar el fitxer app.js dossier.

Aquí, la línia 1 executa el fitxer main () funció quan la pàgina web s'acaba de carregar. A la main () funció, el getAPIData () La funció obté les dades de l'API meteorològica mitjançant AJAX i crida a update () funció (a la línia 10) un cop s'han recuperat correctament les dades. El update () La funció actualitza l'element de la pàgina web mitjançant les dades de l'API.

A la línia 20, el fitxer document.getElementById () s'utilitza el mètode per obtenir la referència de l'element de la pàgina web amb l'identificador tempC . La línia 28 s’utilitza per substituir el contingut de l’element de la pàgina web que té l’identificador tempC amb la temperatura (en centígrads) de l'API. De la mateixa manera, el contingut de tots els elements web (línies 21-26) se substitueix per les seves dades API respectives.

A la app () funció, el getAPIData () es diu cada 5 segons (5.000 mil·lisegons) per mantenir les dades meteorològiques actualitzades a l’aplicació meteorològica. Finalment, a la línia 46, el fitxer app () s'executa la funció.

Per provar l'aplicació web, introduïu l'ordre següent:

$ FLASK_APP = servidor.py matràs executat --host = 0.0.0.0

L'aplicació meteorològica s'hauria d'executar al port 5000 (per defecte).

Per provar si l'API Weather funciona, executeu l'ordre següent:

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

Com podeu veure, les dades de l’API Weather s’imprimeixen a la consola. Per tant, l'API funciona.

Per provar l'aplicació Meteorològica, visiteu http: // localhost: 5000 des d’un navegador web Chromium. L'aplicació Meteorologia s'hauria de carregar al navegador web, però no s'haurien de mostrar dades meteorològiques al principi.

Al cap d’uns segons, l’aplicació meteorològica hauria d’acabar d’extreure les dades meteorològiques de l’API i mostrar-les.

En qualsevol moment, podeu prémer + C per aturar el servidor web.

Creació del servei Systemd per a l'aplicació web Weather

En aquesta secció, us mostrarem com crear un fitxer de servei systemd per a l’aplicació meteorològica perquè s’iniciï automàticament en arrencar.

En primer lloc, creeu un fitxer meteorològic-servei.servici al directori del projecte de la següent manera:

$ nano weather-station.service

Introduïu les següents línies de codi al fitxer meteorològic-servei.servici dossier.

[Unitat]
Descripció = Aplicació web Raspberry Pi Weather Station amb Raspberry Pi Sense Hat
Després de = network.target

[Servei]
Directori de treball = / home / pi / treball
Entorn = FLASK_APP = server.py
Entorn = FLASK_ENV = producció
ExecStart = / usr / bin / flask run --host = 0.0.0.0
StandardOutput = heretar
StandardError = heretar
Reinicia = sempre
Usuari = pi

[Instal·la]
WantedBy = multi-usuari.target

A continuació, premeu + X Seguit per I i per desar el fitxer meteorològic-servei.servici dossier.

Copieu el fitxer meteorològic-servei.servici arxiu al fitxer / etc / systemd / system / directori amb l'ordre següent:

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

Torneu a carregar els dimonis systemd perquè els canvis entrin en vigor de la manera següent:

$ sudo systemctl daemon-recoad

El estació meteorològica El servei systemd hauria d’estar inactiu en aquest moment, tal com es mostra a la captura de pantalla següent.

$ sudo systemctl status weather-station.service

Inicieu el estació meteorològica servei amb l'ordre següent:

$ sudo systemctl start weather-station.service

Com podeu veure, el estació meteorològica El servei està en execució.

$ sudo systemctl status weather-station.service

Ara que el estació meteorològica El servei funciona, podeu afegir-lo a l'inici del sistema del sistema operatiu Raspberry Pi amb l'ordre següent:

$ sudo systemctl habilita weather-station.service

Reinicieu el Raspberry Pi amb l'ordre següent:

$ sudo reiniciar

Un cop arrencat el vostre Raspberry Pi, el fitxer estació meteorològica El servei s'hauria d'executar, tal com es mostra a la captura de pantalla següent.

$ sudo systemctl status weather-station.service

Accedir a l'aplicació Meteorològica des d'altres dispositius

Per accedir a l'aplicació meteorològica des d'altres dispositius de la vostra xarxa domèstica, heu de conèixer l'adreça IP del vostre Raspberry Pi. Podeu trobar l'adreça IP del vostre Raspberry Pi 4 des de la interfície de gestió web del vostre encaminador domèstic. En el nostre cas, l'adreça IP és 192.168.0.103, però aquesta adreça serà diferent per a vosaltres, així que assegureu-vos de substituir aquesta adreça per la vostra en tots els passos posteriors.

Si teniu accés a la consola Raspberry Pi, podeu executar l'ordre següent per trobar també l'adreça IP.

$ nom d'amfitrió -I

Un cop conegueu l'adreça IP del vostre Raspberry Pi, podeu accedir-hi des de qualsevol dispositiu de la vostra xarxa domèstica. Com es mostra a la captura de pantalla següent, hem accedit a l'aplicació meteorològica des d'un telèfon intel·ligent Android.

Conclusió

En aquest article, us vam mostrar com utilitzar el barret Sense Raspberry Pi per construir una estació meteorològica Raspberry Pi. Hem utilitzat el barret de sentit Biblioteca Python per extreure dades meteorològiques del Raspberry Pi Sense Hat. A continuació, hem utilitzat el micro framework web Flask Python per crear una API meteorològica i una aplicació web. L’aplicació web obté les dades meteorològiques de l’API meteorològica cada 5 segons per mantenir l’aplicació web actualitzada amb les últimes dades meteorològiques.