Sukurkite savo Raspberry Pi orų stotį

Build Your Own Raspberry Pi Weather Station



„Raspberry Pi Sense Hat“ yra papildoma plokštė, kurią galima naudoti su „Raspberry Pi“ vienos plokštės kompiuteriais. „Raspberry Pi Sense“ skrybėlėje yra 8 × 8 LED ekranas ir 5 mygtukų vairasvirtė, o joje yra šie jutikliai:

  1. Giroskopas
  2. Akselerometras
  3. Magnetometras
  4. Temperatūra
  5. Barometrinis slėgis
  6. Drėgmė

Šiame straipsnyje aš jums parodysiu, kaip sukurti „Python“ API pagrįstą orų stoties žiniatinklio programą naudojant temperatūra , barometrinis slėgis , ir drėgmės „Raspberry Pi Sense“ skrybėlės jutikliai. Norėdami tęsti šį straipsnį, jums reikės:







  1. „Raspberry Pi 3“ arba „Raspberry Pi 4“ su tinklo ryšiu.
  2. „Raspberry Pi Sense Hat“ modulis.
  3. Mikro-USB (Raspberry Pi 3) arba C tipo USB (Raspberry Pi 4) maitinimo adapteris.
  4. 16 GB arba 32 GB „microSD“ kortelė su „Raspberry Pi“ OS.
  5. Nešiojamasis kompiuteris arba stalinis kompiuteris, skirtas VNC nuotolinio darbalaukio prieigai arba SSH prieigai prie „Raspberry Pi“.

PASTABA: Šiame straipsnyje mes prisijungsime prie „Raspberry Pi“ nuotoliniu būdu per VNC arba SSH, naudodami „Raspberry Pi“ sąranką be galvos. Jei nenorite nuotoliniu būdu pasiekti „Raspberry Pi“ per SSH arba VNC, prie „Raspberry Pi“ turėsite prijungti monitorių, klaviatūrą ir pelę.



Norėdami sužinoti, kaip „Raspberry Pi“ OS atvaizdą perkelti į „microSD“ kortelę, žr. Kaip įdiegti ir naudoti „Raspberry Pi Imager“. Jei jums reikia pagalbos diegiant Raspberry Pi OS savo Raspberry Pi, skaitykite Kaip įdiegti Raspberry Pi OS Raspberry Pi 4 . Jei jums reikia pagalbos nustatant „Raspberry Pi“ be galvos, patikrinkite, kaip įdiegti ir konfigūruoti „Raspberry Pi“ OS „Raspberry Pi 4“ be išorinio monitoriaus.



„Raspberry Pi Sense“ skrybėlės prijungimas prie „Raspberry Pi“

„Raspberry Pi Sense Hat“ rinkinyje yra „Raspberry Pi Sense Hat“ priedas, 40 kontaktų antraštė nuo vyrų iki moterų ir kai kurie varžtai ir tarpikliai.





Prieš pritvirtindami „Sense Hat“ plokštę prie „Raspberry Pi“, turite prijungti 40 kontaktų antraštę prie „Sense Hat“. Prijunkite 40 kontaktų vyriškos ir moteriškos galvutės kaiščius prie „Sense“ skrybėlės, kaip parodyta žemiau esančiuose paveikslėliuose.



Vienos plokštės „Raspberry Pi“ kompiuteriai turi 4 skyles, kuriomis galima pritvirtinti papildomas plokštes ar dėklą. Norėdami pritvirtinti papildomą plokštę, įkiškite varžtus iš „Raspberry Pi“ užpakalinės dalies, kaip parodyta žemiau esančiuose paveikslėliuose.

Tada prie varžto prijunkite tarpiklį.

Pridėję visus keturis varžtus ir tarpiklius, jūsų „Raspberry Pi“ turėtų atrodyti taip, kaip parodyta žemiau esančiame paveikslėlyje.

Prijunkite „Raspberry Pi Sense“ skrybėlę prie 40 kontaktų GPIO „Raspberry Pi“ antraštės, kaip parodyta žemiau esančiuose paveikslėliuose.

PASTABA: Būkite atsargūs, atjungdami „Raspberry Pi Sense“ skrybėlę nuo „Raspberry Pi“ 40 kontaktų GPIO antraštės, kad nesulenktumėte „Raspberry Pi GPIO“ kaiščių.

Likusiais keturiais varžtais pritvirtinkite „Raspberry Pi Sense“ skrybėlę, kaip parodyta žemiau esančiuose paveikslėliuose.

Įjungiamas „Raspberry Pi“

Dabar, kai „Raspberry Pi Sense Hat“ yra prijungta prie „Raspberry Pi“, įdėkite „microSD“ kortelę su „Raspberry Pi“ OS į „Raspberry Pi“ „microSD“ kortelės lizdą, prijunkite maitinimo kabelį prie „Raspberry Pi“ ir įjunkite.

„Raspberry Pi Sense Hat Python“ bibliotekos diegimas

Jei norite naudoti Raspberry Pi Sense Hat ant Raspberry Pi, prasmė-skrybėlė „Python“ biblioteka turi būti įdiegta „Raspberry Pi“ OS. The prasmė-skrybėlė biblioteką galima rasti oficialioje „Raspberry Pi“ OS paketų saugykloje.

Norėdami įdiegti „Raspberry Pi“ prasmė-skrybėlė „Python“ bibliotekoje „Raspberry Pi“ OS, pirmiausia atnaujinkite APT paketo saugyklos talpyklą naudodami šią komandą:

$ sudo apt atnaujinimas

Tada paleiskite šią komandą:

$ sudo apt įdiegti sense -hat -y

„Flask Micro Web Framework“ „Python“ bibliotekos diegimas

Mes naudosime „Flask Python“ sistemą, kad sukurtume savo orų programą. „Flask“ galite įdiegti iš oficialios „Raspberry Pi OS“ paketų saugyklos naudodami šią komandą:

$ sudo apt įdiegti python3 -flask -y

Projekto katalogo kūrimas

Patartina sukurti projekto katalogą, kuriame būtų tvarkomi jūsų projekto failai. Norėdami sukurti projekto katalogą ~/darbas , naudokite šią komandą:

$ mkdir ~/darbas

Sukūrę projekto katalogą, eikite į projekto katalogą taip:

$ cd ~/darbas

„Raspberry Pi Sense“ skrybėlės bandymas

Norėdami patikrinti, ar „Raspberry Pi Sense Hat“ veikia, galime parašyti paprastą bandomąjį „Python“ scenarijų. Galite sukurti naują „Python“ scenarijų pavadinimu test.py su nano teksto redaktorius:

$ nano test.py

Įveskite šį kodą į test.py failą. 1 eilutės importas SenseHat nuo sense_hat modulis, 3 eilutė sukuria a SenseHat objektą ir išsaugo nuorodą prasme kintamas, o 5–6 eilutės nustato visų 8 × 8 šviesos diodų spalvą į raudoną. Kai baigsite, paspauskite + X po to IR ir .

Galite paleisti test.py „Python“ scenarijus su tokia komanda:

$ python3 test.py

8 × 8 LED matrica turėtų švytėti raudona spalva, kaip parodyta paveikslėlyje žemiau.

Norėdami išjungti „Sense Hat“ šviesos diodus, paleiskite aišku () metodas be jokios spalvos vertės test.py „Python“ scenarijų, kaip parodyta žemiau esančioje ekrano kopijoje, ir paleiskite test.py Vėl „Python“ scenarijus.

„Sense Hat“ šviesos diodai dabar turėtų būti išjungti, kaip parodyta paveikslėlyje žemiau.

Jei „Sense Hat“ veikia tinkamai, pereikite prie kito skyriaus.

Gaunami orų duomenys iš „Sense Hat“

Jutiklių duomenis iš „Sense Hat“ galite gauti labai lengvai naudodami prasmė-skrybėlė Python biblioteka. Norėdami gauti jutiklio duomenis iš „Sense Hat“, galite sukurti naują „Python“ scenarijų read_sensor_data.py taip:

$ nano read_sensor_data.py

Įveskite šį kodą į read_sensor_data.py Python failas.

nuosense_hatimportasSenseHat
nuo laikas importasmiegoti
prasme=SenseHat()
prasme.aišku()
tuo tarpu Tiesa:
tempC=prasme.get_temperature()
tempF=tempC *(9/5)+32
spaudimas=prasme.get_pressure()
drėgmės=prasme.get_humidity()

spausdinti(„Temperatūra: %.2f ° C/ %.2f ° F n'%(tempC,tempF))
spausdinti('Slėgis: %.2f mb n'%(spaudimas))
spausdinti(„Drėgmė:%.2f %% n n'%(drėgmės))
miegoti(5)

Kai baigsite, paspauskite + X po to IR ir .

Aukščiau esančiame kode 1 ir 2 eilutės importuoja visas reikalingas bibliotekas, 4 eilutė sukuria a SenseHat objektas, o 5 eilutė išjungia visus „Sense Hat“ šviesos diodus naudodami aišku () metodas. Nors ciklas 7 eilutėje yra begalinis ciklas, kuris visą laiką paleis kodą 8–16 eilutėse.

8 eilutėje, get_temperature () metodas naudojamas temperatūros duomenims (Celsijaus laipsniais) nuskaityti iš „Sense Hat“ drėgmės jutiklio. 9 eilutėje temperatūros duomenys konvertuojami iš Celsijaus laipsnių į Farenheito laipsnius. 10 eilutėje, get_pressure () metodas naudojamas skaityti oro slėgio duomenis (milibarais) iš „Sense Hat“ slėgio jutiklio. 11 eilutėje, get_humidity () metodas naudojamas skaityti drėgmės duomenis ( %) iš „Sense Hat“ drėgmės jutiklio.

13–15 eilutės naudojamos jutiklio duomenims spausdinti į konsolę, o 16 eilutė - laukti 5 sekundes, kol vėl nuskaitomi jutiklio duomenys.

Galite paleisti read_sensor_data.py „Python“ scenarijus:

$ python3 read_sensor_data.py

Kai scenarijus bus paleistas, jutiklio duomenys bus atspausdinti konsolėje.

Dabar, kai galime skaityti jutiklio duomenis iš „Sense Hat“, paspauskite + C sustabdyti programą.

„Weather Station“ žiniatinklio programos kūrimas

Šiame skyriuje parodysime, kaip naudoti „Python Flask“ žiniatinklio sistemą kuriant orų API ir orų programą. Orų programa pasieks orų duomenų API ir parodys orų duomenis realiu laiku. Visą šiame skyriuje aptariamą kodą galite rasti „GitHub“ adresu „shovon8“ / aviečių-pi-jausmo-skrybėlių-orų programa .

Pirmiausia sukurkite a server.py „Python“ scenarijus projekto kataloge:

$ nano server.py

Įveskite šį kodą į server.py Python failas.

nuokolbaimportasKolba
nuokolbaimportasjsonify
nuokolbaimportasrender_template
nuokolbaimportasurl_for
nuosense_hatimportasSenseHat
programėlę=Kolba(__vardas__)
programėlę.konfig[„SEND_FILE_MAX_AGE_DEFAULT“] = 0
prasme=SenseHat()
prasme.aišku()
suprogramėlę.test_request_context():
url_for('statinis',failo pavadinimas='style.css')
url_for('statinis',failo pavadinimas=„app.js“)
@programėlę.maršrutą('/Ugnis')
defUgnis():
tempC=prasme.get_temperature()
tempF=tempC *(9/5)+32
spaudimas=prasme.get_pressure()
slėgis Psi=slėgis *0,0145038
slėgis P.=slėgis *100
drėgmės=prasme.get_humidity()

grįžtijsonify({
'temperatūra':{ „C“: tempC, „F“: tempF},
'spaudimas':{ 'mb': slėgis, „hPa“: slėgis,
„psi“: slėgisPsi, „P“: slėgisP},
'drėgmė': drėgmė
})
@programėlę.maršrutą('/')
defnamai():
grįžtirender_template('./home.html')

Tada paspauskite + X po to IR ir išsaugoti server.py „Python“ scenarijus.

Pirmiau pateiktame kode 1–5 eilutės importuoja visas reikalingas bibliotekas, 7 eilutė sukuria „Flask“ programą, 11 eilutė sukuria „SenseHat“ objektą, o 12 eilutė išjungia visus „Sense Hat“ šviesos diodus. 8 eilutė išjungia žiniatinklio talpyklą „Flask“ programoje. Kadangi ši programa yra lengva, nereikia talpyklos. Jei norite modifikuoti programą, išjungus žiniatinklio talpyklą bus daug lengviau išbandyti.

18–31 eilutės skaito jutiklio duomenis iš „Sense Hat“ ir grąžina API duomenis JSON formatu pagal HTTP GET užklausą /Ugnis žiniatinklio serverio galinis taškas. 37–39 eilutės grąžina orų žiniatinklio programos pagrindinį puslapį / žiniatinklio serverio galinis taškas. Pagrindinis puslapis pateikiamas iš home.html failą, kuris turėtų būti šablonai/ projekto katalogo katalogas.

14–16 eilutės naudojamos prieigai prie stilius.css ir app.js statiniai failai. Šie failai turėtų būti statinis/ projekto katalogo katalogas. The stilius.css failas naudojamas stiliui home.html pagrindinis puslapis ir app.js failas naudojamas prašyti API duomenų iš /Ugnis pabaigos tašką ir atnaujinti orų duomenis home.html puslapį kas 5 sekundes.

Sukurkite statinis/ ir šablonai/ katalogą projekto kataloge taip:

$ mkdir -v {static, templates}

Sukurti home.html failą šablonai/ katalogą taip:

$ nano šablonai/home.html

Įveskite šį kodą į home.html failą.


< html >
< galva >
< meta vardas='peržiūros sritis' turinys='plotis = įrenginio plotis, pradinė skalė = 1,0'>
< titulas >Raspberry Pi orų stotis</ titulas >
< nuoroda rel='stiliaus lapas' tipo='text/css'
href='{{url_for (' static ', filename =' style.css ')}}'/>
</ galva >
< kūnas >
< div id='turinys'>
< h1 >Raspberry Pi orų stotis</ h1 >

< div klasė=„duomenų turinys“>
< h2 >Temperatūra</ h2 >
< div klasė='duomenų eilutė'>
< div klasė=„duomenų ląstelė“ id='tempC'>
...
</ div >
< div klasė=„duomenų langelis“ id='tempF'>
...
</ div >
</ div >
</ div >

< div klasė=„duomenų turinys“>
< h2 >Slėgis</ h2 >
< div klasė='duomenų eilutė'>
< div klasė=„duomenų ląstelė“ id=„slėgis MB“>
...
</ div >
< div klasė=„duomenų langelis“ id=„pressurePsi“>
...
</ div >
</ div >
< div klasė='duomenų eilutė'>
< div klasė=„duomenų langelis“ id=„pressureHpa“>
...
</ div >
< div klasė=„duomenų langelis“ id=„slėgis P“>
...
</ div >
</ div >
</ div >

< div klasė=„duomenų turinys“>
< h2 >Drėgmė</ h2 >
< div klasė='duomenų eilutė'>
< div klasė=„duomenų langelis“ id='drėgmė'>
...
</ div >
</ div >
</ div >
</ div >

< scenarijus tipo='text/javascript' src='{{url_for (' static ', filename =' app.js ')}} “></ scenarijus >
</ kūnas >
</ html >

Tada paspauskite + X po to IR ir išsaugoti home.html failą.

Sukurti stilius.css failą statinis/ katalogą taip:

$ nano static/style.css

Įveskite šiuos kodus į stilius.css failą.

@importas url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
* {
paminkštinimas: 0;
marža: 0;
šrifto šeima: 'Roboto', be serifo;
}
kūnas{
fone: # 737373;
}
h1{
ekranas: blokuoti;
spalva: #79DC7B;
lygiuoti tekstą: centre;
šrifto svoris: 400;
fone: # 000;
paminkštinimas: 0,5em 0;
}
h2{
ekranas: blokuoti;
fone: # 000;
spalva: #fff;
lygiuoti tekstą: centre;
šrifto svoris: 400;
šrifto dydis: 1em;
}
.data-turinys {
marža: 10 taškų;
siena: 2 piks kietas juoda;
ribos spindulys: 5 piks;
fono spalva: #79DC7B;
}
.data-eilutė {
ekranas:lankstyti;
lanksti kryptis:eilė;
}
.datos langelis {
plotis: 100%;
aukščio: 80 piks;
ekranas:lankstytis;
suderinti elementus: centre;
pagrįsti turinį: centre;
šrifto svoris: drąsus;
šrifto dydis: 1.5em;
spalva: # 006902;
}
.datos langelis:slinkti {
fone: # FFE891;
spalva: # AA8600;
žymeklis: rodyklė;
}

Tada paspauskite + X po to IR ir išsaugoti stilius.css failą.

Sukurkite app.js failą statinis/ katalogą taip:

$ nano static/app.js

Įveskite šį kodą į app.js failą.

langas.addEventListener('pakrauti',pagrindinis);
funkcijapagrindinis() {
funkcijagetAPIData() {
kurhttp= naujasXMLHttpRequest();

http.jau pakeitus = funkcija() {
jei(tai.readyState === 4 && tai.būsena === 200) {
atnaujinti(JSONAS.išanalizuoti(tai.responseText));
}
}

http.atviras(„GET“, '/Ugnis', tiesa);
http.siųsti();
}


funkcijaatnaujinti(apiData) {
kurtempC=dokumentas.getElementById('tempC');
kurtempF=dokumentas.getElementById('tempF');
kurslėgisMb=dokumentas.getElementById(„slėgis MB“);
kurslėgis Psi=dokumentas.getElementById(„pressurePsi“);
kurslėgisHpa=dokumentas.getElementById(„pressureHpa“);
kurslėgis P.=dokumentas.getElementById(„slėgis P“);
kurdrėgmės=dokumentas.getElementById('drėgmė');

tempC.vidinisHTML =parseFloat(apiData.temperatūra.C).toFiksuotas(2) + '° C';
tempF.vidinisHTML =parseFloat(apiData.temperatūra.F).toFiksuotas(2) + '° F';

slėgisMb.vidinisHTML =parseFloat(apiData.spaudimas.mb).toFiksuotas(2) + 'mb';
slėgis Psi.vidinisHTML =parseFloat(apiData.spaudimas.psi).toFiksuotas(2) + „psi“;
slėgisHpa.vidinisHTML =parseFloat(apiData.spaudimas.hPa).toFiksuotas(2) + „hPa“;
slėgis P.vidinisHTML =parseFloat(apiData.spaudimas.P).toFiksuotas(2) + „P“;

drėgmės.vidinisHTML =parseFloat(apiData.drėgmės).toFiksuotas(2) + '%';
}


funkcijaprogramėlę() {
langas.setInterval(funkcija() {
getAPIData();
}, 5000);
}

programėlę();
}

Tada paspauskite + X po to IR ir išsaugoti app.js failą.

Čia 1 eilutė eina pagrindinis () funkcija, kai tinklalapis baigiamas įkelti. Viduje konors pagrindinis () funkcija, getAPIData () funkcija surenka orų API duomenis naudodami AJAX ir iškviečia atnaujinti () funkcija (10 eilutėje), kai duomenys buvo sėkmingai gauti. The atnaujinti () funkcija atnaujina tinklalapio elementą naudodami API duomenis.

20 eilutėje document.getElementById () metodas naudojamas norint gauti nuorodą į tinklalapio elementą su id tempC . 28 eilutė naudojama pakeisti tinklalapio elemento, turinčio ID, turinį tempC su temperatūra (Celsijaus laipsniu) iš API. Lygiai taip pat visų žiniatinklio elementų (21–26 eilutės) turinys pakeičiamas atitinkamais API duomenimis.

Viduje konors programa () funkcija, getAPIData () skambinama kas 5 sekundes (5000 milisekundžių), kad orų programoje orų duomenys būtų atnaujinami. Galiausiai 46 eilutėje programa () funkcija vykdoma.

Norėdami išbandyti žiniatinklio programą, įveskite šią komandą:

$ FLASK_APP = server.py kolbos paleidimas -host = 0.0.0.0

Orų programa turėtų veikti 5000 prievade (pagal numatytuosius nustatymus).

Norėdami patikrinti, ar „Weather API“ veikia, paleiskite šią komandą:

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

Kaip matote, „Weather“ API duomenys spausdinami konsolėje. Todėl API veikia.

Jei norite išbandyti orų programą, apsilankykite http: // localhost: 5000 iš „Chromium“ žiniatinklio naršyklės. Programa „Weather“ turėtų būti įkelta į žiniatinklio naršyklę, tačiau iš pradžių neturėtų būti rodomi jokie orų duomenys.

Po kelių sekundžių orų programa turėtų baigti gauti orų duomenis iš API ir juos rodyti.

Bet kuriuo metu galite paspausti + C Norėdami sustabdyti žiniatinklio serverį.

Sistemos paslaugos kūrimas „Weather Web App“

Šiame skyriuje parodysime, kaip sukurti sisteminį paslaugų failą orų programai, kad ji automatiškai prasidėtų paleidus.

Pirmiausia sukurkite a orų stotis.paslauga failą savo projekto kataloge taip:

$ nano orų stotis.paslauga

Įveskite šias kodo eilutes orų stotis.paslauga failą.

[Vienetas]
Aprašymas = Raspberry Pi Weather Station Web App naudojant Raspberry Pi Sense Hat
Po = tinklas.tikslas

[Paslauga]
WorkingDirectory =/home/pi/work
Aplinka = FLASK_APP = server.py
Aplinka = FLASK_ENV = gamyba
ExecStart =/usr/bin/kolba paleisti -host = 0.0.0.0
StandardOutput = paveldėti
Standartinė klaida = paveldėti
Paleisti iš naujo = visada
Vartotojas = pi

[Diegti]
WantedBy = kelių vartotojų tikslas

Tada paspauskite + X po to IR ir išsaugoti orų stotis.paslauga failą.

Nukopijuokite orų stotis.paslauga failą į /etc/systemd/system/ katalogą su tokia komanda:

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

Iš naujo įkelkite sisteminius demonus, kad pakeitimai įsigaliotų taip:

$ sudo systemctl demonas iš naujo

The orų stotis „systemd“ paslauga šiuo metu turėtų būti neaktyvi, kaip parodyta žemiau esančioje ekrano kopijoje.

$ sudo systemctl status weather-station.service

Pradėkite orų stotis paslaugą naudodami šią komandą:

$ sudo systemctl paleisti weather-station.service

Kaip matote, orų stotis paslauga dabar veikia.

$ sudo systemctl status weather-station.service

Dabar, kai orų stotis paslauga veikia, galite ją pridėti prie „Raspberry Pi“ OS paleisties naudodami šią komandą:

$ sudo systemctl įgalinti weather-station.service

Iš naujo paleiskite „Raspberry Pi“ naudodami šią komandą:

$ sudo perkraukite

Kai tik avėsite „Raspberry Pi“ batus, orų stotis paslauga turėtų veikti, kaip parodyta žemiau esančioje ekrano kopijoje.

$ sudo systemctl status weather-station.service

Prieiga prie „Weather“ programos iš kitų įrenginių

Norėdami pasiekti orų programą iš kitų namų tinklo įrenginių, turite žinoti savo „Raspberry Pi“ IP adresą. Raspberry Pi 4 IP adresą galite rasti savo namų maršrutizatoriaus žiniatinklio valdymo sąsajoje. Mūsų atveju IP adresas yra 192.168.0.103, tačiau šis adresas jums bus kitoks, todėl būtinai pakeiskite šį adresą savo visuose tolesniuose veiksmuose.

Jei turite prieigą prie „Raspberry Pi“ konsolės, galite paleisti šią komandą, kad surastumėte ir IP adresą.

$ hostname -I

Kai žinote savo „Raspberry Pi“ IP adresą, galite jį pasiekti iš bet kurio namų tinklo įrenginio. Kaip parodyta žemiau esančioje ekrano kopijoje, mes pasiekėme orų programą iš „Android“ išmaniojo telefono.

Išvada

Šiame straipsnyje mes parodėme, kaip naudoti „Raspberry Pi Sense“ skrybėlę kuriant „Raspberry Pi“ oro stotį. Mes naudojome prasmė-skrybėlė „Python“ biblioteka, skirta ištraukti orų duomenis iš „Raspberry Pi Sense Hat“. Tada mes panaudojome „Flask Python“ mikro žiniatinklio sistemą, kad sukurtume orų API ir žiniatinklio programą. Žiniatinklio programa kas 5 sekundes gauna orų duomenis iš orų API, kad žiniatinklio programa būtų atnaujinta su naujausiais orų duomenimis.