Bygg din egen Raspberry Pi værstasjon

Build Your Own Raspberry Pi Weather Station



Raspberry Pi Sense Hat er et tilleggskort som kan brukes med Raspberry Pi enkeltbordsmaskiner. Raspberry Pi Sense Hat har en 8 × 8 LED-skjerm og en 5-knappers joystick, og den er utstyrt med følgende sensorer:

  1. Gyroskop
  2. Akselerometer
  3. Magnetometer
  4. Temperatur
  5. Barometrisk trykk
  6. Luftfuktighet

I denne artikkelen skal jeg vise deg hvordan du oppretter en Python API -basert værstasjon -webapplikasjon ved å bruke temperatur , barometrisk trykk , og luftfuktighet sensorer på Raspberry Pi Sense Hat. For å følge denne artikkelen trenger du følgende:







  1. En Raspberry Pi 3 eller Raspberry Pi 4 med nettverkstilkobling.
  2. En Raspberry Pi Sense Hat -modul.
  3. En mikro-USB (Raspberry Pi 3) eller USB Type-C (Raspberry Pi 4) strømadapter.
  4. Et 16 GB eller 32 GB microSD -kort med Raspberry Pi OS.
  5. En bærbar datamaskin eller en stasjonær datamaskin for VNC ekstern skrivebordstilgang eller SSH -tilgang til Raspberry Pi.

MERK: I denne artikkelen vil vi koble til Raspberry Pi eksternt via VNC eller SSH ved hjelp av det hodeløse oppsettet til Raspberry Pi. Hvis du ikke ønsker å få tilgang til Raspberry Pi eksternt via SSH eller VNC, må du koble en skjerm, et tastatur og en mus til din Raspberry Pi.



For å lære hvordan du blinker Raspberry Pi OS -bildet på et microSD -kort, kan du se Hvordan installere og bruke Raspberry Pi Imager. Hvis du trenger hjelp til å installere Raspberry Pi OS på Raspberry Pi, kan du lese Slik installerer du Raspberry Pi OS på Raspberry Pi 4 . Hvis du trenger hjelp med det hodeløse oppsettet til Raspberry Pi, kan du se hvordan du installerer og konfigurerer Raspberry Pi OS på Raspberry Pi 4 uten ekstern skjerm.



Koble Raspberry Pi Sense Hat til Raspberry Pi

Raspberry Pi Sense Hat-settet kommer med tilleggsbrettet Raspberry Pi Sense Hat, en 40-pinners hode-til-hunn-overskrift og noen skruer og avstandsstykker.





Før du kan feste Sense Hat-kortet til Raspberry Pi, må du koble 40-pinners topptekst til Sense Hat. Koble hannpinnene på 40-pinners hann-hunn-topptekst til Sense-hatten som vist på bildene nedenfor.



Raspberry Pi single-board datamaskiner har 4 hull som kan brukes til å feste tilleggstavler eller etui. For å feste tilleggskortet, sett inn skruer på baksiden av Raspberry Pi, som vist på bildene nedenfor.

Koble deretter en avstandsstykke til skruen.

Når du har lagt til alle fire skruer og avstandsstykker, skal din Raspberry Pi se slik ut som vist på bildet nedenfor.

Koble Raspberry Pi Sense-hatten til den 40-pinners GPIO-overskriften til Raspberry Pi, som vist på bildene nedenfor.

MERK: Vær forsiktig når du kobler Raspberry Pi Sense-hatten fra Raspberry Pi 40-pinners GPIO-topptekst for å unngå å bøye pinnene på Raspberry Pi GPIO.

Fest de Raspberry Pi Sense Hat med de fire gjenværende skruene, som vist på bildene nedenfor.

Slå på Raspberry Pi

Nå som Raspberry Pi Sense Hat er koblet til Raspberry Pi, sett inn microSD -kortet med Raspberry Pi OS i microSD -kortsporet på Raspberry Pi, koble strømkabelen til Raspberry Pi og slå den på.

Installere Raspberry Pi Sense Hat Python Library

For å bruke Raspberry Pi Sense Hat på Raspberry Pi, sense-hat Python -biblioteket må være installert på Raspberry Pi OS. De sense-hat biblioteket er tilgjengelig i det offisielle pakkelageret til Raspberry Pi OS.

For å installere Raspberry Pi sense-hat Python -bibliotek på Raspberry Pi OS, oppdater først APT -pakkens depotbuffer med følgende kommando:

$ sudo apt oppdatering

Kjør deretter følgende kommando:

$ sudo apt installer sense -hat -y

Installere Flask Micro Web Framework Python Library

Vi vil bruke Flask Python -rammeverket for å lage vårt værprogram. Du kan installere Flask fra det offisielle pakkelageret til Raspberry Pi OS med følgende kommando:

$ sudo apt installer python3 -flask -y

Opprette en prosjektkatalog

Det er en god idé å opprette en prosjektkatalog for å organisere prosjektfilene. For å opprette en prosjektkatalog ~/arbeid , bruk følgende kommando:

$ mkdir ~/arbeid

Når prosjektkatalogen er opprettet, navigerer du til prosjektkatalogen som følger:

$ cd ~/arbeid

Tester Raspberry Pi Sense Hat

For å teste om Raspberry Pi Sense Hat fungerer, kan vi skrive et enkelt test -Python -skript. Du kan opprette et nytt Python -skript kalt test.py med nano tekstredigerer som følger:

$ nano test.py

Skriv inn følgende kode i test.py fil. Linje 1 importerer SenseHat fra sense_hat modul, linje 3 oppretter en SenseHat objektet og lagrer en referanse i føle variabel, og linjene 5–6 setter fargen på alle 8 × 8 lysdiodene til rød. Når du er ferdig, trykker du på + X etterfulgt av OG og .

Du kan kjøre test.py Python -skript med følgende kommando:

$ python3 test.py

8 × 8 LED -matrisen skal lyse i rød farge som vist på bildet nedenfor.

For å slå av lysdiodene til Sense Hat, kjør klar() metode uten fargeverdi i test.py Python -skript, som vist på skjermbildet nedenfor, og kjør test.py Python -skript igjen.

Lysdiodene til Sense Hat bør nå slås av, som vist på bildet nedenfor.

Hvis Sense -hatten fungerer som den skal, går du videre til neste avsnitt.

Få værdata fra Sense Hat

Du kan enkelt hente sensordata fra Sense Hat ved å bruke sense-hat Python -bibliotek. For å hente sensordata fra Sense Hat kan du opprette et nytt Python -skript read_sensor_data.py følgende:

$ nano read_sensor_data.py

Skriv inn følgende kode i read_sensor_data.py Python -fil.

frasense_hatimportSenseHat
fra tid importsøvn
føle=SenseHat()
føle.klar()
samtidig som ekte:
tempC=føle.get_temperature()
tempF=tempC *(9/5)+32
press=føle.get_pressure()
luftfuktighet=føle.få_fuktighet()

skrive ut('Temperatur: %.2f ° C/ %. 2f ° F n'%(tempC,tempF))
skrive ut(Trykk: %.2f mb n'%(press))
skrive ut('Fuktighet:%.2f %% n n'%(luftfuktighet))
søvn(5)

Når du er ferdig, trykker du på + X etterfulgt av OG og .

I koden ovenfor importerer linje 1 og 2 alle nødvendige biblioteker, linje 4 lager en SenseHat objekt, og linje 5 slår av alle lysdiodene til Sense Hat ved hjelp av klar() metode. Mens -sløyfen på linje 7 er en uendelig sløyfe som vil kjøre koden i linje 8–16 for alltid.

På linje 8, get_temperature () metoden brukes til å lese temperaturdata (i grader Celsius) fra fuktighetssensoren til Sense Hat. På linje 9 konverteres temperaturdataene fra grader Celsius til grader Fahrenheit. På linje 10, get_pressure () metoden brukes til å lese lufttrykkdata (i millibar) fra trykksensoren til Sense Hat. I linje 11, get_humidity () metoden brukes til å lese fuktighetsdata (i %) fra fuktighetssensoren til Sense Hat.

Linje 13–15 brukes til å skrive ut sensordata til konsollen, og linje 16 brukes til å vente i 5 sekunder før du leser sensordata igjen.

Du kan kjøre read_sensor_data.py Python -skript som følger:

$ python3 read_sensor_data.py

Når skriptet er kjørt, skrives sensordata ut til konsollen.

Nå som vi kan lese sensordataene fra Sense Hat, trykker du på + C for å stoppe programmet.

Opprette en Weather Station Web App

I denne delen vil vi vise deg hvordan du bruker Python Flask webramme for å lage et vær -API og et værprogram. Værprogrammet får tilgang til værdata -API -et og viser værdataene i sanntid. All koden som er omtalt i denne delen er tilgjengelig på GitHub på shovon8 / bringebær-pi-sense-hatt-vær-app .

Opprett først en server.py Python -skript i prosjektkatalogen som følger:

$ nano server.py

Skriv inn følgende kode i server.py Python -fil.

frakolbeimportKolbe
frakolbeimportjsonify
frakolbeimportrender_template
frakolbeimporturl_for
frasense_hatimportSenseHat
app=Kolbe(__Navn__)
app.konfigur['SEND_FILE_MAX_AGE_DEFAULT'] = 0
føle=SenseHat()
føle.klar()
medapp.test_request_context():
url_for('statisk',filnavn='style.css')
url_for('statisk',filnavn='app.js')
@app.rute('/Brann')
defBrann():
tempC=føle.get_temperature()
tempF=tempC *(9/5)+32
press=føle.get_pressure()
trykkPsi=press *0,0145038
trykkP=press *100
luftfuktighet=føle.få_fuktighet()

komme tilbakejsonify({
'temperatur':{ 'C': tempC, 'F': tempF},
'press':{ 'mb': press, 'hPa': press,
'psi': pressPsi, 'P': trykkP},
'luftfuktighet': luftfuktighet
})
@app.rute('/')
defhjem():
komme tilbakerender_template('./home.html')

Trykk deretter på + X etterfulgt av OG og for å lagre server.py Python -skript.

I koden ovenfor importerer linje 1–5 alle nødvendige biblioteker, linje 7 oppretter en Flask -app, linje 11 lager et SenseHat -objekt, og linje 12 slår av alle lysdiodene til Sense Hat. Linje 8 deaktiverer hurtigbufring for Flask -appen. Fordi denne appen er lett, er det ikke behov for bufring. Hvis du vil endre appen, blir det mye lettere å teste å ha deaktivert nettbuffer.

Linje 18–31 leser sensordata fra Sense Hat og returnerer API -dataene i JSON -format på HTTP GET -forespørsel i /Brann endepunktet til webserveren. Linje 37–39 returnerer været -web -hjemmesiden på / endepunktet til webserveren. Hjemmesiden gjengis fra home.html filen, som skal være i maler/ katalog over prosjektkatalogen.

Linje 14–16 brukes for å gi tilgang til style.css og app.js statiske filer. Disse filene skal være i statisk/ katalog over prosjektkatalogen. De style.css filen brukes til å style home.html hjemmesiden og app.js filen brukes til å be om API -data fra /Brann endepunkt og oppdater værdataene på home.html side hvert 5. sekund.

Lag statisk/ og maler/ katalogen i prosjektkatalogen som følger:

$ mkdir -v {static, templates}

Lage en home.html filen i maler/ katalogen som følger:

$ nano -maler/home.html

Skriv inn følgende kode i home.html fil.


< html >
< hode >
< meta Navn='viewport' innhold='width = device-width, initial-scale = 1.0'>
< tittel >Raspberry Pi værstasjon</ tittel >
< lenke rel='stilark' type='tekst/css'
href='{{url_for (' statisk ', filnavn =' style.css ')}}'/>
</ hode >
< kropp >
< div id='innhold'>
< h1 >Raspberry Pi værstasjon</ h1 >

< div klasse='data-innhold'>
< h2 >Temperatur</ h2 >
< div klasse='data-row'>
< div klasse='datacelle' id='tempC'>
...
</ div >
< div klasse='datacelle' id='tempF'>
...
</ div >
</ div >
</ div >

< div klasse='data-innhold'>
< h2 >Press</ h2 >
< div klasse='data-row'>
< div klasse='datacelle' id='pressMb'>
...
</ div >
< div klasse='datacelle' id='pressPsi'>
...
</ div >
</ div >
< div klasse='data-row'>
< div klasse='datacelle' id='pressHpa'>
...
</ div >
< div klasse='datacelle' id='pressP'>
...
</ div >
</ div >
</ div >

< div klasse='data-innhold'>
< h2 >Luftfuktighet</ h2 >
< div klasse='data-row'>
< div klasse='datacelle' id='luftfuktighet'>
...
</ div >
</ div >
</ div >
</ div >

< manus type='tekst/javascript' src='{{url_for (' static ', filnavn =' app.js ')}}'></ manus >
</ kropp >
</ html >

Trykk deretter på + X etterfulgt av OG og for å lagre home.html fil.

Lage en style.css filen i statisk/ katalogen som følger:

$ nano static/style.css

Skriv inn følgende koder i style.css fil.

@import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
* {
polstring: 0;
margin: 0;
font-familie: 'Robot', sans serif;
}
kropp{
bakgrunn: # 737373;
}
h1{
vise: blokkere;
farge: #79DC7B;
tekstjustering: senter;
font-vekt: 400;
bakgrunn: # 000;
polstring: 0,5 em 0;
}
h2{
vise: blokkere;
bakgrunn: # 000;
farge: #fff;
tekstjustering: senter;
font-vekt: 400;
skriftstørrelse: 1 em;
}
.data-innhold {
margin: 10px;
grense: 2px fast svart;
grense-radius: 5px;
bakgrunnsfarge: #79DC7B;
}
.data-rad {
vise:fleks;
fleksibel retning:rad;
}
.data-celle {
bredde: 100%;
høyde: 80px;
vise:fleks;
juster-elementer: senter;
justify-content: senter;
font-vekt: modig;
skriftstørrelse: 1,5 em;
farge: # 006902;
}
.data-celle:sveve {
bakgrunn: # FFE891;
farge: # AA8600;
markøren: pekeren;
}

Trykk deretter på + X etterfulgt av OG og for å lagre style.css fil.

Lag en app.js filen i statisk/ katalogen som følger:

$ nano static/app.js

Skriv inn følgende kode i app.js fil.

vindu.addEventListener('laste',hoved-);
funksjonhoved-() {
funksjongetAPIData() {
hvorhttp= nyXMLHttpRequest();

http.onreadystatechange = funksjon() {
hvis(dette.readyState === 4 && dette.status === 200) {
Oppdater(JSON.analysere(dette.responseText));
}
}

http.åpen('FÅ', '/Brann', ekte);
http.sende();
}


funksjonOppdater(apiData) {
hvortempC=dokument.getElementById('tempC');
hvortempF=dokument.getElementById('tempF');
hvortrykk Mb=dokument.getElementById('pressMb');
hvortrykkPsi=dokument.getElementById('pressPsi');
hvortrykkHpa=dokument.getElementById('pressHpa');
hvortrykkP=dokument.getElementById('pressP');
hvorluftfuktighet=dokument.getElementById('luftfuktighet');

tempC.indre HTML =parseFloat(apiData.temperatur.C).tilFast(2) + '° C';
tempF.indre HTML =parseFloat(apiData.temperatur.F).tilFast(2) + '° F';

trykk Mb.indre HTML =parseFloat(apiData.press.mb).tilFast(2) + 'mb';
trykkPsi.indre HTML =parseFloat(apiData.press.psi).tilFast(2) + 'psi';
trykkHpa.indre HTML =parseFloat(apiData.press.hPa).tilFast(2) + 'hPa';
trykkP.indre HTML =parseFloat(apiData.press.P).tilFast(2) + 'P';

luftfuktighet.indre HTML =parseFloat(apiData.luftfuktighet).tilFast(2) + '%';
}


funksjonapp() {
vindu.setInterval(funksjon() {
getAPIData();
}, 5000);
}

app();
}

Trykk deretter på + X etterfulgt av OG og for å lagre app.js fil.

Her kjører linje 1 hoved() funksjon når websiden er lastet inn. I hoved() funksjonen, getAPIData () -funksjonen henter vær -API -dataene ved hjelp av AJAX og kaller Oppdater() funksjon (på linje 10) når dataene er hentet. De Oppdater() funksjonen oppdaterer nettsideelementet ved hjelp av API -dataene.

På linje 20, document.getElementById () metoden brukes for å få referansen til nettsideelementet med id tempC . Linje 28 brukes til å erstatte innholdet i nettsideelementet som har id tempC med temperaturen (i Celsius) fra API. På samme måte blir innholdet i alle webelementene (linje 21–26) erstattet med sine respektive API -data.

I app () funksjonen, getAPIData () ringes hvert 5. sekund (5000 millisekunder) for å holde værdataene oppdaterte i vær -appen. Til slutt, på linje 46, app () funksjonen utføres.

For å teste webappen, skriv inn følgende kommando:

$ FLASK_APP = server.py kolbe kjøre --host = 0.0.0.0

Vær -appen skal kjøre på port 5000 (som standard).

For å teste om Weather API fungerer, kjør følgende kommando:

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

Som du kan se, skrives Weather API -dataene ut på konsollen. Derfor fungerer API.

For å teste Vær -appen, besøk http: // lokal vert: 5000 fra en Chromium -nettleser. Vær -appen skal lastes ned i nettleseren, men ingen værdata skal vises først.

Etter noen sekunder bør vær -appen fullføre å hente værdataene fra API -en og vise den.

Du kan når som helst trykke + C for å stoppe webserveren.

Opprette Systemd Service for Weather Web App

I denne delen viser vi deg hvordan du oppretter en systemd servicefil for vær -appen slik at den starter automatisk ved oppstart.

Opprett først en værstasjon. service filen i prosjektkatalogen som følger:

$ nano værstasjon. service

Skriv inn følgende kodelinjer i værstasjon. service fil.

[Enhet]
Beskrivelse = Raspberry Pi Weather Station Web -app som bruker Raspberry Pi Sense Hat
Etter = network.target

[Service]
WorkingDirectory =/home/pi/work
Miljø = FLASK_APP = server.py
Miljø = FLASK_ENV = produksjon
ExecStart =/usr/bin/flask run --host = 0.0.0.0
StandardOutput = arve
StandardError = arve
Start på nytt = alltid
Bruker = pi

[Installere]
WantedBy = multi-user.target

Trykk deretter på + X etterfulgt av OG og for å lagre værstasjon. service fil.

Kopier værstasjon. service filen til /etc/systemd/system/ katalog med følgende kommando:

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

Last inn systemdemonene på nytt for at endringene skal tre i kraft som følger:

$ sudo systemctl daemon-reload

De værstasjon systemd -tjenesten skal være inaktiv for øyeblikket, som vist på skjermbildet nedenfor.

$ sudo systemctl status weather-station.service

Start værstasjon service med følgende kommando:

$ sudo systemctl start weather-station.service

Som du kan se, værstasjon tjenesten kjører nå.

$ sudo systemctl status weather-station.service

Nå som værstasjon tjenesten fungerer, kan du legge den til systemoppstarten av Raspberry Pi OS med følgende kommando:

$ sudo systemctl aktivere weather-station.service

Start Raspberry Pi på nytt med følgende kommando:

$ sudo omstart

Når Raspberry Pi -støvlene dine er værstasjon tjenesten skal kjøre, som vist på skjermbildet nedenfor.

$ sudo systemctl status weather-station.service

Få tilgang til Weather -appen fra andre enheter

For å få tilgang til vær -appen fra andre enheter i hjemmenettverket ditt, må du vite IP -adressen til Raspberry Pi. Du finner IP -adressen til din Raspberry Pi 4 fra nettadministrasjonsgrensesnittet til hjemmeruteren. I vårt tilfelle er IP -adressen 192.168.0.103, men denne adressen vil være annerledes for deg, så sørg for å erstatte denne adressen med din i alle påfølgende trinn.

Hvis du har tilgang til Raspberry Pi -konsollen, kan du også kjøre følgende kommando for å finne IP -adressen.

$ vertsnavn -I

Når du kjenner IP -adressen til Raspberry Pi, kan du få tilgang til den fra hvilken som helst enhet i hjemmenettverket. Som vist på skjermbildet nedenfor, har vi fått tilgang til vær -appen fra en Android -smarttelefon.

Konklusjon

I denne artikkelen viste vi deg hvordan du bruker Raspberry Pi Sense Hat til å bygge en Raspberry Pi værstasjon. Vi brukte sense-hat Python -bibliotek for å trekke ut værdata fra Raspberry Pi Sense Hat. Deretter brukte vi Flask Python micro web -rammeverket for å lage et vær -API og et webprogram. Nettappen får værdataene fra vær -API hvert 5. sekund for å holde web -appen oppdatert med de siste værdataene.