Zgradite svojo vremensko postajo Raspberry Pi

Build Your Own Raspberry Pi Weather Station



Raspberry Pi Sense Hat je dodatna plošča, ki jo je mogoče uporabiti z računalniki z eno ploščo Raspberry Pi. Klobuk Raspberry Pi Sense ima 8 × 8 LED zaslon in krmilno palico s 5 gumbi, opremljen pa je z naslednjimi senzorji:

  1. Žiroskop
  2. Merilnik pospeška
  3. Magnetometer
  4. Temperatura
  5. Barometrični tlak
  6. Vlažnost

V tem članku vam bom pokazal, kako z uporabo datoteke temperaturo , barometrični tlak , in vlažnost senzorji klobuka Raspberry Pi Sense. Če želite slediti temu članku, boste potrebovali naslednje:







  1. Raspberry Pi 3 ali Raspberry Pi 4 z omrežno povezljivostjo.
  2. Modul klobuka Raspberry Pi Sense.
  3. Napajalnik micro-USB (Raspberry Pi 3) ali USB Type-C (Raspberry Pi 4).
  4. Kartica microSD s 16 GB ali 32 GB z Raspberry Pi OS.
  5. Prenosni ali namizni računalnik za dostop do oddaljenega namizja VNC ali dostop SSH do Raspberry Pi.

OPOMBA: V tem članku se bomo z Raspberry Pi na daljavo povezali prek VNC ali SSH z uporabo brezglave nastavitve Raspberry Pi. Če ne želite dostopati do vašega Raspberry Pi na daljavo prek SSH ali VNC, morate na svoj Raspberry Pi povezati monitor, tipkovnico in miško.



Če želite izvedeti, kako sliko Raspberry Pi OS prestaviti na kartico microSD, si oglejte Kako namestiti in uporabljati Raspberry Pi Imager. Če potrebujete pomoč pri namestitvi OS Raspberry Pi na vaš Raspberry Pi, preberite Kako namestiti Raspberry Pi OS na Raspberry Pi 4 . Če potrebujete pomoč pri brezglavi nastavitvi Raspberry Pi, si oglejte Kako namestiti in konfigurirati OS Raspberry Pi na Raspberry Pi 4 brez zunanjega monitorja.



Povezovanje klobuka Raspberry Pi Sense z Raspberry Pi

Komplet klobuka Raspberry Pi Sense Hat je priložen dodatni plošči Raspberry Pi Sense Hat, 40-polni glavi za moške in ženske ter nekaj vijakov in distančnikov.





Preden lahko ploščo Sense Hat pritrdite na Raspberry Pi, morate 40-polno glavo povezati s klobukom Sense. Priključite moške nožice 40-polne moško-ženske glave na klobuk Sense, kot je prikazano na spodnjih slikah.



Računalniki z eno ploščo Raspberry Pi imajo 4 luknje, s katerimi lahko pritrdite dodatne plošče ali ohišje. Za pritrditev dodatne plošče vstavite vijake na zadnji strani Raspberry Pi, kot je prikazano na spodnjih slikah.

Nato na vijak priključite distančnik.

Ko dodate vse štiri vijake in distančnike, bi moral vaš Raspberry Pi izgledati tako, kot je prikazano na spodnji sliki.

Klobuk Raspberry Pi Sense povežite s 40-polnim moškim priključkom GPIO Raspberry Pi, kot je prikazano na spodnjih slikah.

OPOMBA: Bodite previdni, ko odklopite klobuk Raspberry Pi Sense Hat iz 40-polne glave GPIO Raspberry Pi, da se izognete upogibanju nožic Raspberry Pi GPIO.

S štirimi preostalimi vijaki pritrdite klobuk Raspberry Pi Sense, kot je prikazano na spodnjih slikah.

Vklop Raspberry Pi

Zdaj, ko je Raspberry Pi Sense Hat povezan z Raspberry Pi, vstavite kartico microSD z Raspberry Pi OS v režo za kartico microSD v Raspberry Pi, priključite napajalni kabel na Raspberry Pi in ga vklopite.

Namestitev knjižnice Python Raspberry Pi Sense Hat

Če želite uporabiti Raspberry Pi Sense Hat na Raspberry Pi, uporabite čutilni klobuk Knjižnica Python mora biti nameščena v sistemu Raspberry Pi OS. The čutilni klobuk knjižnica je na voljo v uradnem skladišču paketov v sistemu Raspberry Pi OS.

Če želite namestiti Raspberry Pi čutilni klobuk Knjižnica Python v sistemu Raspberry Pi, najprej posodobite predpomnilnik shrambe paketov APT z naslednjim ukazom:

$ sudo apt posodobitev

Nato zaženite naslednji ukaz:

$ sudo apt install sense -hat -y

Namestitev knjižnice Python Flask Micro Web Framework

Za izdelavo vremenske aplikacije bomo uporabili ogrodje Flask Python. Flask lahko namestite iz uradnega skladišča paketov Raspberry Pi OS z naslednjim ukazom:

$ sudo apt install python3 -flask -y

Ustvarjanje imenika projektov

Za organizacijo projektnih datotek je dobro ustvariti imenik projektov. Če želite ustvariti imenik projekta ~/delo , uporabite naslednji ukaz:

$ mkdir ~/delo

Ko je imenik projekta ustvarjen, se pomaknite do imenika projekta na naslednji način:

$ cd ~/delo

Testiranje klobuka Raspberry Pi Sense

Če želite preveriti, ali Raspberry Pi Sense Hat deluje, lahko napišemo preprost preskusni skript Python. Ustvarite lahko nov skript Python, imenovan test.py z nano urejevalnik besedila na naslednji način:

$ nano test.py

Vnesite naslednjo kodo v test.py mapa. Uvoz vrstice 1 SenseHat Iz sense_hat modul, vrstica 3 ustvari a SenseHat predmet in shrani referenco v smisel spremenljivka, vrstice 5-6 pa barvo vseh LED 8 × 8 nastavijo na rdečo. Ko končate, pritisnite + X sledi IN in .

Lahko zaženete test.py Python skript z naslednjim ukazom:

$ python3 test.py

LED matrika 8 × 8 mora svetleti v rdeči barvi, kot je prikazano na spodnji sliki.

Če želite ugasniti LED diode Sense Hat, zaženite jasno () metodo brez vrednosti barve v test.py Python skript, kot je prikazano na spodnjem posnetku zaslona, ​​in zaženite datoteko test.py Spet skript Python.

LED diode Sense Hat bi morali zdaj izklopiti, kot je prikazano na spodnji sliki.

Če Sense Hat deluje pravilno, pojdite na naslednji razdelek.

Pridobivanje vremenskih podatkov iz Sense Hat

Podatke senzorjev iz Sense Hat lahko zelo enostavno pridobite s pomočjo čutilni klobuk Knjižnica Python. Če želite pridobiti podatke senzorja iz Sense Hat, lahko ustvarite nov skript Python read_sensor_data.py kot sledi:

$ nano read_sensor_data.py

Vnesite naslednjo kodo v read_sensor_data.py Python datoteko.

odsense_hatuvozSenseHat
od čas uvozspi
smisel=SenseHat()
smisel.jasno()
medtem Prav:
tempC=smisel.get_temperature()
tempF=tempC *(9/5)+32
pritisk=smisel.get_pressure()
vlažnost=smisel.get_humidity()

tiskanje(„Temperatura: %.2f ° C/ %. 2f ° F n'%(tempC,tempF))
tiskanje('Tlak: %.2f mb n'%(pritisk))
tiskanje('Vlažnost:%.2f %% n n'%(vlažnost))
spi(5)

Ko končate, pritisnite + X sledi IN in .

V zgornji kodi 1. in 2. vrstica uvažata vse potrebne knjižnice, 4. vrstica ustvari a SenseHat objekt, vrstica 5 pa izklopi vse LED diode Sense Hat z uporabo jasno () metoda. Zanka while v vrstici 7 je neskončna zanka, ki bo kodo v vrsticah 8–16 izvajala večno.

V 8. vrstici je get_temperature () metoda se uporablja za branje temperaturnih podatkov (v stopinjah Celzija) s senzorja vlažnosti Sense Hat. V vrstici 9 se temperaturni podatki pretvorijo iz stopinj Celzija v stopinje Fahrenheita. V vrstici 10 je get_pressure () metoda se uporablja za branje podatkov o zračnem tlaku (v milibarjih) s senzorja tlaka Sense Hat. V vrstici 11 je get_humidity () metoda se uporablja za branje podatkov o vlažnosti (v %) s senzorja vlažnosti Sense Hat.

Vrstice 13–15 se uporabljajo za tiskanje podatkov senzorja na konzolo, vrstica 16 pa za čakanje 5 sekund, preden ponovno preberete podatke senzorja.

Lahko zaženete read_sensor_data.py Python skript:

$ python3 read_sensor_data.py

Ko se skript zažene, bodo podatki senzorja natisnjeni na konzolo.

Zdaj, ko lahko preberemo podatke senzorja iz Sense Hat, pritisnite + C da ustavite program.

Ustvarjanje spletne aplikacije vremenske postaje

V tem razdelku vam bomo pokazali, kako uporabite spletni okvir Python Flask za ustvarjanje vremenskega API -ja in vremenske aplikacije. Vremenska aplikacija bo dostopala do API -ja za vremenske podatke in v realnem času prikazala vremenske podatke. Vsa koda, obravnavana v tem razdelku, je na voljo na GitHubu na naslovu shovon8 / malina-pi-sense-hat-vremenska-aplikacija .

Najprej ustvarite server.py Python skript v imeniku projekta na naslednji način:

$ nano server.py

Vnesite naslednjo kodo v server.py Python datoteko.

odbučkouvozBučka
odbučkouvozjsonify
odbučkouvozrender_template
odbučkouvozurl_for
odsense_hatuvozSenseHat
aplikacijo=Bučka(__ime__)
aplikacijo.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0
smisel=SenseHat()
smisel.jasno()
zaplikacijo.test_request_context():
url_for('statično',Ime datoteke='style.css')
url_for('statično',Ime datoteke='app.js')
@aplikacijo.pot('/požar')
defogenj():
tempC=smisel.get_temperature()
tempF=tempC *(9/5)+32
pritisk=smisel.get_pressure()
tlakPsi=pritisk *0,0145038
tlakP=pritisk *100
vlažnost=smisel.get_humidity()

vrnitevjsonify({
'temperatura':{ 'C': tempC, 'F': tempF},
'pritisk':{ 'mb': pritisk, 'hPa': pritisk,
'psi': tlakPsi, 'P': tlakP},
'vlažnost': vlažnost
})
@aplikacijo.pot('/')
defdoma():
vrnitevrender_template('./home.html')

Nato pritisnite + X sledi IN in da shranite server.py Python skript.

V zgornji kodi vrstice 1–5 uvozijo vse zahtevane knjižnice, vrstica 7 ustvari aplikacijo Flask, vrstica 11 ustvari objekt SenseHat, vrstica 12 pa izklopi vse LED diode Sense Hat. Vrstica 8 onemogoči spletno predpomnjenje aplikacije Flask. Ker je ta aplikacija lahka, predpomnjenje ni potrebno. Če želite spremeniti aplikacijo, bo onemogočanje spletnega predpomnjenja veliko lažje.

Vrstice 18–31 preberejo podatke senzorja iz Sense Hat in vrnejo podatke API v obliki JSON na zahtevo HTTP GET v /ogenj končna točka spletnega strežnika. Vrstice 37–39 vrnejo domačo stran spletne aplikacije za vreme na / končna točka spletnega strežnika. Domača stran je upodobljena iz home.html datoteko, ki bi morala biti v predloge/ imenik imenika projekta.

Vrstice 14–16 se uporabljajo za omogočanje dostopa do style.css in app.js statične datoteke. Te datoteke bi morale biti v statično/ imenik imenika projekta. The style.css Datoteka se uporablja za oblikovanje datoteke home.html domačo stran in app.js file se uporablja za zahtevanje podatkov API od /ogenj končno točko in posodobite vremenske podatke na home.html stran vsakih 5 sekund.

Ustvarite datoteko statično/ in predloge/ imenik v imeniku projekta na naslednji način:

$ mkdir -v {static, templates}

Ustvariti home.html datoteko v predloge/ imenik na naslednji način:

$ nano predloge/home.html

Vnesite naslednjo kodo v home.html mapa.


< html >
< glavo >
< meta ime='viewport' vsebino='width = širina naprave, začetno merilo = 1,0'>
< naslov >Vremenska postaja Raspberry Pi</ naslov >
< povezava rel='slog' tip='text/css'
href='{{url_for (' static ', filename =' style.css ')}}'/>
</ glavo >
< telo >
< div id='vsebina'>
< h1 >Vremenska postaja Raspberry Pi</ h1 >

< div razred='podatkovna vsebina'>
< h2 >Temperatura</ h2 >
< div razred='podatkovna vrstica'>
< div razred='podatkovna celica' id='tempC'>
...
</ div >
< div razred='podatkovna celica' id='tempF'>
...
</ div >
</ div >
</ div >

< div razred='podatkovna vsebina'>
< h2 >Pritisk</ h2 >
< div razred='podatkovna vrstica'>
< div razred='podatkovna celica' id='pressureMb'>
...
</ div >
< div razred='podatkovna celica' id='pressurePsi'>
...
</ div >
</ div >
< div razred='podatkovna vrstica'>
< div razred='podatkovna celica' id='pressureHpa'>
...
</ div >
< div razred='podatkovna celica' id='pressureP'>
...
</ div >
</ div >
</ div >

< div razred='podatkovna vsebina'>
< h2 >Vlažnost</ h2 >
< div razred='podatkovna vrstica'>
< div razred='podatkovna celica' id='vlažnost'>
...
</ div >
</ div >
</ div >
</ div >

< skript tip='besedilo/javascript' src='{{url_for (' static ', filename =' app.js ')}}'></ skript >
</ telo >
</ html >

Nato pritisnite + X sledi IN in da shranite home.html mapa.

Ustvariti style.css datoteko v statično/ imenik na naslednji način:

$ nano static/style.css

Vnesite naslednje kode v style.css mapa.

@uvoz url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
* {
oblazinjenje: 0;
marža: 0;
družina pisav: 'Robot', brez serifa;
}
telo{
ozadje: # 737373;
}
h1{
zaslon: blok;
barvo: #79DC7B;
poravnajte besedilo: center;
teža pisave: 400;
ozadje: # 000;
oblazinjenje: 0,5em 0;
}
h2{
zaslon: blok;
ozadje: # 000;
barvo: #fff;
poravnajte besedilo: center;
teža pisave: 400;
velikost pisave: 1em;
}
.podatkovna vsebina {
marža: 10 slikovnih pik;
meja: 2 slikovnih pik trden Črna;
meja-polmer: 5 slikovnih pik;
Barva ozadja: #79DC7B;
}
.podatkovna vrstica {
zaslon:upognite;
upogibna smer:vrstici;
}
.podatkovna celica {
premer: 100%;
višina: 80 slikovnih pik;
zaslon:upognite;
align-items: center;
upraviči-vsebino: center;
teža pisave: krepko;
velikost pisave: 1,5em;
barvo: # 006902;
}
.podatkovna celica:lebdite {
ozadje: # FFE891;
barvo: # AA8600;
kazalec: kazalec;
}

Nato pritisnite + X sledi IN in da shranite style.css mapa.

Ustvarite app.js datoteko v statično/ imenik na naslednji način:

$ nano static/app.js

Vnesite naslednjo kodo v app.js mapa.

okno.addEventListener('obremenitev',glavni);
funkcijoglavni() {
funkcijogetAPIData() {
kjehttp= novXMLHttpRequest();

http.onreadystatechange = funkcijo() {
če(to.readyState === 4 && to.stanje === 200) {
nadgradnja(JSON.razčleniti(to.responseText));
}
}

http.odprto('GET', '/požar', prav);
http.pošlji();
}


funkcijonadgradnja(apiData) {
kjetempC=dokument.getElementById('tempC');
kjetempF=dokument.getElementById('tempF');
kjetlakMb=dokument.getElementById('pressureMb');
kjetlakPsi=dokument.getElementById('pressurePsi');
kjetlakHpa=dokument.getElementById('pressureHpa');
kjetlakP=dokument.getElementById('pressureP');
kjevlažnost=dokument.getElementById('vlažnost');

tempC.innerHTML =parseFloat(apiData.temperaturo.C).toPopravljeno(2) + '° C';
tempF.innerHTML =parseFloat(apiData.temperaturo.F.).toPopravljeno(2) + '° F';

tlakMb.innerHTML =parseFloat(apiData.pritisk.mb).toPopravljeno(2) + 'mb';
tlakPsi.innerHTML =parseFloat(apiData.pritisk.psi).toPopravljeno(2) + 'psi';
tlakHpa.innerHTML =parseFloat(apiData.pritisk.hPa).toPopravljeno(2) + 'hPa';
tlakP.innerHTML =parseFloat(apiData.pritisk.P).toPopravljeno(2) + 'P';

vlažnost.innerHTML =parseFloat(apiData.vlažnost).toPopravljeno(2) + '%';
}


funkcijoaplikacijo() {
okno.setInterval(funkcijo() {
getAPIData();
}, 5000);
}

aplikacijo();
}

Nato pritisnite + X sledi IN in da shranite app.js mapa.

Tukaj vrstica 1 vodi main () funkcijo, ko se spletna stran naloži. V main () funkcijo, getAPIData () funkcija pridobi podatke vremenskega API -ja z uporabo AJAX in pokliče nadgradnja() funkcijo (v vrstici 10), ko so bili podatki uspešno pridobljeni. The nadgradnja() funkcija posodobi element spletne strani z uporabo podatkov API.

V vrstici 20 je document.getElementById () metoda se uporablja za pridobivanje sklica elementa spletne strani z ID -jem tempC . Vrstica 28 se uporablja za nadomestitev vsebine elementa spletne strani, ki ima id tempC s temperaturo (v stopinjah Celzija) iz API -ja. Na enak način se vsebina vseh spletnih elementov (vrstice 21–26) nadomesti z ustreznimi podatki API.

V app () funkcijo, getAPIData () se kliče vsakih 5 sekund (5000 milisekund), da se vremenski podatki posodabljajo v aplikaciji za vreme. Nazadnje, v vrstici 46 je app () funkcija je izvedena.

Če želite preizkusiti spletno aplikacijo, vnesite naslednji ukaz:

$ FLASK_APP = zagon bučke server.py --host = 0.0.0.0

Vremenska aplikacija bi morala delovati na vratih 5000 (privzeto).

Če želite preveriti, ali vremenski API deluje, zaženite naslednji ukaz:

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

Kot lahko vidite, se podatki Weather API natisnejo na konzolo. Zato API deluje.

Če želite preizkusiti aplikacijo Vreme, obiščite http: // localhost: 5000 iz spletnega brskalnika Chromium. Aplikacijo Vreme je treba naložiti v spletni brskalnik, vendar najprej ne smejo biti prikazani vremenski podatki.

Po nekaj sekundah bi morala vremenska aplikacija dokončati pridobivanje vremenskih podatkov iz API -ja in jih prikazati.

Kadar koli lahko pritisnete + C ustaviti spletni strežnik.

Ustvarjanje storitve Systemd za spletno aplikacijo Weather

V tem razdelku vam bomo pokazali, kako ustvarite sistemsko datoteko storitve za vremensko aplikacijo, tako da se bo samodejno zagnala ob zagonu.

Najprej ustvarite vremenska postaja.service datoteko v imeniku vašega projekta na naslednji način:

$ nano weather-station.service

Vnesite naslednje vrstice kode v vremenska postaja.service mapa.

[Enota]
Opis = Spletna aplikacija vremenske postaje Raspberry Pi s klobukom Raspberry Pi Sense
Za = network.target

[Storitev]
Delovni imenik =/home/pi/work
Okolje = FLASK_APP = server.py
Okolje = FLASK_ENV = proizvodnja
ExecStart =/usr/bin/flask run --host = 0.0.0.0
StandardOutput = podeduje
StandardError = podeduje
Ponovni zagon = vedno
Uporabnik = pi

[Namesti]
WantedBy = cilj za več uporabnikov

Nato pritisnite + X sledi IN in da shranite vremenska postaja.service mapa.

Kopirajte datoteko vremenska postaja.service datoteko v /etc/systemd/system/ imenik z naslednjim ukazom:

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

Znova naložite sistemske demone, da bodo spremembe začele veljati na naslednji način:

$ sudo systemctl daemon-reload

The vremenska postaja storitev systemd bi morala biti trenutno neaktivna, kot je prikazano na spodnjem posnetku zaslona.

$ sudo systemctl status weather-station.service

Zaženite vremenska postaja storitev z naslednjim ukazom:

$ sudo systemctl start weather-station.service

Kot lahko vidite, vremenska postaja storitev zdaj deluje.

$ sudo systemctl status weather-station.service

Zdaj, ko je vremenska postaja storitev deluje, jo lahko dodate v zagon sistema Raspberry Pi OS z naslednjim ukazom:

$ sudo systemctl omogoči vremensko postajo.service

Znova zaženite Raspberry Pi z naslednjim ukazom:

$ sudo ponovni zagon

Ko enkrat zaženete Raspberry Pi, se vremenska postaja storitev mora delovati, kot je prikazano na spodnjem posnetku zaslona.

$ sudo systemctl status weather-station.service

Dostop do aplikacije Weather iz drugih naprav

Za dostop do aplikacije za vreme iz drugih naprav v vašem domačem omrežju morate poznati naslov IP vašega Raspberry Pi. Naslov IP vašega Raspberry Pi 4 najdete v vmesniku za spletno upravljanje vašega domačega usmerjevalnika. V našem primeru je naslov IP 192.168.0.103, vendar bo ta naslov za vas drugačen, zato ga v vseh naslednjih korakih zamenjajte z vašim.

Če imate dostop do konzole Raspberry Pi, lahko izvedete naslednji ukaz, da poiščete tudi naslov IP.

$ ime gostitelja -I

Ko poznate naslov IP vašega Raspberry Pi, lahko do njega dostopate iz katere koli naprave v domačem omrežju. Kot je prikazano na spodnjem posnetku zaslona, ​​smo aplikacijo za vreme dostopali s pametnega telefona Android.

Zaključek

V tem članku smo vam pokazali, kako uporabite klobuk Raspberry Pi Sense za izdelavo vremenske postaje Raspberry Pi. Uporabili smo čutilni klobuk Knjižnica Python za pridobivanje vremenskih podatkov iz Raspberry Pi Sense Hat. Nato smo z mikro spletnim ogrodjem Flask Python ustvarili vremenski API in spletno aplikacijo. Spletna aplikacija vsakih 5 sekund dobi vremenske podatke iz vremenskega vmesnika, da spletno aplikacijo posodablja z najnovejšimi vremenskimi podatki.