Ehitage oma Raspberry Pi ilmajaam

Build Your Own Raspberry Pi Weather Station

Raspberry Pi Sense Hat on lisaplaat, mida saab kasutada Raspberry Pi üheplaadiga arvutitega. Raspberry Pi Sense mütsil on 8 × 8 LED-ekraan ja 5-nupuline juhtkang ning see on varustatud järgmiste anduritega:

  1. Güroskoop
  2. Kiirendusmõõtur
  3. Magnetomeeter
  4. Temperatuur
  5. Õhurõhk
  6. Niiskus

Selles artiklis näitan teile, kuidas luua Pythoni API -põhist ilmajaama veebirakendust, kasutades temperatuur , õhurõhk ja niiskus Raspberry Pi Sense mütsi andurid. Selle artikli järgimiseks vajate järgmist.



  1. Võrguühendusega Raspberry Pi 3 või Raspberry Pi 4.
  2. Raspberry Pi Sense Hat moodul.
  3. Mikro-USB (Raspberry Pi 3) või C-tüüpi USB (Raspberry Pi 4) toiteadapter.
  4. 16 GB või 32 GB microSD -kaart koos Raspberry Pi OS -iga.
  5. Sülearvuti või lauaarvuti VNC kaugtöölauale juurdepääsuks või SSH -juurdepääsuks Raspberry Pi -le.

MÄRGE: Selles artiklis loome ühenduse Raspberry Pi -ga kaugühendusega VNC või SSH kaudu, kasutades Raspberry Pi peata seadistust. Kui te ei soovi oma Raspberry Pi -le SSH või VNC kaudu kaugjuurdepääsu saada, peate oma Raspberry Pi -ga ühendama monitori, klaviatuuri ja hiire.



Raspberry Pi OS -i kujutise microSD -kaardile välgutamise kohta lisateabe saamiseks lugege jaotist Raspberry Pi Imager installimine ja kasutamine. Kui vajate abi Raspberry Pi OS -i installimisel oma Raspberry Pi -le, lugege Kuidas installida Raspberry Pi OS Raspberry Pi 4 -le . Kui vajate abi Raspberry Pi peata seadistamisel, vaadake, kuidas Raspberry Pi OS -i installida ja konfigureerida ilma välise monitorita.



Raspberry Pi Sense mütsi ühendamine Raspberry Pi -ga

Raspberry Pi Sense Hat komplektiga on kaasas Raspberry Pi Sense Hat lisaplaat, 40-kontaktiline meessoost naissoost päis ning mõned kruvid ja vahetükid.

Enne kui saate Sense Hat tahvli Raspberry Pi külge kinnitada, peate ühendama 40 kontaktiga päise Sense Hatiga. Ühendage 40-kontaktilise isase-emase päise isast tihvtid Sense mütsiga, nagu on näidatud allolevatel piltidel.



Raspberry Pi üheplaadilistel arvutitel on 4 auku, mida saab kasutada lisaplaatide või korpuse kinnitamiseks. Lisaplaadi kinnitamiseks sisestage Raspberry Pi tagaküljelt kruvid, nagu on näidatud allolevatel piltidel.

Seejärel ühendage kruviga vahekaugus.

Kui olete kõik neli kruvi ja vahetükki lisanud, peaks teie Raspberry Pi välja nägema selline, nagu on näidatud alloleval pildil.

Ühendage Raspberry Pi Sense müts Raspberry Pi 40-kontaktilise GPIO isase päisega, nagu on näidatud allolevatel piltidel.

MÄRGE: Olge Raspberry Pi Sense mütsi Raspberry Pi 40-kontaktilise GPIO-päise küljest lahti ühendades ettevaatlik, et vältida Raspberry Pi GPIO tihvtide painutamist.

Kinnitage nelja ülejäänud kruviga Raspberry Pi Sense müts, nagu on näidatud allolevatel piltidel.

Vaarika Pi sisselülitamine

Nüüd, kui Raspberry Pi Sense Hat on Raspberry Pi -ga ühendatud, sisestage Raspberry Pi OS -iga microSD -kaart Raspberry Pi microSD -kaardi pesasse, ühendage toitekaabel Raspberry Pi -ga ja lülitage see sisse.

Raspberry Pi Sense Hat Pythoni raamatukogu installimine

Raspberry Pi Sense Hat kasutamiseks Raspberry Pi -l meelemüts Raspberry Pi OS -i tuleb installida Pythoni teek. The meelemüts raamatukogu on saadaval Raspberry Pi OS ametlikus pakettide hoidlas.

Raspberry Pi installimiseks meelemüts Raspberry Pi OS -i Pythoni raamatukogus värskendage esmalt APT paketi hoidla vahemälu järgmise käsuga:

$ sudo apt värskendus

Seejärel käivitage järgmine käsk:

$ sudo apt install sense -hat -y

Flask Micro Web Framework Pythoni kogu installimine

Kasutame oma ilmastikurakenduse loomiseks Flask Pythoni raamistikku. Flaski saate installida Raspberry Pi OS ametlikust pakettide hoidlast järgmise käsuga:

$ sudo apt install python3 -flask -y

Projekti kataloogi loomine

Projektifailide korraldamiseks on hea luua projektikataloog. Projekti kataloogi loomiseks ~/töö , kasutage järgmist käsku:

$ mkdir ~/töö

Kui projekti kataloog on loodud, liikuge projekti kataloogi järgmiselt.

$ cd ~/töö

Raspberry Pi Sense mütsi testimine

Et testida, kas Raspberry Pi Sense Hat töötab, võime kirjutada lihtsa testi Pythoni skripti. Saate luua uue Pythoni skripti nimega test.py koos nano tekstiredaktorit järgmiselt:

$ nano test.py

Sisestage väljale järgmine kood test.py faili. Rida 1 import SenseHat alates sense_hat moodul, rida 3 loob a SenseHat objekti ja salvestab viite kausta meel muutuvad ja read 5–6 määravad kõigi 8 × 8 valgusdioodide värvi punaseks. Kui olete lõpetanud, vajutage + X millele järgnes JA ja .

Saate käivitada test.py Pythoni skript järgmise käsuga:

$ python3 test.py

8 × 8 LED -maatriks peaks helendama punaselt, nagu on näidatud alloleval pildil.

Sense Hat LED -de väljalülitamiseks käivitage selge () meetod ilma värviväärtuseta test.py Pythoni skripti, nagu on näidatud alloleval ekraanipildil, ja käivitage test.py Jälle Pythoni skript.

Sense Hat'i LED -id tuleks nüüd välja lülitada, nagu on näidatud alloleval pildil.

Kui Sense Hat töötab korralikult, liikuge järgmise jao juurde.

Ilmaandmete hankimine Sense Hatist

Sense Hatist saate sensori andmeid väga lihtsalt, kasutades meelemüts Pythoni raamatukogu. Sense Hatist sensori andmete hankimiseks saate luua uue Pythoni skripti read_sensor_data.py järgnevalt:

$ nano read_sensor_data.py

Sisestage väljale järgmine kood read_sensor_data.py Pythoni fail.

alatessense_hatimportSenseHat
alates aega importmagama
meel=SenseHat()
meel.selge()
samas Tõsi:
tempC=meel.get_temperature()
tempF=tempC *(9/5)+32
surve=meel.saada_rõhku()
niiskus=meel.get_humidity()

printida('Temperatuur: %.2f ° C/ %.2f ° F n'%(tempC,tempF))
printida('Rõhk: %.2f mb n'%(surve))
printida(„Niiskus:%.2f %% n n'%(niiskus))
magama(5)

Kui olete lõpetanud, vajutage + X millele järgnes JA ja .

Ülaltoodud koodis impordivad read 1 ja 2 kõik nõutavad teegid, rida 4 loob a SenseHat objekti ja rida 5 lülitab välja kõik Sense Hat LED -id selge () meetod. Rea 7 silmus while on lõpmatu tsükkel, mis käivitab koodi ridadel 8–16 igavesti.

Reas 8 on get_temperature () meetodit kasutatakse temperatuuriandmete (Celsiuse kraadides) lugemiseks Sense Hat mütsi niiskusandurilt. Reas 9 teisendatakse temperatuuri andmed Celsiuse kraadidest Fahrenheiti kraadideks. Reas 10, get_pressure () meetodit kasutatakse õhurõhu andmete (millibaarides) lugemiseks Sense Hat'i rõhuandurilt. Reas 11 on get_humidity () meetodit kasutatakse niiskuse andmete ( %) lugemiseks Sense Hat mütsi niiskusandurilt.

Ridasid 13–15 kasutatakse andurite andmete konsoolile printimiseks ja rida 16 kasutatakse 5 sekundi ootamiseks, enne kui sensoriandmeid uuesti loetakse.

Saate käivitada read_sensor_data.py Pythoni skript järgmiselt:

$ python3 read_sensor_data.py

Kui skript on käivitatud, prinditakse anduri andmed konsoolile.

Nüüd, kui saame sensori andmeid Sense Hatist lugeda, vajutage + C programmi peatamiseks.

Ilmajaama veebirakenduse loomine

Selles jaotises näitame teile, kuidas kasutada Python Flaski veebiraamistikku ilmastiku API ja ilmarakenduse loomiseks. Ilmarakendus pääseb ilmaandmete API -le juurde ja näitab ilmaandmeid reaalajas. Kogu selles jaotises käsitletud kood on saadaval GitHubis aadressil shovon8 / vaarika-pi-tunne-müts-ilm-rakendus .

Esiteks looge a server.py Pythoni skript projekti kataloogis järgmiselt:

$ nano server.py

Sisestage väljale järgmine kood server.py Pythoni fail.

alateskolbimportKolb
alateskolbimportjsonify
alateskolbimportrender_template
alateskolbimporturl_for
alatessense_hatimportSenseHat
rakendus=Kolb(__name__)
rakendus.config[„SEND_FILE_MAX_AGE_DEFAULT”] = 0
meel=SenseHat()
meel.selge()
koosrakendus.test_request_context():
url_for('staatiline',faili nimi='style.css')
url_for('staatiline',faili nimi='app.js')
@rakendus.tee('/tuli')
deftuld():
tempC=meel.get_temperature()
tempF=tempC *(9/5)+32
surve=meel.saada_rõhku()
rõhkPsi=rõhk *0,0145038
rõhk P=rõhk *100
niiskus=meel.get_humidity()

tagasijsonify({
'temperatuur':{ 'C': tempC, 'F': tempF},
'surve':{ 'mb': rõhk, 'hPa': rõhk,
'psi': rõhkPsi, 'P': rõhkP},
'niiskus': niiskus
})
@rakendus.tee('/')
defKodu():
tagasirender_template('./home.html')

Seejärel vajutage + X millele järgnes JA ja päästa server.py Pythoni skript.

Ülaltoodud koodis impordivad read 1–5 kõik nõutavad teegid, rida 7 loob rakenduse Flask, rida 11 loob objekti SenseHat ja rida 12 lülitab välja kõik Sense Hat'i LED -id. Rida 8 keelab rakenduse Flask veebipõhise vahemällu salvestamise. Kuna see rakendus on kerge, pole vahemällu salvestamist vaja. Kui soovite rakendust muuta, muudab veebivahemälu keelamine testimise palju lihtsamaks.

Ridad 18–31 loevad sensori andmeid Sense Hatist ja tagastavad API andmed JSON -vormingus HTTP GET -i päringu korral /tulekahju veebiserveri lõpp -punkt. Liinid 37–39 tagastavad ilmateabe veebirakenduse kodulehe / veebiserveri lõpp -punkt. Koduleht renderdatakse home.html fail, mis peaks olema kaustas mallid/ projekti kataloogi kataloog.

Liinidele juurdepääsu võimaldamiseks kasutatakse ridu 14–16 stiil.css ja app.js staatilised failid. Need failid peaksid olema kaustas staatiline/ projekti kataloogi kataloog. The stiil.css faili kasutatakse stiili kujundamiseks home.html koduleht ja app.js faili kasutatakse API andmete küsimiseks /tulekahju lõpp -punkt ja värskendage ilmaandmeid home.html lehte iga 5 sekundi järel.

Loo staatiline/ ja mallid/ kataloogi projekti kataloogis järgmiselt:

$ mkdir -v {static, templates}

Loo home.html fail kaustas mallid/ kataloogi järgmiselt:

$ nano mallid/home.html

Sisestage väljale järgmine kood home.html faili.


< html >
< pea >
< meta nimi='vaateava' sisu='laius = seadme laius, esialgne skaala = 1,0'>
< tiitel >Raspberry Pi ilmajaam</ tiitel >
< link rel='stiilileht' tüüpi='text/css'
href='{{url_for (' staatiline ', failinimi =' style.css ')}}'/>
</ pea >
< keha >
< div id='sisu'>
< h1 >Raspberry Pi ilmajaam</ h1 >

< div klassi='andmete sisu'>
< h2 >Temperatuur</ h2 >
< div klassi='andmerida'>
< div klassi='andmeelement' id='tempC'>
...
</ div >
< div klassi='andmeelement' id='tempF'>
...
</ div >
</ div >
</ div >

< div klassi='andmete sisu'>
< h2 >Rõhk</ h2 >
< div klassi='andmerida'>
< div klassi='andmeelement' id='surveMb'>
...
</ div >
< div klassi='andmeelement' id='survePsi'>
...
</ div >
</ div >
< div klassi='andmerida'>
< div klassi='andmeelement' id='surveHpa'>
...
</ div >
< div klassi='andmeelement' id='surveP'>
...
</ div >
</ div >
</ div >

< div klassi='andmete sisu'>
< h2 >Niiskus</ h2 >
< div klassi='andmerida'>
< div klassi='andmeelement' id='niiskus'>
...
</ div >
</ div >
</ div >
</ div >

< skript tüüpi='text/javascript' src='{{url_for (' staatiline ', failinimi =' app.js ')}}'></ skript >
</ keha >
</ html >

Seejärel vajutage + X millele järgnes JA ja päästa home.html faili.

Loo stiil.css fail kaustas staatiline/ kataloogi järgmiselt:

$ nano static/style.css

Sisestage lahtrisse järgmised koodid stiil.css faili.

@import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
* {
polsterdus: 0;
marginaal: 0;
font-family: 'Robot', sans-serif;
}
keha{
taust: # 737373;
}
h1{
kuvada: blokeerida;
värvi: #79DC7B;
teksti joondamine: Keskus;
font-kaal: 400;
taust: # 000;
polsterdus: 0,5 em 0;
}
h2{
kuvada: blokeerida;
taust: # 000;
värvi: #fff;
teksti joondamine: Keskus;
font-kaal: 400;
fondi suurus: 1em;
}
.andmete sisu {
marginaal: 10 pikslit;
piir: 2 pikslit tahke must;
piiri raadius: 5 pikslit;
taustavärv: #79DC7B;
}
.andmete rida {
kuvada:painduma;
paindlik suund:rida;
}
.andmeelement {
laius: 100%;
kõrgus: 80 pikslit;
kuvada:painduma;
joondada: Keskus;
õigustada-sisu: Keskus;
font-kaal: julge;
fondi suurus: 1.5em;
värvi: # 006902;
}
.andmeelement:hõljuma {
taust: # FFE891;
värvi: # AA8600;
kursor: osuti;
}

Seejärel vajutage + X millele järgnes JA ja päästa stiil.css faili.

Loo app.js fail kaustas staatiline/ kataloogi järgmiselt:

$ nano static/app.js

Sisestage väljale järgmine kood app.js faili.

aken.addEventListener('koormus',peamine);
funktsioonipeamine() {
funktsioonigetAPIData() {
kushttp= uusXMLHttpRequest();

http.juba vahetusel = funktsiooni() {
kui(seda.readyState === 4 && seda.staatus === 200) {
uuendada(JSON.sõeluda(seda.responseText));
}
}

http.lahti('SAA', '/tuli', tõsi);
http.saada();
}


funktsiooniuuendada(apiData) {
kustempC=dokument.getElementById('tempC');
kustempF=dokument.getElementById('tempF');
kusrõhkMb=dokument.getElementById('surveMb');
kusrõhkPsi=dokument.getElementById('survePsi');
kusrõhkHpa=dokument.getElementById('surveHpa');
kusrõhk P=dokument.getElementById('surveP');
kusniiskus=dokument.getElementById('niiskus');

tempC.sisemineHTML =parseFloat(apiData.temperatuur.C).fikseeritud(2) + '° C';
tempF.sisemineHTML =parseFloat(apiData.temperatuur.F).fikseeritud(2) + '° F';

rõhkMb.sisemineHTML =parseFloat(apiData.surve.mb).fikseeritud(2) + 'mb';
rõhkPsi.sisemineHTML =parseFloat(apiData.surve.psi).fikseeritud(2) + 'psi';
rõhkHpa.sisemineHTML =parseFloat(apiData.surve.hPa).fikseeritud(2) + 'hPa';
rõhk P.sisemineHTML =parseFloat(apiData.surve.P).fikseeritud(2) + 'P';

niiskus.sisemineHTML =parseFloat(apiData.niiskus).fikseeritud(2) + '%';
}


funktsioonirakendus() {
aken.setInterval(funktsiooni() {
getAPIData();
}, 5000);
}

rakendus();
}

Seejärel vajutage + X millele järgnes JA ja päästa app.js faili.

Siin jookseb rida 1 peamine () funktsioon, kui veebileht laaditakse. Aastal peamine () funktsioon, getAPIData () funktsioon otsib ilmastiku API andmeid AJAXi abil ja kutsub uuenda () funktsiooni (real 10) pärast andmete edukat toomist. The uuenda () funktsioon värskendab veebilehe elementi, kasutades API andmeid.

Reas 20 on document.getElementById () meetodit kasutatakse id -ga veebilehe elemendi viite saamiseks tempC . Rida 28 kasutatakse selle veebilehe elemendi sisu asendamiseks, millel on id tempC temperatuuri (Celsiuse järgi) API -st. Samamoodi asendatakse kõigi veebielementide (read 21–26) sisu nende vastavate API -andmetega.

Aastal rakendus () funktsioon, getAPIData () helistatakse iga 5 sekundi (5000 millisekundi) järel, et ilmarakenduses ilmaandmeid ajakohasena hoida. Lõpuks, reas 46, rakendus () funktsioon täidetakse.

Veebirakenduse testimiseks sisestage järgmine käsk:

$ FLASK_APP = server.py kolbi käitamine -host = 0.0.0.0

Ilmarakendus peaks töötama pordis 5000 (vaikimisi).

Et kontrollida, kas Weather API töötab, käivitage järgmine käsk:

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

Nagu näete, prinditakse Weather API andmed konsoolile. Seetõttu töötab API.

Ilmarakenduse testimiseks külastage lehte http: // localhost: 5000 Chromiumi veebibrauserist. Rakendus Ilm tuleks veebibrauserisse laadida, kuid ilmaandmeid ei tohiks esialgu kuvada.

Mõne sekundi pärast peaks ilmarakendus lõpetama ilmastikuandmete toomise API -st ja selle kuvama.

Saate igal ajal vajutada + C veebiserveri peatamiseks.

Systemd -teenuse loomine Weather Web Appi jaoks

Selles jaotises näitame teile, kuidas luua ilmarakendusele süsteemne teenusefail, et see käivitumisel automaatselt käivituks.

Esiteks looge a ilmajaam.teenus faili oma projekti kataloogis järgmiselt:

$ nano ilmajaam. teenus

Sisestage lahtrisse järgmised koodiridad ilmajaam.teenus faili.

[Ühik]
Kirjeldus = Raspberry Pi ilmajaama veebirakendus, mis kasutab Raspberry Pi Sense mütsi
Pärast = network.target

[Teenus]
WorkingDirectory =/kodu/pi/töö
Keskkond = FLASK_APP = server.py
Keskkond = FLASK_ENV = tootmine
ExecStart =/usr/bin/kolbi käitamine -host = 0.0.0.0
Standardväljund = pärida
StandardViga = pärida
Taaskäivita = alati
Kasutaja = pi

[Installi]
WantedBy = mitme kasutaja eesmärk

Seejärel vajutage + X millele järgnes JA ja päästa ilmajaam.teenus faili.

Kopeerige ilmajaam.teenus faili aadressile /etc/systemd/system/ kataloogi järgmise käsuga:

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

Muutuste jõustumiseks laadige süsteemidemonid uuesti alla järgmiselt.

$ sudo systemctl deemon-reload

The ilmajaam systemd teenus peaks hetkel passiivne olema, nagu on näidatud alloleval ekraanipildil.

$ sudo systemctl olek weather-station.service

Alustage ilmajaam teenust järgmise käsuga:

$ sudo systemctl käivitage weather-station.service

Nagu näete, ilmajaam teenus töötab praegu.

$ sudo systemctl olek weather-station.service

Nüüd, kui ilmajaam teenus töötab, saate selle lisada Raspberry Pi OS süsteemi käivitamiseks järgmise käsuga:

$ sudo systemctl lubab weather-station.service

Taaskäivitage oma Raspberry Pi järgmise käsuga:

$ sudo taaskäivitamine

Kui teie Raspberry Pi saapad on, ilmajaam teenus peaks töötama, nagu on näidatud alloleval ekraanipildil.

$ sudo systemctl olek weather-station.service

Juurdepääs ilmarakendusele teistest seadmetest

Ilmarakendusele juurdepääsu saamiseks oma koduvõrgu teistest seadmetest peate teadma oma Raspberry Pi IP -aadressi. Raspberry Pi 4 IP -aadressi leiate oma koduse ruuteri veebihaldusliidesest. Meie puhul on IP -aadress 192.168.0.103, kuid see aadress on teie jaoks erinev, nii et asendage see aadress kindlasti järgmiste toimingutega.

Kui teil on juurdepääs Raspberry Pi konsoolile, saate IP -aadressi leidmiseks käivitada järgmise käsu.

$ hostname -I

Kui teate oma Raspberry Pi IP -aadressi, pääsete sellele juurde oma koduvõrgu mis tahes seadmest. Nagu on näidatud alloleval ekraanipildil, oleme ilmarakendusele juurde pääsenud Android -nutitelefonist.

Järeldus

Selles artiklis näitasime teile, kuidas kasutada Raspberry Pi Sense mütsi Raspberry Pi ilmajaama ehitamiseks. Me kasutasime meelemüts Pythoni raamatukogu, et hankida Raspberry Pi Sense Hatist ilmastikuandmeid. Seejärel kasutasime ilmastiku API ja veebirakenduse loomiseks mikroveebiraamistikku Flask Python. Veebirakendus saab ilmaandmed ilmastiku API -lt iga 5 sekundi järel, et veebirakendus oleks kursis viimaste ilmastikuandmetega.