Izveidojiet savu Raspberry Pi meteoroloģisko staciju

Build Your Own Raspberry Pi Weather Station



Raspberry Pi Sense Hat ir papildaprīkojums, ko var izmantot kopā ar Raspberry Pi vienas plates datoriem. Raspberry Pi Sense cepurei ir 8 × 8 LED displejs un 5 pogu vadības svira, un tā ir aprīkota ar šādiem sensoriem:

  1. Žiroskops
  2. Akselerometrs
  3. Magnetometrs
  4. Temperatūra
  5. Barometriskais spiediens
  6. Mitrums

Šajā rakstā es jums parādīšu, kā izveidot uz Python API balstītu laika staciju tīmekļa lietojumprogrammu, izmantojot temperatūra , barometrisko spiedienu , un mitrums Raspberry Pi Sense cepures sensori. Lai turpinātu šo rakstu, jums būs nepieciešams:







  1. Raspberry Pi 3 vai Raspberry Pi 4 ar tīkla savienojumu.
  2. Raspberry Pi Sense Hat modulis.
  3. Mikro-USB (Raspberry Pi 3) vai C tipa USB (Raspberry Pi 4) strāvas adapteris.
  4. 16 GB vai 32 GB microSD karte ar Raspberry Pi OS.
  5. Klēpjdators vai galddators, lai piekļūtu VNC attālajai darbvirsmai vai SSH piekļuvei Raspberry Pi.

PIEZĪME: Šajā rakstā mēs izveidosim savienojumu ar Raspberry Pi attālināti, izmantojot VNC vai SSH, izmantojot Raspberry Pi iestatījumu bez galvas. Ja nevēlaties piekļūt savam Raspberry Pi attālināti, izmantojot SSH vai VNC, Raspberry Pi būs jāpievieno monitors, tastatūra un pele.



Lai uzzinātu, kā ierakstīt Raspberry Pi OS attēlu microSD kartē, lūdzu, skatiet sadaļu Kā instalēt un lietot Raspberry Pi Imager. Ja jums nepieciešama palīdzība, instalējot Raspberry Pi OS savā Raspberry Pi, izlasiet Kā instalēt Raspberry Pi OS Raspberry Pi 4 . Ja jums nepieciešama palīdzība ar Raspberry Pi iestatīšanu bez galvas, skatiet rakstu Kā instalēt un konfigurēt Raspberry Pi OS Raspberry Pi 4 bez ārējā monitora.



Raspberry Pi Sense cepures savienošana ar Raspberry Pi

Raspberry Pi Sense Hat komplektam ir pievienots Raspberry Pi Sense Hat papildinājums, 40 kontaktu galvene no vīrieša līdz sievietei un dažas skrūves un starplikas.





Pirms jūs varat piestiprināt Sense Hat dēli Raspberry Pi, jums ir jāpievieno 40 kontaktu galvene ar Sense Hat. Pievienojiet 40 kontaktu tēviņa un sievietes galvenes tērauda tapas Sense cepurei, kā parādīts zemāk esošajos attēlos.



Raspberry Pi viena paneļa datoriem ir 4 caurumi, kurus var izmantot, lai piestiprinātu papildu dēļus vai korpusu. Lai pievienotu papildplāksni, ievietojiet skrūves no Raspberry Pi aizmugures, kā parādīts attēlos.

Pēc tam pievienojiet skrūvei starpliku.

Kad esat pievienojis visas četras skrūves un starplikas, jūsu Raspberry Pi vajadzētu izskatīties tā, kā parādīts attēlā.

Savienojiet Raspberry Pi Sense cepuri ar Raspberry Pi 40 kontaktu GPIO vīriešu galveni, kā parādīts attēlos zemāk.

PIEZĪME: Esiet piesardzīgs, atvienojot Raspberry Pi Sense cepuri no Raspberry Pi 40 kontaktu GPIO galvenes, lai nesaliektu Raspberry Pi GPIO tapas.

Ar četrām atlikušajām skrūvēm piestipriniet Raspberry Pi Sense cepuri, kā parādīts attēlos zemāk.

Ieslēdzot Raspberry Pi

Tagad, kad Raspberry Pi Sense Hat ir pievienota Raspberry Pi, ievietojiet microSD karti ar Raspberry Pi OS Raspberry Pi microSD kartes slotā, pievienojiet strāvas kabeli Raspberry Pi un ieslēdziet to.

Raspberry Pi Sense Hat Python bibliotēkas instalēšana

Lai izmantotu Raspberry Pi Sense cepuri uz Raspberry Pi, maņu cepure Raspberry Pi OS ir jāinstalē Python bibliotēka. The maņu cepure bibliotēka ir pieejama Raspberry Pi OS oficiālajā pakotņu krātuvē.

Lai instalētu Raspberry Pi maņu cepure Python bibliotēkā Raspberry Pi OS, vispirms atjauniniet APT pakotnes krātuves kešatmiņu ar šādu komandu:

$ sudo apt atjauninājums

Pēc tam palaidiet šādu komandu:

$ sudo apt instalēt sense -hat -y

Flask Micro Web Framework Python bibliotēkas instalēšana

Mēs izmantosim Flask Python sistēmu, lai izveidotu mūsu laika apstākļu lietojumprogrammu. Jūs varat instalēt Flask no Raspberry Pi OS oficiālā pakotņu krātuves ar šādu komandu:

$ sudo apt instalēt python3 -kolba -y

Projekta direktorija izveide

Ieteicams izveidot projektu direktoriju, lai sakārtotu projekta failus. Lai izveidotu projektu direktoriju ~/darbs , izmantojiet šādu komandu:

$ mkdir ~/darbs

Kad projektu direktorijs ir izveidots, dodieties uz projektu direktoriju šādi:

$ cd ~/darbs

Raspberry Pi Sense cepures pārbaude

Lai pārbaudītu, vai Raspberry Pi Sense cepure darbojas, mēs varam uzrakstīt vienkāršu testa Python skriptu. Jūs varat izveidot jaunu Python skriptu ar nosaukumu test.py Ar nano teksta redaktoru šādi:

$ nano test.py

Ievadiet tālāk norādīto kodu test.py failu. 1. rindas imports SenseHat no sense_hat modulis, 3. rinda izveido a SenseHat objektu un saglabā atsauci mapē jēga mainīgs, un 5. – 6. rindā visu 8 × 8 gaismas diodes krāsa ir sarkana. Kad esat pabeidzis, nospiediet + X kam sekoja UN un .

Jūs varat palaist test.py Python skripts ar šādu komandu:

$ python3 test.py

8 × 8 LED matricai vajadzētu spīdēt sarkanā krāsā, kā parādīts attēlā zemāk.

Lai izslēgtu Sense Hat gaismas diodes, palaidiet skaidrs () metodi bez krāsas vērtības test.py Python skriptu, kā parādīts zemāk esošajā ekrānuzņēmumā, un palaist test.py Atkal Python skripts.

Sense Hat gaismas diodēm tagad jābūt izslēgtām, kā parādīts attēlā zemāk.

Ja Sense cepure darbojas pareizi, pārejiet pie nākamās sadaļas.

Laika datu iegūšana no Sense Hat

Jūs varat ļoti viegli iegūt sensoru datus no Sense Hat, izmantojot maņu cepure Python bibliotēka. Lai izgūtu sensoru datus no Sense Hat, varat izveidot jaunu Python skriptu read_sensor_data.py sekojoši:

$ nano read_sensor_data.py

Ievadiet tālāk norādīto kodu read_sensor_data.py Python fails.

nosense_hatimportētSenseHat
no laiks importētGulēt
jēga=SenseHat()
jēga.skaidrs()
kamēr Taisnība:
tempC=jēga.get_temperature()
tempF=tempC *(9/5)+32
spiedienu=jēga.get_pressure()
mitrums=jēga.get_humidity()

drukāt('Temperatūra: %.2f ° C/ %.2f ° F n'%(tempC,tempF))
drukāt('Spiediens: %.2f mb n'%(spiedienu))
drukāt('Mitrums:%.2f %% n n'%(mitrums))
Gulēt(5)

Kad esat pabeidzis, nospiediet + X kam sekoja UN un .

Iepriekš redzamajā kodā 1. un 2. rindā tiek importētas visas nepieciešamās bibliotēkas, 4. rindā tiek izveidots a SenseHat objekts, un 5. līnija izslēdz visas Sense Hat gaismas diodes, izmantojot skaidrs () metodi. Kamēr cilpa 7. rindā ir bezgalīga cilpa, kas visu laiku darbinās kodu rindās 8–16.

8. rindā, get_temperature () metodi izmanto, lai nolasītu temperatūras datus (Celsija grādos) no Sense Hat mitruma sensora. 9. rindā temperatūras dati tiek pārvērsti no Celsija grādiem uz Fārenheita grādiem. 10. rindā ,. get_pressure () metodi izmanto, lai nolasītu gaisa spiediena datus (milibāros) no Sense Hat spiediena sensora. 11. rindā, get_humidity () metode tiek izmantota, lai nolasītu mitruma datus ( %) no Sense Hat mitruma sensora.

Līnijas 13–15 tiek izmantotas, lai drukātu sensora datus uz konsoli, un 16. rindu izmanto, lai nogaidītu 5 sekundes, pirms nolasīt sensora datus vēlreiz.

Jūs varat palaist read_sensor_data.py Python skripts ir šāds:

$ python3 read_sensor_data.py

Kad skripts ir izpildīts, sensora dati tiks izdrukāti konsolē.

Tagad, kad mēs varam nolasīt sensora datus no Sense Hat, nospiediet + C lai apturētu programmu.

Meteoroloģiskās stacijas tīmekļa lietotnes izveide

Šajā sadaļā mēs parādīsim, kā izmantot tīmekļa sistēmu Python Flask, lai izveidotu laika apstākļu API un laika apstākļu lietojumprogrammu. Laika apstākļu lietojumprogramma piekļūs laika apstākļu datu API un parādīs laika apstākļu datus reālā laikā. Viss šajā sadaļā aplūkotais kods ir pieejams vietnē GitHub vietnē shovon8 / aveņu-pi-sense-hat-weather-app .

Vispirms izveidojiet a server.py Python skripts projekta direktorijā ir šāds:

$ nano server.py

Ievadiet tālāk norādīto kodu server.py Python fails.

nokolbaimportētKolba
nokolbaimportētjsonify
nokolbaimportētrender_template
nokolbaimportēturl_for
nosense_hatimportētSenseHat
lietotne=Kolba(__name__)
lietotne.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0
jēga=SenseHat()
jēga.skaidrs()
arlietotne.test_request_context():
url_for('statisks',faila nosaukums='style.css')
url_for('statisks',faila nosaukums='app.js')
@lietotne.maršrutu('/uguns')
defuguns():
tempC=jēga.get_temperature()
tempF=tempC *(9/5)+32
spiedienu=jēga.get_pressure()
spiediensPsi=spiediens *0,0145038
spiediensP=spiediens *100
mitrums=jēga.get_humidity()

atgrieztiesjsonify({
'temperatūra':{ “C”: tempC, “F”: tempF},
'spiediens':{ 'mb': spiediens, 'hPa': spiediens,
'psi': spiediensPsi, “P”: spiediensP},
'mitrums': mitrums
})
@lietotne.maršrutu('/')
defmājas():
atgrieztiesrender_template('./home.html')

Pēc tam nospiediet + X kam sekoja UN un lai saglabātu server.py Python skripts.

Iepriekš redzamajā kodā 1. – 5. Rinda importē visas nepieciešamās bibliotēkas, 7. rindiņa izveido lietotni Kolba, 11. rinda izveido objektu SenseHat, un 12. rindiņa izslēdz visas Sense Hat gaismas diodes. 8. rindā tiek atspējota tīmekļa kešatmiņa lietotnei Flask. Tā kā šī lietotne ir viegla, kešatmiņa nav nepieciešama. Ja vēlaties modificēt lietotni, atspējojot tīmekļa kešatmiņu, testēšana būs daudz vieglāka.

18. – 31. Rindiņa nolasa sensoru datus no Sense Hat un atgriež API datus JSON formātā, izmantojot HTTP GET pieprasījumu /uguns tīmekļa servera galapunkts. 37. – 39. Rindā vietnē tiek atgriezta laikapstākļu tīmekļa lietotnes sākumlapa / tīmekļa servera galapunkts. Mājas lapa tiek renderēta no mājas.html failu, kuram vajadzētu būt veidnes/ projekta direktorija direktorijā.

Līnijas 14–16 tiek izmantotas, lai ļautu piekļūt stils.css un app.js statiskos failus. Šiem failiem jābūt mapē statisks/ projekta direktorija direktorijā. The stils.css fails tiek izmantots, lai veidotu mājas.html mājas lapa un app.js fails tiek izmantots, lai pieprasītu API datus no /uguns galapunktu un atjauniniet laika apstākļu datus vietnē mājas.html lapu ik pēc 5 sekundēm.

Izveidojiet statisks/ un veidnes/ direktoriju projekta direktorijā šādi:

$ mkdir -v {static, templates}

Izveidojiet a mājas.html failu mapē veidnes/ direktoriju šādi:

$ nano templates/home.html

Ievadiet tālāk norādīto kodu mājas.html failu.


< html >
< galvu >
< meta vārds='skatu punkts' saturu='platums = ierīces platums, sākotnējā skala = 1,0'>
< titulu >Meteoroloģiskā stacija Raspberry Pi</ titulu >
< saite rel='stilu lapa' tipa='text/css'
href='{{url_for (' static ', faila nosaukums =' style.css ')}}'/>
</ galvu >
< ķermenis >
< div id='saturs'>
< h1 >Meteoroloģiskā stacija Raspberry Pi</ h1 >

< div klase='datu saturs'>
< h2 >Temperatūra</ h2 >
< div klase='datu rinda'>
< div klase='datu šūna' id='tempC'>
...
</ div >
< div klase='datu šūna' id='tempF'>
...
</ div >
</ div >
</ div >

< div klase='datu saturs'>
< h2 >Spiediens</ h2 >
< div klase='datu rinda'>
< div klase='datu šūna' id='spiediensMb'>
...
</ div >
< div klase='datu šūna' id='spiediens Psi'>
...
</ div >
</ div >
< div klase='datu rinda'>
< div klase='datu šūna' id='spiediensHpa'>
...
</ div >
< div klase='datu šūna' id='spiediens P'>
...
</ div >
</ div >
</ div >

< div klase='datu saturs'>
< h2 >Mitrums</ h2 >
< div klase='datu rinda'>
< div klase='datu šūna' id='mitrums'>
...
</ div >
</ div >
</ div >
</ div >

< skripts tipa='text/javascript' src='{{url_for (' static ', faila nosaukums =' app.js ')}}'></ skripts >
</ ķermenis >
</ html >

Pēc tam nospiediet + X kam sekoja UN un lai saglabātu mājas.html failu.

Izveidojiet a stils.css failu mapē statisks/ direktoriju šādi:

$ nano static/style.css

Ievadiet tālāk norādītos kodus stils.css failu.

@importēt url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
* {
polsterējums: 0;
rezerve: 0;
fontu saime: 'Robots', sans serif;
}
ķermenis{
fons: # 737373;
}
h1{
displejs: bloķēt;
krāsa: #79DC7B;
teksta līdzināšana: centrā;
fontu svars: 400;
fons: # 000;
polsterējums: 0.5em 0;
}
h2{
displejs: bloķēt;
fons: # 000;
krāsa: #fff;
teksta līdzināšana: centrā;
fontu svars: 400;
fonta izmērs: 1em;
}
.datu saturs {
rezerve: 10 pikseļi;
robeža: 2 pikseļi ciets melns;
robežas rādiuss: 5 pikseļi;
fona krāsa: #79DC7B;
}
.datu rinda {
displejs:saliekties;
elastīgs virziens:rinda;
}
.datu šūna {
platums: 100%;
augstums: 80 pikseļi;
displejs:saliekties;
izlīdzināt vienumus: centrā;
pamatot saturu: centrā;
fontu svars: treknrakstā;
fonta izmērs: 1.5em;
krāsa: # 006902;
}
.datu šūna:virziet kursoru {
fons: # FFE891;
krāsa: # AA8600;
kursors: rādītājs;
}

Pēc tam nospiediet + X kam sekoja UN un lai saglabātu stils.css failu.

Izveidojiet app.js failu mapē statisks/ direktoriju šādi:

$ nano static/app.js

Ievadiet tālāk norādīto kodu app.js failu.

logs.addEventListener('slodze',galvenais);
funkcijugalvenais() {
funkcijugetAPIData() {
kurhttp= jaunsXMLHttpRequest();

http.jau maiņa = funkciju() {
ja(šo.readyState === 4 && šo.statuss === 200) {
Atjaunināt(JSON.parsēt(šo.responseText));
}
}

http.atvērts('GŪT', '/uguns', taisnība);
http.nosūtīt();
}


funkcijuAtjaunināt(apiData) {
kurtempC=dokuments.getElementById('tempC');
kurtempF=dokuments.getElementById('tempF');
kurspiediensMb=dokuments.getElementById('spiediensMb');
kurspiediensPsi=dokuments.getElementById('spiediens Psi');
kurspiediensHpa=dokuments.getElementById('spiediensHpa');
kurspiediensP=dokuments.getElementById('spiediens P');
kurmitrums=dokuments.getElementById('mitrums');

tempC.iekšējaisHTML =parseFloat(apiData.temperatūra.C).toFiksēts(2) + '° C';
tempF.iekšējaisHTML =parseFloat(apiData.temperatūra.F).toFiksēts(2) + '° F';

spiediensMb.iekšējaisHTML =parseFloat(apiData.spiedienu.mb).toFiksēts(2) + 'mb';
spiediensPsi.iekšējaisHTML =parseFloat(apiData.spiedienu.psi).toFiksēts(2) + 'psi';
spiediensHpa.iekšējaisHTML =parseFloat(apiData.spiedienu.hPa).toFiksēts(2) + 'hPa';
spiediensP.iekšējaisHTML =parseFloat(apiData.spiedienu.Lpp).toFiksēts(2) + “P”;

mitrums.iekšējaisHTML =parseFloat(apiData.mitrums).toFiksēts(2) + '%';
}


funkcijulietotne() {
logs.setInterval(funkciju() {
getAPIData();
}, 5000);
}

lietotne();
}

Pēc tam nospiediet + X kam sekoja UN un lai saglabātu app.js failu.

Šeit 1. rindiņa vada galvenais () funkcija, kad tīmekļa lapa tiek ielādēta. Iekš galvenais () funkcija, getAPIData () funkcija iegūst laika apstākļu API datus, izmantojot AJAX, un izsauc Atjaunināt() funkciju (10. rindā), kad dati ir veiksmīgi iegūti. The Atjaunināt() funkcija atjaunina tīmekļa lapas elementu, izmantojot API datus.

20. rindā, document.getElementById () metode tiek izmantota, lai iegūtu atsauci uz tīmekļa lapas elementu ar ID tempC . 28. rindu izmanto, lai aizstātu tās tīmekļa lapas elementa saturu, kuram ir id tempC ar temperatūru (pēc Celsija) no API. Tādā pašā veidā visu tīmekļa elementu (21. – 26. Rindas) saturs tiek aizstāts ar attiecīgajiem API datiem.

Iekš lietotne () funkcija, getAPIData () tiek izsaukts ik pēc 5 sekundēm (5000 milisekundes), lai laika apstākļu lietotnē atjauninātu laika apstākļu datus. Visbeidzot, 46. rindā lietotne () funkcija tiek izpildīta.

Lai pārbaudītu tīmekļa lietotni, ievadiet šādu komandu:

$ FLASK_APP = server.py kolbas palaišana -host = 0.0.0.0

Laikapstākļu lietotnei vajadzētu darboties ostā 5000 (pēc noklusējuma).

Lai pārbaudītu, vai laika apstākļu API darbojas, palaidiet šādu komandu:

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

Kā redzat, laika apstākļu API dati tiek izdrukāti konsolē. Tāpēc API darbojas.

Lai pārbaudītu laika apstākļu lietotni, apmeklējiet http: // localhost: 5000 no Chromium tīmekļa pārlūkprogrammas. Lietotne Laika apstākļi ir jāielādē tīmekļa pārlūkprogrammā, taču sākotnēji nevajadzētu parādīt laika apstākļu datus.

Pēc dažām sekundēm laika apstākļu lietotnei jāpabeidz laika apstākļu datu izgūšana no API un tā jāparāda.

Jebkurā brīdī varat nospiest + C lai apturētu tīmekļa serveri.

Sistēmas pakalpojuma izveide tīmekļa lietotnei Weather

Šajā sadaļā mēs parādīsim, kā izveidot sistemātisku pakalpojuma failu laika apstākļu lietotnei, lai tā automātiski sāktos pēc palaišanas.

Vispirms izveidojiet a laika stacija.pakalpojums failu projekta direktorijā šādi:

$ nano meteoroloģiskā stacija. pakalpojums

Ievadiet tālāk norādītās koda rindiņas laika stacija.pakalpojums failu.

[Vienība]
Apraksts = Raspberry Pi Weather Station Web App, izmantojot Raspberry Pi Sense Hat
Pēc = network.target

[Apkalpošana]
WorkingDirectory =/mājas/pi/darbs
Vide = FLASK_APP = server.py
Vide = FLASK_ENV = ražošana
ExecStart =/usr/bin/kolba palaist -host = 0.0.0.0
StandardOutput = mantot
Standarta kļūda = mantot
Restartēt = vienmēr
Lietotājs = pi

[Uzstādīt]
WantedBy = vairāku lietotāju mērķis

Pēc tam nospiediet + X kam sekoja UN un lai saglabātu laika stacija.pakalpojums failu.

Kopējiet laika stacija.pakalpojums failu uz /etc/systemd/system/ direktoriju ar šādu komandu:

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

Lai izmaiņas stātos spēkā, atkārtoti ielādējiet sistēmas dēmonus:

$ sudo systemctl dēmonu pārlādēšana

The laika stacija systemd pakalpojumam pašlaik jābūt neaktīvam, kā parādīts zemāk esošajā ekrānuzņēmumā.

$ sudo systemctl statuss weather-station.service

Sāciet laika stacija pakalpojumu ar šādu komandu:

$ sudo systemctl sākt meteoroloģisko staciju. pakalpojums

Kā redzat, laika stacija pakalpojums tagad darbojas.

$ sudo systemctl statuss weather-station.service

Tagad, kad laika stacija pakalpojums darbojas, varat to pievienot Raspberry Pi OS sistēmas startēšanai ar šādu komandu:

$ sudo systemctl iespējot Weather-station.service

Pārstartējiet Raspberry Pi ar šādu komandu:

$ sudo atsāknēšana

Kad jūsu Raspberry Pi zābaki, laika stacija pakalpojumam vajadzētu darboties, kā parādīts zemāk esošajā ekrānuzņēmumā.

$ sudo systemctl statuss weather-station.service

Piekļuve laika apstākļu lietotnei no citām ierīcēm

Lai piekļūtu laika apstākļu lietotnei no citām mājas tīkla ierīcēm, jums jāzina jūsu Raspberry Pi IP adrese. Raspberry Pi 4 IP adresi varat atrast mājas maršrutētāja tīmekļa pārvaldības saskarnē. Mūsu gadījumā IP adrese ir 192.168.0.103, taču šī adrese jums būs atšķirīga, tāpēc noteikti nomainiet šo adresi ar savu, veicot visas turpmākās darbības.

Ja jums ir piekļuve konsolei Raspberry Pi, varat izpildīt šādu komandu, lai atrastu arī IP adresi.

$ hostname -I

Kad esat uzzinājis sava Raspberry Pi IP adresi, varat tai piekļūt no jebkuras mājas tīkla ierīces. Kā parādīts zemāk esošajā ekrānuzņēmumā, mēs esam piekļuvuši laika apstākļu lietotnei no Android viedtālruņa.

Secinājums

Šajā rakstā mēs parādījām, kā izmantot Raspberry Pi Sense cepuri, lai izveidotu Raspberry Pi laika staciju. Mēs izmantojām maņu cepure Python bibliotēka, lai iegūtu datus par laika apstākļiem no Raspberry Pi Sense cepures. Pēc tam mēs izmantojām Flask Python mikro tīmekļa sistēmu, lai izveidotu laika apstākļu API un tīmekļa lietojumprogrammu. Tīmekļa lietotne ik pēc 5 sekundēm iegūst laika apstākļu datus no laika apstākļu API, lai tīmekļa lietotne tiktu atjaunināta ar jaunākajiem laika apstākļu datiem.