Építse meg saját Raspberry Pi meteorológiai állomását

Build Your Own Raspberry Pi Weather Station



A Raspberry Pi Sense Hat egy kiegészítő fedélzet, amely Raspberry Pi egytábla számítógépekkel használható. A Raspberry Pi Sense Hat 8 × 8 LED-es kijelzővel és 5 gombos joystickkal rendelkezik, és a következő érzékelőkkel van felszerelve:

  1. Giroszkóp
  2. Gyorsulásmérő
  3. Magnetométer
  4. Hőfok
  5. Légköri nyomás
  6. páratartalom

Ebben a cikkben megmutatom, hogyan hozhat létre Python API alapú meteorológiai állomás webalkalmazást a hőfok , légköri nyomás , és páratartalom a Raspberry Pi Sense Hat érzékelői. A cikk folytatásához a következőkre lesz szüksége:







  1. Raspberry Pi 3 vagy Raspberry Pi 4 hálózati kapcsolattal.
  2. Egy Raspberry Pi Sense Hat modul.
  3. Egy mikro-USB (Raspberry Pi 3) vagy C típusú USB (Raspberry Pi 4) hálózati adapter.
  4. 16 GB vagy 32 GB -os microSD kártya Raspberry Pi operációs rendszerrel.
  5. Laptop vagy asztali számítógép VNC távoli asztali hozzáféréshez vagy SSH -hozzáféréshez a Raspberry Pi -hez.

JEGYZET: Ebben a cikkben távolról csatlakozunk a Raspberry Pi -hez VNC vagy SSH segítségével, a Raspberry Pi fej nélküli beállításával. Ha nem szeretné SSL -en vagy VNC -n keresztül távolról elérni Raspberry Pi -jét, csatlakoztatnia kell egy monitort, egy billentyűzetet és egy egeret a Raspberry Pi -hez.



Ha szeretné megtudni, hogyan kell a Raspberry Pi OS képét microSD -kártyára villanni, olvassa el a Raspberry Pi Imager telepítése és használata című részt. Ha segítségre van szüksége a Raspberry Pi operációs rendszer Raspberry Pi -re történő telepítéséhez, olvassa el A Raspberry Pi OS telepítése a Raspberry Pi 4 -re . Ha segítségre van szüksége a Raspberry Pi fej nélküli beállításához, nézze meg a Raspberry Pi OS telepítése és konfigurálása Raspberry Pi 4 külső monitor nélkül című témakört.



A Raspberry Pi Sense Hat csatlakoztatása a Raspberry Pi -hez

A Raspberry Pi Sense Hat készlethez tartozik a Raspberry Pi Sense Hat kiegészítő fedélzet, egy 40 tűs férfi-női fejrész, valamint néhány csavar és távtartó.





Mielőtt csatlakoztathatja a Sense Hat táblát a Raspberry Pi-hez, csatlakoztatnia kell a 40-tűs fejlécet a Sense Hat-hoz. Csatlakoztassa a 40 tűs férfi-női fejléc dugóit az érzékkalaphoz az alábbi képek szerint.



A Raspberry Pi egylapos számítógépek 4 lyukkal rendelkeznek, amelyek segítségével kiegészítő táblákat vagy tokot rögzíthetnek. A kiegészítő panel rögzítéséhez helyezze be a csavarokat a Raspberry Pi hátuljából, az alábbi képek szerint.

Ezután csatlakoztasson egy távtartót a csavarhoz.

Miután hozzáadta mind a négy csavart és távtartót, a Raspberry Pi -nek úgy kell kinéznie, mint az alábbi képen.

Csatlakoztassa a Raspberry Pi Sense kalapot a Raspberry Pi 40 tűs GPIO dugójához, az alábbi képek szerint.

JEGYZET: Legyen óvatos, miközben leválasztja a Raspberry Pi Sense sapkát a Raspberry Pi 40 tűs GPIO fejlécéről, nehogy meghajlítsa a Raspberry Pi GPIO csapjait.

A fennmaradó négy csavarral rögzítse a Raspberry Pi Sense sapkát az alábbi képek szerint.

A Raspberry Pi bekapcsolása

Most, hogy a Raspberry Pi Sense Hat csatlakozik a Raspberry Pi -hez, helyezze be a Raspberry Pi OS -t tartalmazó microSD -kártyát a Raspberry Pi microSD -kártyanyílásába, csatlakoztassa a tápkábelt a Raspberry Pi -hez, majd kapcsolja be.

A Raspberry Pi Sense Hat Python Library telepítése

A Raspberry Pi Sense Hat használatához a Raspberry Pi -n a érzék-kalap A Python könyvtárat telepíteni kell a Raspberry Pi operációs rendszerre. Az érzék-kalap könyvtár elérhető a Raspberry Pi OS hivatalos csomagtárában.

A Raspberry Pi telepítéséhez érzék-kalap Python könyvtár a Raspberry Pi operációs rendszeren, először frissítse az APT csomagtár tár gyorsítótárát a következő paranccsal:

$ sudo apt frissítés

Ezután futtassa a következő parancsot:

$ sudo apt install sense -hat -y

A Flask Micro Web Framework Python Library telepítése

Időjárási alkalmazásunk elkészítéséhez a Flask Python keretrendszert fogjuk használni. A Flask telepíthető a Raspberry Pi OS hivatalos csomagtárából a következő paranccsal:

$ sudo apt install python3 -flask -y

Projektkönyvtár létrehozása

Jó ötlet létrehozni egy projektkönyvtárat a projektfájlok rendszerezéséhez. Projektkönyvtár létrehozása ~/munka , használja a következő parancsot:

$ mkdir ~/munka

A projektkönyvtár létrehozása után navigáljon a projektkönyvtárhoz az alábbiak szerint:

$ cd ~/munka

A Raspberry Pi Sense sapka tesztelése

Annak tesztelésére, hogy a Raspberry Pi Sense Hat működik -e, írhatunk egy egyszerű teszt Python szkriptet. Létrehozhat egy új Python parancsfájlt teszt.py a ... val nano szövegszerkesztő az alábbiak szerint:

$ nano test.py

Írja be a következő kódot a teszt.py fájlt. 1. sor importja SenseHat tól sense_hat modul, a 3. sor létrehozza a SenseHat objektumot, és tárol egy hivatkozást a érzék változó, és az 5–6. sorok mind a 8 × 8 LED színét pirosra állítják. Ha végzett, nyomja meg a gombot + x követi ÉS és .

Futtathatja a teszt.py Python szkript a következő paranccsal:

$ python3 test.py

A 8 × 8 LED mátrixnak vörös színben kell világítania, ahogy az alábbi képen látható.

A Sense Hat LED -jeinek kikapcsolásához futtassa a egyértelmű() módszert, ahol nincs színérték teszt.py Python szkriptet, amint az az alábbi képernyőképen látható, és futtassa a teszt.py Ismét Python -szkript.

A Sense Hat LED -jeit most ki kell kapcsolni, ahogy az alábbi képen látható.

Ha az érzékkalap megfelelően működik, akkor lépjen tovább a következő szakaszra.

Időjárási adatok lekérése a Sense Hat -tól

Az érzékelőadatokat a Sense Hat segítségével nagyon egyszerűen szerezheti be a érzék-kalap Python könyvtár. Az érzékelőadatok lekéréséhez a Sense Hat -ból létrehozhat egy új Python -szkriptet read_sensor_data.py alábbiak szerint:

$ nano read_sensor_data.py

Írja be a következő kódot a read_sensor_data.py Python fájl.

tól tőlsense_hatimportSenseHat
tól től idő importalvás
érzék=SenseHat()
érzék.egyértelmű()
míg Igaz:
tempC=érzék.get_temperature()
tempF=tempC *(9/5)+32
nyomás=érzék.get_pressure()
páratartalom=érzék.get_humidity()

nyomtatás('Hőmérséklet: %.2f ° C/ %.2f ° F n'%(tempC,tempF))
nyomtatás('Nyomás: %.2f mb n'%(nyomás))
nyomtatás('Páratartalom:%.2f %% n n'%(páratartalom))
alvás(5)

Ha végzett, nyomja meg a gombot + x követi ÉS és .

A fenti kódban az 1. és 2. sor importálja az összes szükséges könyvtárat, a 4. sor a SenseHat objektumot, és az 5. sor kikapcsolja a Sense Hat összes LED -jét a egyértelmű() módszer. A while sor a 7. sorban egy végtelen ciklus, amely örökre futtatni fogja a kódot a 8–16.

A 8. sorban a get_temperature () módszerrel olvassuk le a hőmérsékleti adatokat (Celsius fokban) a Sense Kalap páratartalom érzékelőjéből. A 9. sorban a hőmérsékleti adatokat Celsius fokról Fahrenheit fokra konvertálják. A 10. sorban a get_pressure () módszerrel olvassuk le a légnyomásadatokat (millibárban) a Sense Kalap nyomásérzékelőjéből. A 11. sorban a get_humidity () módszerrel olvassuk le a nedvesség adatokat ( %-ban) a Sense Hat kalaptartó páratartalom érzékelőjéből.

A 13–15. Sorok az érzékelőadatok konzolra történő nyomtatására szolgálnak, a 16. sor pedig 5 másodperc várakozásra, mielőtt újra elolvassa az érzékelő adatait.

Futtathatja a read_sensor_data.py A Python szkriptje a következő:

$ python3 read_sensor_data.py

A szkript futtatása után az érzékelő adatai kinyomtatásra kerülnek a konzolra.

Most, hogy ki tudjuk olvasni az érzékelő adatait az érzékkalapból, nyomja meg a gombot + C hogy leállítsa a programot.

Weather Station webes alkalmazás létrehozása

Ebben a részben megmutatjuk, hogyan használhatja a Python Flask webes keretrendszert időjárási API és időjárási alkalmazás létrehozásához. Az időjárási alkalmazás hozzáfér az időjárási adatok API -hoz, és valós időben megjeleníti az időjárási adatokat. Az ebben a szakaszban tárgyalt összes kód elérhető a GitHub címen shovon8 / málna-pi-érzék-kalap-időjárás-app .

Először hozzon létre egy szerver.py Python -szkript a projektkönyvtárban az alábbiak szerint:

$ nano szerver.py

Írja be a következő kódot a szerver.py Python fájl.

tól tőllombikimportLombik
tól tőllombikimportjsonify
tól tőllombikimportrender_template
tól tőllombikimporturl_for
tól tőlsense_hatimportSenseHat
kb=Lombik(__név__)
kb.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0
érzék=SenseHat()
érzék.egyértelmű()
val velkb.test_request_context():
url_for('statikus',fájl név='style.css')
url_for('statikus',fájl név='app.js')
@kb.útvonal('/Tűz')
defTűz():
tempC=érzék.get_temperature()
tempF=tempC *(9/5)+32
nyomás=érzék.get_pressure()
nyomásPsi=nyomás *0,0145038
nyomás P=nyomás *100
páratartalom=érzék.get_humidity()

Visszatérésjsonify({
'hőfok':{ 'C': tempC, 'F': tempF},
'nyomás':{ 'mb': nyomás, 'hPa': nyomás,
'psi': nyomásPsi, 'P': nyomásP},
'páratartalom': páratartalom
})
@kb.útvonal('/')
defitthon():
Visszatérésrender_template('./home.html')

Ezután nyomja meg a gombot + x követi ÉS és hogy megmentse a szerver.py Python szkript.

A fenti kódban az 1–5. Sor importálja az összes szükséges könyvtárat, a 7. sor egy Flask alkalmazást hoz létre, a 11. sor egy SenseHat objektumot, és a 12. sor kikapcsolja a Sense Hat összes LED -jét. A 8. sor letiltja a webes gyorsítótárazást a Lombik alkalmazásnál. Mivel ez az alkalmazás könnyű, nincs szükség gyorsítótárazásra. Ha módosítani szeretné az alkalmazást, akkor a webes gyorsítótárazás letiltása jelentősen megkönnyíti a tesztelést.

A 18–31. Sorok kiolvassák az érzékelőadatokat a Sense Hat -ből, és visszaadják az API -adatokat JSON formátumban a HTTP GET kérésre a /Tűz a webszerver végpontja. A 37–39. Sorok az időjárási webes alkalmazás kezdőlapját adják vissza a / a webszerver végpontja. A kezdőlap a home.html fájlt, amely a sablonok/ projektkönyvtár könyvtárát.

A 14–16. Sorok lehetővé teszik a hozzáférést stílus.css és app.js statikus fájlokat. Ezeknek a fájloknak a statikus/ projektkönyvtár könyvtárát. Az stílus.css fájlt használják a stílus kialakításához home.html honlap, és a app.js fájl az API adatok kérésére szolgál a /Tűz végpontot, és frissítse az időjárási adatokat a home.html oldal 5 másodpercenként.

Hozza létre a statikus/ és sablonok/ könyvtár a projektkönyvtárban az alábbiak szerint:

$ mkdir -v {static, templates}

Hozzon létre egy home.html fájlt a sablonok/ könyvtár az alábbiak szerint:

$ nano sablonok/home.html

Írja be a következő kódot a home.html fájlt.


< html >
< fej >
< meta név='viewport' tartalom='szélesség = eszközszélesség, kezdeti skála = 1,0'>
< cím >Raspberry Pi meteorológiai állomás</ cím >
< link rel='stíluslap' típus='text/css'
href='{{url_for (' static ', fájlnév =' style.css ')}}'/>
</ fej >
< test >
< div id='tartalom'>
< h1 >Raspberry Pi meteorológiai állomás</ h1 >

< div osztály='adattartalom'>
< h2 >Hőfok</ h2 >
< div osztály='adatsor'>
< div osztály='adatcella' id='tempC'>
...
</ div >
< div osztály='adatcella' id='tempF'>
...
</ div >
</ div >
</ div >

< div osztály='adattartalom'>
< h2 >Nyomás</ h2 >
< div osztály='adatsor'>
< div osztály='adatcella' id='nyomásMb'>
...
</ div >
< div osztály='adatcella' id='pressurePsi'>
...
</ div >
</ div >
< div osztály='adatsor'>
< div osztály='adatcella' id='nyomásHpa'>
...
</ div >
< div osztály='adatcella' id=„nyomás P”>
...
</ div >
</ div >
</ div >

< div osztály='adattartalom'>
< h2 >páratartalom</ h2 >
< div osztály='adatsor'>
< div osztály='adatcella' id='páratartalom'>
...
</ div >
</ div >
</ div >
</ div >

< forgatókönyv típus='text/javascript' src='{{url_for (' static ', filename =' app.js ')}} ”></ forgatókönyv >
</ test >
</ html >

Ezután nyomja meg a gombot + x követi ÉS és hogy megmentse a home.html fájlt.

Hozzon létre egy stílus.css fájlt a statikus/ könyvtár az alábbiak szerint:

$ nano static/style.css

Írja be a következő kódokat a stílus.css fájlt.

@import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
* {
párnázás: 0;
árrés: 0;
betűtípus család: 'Robot', sans-serif;
}
test{
háttér: # 737373;
}
h1{
kijelző: Blokk;
szín: #79DC7B;
szöveg igazítás: központ;
font-weight: 400;
háttér: # 000;
párnázás: 0.5em 0;
}
h2{
kijelző: Blokk;
háttér: # 000;
szín: #fff;
szöveg igazítás: központ;
font-weight: 400;
betűméret: 1em;
}
.adat-tartalom {
árrés: 10 képpont;
határ: 2 képpont szilárd fekete;
határsugár: 5 képpont;
háttérszín: #79DC7B;
}
.adatsor {
kijelző:Flex;
flex-irány:sor;
}
.adatsejt {
szélesség: 100%;
magasság: 80 képpont;
kijelző:Flex;
align-items: központ;
indokol-tartalom: központ;
font-weight: bátor;
betűméret: 1.5em;
szín: # 006902;
}
.adatsejt:lebeg {
háttér: # FFE891;
szín: # AA8600;
kurzor: mutató;
}

Ezután nyomja meg a gombot + x követi ÉS és hogy megmentse a stílus.css fájlt.

Hozzon létre egy app.js fájlt a statikus/ könyvtár az alábbiak szerint:

$ nano static/app.js

Írja be a következő kódot a app.js fájlt.

ablak.addEventListener('Betöltés',fő-);
funkciófő-() {
funkciógetAPIData() {
aholhttp= újXMLHttpRequest();

http.már az államcserénél = funkció() {
ha(ez.readyState === 4 && ez.állapot === 200) {
frissítés(JSON.elemezni(ez.responseText));
}
}

http.nyisd ki('KAP', '/Tűz', igaz);
http.Küld();
}


funkciófrissítés(apiData) {
aholtempC=dokumentum.getElementById('tempC');
aholtempF=dokumentum.getElementById('tempF');
aholnyomásMb=dokumentum.getElementById('nyomásMb');
aholnyomásPsi=dokumentum.getElementById('pressurePsi');
aholnyomásHpa=dokumentum.getElementById('nyomásHpa');
aholnyomás P=dokumentum.getElementById(„nyomás P”);
aholpáratartalom=dokumentum.getElementById('páratartalom');

tempC.belsőHTML =parseFloat(apiData.hőfok.C).toFixed(2) + '° C';
tempF.belsőHTML =parseFloat(apiData.hőfok.F).toFixed(2) + '° F';

nyomásMb.belsőHTML =parseFloat(apiData.nyomás.mb).toFixed(2) + 'mb';
nyomásPsi.belsőHTML =parseFloat(apiData.nyomás.psi).toFixed(2) + 'psi';
nyomásHpa.belsőHTML =parseFloat(apiData.nyomás.hPa).toFixed(2) + 'hPa';
nyomás P.belsőHTML =parseFloat(apiData.nyomás.P).toFixed(2) + 'P';

páratartalom.belsőHTML =parseFloat(apiData.páratartalom).toFixed(2) + '%';
}


funkciókb() {
ablak.setInterval(funkció() {
getAPIData();
}, 5000);
}

kb();
}

Ezután nyomja meg a gombot + x követi ÉS és hogy megmentse a app.js fájlt.

Itt az 1. sor a fő() funkciót, amikor a weboldal betöltése befejeződött. Ban,-ben fő() funkció, a getAPIData () függvény az AJAX használatával lekéri az időjárás API adatait, és meghívja a frissítés () funkciót (a 10. sorban), miután az adatokat sikeresen lekérte. Az frissítés () függvény frissíti a weboldal elemét az API adatok segítségével.

A 20. sorban a document.getElementById () metódust használjuk arra, hogy lekérjük az azonosítójú weblap elem hivatkozását tempC . A 28. sor az azonosítóval rendelkező weboldal elem tartalmának cseréjére szolgál tempC az API -ból származó hőmérséklettel (Celsius -fokban). Ugyanígy az összes webes elem tartalmát (21–26. Sor) lecseréli a megfelelő API -adatokra.

Ban,-ben app () funkció, a getAPIData () hívja 5 másodpercenként (5000 milliszekundum), hogy az időjárási adatok naprakészek legyenek az időjárási alkalmazásban. Végül a 46. sorban a app () funkció végrehajtásra kerül.

A webalkalmazás teszteléséhez írja be a következő parancsot:

$ FLASK_APP = server.py lombik futtatása -host = 0.0.0.0

Az időjárás -alkalmazásnak az 5000 -es porton kell futnia (alapértelmezés szerint).

Az időjárási API működésének ellenőrzéséhez futtassa a következő parancsot:

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

Amint láthatja, az Weather API adatait a konzolon nyomtatja ki. Ezért az API működik.

Az Időjárás alkalmazás teszteléséhez keresse fel a következő oldalt http: // localhost: 5000 Chromium webböngészőből. Az Időjárás alkalmazást be kell tölteni a webböngészőbe, de először ne jelenjenek meg időjárási adatok.

Néhány másodperc múlva az időjárás -alkalmazásnak be kell fejeznie az időjárási adatok lekérését az API -ból, és meg kell jelenítenie azokat.

Bármikor megnyomhatja a gombot + C a webszerver leállításához.

Systemd szolgáltatás létrehozása az Weather Web App számára

Ebben a szakaszban megmutatjuk, hogyan hozhat létre rendszeres szolgáltatásfájlt az időjárás -alkalmazáshoz, hogy az automatikusan elinduljon a rendszerindításkor.

Először hozzon létre egy időjárás-állomás.szolgáltatás fájlt a projekt könyvtárában az alábbiak szerint:

$ nano weather-station.service

Írja be a következő kódsorokat a időjárás-állomás.szolgáltatás fájlt.

[Mértékegység]
Leírás = Raspberry Pi Weather Station webes alkalmazás a Raspberry Pi Sense Hat használatával
Utána = network.target

[Szolgáltatás]
WorkingDirectory =/home/pi/work
Környezet = FLASK_APP = szerver.py
Környezet = FLASK_ENV = termelés
ExecStart =/usr/bin/flask run -host = 0.0.0.0
StandardOutput = örököl
StandardError = örököl
Újraindítás = mindig
Felhasználó = pi

[Telepítés]
WantedBy = többfelhasználós.cél

Ezután nyomja meg a gombot + x követi ÉS és hogy megmentse a időjárás-állomás.szolgáltatás fájlt.

Másolja a időjárás-állomás.szolgáltatás fájlt a /etc/systemd/system/ könyvtárat a következő paranccsal:

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

Töltse be újra a rendszerdémonokat, hogy a módosítások az alábbiak szerint lépjenek érvénybe:

$ sudo systemctl démon-reload

Az meteorológiai állomás A systemd szolgáltatásnak inaktívnak kell lennie, amint az az alábbi képernyőképen látható.

$ sudo systemctl állapot weather-station.service

Indítsa el a meteorológiai állomás szolgáltatás a következő paranccsal:

$ sudo systemctl indítsa el az weather-station.service szolgáltatást

Mint látható, a meteorológiai állomás szolgáltatás most fut.

$ sudo systemctl állapot weather-station.service

Most, hogy a meteorológiai állomás szolgáltatás működik, hozzáadhatja a Raspberry Pi OS rendszerindításához a következő paranccsal:

$ sudo systemctl engedélyezi az weather-station.service szolgáltatást

Indítsa újra a Raspberry Pi -t a következő paranccsal:

$ sudo újraindítás

Miután a Raspberry Pi csizma, a meteorológiai állomás szolgáltatásnak futnia kell, amint az az alábbi képernyőképen látható.

$ sudo systemctl állapot weather-station.service

Az Időjárás alkalmazás elérése más eszközökről

Ha az otthoni hálózat más eszközeiről szeretné elérni az időjárás -alkalmazást, ismernie kell Raspberry Pi készülékének IP -címét. A Raspberry Pi 4 IP -címét megtalálhatja az otthoni útválasztó webkezelő felületéről. Esetünkben az IP -cím 192.168.0.103, de ez a cím más lesz az Ön számára, ezért minden további lépésben feltétlenül cserélje ki ezt a címet a sajátjára.

Ha hozzáfér a Raspberry Pi konzolhoz, akkor futtassa a következő parancsot az IP -cím megkereséséhez.

$ hostname -I

Ha ismeri a Raspberry Pi IP -címét, elérheti azt az otthoni hálózat bármely eszközéről. Amint az az alábbi képernyőképen is látható, egy Android okostelefonról értük el az időjárás -alkalmazást.

Következtetés

Ebben a cikkben megmutattuk, hogyan használhatja a Raspberry Pi Sense Hat kalapot Raspberry Pi időjárásállomás építéséhez. Mi használtuk a érzék-kalap Python könyvtár az időjárási adatok kinyeréséhez a Raspberry Pi Sense Hat -ből. Ezután a Flask Python mikro webes keretrendszert használtuk időjárási API és webes alkalmazás létrehozásához. A webalkalmazás 5 másodpercenként lekéri az időjárási adatokat az időjárási API -tól, hogy a webalkalmazás naprakész legyen a legújabb időjárási adatokkal.