Bygg din egen Raspberry Pi -väderstation

Build Your Own Raspberry Pi Weather Station



Raspberry Pi Sense Hat är ett tilläggskort som kan användas med Raspberry Pi enkortsdatorer. Raspberry Pi Sense Hat har en 8 × 8 LED-skärm och en 5-knappars joystick, och den är utrustad med följande sensorer:

  1. Gyroskop
  2. Accelerometer
  3. Magnetometer
  4. Temperatur
  5. Barometertryck
  6. Fuktighet

I den här artikeln kommer jag att visa dig hur du skapar en Python API -baserad väderstation webbapplikation med hjälp av temperatur , barometertryck , och fuktighet sensorer på Raspberry Pi Sense Hat. För att följa den här artikeln behöver du följande:







  1. En Raspberry Pi 3 eller Raspberry Pi 4 med nätverksanslutning.
  2. En Raspberry Pi Sense Hat -modul.
  3. En mikro-USB (Raspberry Pi 3) eller USB Type-C (Raspberry Pi 4) strömadapter.
  4. Ett 16 GB eller 32 GB microSD -kort med Raspberry Pi OS.
  5. En bärbar dator eller en stationär dator för VNC -åtkomst till fjärrskrivbord eller SSH -åtkomst till Raspberry Pi.

NOTERA: I den här artikeln kommer vi att ansluta till Raspberry Pi på distans via VNC eller SSH med hjälp av Raspberry Pi utan huvud. Om du inte vill komma åt din Raspberry Pi på distans via SSH eller VNC måste du ansluta en bildskärm, ett tangentbord och en mus till din Raspberry Pi.



För att lära dig hur du flashar Raspberry Pi OS -bilden på ett microSD -kort, hänvisar du till hur du installerar och använder Raspberry Pi Imager. Om du behöver hjälp med att installera Raspberry Pi OS på din Raspberry Pi, läs Så här installerar du Raspberry Pi OS på Raspberry Pi 4 . Om du behöver hjälp med den huvudlösa installationen av Raspberry Pi, kolla in Hur du installerar och konfigurerar Raspberry Pi OS på Raspberry Pi 4 utan extern bildskärm.



Ansluter Raspberry Pi Sense Hat till Raspberry Pi

Raspberry Pi Sense Hat-kit levereras med tilläggskortet Raspberry Pi Sense Hat, ett 40-stifts han-till-hona-huvud och några skruvar och distanser.





Innan du kan fästa Sense Hat-kortet på Raspberry Pi måste du ansluta 40-stifts rubriken till Sense Hat. Anslut hanstiften på 40-stifts han-hona-huvudet till Sense-hatten som visas på bilderna nedan.



Raspberry Pi enkortsdatorer har 4 hål som kan användas för att fästa tilläggskort eller ett fodral. För att fästa tilläggskortet, sätt i skruvarna från baksidan av Raspberry Pi, som visas på bilderna nedan.

Anslut sedan en distans till skruven.

När du har lagt till alla fyra skruvar och distanser ska din Raspberry Pi se ut så som visas på bilden nedan.

Anslut Raspberry Pi Sense-hatten till den 40-stifts GPIO-hanrubriken på Raspberry Pi, som visas på bilderna nedan.

NOTERA: Var försiktig när du kopplar bort Raspberry Pi Sense Hat från Raspberry Pi 40-pin GPIO-rubriken för att undvika att böja stiften på Raspberry Pi GPIO.

Fäst Raspberry Pi Sense Hat med de fyra återstående skruvarna, som visas på bilderna nedan.

Slå på Raspberry Pi

Nu när Raspberry Pi Sense Hat är ansluten till Raspberry Pi, sätt in microSD -kortet med Raspberry Pi OS i microSD -kortplatsen på Raspberry Pi, anslut strömkabeln till Raspberry Pi och slå på den.

Installera Raspberry Pi Sense Hat Python Library

För att använda Raspberry Pi Sense Hat på Raspberry Pi, sinne-hatt Python -biblioteket måste installeras på Raspberry Pi OS. De sinne-hatt biblioteket är tillgängligt i det officiella paketförvaret för Raspberry Pi OS.

För att installera Raspberry Pi sinne-hatt Python -bibliotek på Raspberry Pi OS, uppdatera först APT -paketets förvaringscache med följande kommando:

$ sudo apt uppdatering

Kör sedan följande kommando:

$ sudo apt installera sense -hat -y

Installera Flask Micro Web Framework Python Library

Vi kommer att använda Flask Python -ramverket för att skapa vår väderapplikation. Du kan installera Flask från det officiella paketförvaret för Raspberry Pi OS med följande kommando:

$ sudo apt installera python3 -flask -y

Skapa en projektkatalog

Det är en bra idé att skapa en projektkatalog för att organisera dina projektfiler. För att skapa en projektkatalog ~/arbete , använd följande kommando:

$ mkdir ~/arbete

När projektkatalogen har skapats, navigerar du till projektkatalogen enligt följande:

$ cd ~/arbete

Testar Raspberry Pi Sense Hat

För att testa om Raspberry Pi Sense Hat fungerar kan vi skriva ett enkelt test -Python -skript. Du kan skapa ett nytt Python -skript som heter test.py med nano textredigerare enligt följande:

$ nano test.py

Ange följande kod i test.py fil. Rad 1 importerar SenseHat från sense_hat modul, rad 3 skapar en SenseHat objekt och lagrar en referens i känsla variabel och raderna 5–6 ställer in färgen på alla 8 × 8 lysdioder till rött. När du är klar trycker du på + X följd av OCH och .

Du kan köra test.py Python -skript med följande kommando:

$ python3 test.py

8 × 8 LED -matrisen ska lysa i röd färg som visas på bilden nedan.

För att stänga av lysdioderna på Sense Hat, kör klar() metod utan något färgvärde i test.py Python -skript, som visas på skärmdumpen nedan, och kör test.py Python -skript igen.

Lysdioderna på Sense Hat bör nu släckas, som visas på bilden nedan.

Om Sense Hat fungerar korrekt, gå vidare till nästa avsnitt.

Få väderdata från Sense Hat

Du kan enkelt få sensordata från Sense Hat genom att använda sinne-hatt Python -bibliotek. För att hämta sensordata från Sense Hat kan du skapa ett nytt Python -skript read_sensor_data.py som följer:

$ nano read_sensor_data.py

Ange följande kod i read_sensor_data.py Python -fil.

frånsense_hatimporteraSenseHat
från tid importerasömn
känsla=SenseHat()
känsla.klar()
medan Sann:
tempC=känsla.get_temperature()
tempF=tempC *(9/5)+32
tryck=känsla.get_pressure()
fuktighet=känsla.få_fuktighet()

skriva ut('Temperatur: %.2f ° C/ %. 2f ° F n'%(tempC,tempF))
skriva ut('Tryck: %.2f mb n'%(tryck))
skriva ut('Luftfuktighet:%.2f %% n n'%(fuktighet))
sömn(5)

När du är klar trycker du på + X följd av OCH och .

I koden ovan importerar rad 1 och 2 alla nödvändiga bibliotek, rad 4 skapar en SenseHat objekt, och rad 5 släcker alla lysdioder på Sense Hat med hjälp av klar() metod. While loop på rad 7 är en oändlig loop som kommer att köra koden i raderna 8–16 för alltid.

På rad 8, get_temperature () metoden används för att läsa temperaturdata (i grader Celsius) från fuktsensorn på Sense Hat. I rad 9 konverteras temperaturdata från grader Celsius till grader Fahrenheit. På rad 10, get_pressure () metoden används för att läsa lufttrycksdata (i millibar) från trycksensorn på Sense Hat. På rad 11, get_humidity () metoden används för att läsa av luftfuktighetsdata (i %) från fuktsensorn på Sense Hat.

Rad 13–15 används för att skriva ut sensordata till konsolen och rad 16 används för att vänta i 5 sekunder innan sensordata läses igen.

Du kan köra read_sensor_data.py Python -skript enligt följande:

$ python3 read_sensor_data.py

När skriptet körs kommer sensordata att skrivas ut till konsolen.

Nu när vi kan läsa sensordata från Sense Hat, tryck på + C för att stoppa programmet.

Skapa en väderstation webbapp

I det här avsnittet kommer vi att visa dig hur du använder Python Flask -webbramen för att skapa ett väder -API och ett väderprogram. Väderprogrammet kommer åt väderdata -API: et och visar väderdata i realtid. All kod som diskuteras i detta avsnitt är tillgänglig på GitHub på shovon8 / hallon-pi-sense-hatt-väder-app .

Skapa först en server.py Python -skript i projektkatalogen enligt följande:

$ nano server.py

Ange följande kod i server.py Python -fil.

frånflaskaimporteraFlaska
frånflaskaimporterajsonify
frånflaskaimporterarender_template
frånflaskaimporteraurl_for
frånsense_hatimporteraSenseHat
app=Flaska(__namn__)
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0
känsla=SenseHat()
känsla.klar()
medapp.test_request_context():
url_for('statisk',filnamn='style.css')
url_for('statisk',filnamn='app.js')
@app.rutt('/brand')
defbrand():
tempC=känsla.get_temperature()
tempF=tempC *(9/5)+32
tryck=känsla.get_pressure()
tryckPsi=tryck *0,0145038
tryckP=tryck *100
fuktighet=känsla.få_fuktighet()

lämna tillbakajsonify({
'temperatur':{ 'C': tempC, 'F': tempF},
'tryck':{ 'mb': tryck, 'hPa': tryck,
'psi': tryckPsi, 'P': tryckP},
'fuktighet': luftfuktighet
})
@app.rutt('/')
defHem():
lämna tillbakarender_template('./home.html')

Tryck sedan på + X följd av OCH och för att spara server.py Python -skript.

I koden ovan importerar raderna 1–5 alla nödvändiga bibliotek, rad 7 skapar en Flask -app, rad 11 skapar ett SenseHat -objekt och rad 12 stänger av alla lysdioder på Sense Hat. Rad 8 inaktiverar webbcachning för Flask -appen. Eftersom den här appen är lätt behöver du inte cacha. Om du vill ändra appen gör det mycket enklare att testa om du har inaktiverat webbcachning.

Linjerna 18–31 läser sensordata från Sense Hat och returnerar API -data i JSON -format på HTTP GET -begäran i /brand slutpunkten för webbservern. Rad 37–39 returnerar väderwebbappens hemsida på / slutpunkten för webbservern. Hemsidan återges från home.html filen, som ska finnas i mallar/ projektkatalogens katalog.

Linjerna 14–16 används för att ge åtkomst till style.css och app.js statiska filer. Dessa filer ska finnas i statisk/ projektkatalogens katalog. De style.css filen används för att formatera home.html hemsida och app.js filen används för att begära API -data från /brand slutpunkt och uppdatera väderdata på home.html sida var 5: e sekund.

Skapa statisk/ och mallar/ katalog i projektkatalogen enligt följande:

$ mkdir -v {statisk, mallar}

Skapa en home.html filen i mallar/ katalog enligt följande:

$ nano -mallar/home.html

Ange följande kod i home.html fil.


< html >
< huvud >
< meta namn='viewport' innehåll='width = device-width, initial-scale = 1.0'>
< titel >Raspberry Pi Väderstation</ titel >
< länk rel='formatmall' typ='text/css'
href='{{url_for (' static ', filnamn =' style.css ')}}'/>
</ huvud >
< kropp >
< div id='innehåll'>
< h1 >Raspberry Pi Väderstation</ h1 >

< div klass='datainnehåll'>
< h2 >Temperatur</ h2 >
< div klass='data-rad'>
< div klass='datacell' id='tempC'>
...
</ div >
< div klass='datacell' id='tempF'>
...
</ div >
</ div >
</ div >

< div klass='datainnehåll'>
< h2 >Tryck</ h2 >
< div klass='data-rad'>
< div klass='datacell' id='tryckMb'>
...
</ div >
< div klass='datacell' id='pressPsi'>
...
</ div >
</ div >
< div klass='data-rad'>
< div klass='datacell' id='tryckHpa'>
...
</ div >
< div klass='datacell' id='tryckP'>
...
</ div >
</ div >
</ div >

< div klass='datainnehåll'>
< h2 >Fuktighet</ h2 >
< div klass='data-rad'>
< div klass='datacell' id='fuktighet'>
...
</ div >
</ div >
</ div >
</ div >

< manus typ='text/javascript' src='{{url_for (' static ', filnamn =' app.js ')}}'></ manus >
</ kropp >
</ html >

Tryck sedan på + X följd av OCH och för att spara home.html fil.

Skapa en style.css filen i statisk/ katalog enligt följande:

$ nano static/style.css

Ange följande koder i style.css fil.

@importera url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
* {
stoppning: 0;
marginal: 0;
typsnittsfamilj: 'Robot', sans serif;
}
kropp{
bakgrund: # 737373;
}
h1{
visa: blockera;
Färg: #79DC7B;
textjustera: Centrum;
font-vikt: 400;
bakgrund: # 000;
stoppning: 0,5 em 0;
}
h2{
visa: blockera;
bakgrund: # 000;
Färg: #fff;
textjustera: Centrum;
font-vikt: 400;
textstorlek: 1em;
}
.data-innehåll {
marginal: 10px;
gräns: 2px fast svart;
gränsradie: 5px;
bakgrundsfärg: #79DC7B;
}
.data-rad {
visa:böja;
flexriktning:rad;
}
.data-cell {
bredd: 100%;
höjd: 80px;
visa:böja;
align-items: Centrum;
motivera-innehåll: Centrum;
font-vikt: djärv;
textstorlek: 1,5 em;
Färg: # 006902;
}
.data-cell:sväva {
bakgrund: # FFE891;
Färg: # AA8600;
markören: pekare;
}

Tryck sedan på + X följd av OCH och för att spara style.css fil.

Skapa en app.js filen i statisk/ katalog enligt följande:

$ nano static/app.js

Ange följande kod i app.js fil.

fönster.addEventListener('ladda',huvud);
fungerahuvud() {
fungeragetAPIData() {
varhttp= nyXMLHttpRequest();

http.onreadystatechange = fungera() {
om(detta.readyState === 4 && detta.status === 200) {
uppdatering(JSON.analysera(detta.responseText));
}
}

http.öppen('SKAFFA SIG', '/brand', Sann);
http.skicka();
}


fungerauppdatering(apiData) {
vartempC=dokumentera.getElementById('tempC');
vartempF=dokumentera.getElementById('tempF');
vartryck Mb=dokumentera.getElementById('tryckMb');
vartryckPsi=dokumentera.getElementById('pressPsi');
vartryckHpa=dokumentera.getElementById('tryckHpa');
vartryckP=dokumentera.getElementById('tryckP');
varfuktighet=dokumentera.getElementById('fuktighet');

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

tryck Mb.innerHTML =parseFloat(apiData.tryck.mb).tillFast(2) + 'mb';
tryckPsi.innerHTML =parseFloat(apiData.tryck.psi).tillFast(2) + 'psi';
tryckHpa.innerHTML =parseFloat(apiData.tryck.hPa).tillFast(2) + 'hPa';
tryckP.innerHTML =parseFloat(apiData.tryck.P).tillFast(2) + 'P';

fuktighet.innerHTML =parseFloat(apiData.fuktighet).tillFast(2) + '%';
}


fungeraapp() {
fönster.setInterval(fungera() {
getAPIData();
}, 5000);
}

app();
}

Tryck sedan på + X följd av OCH och för att spara app.js fil.

Här kör rad 1 main () funktion när webbsidan laddas klart. I main () funktion, getAPIData () funktion hämtar väder -API -data med AJAX och anropar uppdatering() funktion (på rad 10) när data har hämtats. De uppdatering() funktion uppdaterar webbsidans element med API -data.

På rad 20, document.getElementById () metod används för att få referensen till webbsidans element med id tempC . Rad 28 används för att ersätta innehållet i webbsidans element som har id: t tempC med temperaturen (i Celsius) från API: et. På samma sätt ersätts innehållet i alla webbelement (rad 21–26) med sina respektive API -data.

I app() funktion, getAPIData () kallas var 5: e sekund (5000 millisekunder) för att hålla väderdatan uppdaterad i väderappen. Slutligen, på rad 46, app() funktionen körs.

För att testa webbappen, ange följande kommando:

$ FLASK_APP = server.py kolvkörning --host = 0.0.0.0

Väder -appen ska köras på port 5000 (som standard).

För att testa om Weather API fungerar, kör följande kommando:

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

Som du kan se skrivs Weather API -data ut på konsolen. Därför fungerar API: et.

Besök för att testa väderappen http: // lokal värd: 5000 från en Chromium -webbläsare. Väder -appen ska laddas i webbläsaren, men inga väderdata ska visas först.

Efter några sekunder bör väderappen hämta väderdata från API: et och visa det.

När som helst kan du trycka på + C för att stoppa webbservern.

Skapar Systemd -tjänst för Weather Web App

I det här avsnittet visar vi dig hur du skapar en systemd servicefil för väderappen så att den automatiskt startar vid uppstart.

Skapa först en väderstation.service fil i din projektkatalog enligt följande:

$ nano väderstation. service

Ange följande kodrader i väderstation.service fil.

[Enhet]
Beskrivning = Raspberry Pi Weather Station webbapp med Raspberry Pi Sense Hat
Efter = network.target

[Service]
WorkingDirectory =/home/pi/work
Miljö = FLASK_APP = server.py
Miljö = FLASK_ENV = produktion
ExecStart =/usr/bin/flask run --host = 0.0.0.0
StandardOutput = ärva
StandardError = ärva
Starta om = alltid
Användare = pi

[Installera]
WantedBy = multi-user.target

Tryck sedan på + X följd av OCH och för att spara väderstation.service fil.

Kopiera väderstation.service filen till /etc/systemd/system/ katalog med följande kommando:

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

Ladda om systemd -demonerna för att ändringarna ska träda i kraft enligt följande:

$ sudo systemctl daemon-reload

De väderstation systemd -tjänsten bör vara inaktiv just nu, som visas på skärmdumpen nedan.

$ sudo systemctl status weather-station.service

Starta väderstation service med följande kommando:

$ sudo systemctl start weather-station.service

Som du kan se, väderstation tjänsten körs nu.

$ sudo systemctl status weather-station.service

Nu när väderstation tjänsten fungerar, kan du lägga till den i systemstart av Raspberry Pi OS med följande kommando:

$ sudo systemctl aktivera weather-station.service

Starta om din Raspberry Pi med följande kommando:

$ sudo starta om

När dina Raspberry Pi -stövlar väl är väderstation tjänsten ska köras, som visas på skärmdumpen nedan.

$ sudo systemctl status weather-station.service

Få tillgång till väderappen från andra enheter

För att komma åt väderappen från andra enheter i ditt hemnätverk måste du veta IP -adressen till din Raspberry Pi. Du hittar IP -adressen till din Raspberry Pi 4 från webbhanteringsgränssnittet i din hemrouter. I vårt fall är IP -adressen 192.168.0.103, men den här adressen kommer att vara annorlunda för dig, så se till att ersätta den här adressen med din i alla efterföljande steg.

Om du har tillgång till Raspberry Pi -konsolen kan du också köra följande kommando för att hitta IP -adressen.

$ värdnamn -I

När du vet IP -adressen för din Raspberry Pi kan du komma åt den från vilken enhet som helst i ditt hemnätverk. Som visas på skärmdumpen nedan har vi öppnat väderappen från en Android -smartphone.

Slutsats

I den här artikeln visade vi dig hur du använder Raspberry Pi Sense Hat för att bygga en Raspberry Pi -väderstation. Vi använde sinne-hatt Python -bibliotek för att extrahera väderdata från Raspberry Pi Sense Hat. Sedan använde vi Flask Python -mikrowebramverket för att skapa ett väder -API och en webbapplikation. Webbappen får väderdata från väder -API: t var 5: e sekund för att hålla webbappen uppdaterad med de senaste väderdata.