Byg din egen Raspberry Pi vejrstation

Build Your Own Raspberry Pi Weather Station



Raspberry Pi Sense Hat er et add-on board, der kan bruges med Raspberry Pi single-board computere. Raspberry Pi Sense Hat har et 8 × 8 LED-display og et joystick med 5 knapper, og den er udstyret med følgende sensorer:

  1. Gyroskop
  2. Accelerometer
  3. Magnetometer
  4. Temperatur
  5. Barometrisk tryk
  6. Fugtighed

I denne artikel vil jeg vise dig, hvordan du opretter en Python API -baseret vejrstation webapplikation ved hjælp af temperatur , barometrisk tryk , og fugtighed sensorer på Raspberry Pi Sense Hat. For at følge denne artikel skal du bruge følgende:







  1. En Raspberry Pi 3 eller Raspberry Pi 4 med netværksforbindelse.
  2. Et 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 computer eller en stationær computer til VNC -adgang til fjernskrivebord eller SSH -adgang til Raspberry Pi.

BEMÆRK: I denne artikel vil vi eksternt oprette forbindelse til Raspberry Pi via VNC eller SSH ved hjælp af den hovedløse opsætning af Raspberry Pi. Hvis du ikke ønsker at få adgang til din Raspberry Pi eksternt via SSH eller VNC, skal du slutte en skærm, et tastatur og en mus til din Raspberry Pi.



Hvis du vil vide, hvordan du blinker Raspberry Pi OS -billedet på et microSD -kort, henvises til Sådan installeres og bruges Raspberry Pi Imager. Hvis du har brug for hjælp til at installere Raspberry Pi OS på din Raspberry Pi, skal du læse Sådan installeres Raspberry Pi OS på Raspberry Pi 4 . Hvis du har brug for hjælp til den hovedløse opsætning af Raspberry Pi, kan du se Sådan installeres og konfigureres Raspberry Pi OS på Raspberry Pi 4 uden ekstern skærm.



Tilslutning af Raspberry Pi Sense Hat til Raspberry Pi

Raspberry Pi Sense Hat kit leveres med Raspberry Pi Sense Hat add-on board, en 40-pin male-to-female header og nogle skruer og afstandsstykker.





Inden du kan tilslutte Sense Hat-kortet til Raspberry Pi, skal du slutte 40-benet header til Sense Hat. Tilslut hanstifterne på 40-benet han-hun-header til Sense Hat som vist på billederne herunder.



Raspberry Pi single-board computere har 4 huller, der kan bruges til at vedhæfte add-on boards eller et etui. For at fastgøre tilføjelseskortet skal du indsætte skruer bag på Raspberry Pi, som vist på billederne herunder.

Tilslut derefter et afstandsstykke til skruen.

Når du har tilføjet alle fire skruer og afstandsstykker, skal din Raspberry Pi se ud som vist på billedet herunder.

Tilslut Raspberry Pi Sense Hat til det 40-benede GPIO hanhoved på Raspberry Pi, som vist på billederne herunder.

BEMÆRK: Vær forsigtig, mens du afbryder Raspberry Pi Sense Hat fra Raspberry Pi 40-pin GPIO header for at undgå at bøje stifterne på Raspberry Pi GPIO.

Fastgør Raspberry Pi Sense Hat med de fire resterende skruer, som vist på billederne herunder.

Tænder på Raspberry Pi

Nu hvor Raspberry Pi Sense Hat er tilsluttet Raspberry Pi, skal du indsætte microSD -kortet med Raspberry Pi OS i microSD -kortstikket på Raspberry Pi, tilslut strømkablet til Raspberry Pi, og tænd det.

Installation af Raspberry Pi Sense Hat Python Library

For at bruge Raspberry Pi Sense Hat på Raspberry Pi skal forstandshue Python -bibliotek skal installeres på Raspberry Pi OS. Det forstandshue bibliotek er tilgængeligt i det officielle pakkeopbevaringssted for Raspberry Pi OS.

For at installere Raspberry Pi forstandshue Python -bibliotek på Raspberry Pi OS, opdater først APT -pakkens lagercache med følgende kommando:

$ sudo apt opdatering

Kør derefter følgende kommando:

$ sudo apt installer sense -hat -y

Installation af Flask Micro Web Framework Python Library

Vi vil bruge Flask Python -rammen til at oprette vores vejrprogram. Du kan installere Flask fra det officielle pakkeopbevaringssted for Raspberry Pi OS med følgende kommando:

$ sudo apt installer python3 -kolbe -y

Oprettelse af en projektmappe

Det er en god idé at oprette et projektmappe til at organisere dine projektfiler. For at oprette et projektmappe ~/arbejde , brug følgende kommando:

$ mkdir ~/arbejde

Når projektmappen er oprettet, skal du navigere til projektmappen som følger:

$ cd ~/arbejde

Test af Raspberry Pi Sense Hat

For at teste, om Raspberry Pi Sense Hat virker, kan vi skrive et simpelt test Python -script. Du kan oprette et nyt Python -script kaldet test.py med nano teksteditor som følger:

$ nano test.py

Indtast følgende kode i test.py fil. Linje 1 import SenseHat fra forstand_hat modul, linje 3 opretter en SenseHat objekt og gemmer en reference i følelse variabel, og linje 5–6 indstiller farven på alle 8 × 8 lysdioder til rød. Når du er færdig, skal du trykke på + x efterfulgt af OG og .

Du kan køre test.py Python -script med følgende kommando:

$ python3 test.py

8 × 8 LED -matrixen skal lyse i rød farve som vist på billedet herunder.

For at slukke lysdioderne på Sense Hat skal du køre klar() metode uden nogen farveværdi i test.py Python -script, som vist på skærmbilledet herunder, og kør test.py Python script igen.

Lysdioderne på Sense Hat skal nu slukkes, som vist på billedet herunder.

Hvis Sense Hat fungerer korrekt, skal du gå videre til det næste afsnit.

Få vejrdata fra Sense Hat

Du kan nemt få sensordata fra Sense Hat ved at bruge forstandshue Python bibliotek. For at hente sensordata fra Sense Hat kan du oprette et nyt Python -script read_sensor_data.py som følger:

$ nano read_sensor_data.py

Indtast følgende kode i read_sensor_data.py Python -fil.

fraforstand_hatimportereSenseHat
fra tid importeresøvn
følelse=SenseHat()
følelse.klar()
mens Sand:
tempC=følelse.get_temperature()
tempF=tempC *(9/5)+32
tryk=følelse.get_pressure()
fugtighed=følelse.få_fugtighed()

Print('Temperatur: %.2f ° C/ %. 2f ° F n'%(tempC,tempF))
Print('Tryk: %.2f mb n'%(tryk))
Print('Fugtighed:%.2f %% n n'%(fugtighed))
søvn(5)

Når du er færdig, skal du trykke på + x efterfulgt af OG og .

I koden ovenfor importerer linje 1 og 2 alle de nødvendige biblioteker, linje 4 opretter en SenseHat objekt, og linje 5 slukker alle lysdioderne på Sense Hat ved hjælp af klar() metode. While loop i linje 7 er en uendelig loop, der vil køre koden i linje 8–16 for evigt.

I linje 8, get_temperature () metode bruges til at aflæse temperaturdata (i grader Celsius) fra Sense Hat's fugtighedsføler. I linje 9 konverteres temperaturdataene fra grader Celsius til grader Fahrenheit. I linje 10, get_pressure () metode bruges til at aflæse lufttrykdata (i millibar) fra trykføleren på Sense Hat. I linje 11, get_humidity () metode bruges til at aflæse fugtighedsdata (i %) fra Sense Hat's fugtighedsføler.

Linje 13–15 bruges til at udskrive sensordata til konsollen, og linje 16 bruges til at vente i 5 sekunder, før sensordata læses igen.

Du kan køre read_sensor_data.py Python script som følger:

$ python3 read_sensor_data.py

Når scriptet er kørt, udskrives sensordata til konsollen.

Nu hvor vi kan læse sensordataene fra Sense Hat, skal du trykke på + C for at stoppe programmet.

Oprettelse af en Weather Station Web App

I dette afsnit viser vi dig, hvordan du bruger Python Flask -webrammen til at oprette et vejr -API og et vejrprogram. Vejrprogrammet får adgang til vejrdata -API'et og viser vejrdataene i realtid. Al den kode, der diskuteres i dette afsnit, er tilgængelig på GitHub på shovon8 / hindbær-pi-sense-hat-vejr-app .

Opret først en server.py Python -script i projektmappen som følger:

$ nano server.py

Indtast følgende kode i server.py Python -fil.

frakolbeimportereKolbe
frakolbeimporterejsonify
frakolbeimportererender_template
frakolbeimportereurl_for
fraforstand_hatimportereSenseHat
app=Kolbe(__navn__)
app.konfiguration['SEND_FILE_MAX_AGE_DEFAULT'] = 0
følelse=SenseHat()
følelse.klar()
medapp.test_anmodning_kontekst():
url_for('statisk',filnavn='style.css')
url_for('statisk',filnavn='app.js')
@app.rute('/ild')
defild():
tempC=følelse.get_temperature()
tempF=tempC *(9/5)+32
tryk=følelse.get_pressure()
trykPsi=tryk *0,0145038
trykP=tryk *100
fugtighed=følelse.få_fugtighed()

Vend tilbagejsonify({
'temperatur':{ 'C': tempC, 'F': tempF},
'tryk':{ 'mb': tryk, 'hPa': tryk,
'psi': trykPsi, 'P': trykP},
'fugtighed': fugtighed
})
@app.rute('/')
defhjem():
Vend tilbagerender_template('./home.html')

Tryk derefter på + x efterfulgt af OG og for at gemme server.py Python script.

I koden ovenfor importerer linje 1-5 alle de nødvendige biblioteker, linje 7 opretter en Flask -app, linje 11 opretter et SenseHat -objekt, og linje 12 slukker alle lysdioder på Sense Hat. Linje 8 deaktiverer webcaching for Flask -appen. Fordi denne app er let, er der ikke behov for caching. Hvis du vil ændre appen, vil det være meget lettere at teste webcache, hvis du deaktiverer den.

Linje 18–31 læser sensordata fra Sense Hat og returnerer API -data i JSON -format på HTTP GET -anmodning i /ild slutpunkt for webserveren. Linje 37–39 returnerer vejrweb -appens hjemmeside på / slutpunkt for webserveren. Hjemmesiden gengives fra home.html fil, som skal være i skabeloner/ bibliotek over projektmappen.

Linjerne 14–16 bruges til at give adgang til stil.css og app.js statiske filer. Disse filer skal være i statisk/ bibliotek over projektmappen. Det stil.css filen bruges til at style home.html hjemmeside og app.js filen bruges til at anmode om API -data fra /ild endepunkt og opdater vejrdata på home.html side hvert 5. sekund.

Opret statisk/ og skabeloner/ bibliotek i projektmappen som følger:

$ mkdir -v {statisk, skabeloner}

Lave en home.html fil i skabeloner/ bibliotek som følger:

$ nano skabeloner/home.html

Indtast følgende kode i home.html fil.


< html >
< hoved >
< meta navn='viewport' indhold='width = device-width, initial-scale = 1.0'>
< titel >Raspberry Pi vejrstation</ titel >
< link rel='stylesheet' type='tekst/css'
href='{{url_for (' statisk ', filnavn =' style.css ')}}'/>
</ hoved >
< legeme >
< div id='indhold'>
< h1 >Raspberry Pi vejrstation</ h1 >

< div klasse='data-indhold'>
< h2 >Temperatur</ h2 >
< div klasse='datarække'>
< div klasse='datacelle' id='tempC'>
...
</ div >
< div klasse='datacelle' id='tempF'>
...
</ div >
</ div >
</ div >

< div klasse='data-indhold'>
< h2 >Tryk</ h2 >
< div klasse='datarække'>
< div klasse='datacelle' id='trykMb'>
...
</ div >
< div klasse='datacelle' id='trykPsi'>
...
</ div >
</ div >
< div klasse='datarække'>
< div klasse='datacelle' id='presHpa'>
...
</ div >
< div klasse='datacelle' id='trykP'>
...
</ div >
</ div >
</ div >

< div klasse='data-indhold'>
< h2 >Fugtighed</ h2 >
< div klasse='datarække'>
< div klasse='datacelle' id='fugtighed'>
...
</ div >
</ div >
</ div >
</ div >

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

Tryk derefter på + x efterfulgt af OG og for at gemme home.html fil.

Lave en stil.css fil i statisk/ bibliotek som følger:

$ nano static/style.css

Indtast følgende koder i stil.css fil.

@importere url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
* {
polstring: 0;
margen: 0;
skrifttype-familie: 'Robot', sans serif;
}
legeme{
baggrund: # 737373;
}
h1{
Skærm: blok;
farve: #79DC7B;
tekstjustering: centrum;
skrifttype-vægt: 400;
baggrund: # 000;
polstring: 0,5 em 0;
}
h2{
Skærm: blok;
baggrund: # 000;
farve: #fff;
tekstjustering: centrum;
skrifttype-vægt: 400;
skriftstørrelse: 1em;
}
.data-indhold {
margen: 10px;
grænse: 2px solid sort;
grænse-radius: 5px;
baggrundsfarve: #79DC7B;
}
.data-række {
Skærm:flex;
flex-retning:række;
}
.data-celle {
bredde: 100%;
højde: 80px;
Skærm:flex;
juster-elementer: centrum;
retfærdiggøre-indhold: centrum;
skrifttype-vægt: fremhævet;
skriftstørrelse: 1,5 em;
farve: # 006902;
}
.data-celle:svæve {
baggrund: # FFE891;
farve: # AA8600;
cursoren: markør;
}

Tryk derefter på + x efterfulgt af OG og for at gemme stil.css fil.

Opret en app.js fil i statisk/ bibliotek som følger:

$ nano static/app.js

Indtast følgende kode i app.js fil.

vindue.addEventListener('belastning',vigtigste);
fungerevigtigste() {
fungeregetAPIData() {
hvorhttp= nyXMLHttpRequest();

http.onreadystatechange = fungere() {
hvis(det her.readyState === 4 && det her.status === 200) {
opdatering(JSON.parse(det her.svarTekst));
}
}

http.åben('FÅ', '/ild', sand);
http.sende();
}


fungereopdatering(apiData) {
hvortempC=dokument.getElementById('tempC');
hvortempF=dokument.getElementById('tempF');
hvortryk Mb=dokument.getElementById('trykMb');
hvortrykPsi=dokument.getElementById('trykPsi');
hvortrykHpa=dokument.getElementById('presHpa');
hvortrykP=dokument.getElementById('trykP');
hvorfugtighed=dokument.getElementById('fugtighed');

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

tryk Mb.indre HTML =parseFloat(apiData.tryk.mb).tilFast(2) + 'mb';
trykPsi.indre HTML =parseFloat(apiData.tryk.psi).tilFast(2) + 'psi';
trykHpa.indre HTML =parseFloat(apiData.tryk.hPa).tilFast(2) + 'hPa';
trykP.indre HTML =parseFloat(apiData.tryk.P).tilFast(2) + 'P';

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


fungereapp() {
vindue.setInterval(fungere() {
getAPIData();
}, 5000);
}

app();
}

Tryk derefter på + x efterfulgt af OG og for at gemme app.js fil.

Her kører linje 1 main () funktion, når websiden er færdig med at indlæse. I main () funktion, den getAPIData () funktion henter vejr -API -data ved hjælp af AJAX og kalder opdater () funktion (i linje 10), når dataene er blevet hentet. Det opdater () funktion opdaterer websideelementet ved hjælp af API -data.

I linje 20, document.getElementById () metode bruges til at få referencen til websidens element med id'et tempC . Linje 28 bruges til at erstatte indholdet af det websideelement, der har id'et tempC med temperaturen (i Celsius) fra API'et. På samme måde erstattes indholdet af alle webelementer (linje 21–26) med deres respektive API -data.

I app () funktion, den getAPIData () kaldes hvert 5. sekund (5000 millisekunder) for at holde vejrdataene opdaterede i vejr -appen. Endelig i linje 46, the app () funktion udføres.

For at teste webappen skal du indtaste følgende kommando:

$ FLASK_APP = server.py kolbe kører --host = 0.0.0.0

Vejr -appen skal køre på port 5000 (som standard).

For at teste, om Weather API fungerer, skal du køre følgende kommando:

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

Som du kan se, udskrives Weather API -dataene til konsollen. Derfor fungerer API'en.

Besøg for at teste Weather -appen http: // lokal vært: 5000 fra en Chromium -webbrowser. Vejr -appen skal indlæses i webbrowseren, men der skal først vises vejrdata.

Efter et par sekunder skulle vejr -appen afslutte at hente vejrdataene fra API'en og vise dem.

Når som helst kan du trykke på + C for at stoppe webserveren.

Oprettelse af Systemd Service til Weather Web App

I dette afsnit viser vi dig, hvordan du opretter en systemd -servicefil til vejr -appen, så den automatisk starter ved opstart.

Opret først en vejr-station.service fil i dit projektmappe som følger:

$ nano vejrstation. service

Indtast følgende kodelinjer i vejr-station.service fil.

[Enhed]
Beskrivelse = Raspberry Pi Weather Station Web -app ved hjælp af Raspberry Pi Sense Hat
Efter = network.target

[Service]
WorkingDirectory =/home/pi/work
Miljø = FLASK_APP = server.py
Miljø = FLASK_ENV = produktion
ExecStart =/usr/bin/kolbe kører --host = 0.0.0.0
StandardOutput = arve
StandardError = arv
Genstart = altid
Bruger = pi

[Installere]
WantedBy = multi-user.target

Tryk derefter på + x efterfulgt af OG og for at gemme vejr-station.service fil.

Kopier vejr-station.service fil til /etc/systemd/system/ bibliotek med følgende kommando:

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

Genindlæs systemd -dæmonerne, så ændringerne træder i kraft som følger:

$ sudo systemctl daemon-reload

Det vejrstation systemd service skal være inaktiv i øjeblikket, som vist på skærmbilledet herunder.

$ sudo systemctl status weather-station.service

Start vejrstation service med følgende kommando:

$ sudo systemctl start weather-station.service

Som du kan se, er vejrstation service kører nu.

$ sudo systemctl status weather-station.service

Nu hvor vejrstation tjenesten fungerer, kan du føje den til systemstart af Raspberry Pi OS med følgende kommando:

$ sudo systemctl aktivere weather-station.service

Genstart din Raspberry Pi med følgende kommando:

$ sudo genstart

Når dine Raspberry Pi støvler, vil vejrstation service skal køre, som vist på skærmbilledet herunder.

$ sudo systemctl status weather-station.service

Adgang til Weather -appen fra andre enheder

For at få adgang til vejr -appen fra andre enheder i dit hjemmenetværk skal du kende IP -adressen på din Raspberry Pi. Du kan finde IP -adressen på din Raspberry Pi 4 fra webadministrationsgrænsefladen på din hjemmrouter. I vores tilfælde er IP -adressen 192.168.0.103, men denne adresse vil være anderledes for dig, så sørg for at erstatte denne adresse med din i alle efterfølgende trin.

Hvis du har adgang til Raspberry Pi -konsollen, kan du også køre følgende kommando for at finde IP -adressen.

$ værtsnavn -I

Når du kender IP -adressen på din Raspberry Pi, kan du få adgang til den fra enhver enhed i dit hjemmenetværk. Som vist på skærmbilledet herunder har vi åbnet vejr -appen fra en Android -smartphone.

Konklusion

I denne artikel viste vi dig, hvordan du bruger Raspberry Pi Sense Hat til at bygge en Raspberry Pi vejrstation. Vi brugte forstandshue Python -bibliotek til at udtrække vejrdata fra Raspberry Pi Sense Hat. Derefter brugte vi Flask Python -mikrowebrammen til at oprette en vejr -API og en webapplikation. Webappen får vejrdataene fra vejr -API'en hvert 5. sekund for at holde web -appen opdateret med de nyeste vejrdata.