Construiți-vă propria stație meteo Raspberry Pi

Build Your Own Raspberry Pi Weather Station



Raspberry Pi Sense Hat este o placă suplimentară care poate fi utilizată cu computerele single-board Raspberry Pi. Raspberry Pi Sense Hat are un afișaj LED de 8 × 8 și un joystick cu 5 butoane și vine echipat cu următorii senzori:

  1. Giroscop
  2. Accelerometru
  3. Magnetometru
  4. Temperatura
  5. Presiune barometrică
  6. Umiditate

În acest articol, vă voi arăta cum să creați o aplicație web pentru stația meteo bazată pe API Python, utilizând temperatura , presiune barometrică , și umiditate senzori ai Raspberry Pi Sense Hat. Pentru a urma acest articol, veți avea nevoie de următoarele:







  1. Un Raspberry Pi 3 sau Raspberry Pi 4 cu conectivitate la rețea.
  2. Un modul Raspberry Pi Sense Hat.
  3. Un adaptor de alimentare micro-USB (Raspberry Pi 3) sau USB Type-C (Raspberry Pi 4).
  4. Un card microSD de 16 GB sau 32 GB cu Raspberry Pi OS.
  5. Un laptop sau un computer desktop pentru acces la desktop VNC la distanță sau acces SSH la Raspberry Pi.

NOTĂ: În acest articol, ne vom conecta la Raspberry Pi de la distanță prin VNC sau SSH utilizând configurarea fără cap a Raspberry Pi. Dacă nu doriți să accesați Raspberry Pi de la distanță prin SSH sau VNC, va trebui să conectați un monitor, o tastatură și un mouse la Raspberry Pi.



Pentru a afla cum să blocheze imaginea Raspberry Pi OS pe un card microSD, vă rugăm să consultați Cum să instalați și să utilizați Raspberry Pi Imager. Dacă aveți nevoie de ajutor pentru instalarea sistemului de operare Raspberry Pi pe Raspberry Pi, citiți Cum se instalează sistemul de operare Raspberry Pi pe Raspberry Pi 4 . Dacă aveți nevoie de ajutor pentru configurarea fără cap a Raspberry Pi, consultați Cum se instalează și se configurează sistemul de operare Raspberry Pi pe Raspberry Pi 4 fără monitor extern.



Conectarea Raspberry Pi Sense Hat la Raspberry Pi

Kitul Raspberry Pi Sense Hat vine cu placa suplimentară Raspberry Pi Sense Hat, un antet de 40 pini de la tată la tată și câteva șuruburi și distanțiere.





Înainte de a putea atașa placa Sense Hat la Raspberry Pi, trebuie să conectați antetul cu 40 de pini la Sense Hat. Conectați pinii masculi ai antetului masculin-feminin cu 40 de pini la Sense Hat așa cum se arată în imaginile de mai jos.



Calculatoarele cu o singură placă Raspberry Pi au 4 găuri care pot fi utilizate pentru atașarea plăcilor suplimentare sau a unei carcase. Pentru a atașa placa suplimentară, introduceți șuruburi din spatele Raspberry Pi, așa cum se arată în imaginile de mai jos.

Apoi, conectați un distanțier la șurub.

După ce adăugați toate cele patru șuruburi și distanțieri, Raspberry Pi ar trebui să arate ca în imaginea de mai jos.

Conectați Raspberry Pi Sense Hat la antetul masculin GPIO cu 40 de pini al Raspberry Pi, așa cum se arată în imaginile de mai jos.

NOTĂ: Aveți grijă când deconectați Raspberry Pi Sense Hat de la antetul GPIO cu 40 de pini Raspberry Pi pentru a evita îndoirea pinilor Raspberry Pi GPIO.

Cu cele patru șuruburi rămase, fixați Raspberry Pi Sense Hat, așa cum se arată în imaginile de mai jos.

Pornirea Raspberry Pi

Acum că Raspberry Pi Sense Hat este conectat la Raspberry Pi, introduceți cardul microSD cu Raspberry Pi OS în slotul pentru card microSD al Raspberry Pi, conectați cablul de alimentare la Raspberry Pi și porniți-l.

Instalarea Raspberry Pi Sense Hat Python Library

Pentru a utiliza Raspberry Pi Sense Hat pe Raspberry Pi, pălărie de simț Biblioteca Python trebuie instalată pe sistemul de operare Raspberry Pi. The pălărie de simț biblioteca este disponibilă în depozitul oficial de pachete al sistemului de operare Raspberry Pi.

Pentru a instala Raspberry Pi pălărie de simț Biblioteca Python de pe sistemul de operare Raspberry Pi, actualizați mai întâi memoria cache a depozitului de pachete APT cu următoarea comandă:

$ sudo apt actualizare

Apoi, executați următoarea comandă:

$ sudo apt instalează sense-hat -y

Instalarea Flask Micro Web Framework Python Library

Vom folosi cadrul Flask Python pentru a crea aplicația noastră meteo. Puteți instala Flask din depozitul oficial de pachete al sistemului de operare Raspberry Pi cu următoarea comandă:

$ sudo apt instalează python3-flask -y

Crearea unui director de proiect

Este o idee bună să creați un director de proiect pentru a vă organiza fișierele de proiect. Pentru a crea un director de proiect ~ / muncă , utilizați următoarea comandă:

$ mkdir ~ / work

Odată ce directorul proiectului este creat, navigați la directorul proiectului după cum urmează:

$ cd ~ / lucru

Testarea pălăriei Raspberry Pi Sense

Pentru a testa dacă Raspberry Pi Sense Hat funcționează, putem scrie un script simplu de testare Python. Puteți crea un nou script Python numit test.py cu nano editor de text după cum urmează:

$ nano test.py

Introduceți următorul cod în test.py fişier. Importul liniei 1 SenseHat de la sense_hat modul, linia 3 creează un SenseHat obiect și stochează o referință în sens variabilă, iar liniile 5-6 stabilesc culoarea tuturor LED-urilor 8 × 8 la roșu. Odată ce ați terminat, apăsați + X urmată de ȘI și .

Puteți rula test.py Script Python cu următoarea comandă:

$ python3 test.py

Matricea LED 8 × 8 ar trebui să lumineze în roșu, așa cum se arată în imaginea de mai jos.

Pentru a opri LED-urile Sense Hat, rulați clar() fără nicio valoare a culorii în test.py Script Python, așa cum se arată în captura de ecran de mai jos, și rulați test.py Script Python din nou.

LED-urile Sense Hat ar trebui să fie acum stinse, așa cum se arată în imaginea de mai jos.

Dacă Sense Hat funcționează corect, treceți la secțiunea următoare.

Obținerea datelor meteo de la Sense Hat

Puteți obține datele senzorilor de la Sense Hat foarte ușor folosind pălărie de simț Biblioteca Python. Pentru a prelua datele senzorilor din Sense Hat, puteți crea un nou script Python read_sensor_data.py după cum urmează:

$ nano read_sensor_data.py

Introduceți următorul cod în read_sensor_data.py Fișier Python.

dinsense_hatimportSenseHat
din timp importdormi
sens=SenseHat()
sens.clar()
in timp ce Adevărat:
tempC=sens.get_temperature()
tempF=tempC *(9/5)+32
presiune=sens.get_pressure()
umiditate=sens.obține_umiditate()

imprimare(„Temperatură:% .2f ° C /%. 2f ° F n'%(tempC,tempF))
imprimare('Presiune:% .2f mb n'%(presiune))
imprimare(„Umiditate:% .2f %% n n'%(umiditate))
dormi(5)

Odată ce ați terminat, apăsați + X urmată de ȘI și .

În codul de mai sus, liniile 1 și 2 importă toate bibliotecile necesare, linia 4 creează un SenseHat obiect, iar linia 5 oprește toate LED-urile Sense Hat folosind clar() metodă. Bucla while din linia 7 este o buclă infinită care va rula codul în rândurile 8-16 pentru totdeauna.

În linia 8, get_temperature () metoda este utilizată pentru a citi datele de temperatură (în grade Celsius) de la senzorul de umiditate al Sense Hat. În linia 9, datele despre temperatură sunt convertite de la grade Celsius la grade Fahrenheit. În linia 10, get_pressure () metoda este utilizată pentru a citi datele despre presiunea aerului (în milibari) de la senzorul de presiune al Sense Hat. În linia 11, get_humidity () metoda este utilizată pentru a citi datele de umiditate (în%) de la senzorul de umiditate al Sense Hat.

Liniile 13-15 sunt utilizate pentru a imprima datele senzorului pe consolă, iar linia 16 este utilizată pentru a aștepta 5 secunde înainte de a citi din nou datele senzorului.

Puteți rula read_sensor_data.py Script Python după cum urmează:

$ python3 read_sensor_data.py

După executarea scriptului, datele senzorului vor fi tipărite pe consolă.

Acum că putem citi datele senzorilor din Sense Hat, apăsați + C pentru a opri programul.

Crearea unei aplicații web pentru stația meteo

În această secțiune, vă vom arăta cum să utilizați cadrul web Python Flask pentru a crea un API meteo și o aplicație meteo. Aplicația meteo va accesa API-ul pentru datele meteo și va afișa datele meteo în timp real. Tot codul discutat în această secțiune este disponibil pe GitHub la shovon8 / raspberry-pi-sense-hat-weather-app .

Mai întâi, creați un server.py Scriptul Python din directorul proiectului după cum urmează:

$ nano server.py

Introduceți următorul cod în server.py Fișier Python.

dinbalonimportBalon
dinbalonimportjsonify
dinbalonimportrender_template
dinbalonimporturl_for
dinsense_hatimportSenseHat
aplicație=Balon(__Nume__)
aplicație.config[„SEND_FILE_MAX_AGE_DEFAULT”] = 0
sens=SenseHat()
sens.clar()
cuaplicație.test_request_context():
url_for('static',nume de fișier=„style.css”)
url_for('static',nume de fișier=„app.js”)
@aplicație.traseu('/foc')
deffoc():
tempC=sens.get_temperature()
tempF=tempC *(9/5)+32
presiune=sens.get_pressure()
pressurePsi=presiune *0,0145038
presiuneP=presiune *100
umiditate=sens.obține_umiditate()

întoarcerejsonify({
'temperatura':{ „C”: tempC, „F”: tempF},
'presiune':{ „mb”: presiune, „hPa”: presiune,
„psi”: pressurePsi, „P”: presiuneP},
'umiditate': umiditate
})
@aplicație.traseu(„/”)
defAcasă():
întoarcererender_template(„./home.html”)

Apoi, apăsați + X urmată de ȘI și pentru a salva server.py Script Python.

În codul de mai sus, liniile 1-5 importă toate bibliotecile necesare, linia 7 creează o aplicație Flask, linia 11 creează un obiect SenseHat și linia 12 oprește toate LED-urile Sense Hat. Linia 8 dezactivează cache-ul web pentru aplicația Flask. Deoarece această aplicație este ușoară, nu este nevoie de cache. Dacă doriți să modificați aplicația, atunci când cache-ul web este dezactivat va face testarea mult mai ușoară.

Liniile 18–31 citesc datele senzorului din Sense Hat și returnează datele API în format JSON la cererea HTTP GET în /foc punctul final al serverului web. Liniile 37-39 returnează pagina de pornire a aplicației web meteo pe / punctul final al serverului web. Pagina de pornire este redată din acasă.html fișier, care ar trebui să fie în șabloane / directorul directorului proiectului.

Liniile 14-16 sunt utilizate pentru a permite accesul la stil.css și app.js fișiere statice. Aceste fișiere ar trebui să fie în static/ directorul directorului proiectului. The stil.css fișierul este utilizat pentru a stiliza fișierul acasă.html pagina de pornire și app.js fișier este utilizat pentru a solicita datele API de la /foc punctul final și actualizați datele meteo pe acasă.html pagină la fiecare 5 secunde.

Creați static/ și șabloane / director în directorul proiectului după cum urmează:

$ mkdir -v {static, șabloane}

Creeaza o acasă.html fișier în șabloane / director după cum urmează:

$ nano templates / home.html

Introduceți următorul cod în acasă.html fişier.


< html >
< cap >
< meta Nume=„vizualizare” conţinut=„lățime = lățime dispozitiv, scară inițială = 1,0”>
< titlu >Stația meteo Raspberry Pi</ titlu >
< legătură rel=„foaie de stil” tip=„text / css”
href='{{url_for (' static ', filename =' style.css ')}}'/>
</ cap >
< corp >
< div id='conţinut'>
< h1 >Stația meteo Raspberry Pi</ h1 >

< div clasă=„conținut de date”>
< h2 >Temperatura</ h2 >
< div clasă=„rând de date”>
< div clasă=„celulă de date” id=„tempC”>
...
</ div >
< div clasă=„celulă de date” id=„tempF”>
...
</ div >
</ div >
</ div >

< div clasă=„conținut de date”>
< h2 >Presiune</ h2 >
< div clasă=„rând de date”>
< div clasă=„celulă de date” id=„pressureMb”>
...
</ div >
< div clasă=„celulă de date” id=„pressurePsi”>
...
</ div >
</ div >
< div clasă=„rând de date”>
< div clasă=„celulă de date” id=„pressureHpa”>
...
</ div >
< div clasă=„celulă de date” id=„presiune P”>
...
</ div >
</ div >
</ div >

< div clasă=„conținut de date”>
< h2 >Umiditate</ h2 >
< div clasă=„rând de date”>
< div clasă=„celulă de date” id='umiditate'>
...
</ div >
</ div >
</ div >
</ div >

< scenariu tip=„text / javascript” src='{{url_for (' static ', filename =' app.js ')}}'></ scenariu >
</ corp >
</ html >

Apoi, apăsați + X urmată de ȘI și pentru a salva acasă.html fişier.

Creeaza o stil.css fișier în static/ director după cum urmează:

$ nano static / style.css

Introduceți următoarele coduri în stil.css fişier.

@import url(„https://fonts.googleapis.com/css2?family=Roboto&display=swap”);
* {
căptușeală: 0;
marjă: 0;
familie de fonturi: 'Robot', sans-serif;
}
corp{
fundal: # 737373;
}
h1{
afişa: bloc;
culoare: # 79DC7B;
aliniere text: centru;
grosimea fontului: 400;
fundal: # 000;
căptușeală: 0,5em 0;
}
h2{
afişa: bloc;
fundal: # 000;
culoare: #fff;
aliniere text: centru;
grosimea fontului: 400;
marimea fontului: 1em;
}
.data-content {
marjă: 10px;
frontieră: 2px solid negru;
frontieră-rază: 5px;
culoare de fundal: # 79DC7B;
}
.data-rând {
afişa:contracta;
direcție flexibilă:rând;
}
.data-celulă {
lăţime: 100%;
înălţime: 80 px;
afişa:contracta;
alinia-elemente: centru;
justify-content: centru;
grosimea fontului: îndrăzneţ;
marimea fontului: 1,5em;
culoare: # 006902;
}
.data-celulă:planare {
fundal: # FFE891;
culoare: # AA8600;
cursor: indicator;
}

Apoi, apăsați + X urmată de ȘI și pentru a salva stil.css fişier.

Creaza un app.js fișier în static/ director după cum urmează:

$ nano static / app.js

Introduceți următorul cod în app.js fişier.

fereastră.addEventListener('sarcină',principal);
funcţieprincipal() {
funcţiegetAPIData() {
Undehttp= nouXMLHttpRequest();

http.onreadystatechange = funcţie() {
dacă(acest.readyState === 4 && acest.stare === 200) {
Actualizați(JSON.analiza(acest.text de răspuns));
}
}

http.deschis('OBȚINE', '/foc', Adevărat);
http.trimite();
}


funcţieActualizați(apiData) {
UndetempC=document.getElementById(„tempC”);
UndetempF=document.getElementById(„tempF”);
UndepresiuneMb=document.getElementById(„pressureMb”);
UndepressurePsi=document.getElementById(„pressurePsi”);
UndepresiuneHpa=document.getElementById(„pressureHpa”);
UndepresiuneP=document.getElementById(„presiune P”);
Undeumiditate=document.getElementById('umiditate');

tempC.HTML interioară =parseFloat(apiData.temperatura.C).toFixed(2) + „° C”;
tempF.HTML interioară =parseFloat(apiData.temperatura.F).toFixed(2) + „° F”;

presiuneMb.HTML interioară =parseFloat(apiData.presiune.mb).toFixed(2) + „mb”;
pressurePsi.HTML interioară =parseFloat(apiData.presiune.psi).toFixed(2) + „psi”;
presiuneHpa.HTML interioară =parseFloat(apiData.presiune.hPa).toFixed(2) + „hPa”;
presiuneP.HTML interioară =parseFloat(apiData.presiune.P).toFixed(2) + „P”;

umiditate.HTML interioară =parseFloat(apiData.umiditate).toFixed(2) + „%”;
}


funcţieaplicație() {
fereastră.setInterval(funcţie() {
getAPIData();
}, 5000);
}

aplicație();
}

Apoi, apăsați + X urmată de ȘI și pentru a salva app.js fişier.

Aici, linia 1 rulează principal() funcția când pagina web se termină de încărcat. În principal() funcția, getAPIData () funcția preia datele meteo API folosind AJAX și apelează Actualizați() funcție (în linia 10) odată ce datele au fost preluate cu succes. The Actualizați() funcția actualizează elementul paginii web utilizând datele API.

În linia 20, document.getElementById () metoda este utilizată pentru a obține referința elementului paginii web cu id-ul tempC . Linia 28 este utilizată pentru a înlocui conținutul elementului paginii web care are id-ul tempC cu temperatura (în grade Celsius) din API. În același mod, conținutul tuturor elementelor web (liniile 21-26) sunt înlocuite cu datele lor API respective.

În app () funcția, getAPIData () este apelat la fiecare 5 secunde (5000 milisecunde) pentru a menține actualizate datele meteo în aplicația meteo. În cele din urmă, în linia 46, app () funcția este executată.

Pentru a testa aplicația web, introduceți următoarea comandă:

$ FLASK_APP = server.py balonul rulează --host = 0.0.0.0

Aplicația meteo ar trebui să ruleze pe portul 5000 (implicit).

Pentru a testa dacă API-ul Weather funcționează, rulați următoarea comandă:

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

După cum puteți vedea, datele API Weather sunt tipărite pe consolă. Prin urmare, API-ul funcționează.

Pentru a testa aplicația Meteo, vizitați http: // localhost: 5000 dintr-un browser web Chromium. Aplicația Meteo ar trebui să fie încărcată pe browserul web, dar nu trebuie afișate date meteo la început.

După câteva secunde, aplicația meteo ar trebui să termine să preia datele meteo din API și să le afișeze.

În orice moment, puteți apăsa + C pentru a opri serverul web.

Crearea serviciului Systemd pentru aplicația Web Weather

În această secțiune, vă vom arăta cum să creați un fișier de serviciu systemd pentru aplicația meteo, astfel încât să înceapă automat la pornire.

Mai întâi, creați un meteo-stație.serviciu fișier în directorul dvs. de proiect după cum urmează:

$ nano meteo-stație.serviciu

Introduceți următoarele linii de cod în meteo-stație.serviciu fişier.

[Unitate]
Descriere = Aplicația web a stației meteo Raspberry Pi utilizând Raspberry Pi Sense Hat
După = network.target

[Serviciu]
WorkingDirectory = / home / pi / work
Mediu = FLASK_APP = server.py
Mediu = FLASK_ENV = producție
ExecStart = / usr / bin / flask run --host = 0.0.0.0
StandardOutput = mostenire
StandardError = moștenire
Restart = întotdeauna
Utilizator = pi

[Instalare]
WantedBy = multi-user.target

Apoi, apăsați + X urmată de ȘI și pentru a salva meteo-stație.serviciu fişier.

Copiați meteo-stație.serviciu fișier la / etc / systemd / system / director cu următoarea comandă:

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

Reîncărcați demonii systemd pentru ca modificările să aibă efect după cum urmează:

$ sudo systemctl daemon-reload

The stație meteorologică serviciul systemd ar trebui să fie inactiv în acest moment, așa cum se arată în captura de ecran de mai jos.

$ sudo systemctl status weather-station.service

Porniți stație meteorologică service cu următoarea comandă:

$ sudo systemctl start weather-station.service

După cum puteți vedea, stație meteorologică serviciul rulează acum.

$ sudo systemctl status weather-station.service

Acum că stație meteorologică serviciul funcționează, îl puteți adăuga la pornirea sistemului Raspberry Pi OS cu următoarea comandă:

$ sudo systemctl activează meteo-stație.serviciu

Reporniți Raspberry Pi cu următoarea comandă:

$ sudo reporniți

Odată ce ați pornit Raspberry Pi, stație meteorologică serviciul ar trebui să ruleze, așa cum se arată în captura de ecran de mai jos.

$ sudo systemctl status weather-station.service

Accesarea aplicației Meteo de pe alte dispozitive

Pentru a accesa aplicația meteo de pe alte dispozitive din rețeaua dvs. de acasă, trebuie să cunoașteți adresa IP a Raspberry Pi. Puteți găsi adresa IP a Raspberry Pi 4 din interfața de gestionare web a routerului dvs. de acasă. În cazul nostru, adresa IP este 192.168.0.103, dar această adresă va fi diferită pentru dvs., deci asigurați-vă că înlocuiți această adresă cu a dvs. în toți pașii ulteriori.

Dacă aveți acces la consola Raspberry Pi, puteți rula următoarea comandă pentru a găsi și adresa IP.

$ hostname -I

După ce cunoașteți adresa IP a Raspberry Pi, o puteți accesa de pe orice dispozitiv din rețeaua dvs. de acasă. După cum se arată în captura de ecran de mai jos, am accesat aplicația meteo de pe un smartphone Android.

Concluzie

În acest articol, v-am arătat cum să utilizați Raspberry Pi Sense Hat pentru a construi o stație meteo Raspberry Pi. Am folosit pălărie de simț Biblioteca Python pentru a extrage datele meteo din Raspberry Pi Sense Hat. Apoi, am folosit micro framework-ul Flask Python pentru a crea un API meteo și o aplicație web. Aplicația web primește datele meteo din API-ul meteo la fiecare 5 secunde pentru a menține aplicația web actualizată cu cele mai recente date meteo.