Postavte si vlastnú meteorologickú stanicu Raspberry Pi

Build Your Own Raspberry Pi Weather Station



Raspberry Pi Sense Hat je doplnková doska, ktorú je možné použiť s jednodoskovými počítačmi Raspberry Pi. Klobúk Raspberry Pi Sense Hat má 8 × 8 LED displej a 5-tlačidlový joystick a je vybavený nasledujúcimi snímačmi:

  1. Gyroskop
  2. Akcelerometer
  3. Magnetometer
  4. Teplota
  5. Barometrický tlak
  6. Vlhkosť

V tomto článku vám ukážem, ako vytvoriť webovú aplikáciu meteorologickej stanice založenú na rozhraní Python API pomocou teplota , barometrický tlak a vlhkosť senzory klobúka Raspberry Pi Sense. Ak chcete pokračovať v tomto článku, budete potrebovať nasledujúce:







  1. Raspberry Pi 3 alebo Raspberry Pi 4 so sieťovým pripojením.
  2. Modul Raspberry Pi Sense Hat.
  3. Napájací adaptér micro USB (Raspberry Pi 3) alebo USB typu C (Raspberry Pi 4).
  4. 16 GB alebo 32 GB karta microSD s OS Raspberry Pi.
  5. Notebook alebo stolný počítač na vzdialený prístup VNC alebo SSH na Raspberry Pi.

POZNÁMKA: V tomto článku sa pripojíme k Raspberry Pi vzdialene prostredníctvom VNC alebo SSH pomocou bezhlavého nastavenia Raspberry Pi. Ak nechcete, aby ste mali k Raspberry Pi vzdialený prístup prostredníctvom SSH alebo VNC, budete k svojmu Raspberry Pi musieť pripojiť monitor, klávesnicu a myš.



Ak sa chcete dozvedieť, ako flashovať obraz Raspberry Pi OS na kartu microSD, pozrite si tému Ako nainštalovať a používať Raspberry Pi Imager. Ak potrebujete pomoc s inštaláciou systému Raspberry Pi OS na svoj Raspberry Pi, čítajte Ako nainštalovať Raspberry Pi OS na Raspberry Pi 4 . Ak potrebujete pomoc s bezhlavým nastavením Raspberry Pi, prečítajte si článok Ako nainštalovať a nakonfigurovať OS Raspberry Pi na Raspberry Pi 4 bez externého monitora.



Pripojenie Raspberry Pi Sense Hat k Raspberry Pi

Súprava Hat Sense Hat Raspberry Pi je dodávaná s prídavnou doskou Raspberry Pi Sense Hat, 40-kolíkovým konektorom typu male-to-female a niekoľkými skrutkami a rozperami.





Predtým, ako budete môcť pripojiť dosku Sense Hat k Raspberry Pi, musíte k Sense Hat pripojiť 40-kolíkovú hlavičku. Pripojte mužské kolíky 40-kolíkovej hlavičky muža a ženy k klobúku Sense, ako je znázornené na obrázkoch nižšie.



Jednodeskové počítače Raspberry Pi majú 4 otvory, ktoré je možné použiť na pripevnenie prídavných dosiek alebo puzdra. Ak chcete pripevniť prídavnú dosku, zasuňte skrutky zo zadnej strany Raspberry Pi, ako je znázornené na obrázkoch nižšie.

Potom k skrutke pripojte rozperu.

Akonáhle pridáte všetky štyri skrutky a rozpery, váš Raspberry Pi by mal vyzerať ako na obrázku nižšie.

Pripojte klobúk Raspberry Pi Sense k 40-kolíkovému GPIO konektoru male pre Raspberry Pi, ako je znázornené na obrázkoch nižšie.

POZNÁMKA: Buďte opatrní pri odpájaní klobúka Raspberry Pi Sense od 40-kolíkového konektora GPIO Raspberry Pi, aby ste sa vyhli ohnutiu kolíkov Raspberry Pi GPIO.

Pomocou štyroch zostávajúcich skrutiek pripevnite klobúk Raspberry Pi Sense, ako je znázornené na obrázkoch nižšie.

Napájanie na Raspberry Pi

Teraz, keď je Raspberry Pi Sense Hat pripojený k Raspberry Pi, vložte kartu microSD s OS Raspberry Pi do slotu pre microSD kartu v Raspberry Pi, pripojte napájací kábel k Raspberry Pi a zapnite ju.

Inštalácia knižnice Python Raspberry Pi Sense Hat

Ak chcete použiť čiapku Raspberry Pi Sense Hat na Raspberry Pi, zmyselný klobúk Knižnica Python musí byť nainštalovaná v systéme Raspberry Pi. The zmyselný klobúk knižnica je k dispozícii v oficiálnom úložisku balíkov systému Raspberry Pi OS.

Ak chcete nainštalovať Raspberry Pi zmyselný klobúk Knižnica Python v systéme Raspberry Pi najskôr aktualizujte vyrovnávaciu pamäť úložiska balíkov APT pomocou nasledujúceho príkazu:

$ sudo apt aktualizácia

Potom spustite nasledujúci príkaz:

$ sudo apt install sense -hat -y

Inštalácia knižnice Python Micro Web Framework Flask Micro Web Framework

Na vytvorenie našej aplikácie pre počasie použijeme rámec Flask Python. Flask môžete nainštalovať z oficiálneho archívu balíkov systému Raspberry Pi OS pomocou nasledujúceho príkazu:

$ sudo apt install python3 -flask -y

Vytvorenie adresára projektu

Na usporiadanie súborov projektu je vhodné vytvoriť adresár projektu. Na vytvorenie adresára projektu ~/práca , použite nasledujúci príkaz:

$ mkdir ~/práca

Po vytvorení adresára projektu prejdite do adresára projektu nasledovne:

$ cd ~/práca

Testovanie klobúka Raspberry Pi Sense

Aby sme otestovali, či Hat Raspberry Pi Sense funguje, môžeme napísať jednoduchý testovací skript Python. Môžete vytvoriť nový skript Pythonu s názvom test.py s nano textový editor nasledovne:

$ nano test.py

Do poľa test.py súbor. Riadok 1 dovoz SenseHat z sense_hat modul, riadok 3 vytvára a SenseHat objekt a uloží referenciu do súboru zmysel premenné a riadky 5–6 nastavia farbu všetkých 8 × 8 LED na červenú. Keď skončíte, stlačte + X nasledovaný A a .

Môžete spustiť test.py Skript Python s nasledujúcim príkazom:

$ python3 test.py

Matica LED 8 × 8 by mala svietiť červenou farbou, ako je znázornené na obrázku nižšie.

Ak chcete vypnúť LED diódy Sense Hat, spustite jasný() metóda bez akejkoľvek hodnoty farby v test.py Skript Python, ako je znázornené na obrázku nižšie, a spustite súbor test.py Opäť skript v Pythone.

LED diódy snímacieho klobúka by mali byť teraz vypnuté, ako je znázornené na obrázku nižšie.

Ak Sense Hat funguje správne, prejdite na ďalšiu časť.

Získanie údajov o počasí zo servera Sense Hat

Údaje o senzoroch zo Sense Hat môžete veľmi ľahko získať pomocou zmyselný klobúk Knižnica Python. Na načítanie údajov senzorov zo Sense Hat môžete vytvoriť nový skript Python read_sensor_data.py nasledovne:

$ nano read_sensor_data.py

Do poľa read_sensor_data.py Súbor Python.

odsense_hatimportSenseHat
od čas importspať
zmysel=SenseHat()
zmysel.jasný()
kým Pravda:
tempC=zmysel.get_temperature()
teplotaF=tempC *(9/5)+32
tlak=zmysel.dostať_tlak()
vlhkosť=zmysel.get_humidity()

vytlačiť(„Teplota: %.2f ° C/ %. 2f ° F n'%(tempC,teplotaF))
vytlačiť('Tlak: %.2f mb n'%(tlak))
vytlačiť(„Vlhkosť:%.2f %% n n'%(vlhkosť))
spať(5)

Keď skončíte, stlačte + X nasledovaný A a .

Vo vyššie uvedenom kóde riadky 1 a 2 importujú všetky požadované knižnice, riadok 4 vytvorí a SenseHat objekt a riadok 5 vypne všetky LED diódy Sense Hat pomocou jasný() metóda. Cyklus while v riadku 7 je nekonečná slučka, ktorá bude navždy spúšťať kód v riadkoch 8–16.

V riadku 8 sa get_temperature () metóda sa používa na čítanie údajov o teplote (v stupňoch Celzia) zo snímača vlhkosti snímača Sense Hat. V riadku 9 sa údaje o teplote prevedú zo stupňov Celzia na stupne Fahrenheita. V riadku 10 sa get_pressure () metóda sa používa na čítanie údajov o tlaku vzduchu (v milibaroch) zo senzora tlaku senzačného klobúka. V riadku 11 sa get_humidity () metóda sa používa na čítanie údajov o vlhkosti (v %) zo snímača vlhkosti snímacieho klobúka.

Riadky 13–15 sa používajú na tlač údajov senzora do konzoly a riadok 16 slúži na počkanie 5 sekúnd, kým sa údaje senzora znova prečítajú.

Môžete spustiť read_sensor_data.py Skript Python takto:

$ python3 read_sensor_data.py

Po spustení skriptu sa údaje zo senzora vytlačia do konzoly.

Teraz, keď môžeme čítať údaje senzorov zo snímača Sense Hat, stlačte + C. na zastavenie programu.

Vytvorenie webovej aplikácie meteorologickej stanice

V tejto časti vám ukážeme, ako použiť webový rámec Python Flask na vytvorenie API pre počasie a aplikácie pre počasie. Aplikácia počasia bude mať prístup k API pre údaje o počasí a bude zobrazovať údaje o počasí v reálnom čase. Všetok kód diskutovaný v tejto časti je k dispozícii na GitHub na shovon8 / malina-pi-sense-hat-počasie-app .

Najprv vytvorte a server.py Skript Python v adresári projektu takto:

$ nano server.py

Do poľa server.py Súbor Python.

odfľašaimportBanka
odfľašaimportjsonify
odfľašaimportrender_template
odfľašaimporturl_for
odsense_hatimportSenseHat
aplikácia=Banka(__názov__)
aplikáciakonfigur['SEND_FILE_MAX_AGE_DEFAULT'] = 0
zmysel=SenseHat()
zmysel.jasný()
saplikáciatest_request_context():
url_for(„statický“,názov súboru='style.css')
url_for(„statický“,názov súboru='app.js')
@aplikáciatrasa('/oheň')
defoheň():
tempC=zmysel.get_temperature()
teplotaF=tempC *(9/5)+32
tlak=zmysel.dostať_tlak()
tlakPsi=tlak *0,0145038
tlak P.=tlak *100
vlhkosť=zmysel.get_humidity()

vrátiť sajsonify({
'teplota':{ 'C': tempC, 'F': tempF},
'tlak':{ 'mb': tlak, 'hPa': tlak,
'psi': tlakPsi, 'P': tlak P.},
„vlhkosť“: vlhkosť
})
@aplikáciatrasa('/')
defDomov():
vrátiť sarender_template('./home.html')

Potom stlačte + X nasledovaný A a zachrániť server.py Skript Python.

Vo vyššie uvedenom kóde riadky 1–5 importujú všetky požadované knižnice, riadok 7 vytvorí aplikáciu Flask, riadok 11 vytvorí objekt SenseHat a riadok 12 vypne všetky LED diódy Sense Hat. Riadok 8 deaktivuje webové ukladanie do vyrovnávacej pamäte pre aplikáciu Flask. Pretože je táto aplikácia ľahká, nie je potrebné ukladať do vyrovnávacej pamäte. Ak chcete aplikáciu upraviť, potom, čo je zakázané ukladanie do vyrovnávacej pamäte webu, bude testovanie oveľa jednoduchšie.

Riadky 18 - 31 čítajú údaje senzorov zo Sense Hat a vracajú údaje API vo formáte JSON na požiadavku HTTP GET v /oheň koncový bod webového servera. Riadky 37–39 vracajú domovskú stránku webovej aplikácie o počasí na stránku / koncový bod webového servera. Domovská stránka je vykreslená z home.html súbor, ktorý by mal byť v súbore šablóny/ adresár adresára projektu.

Riadky 14–16 slúžia na umožnenie prístupu k style.css a app.js statické súbory. Tieto súbory by mali byť vo formáte statický/ adresár adresára projektu. The style.css súbor sa používa na úpravu štýlu súboru home.html domovskú stránku a app.js súbor sa používa na vyžiadanie údajov API z /oheň koncový bod a aktualizovať údaje o počasí na home.html stránku každých 5 sekúnd.

Vytvorte súbor statický/ a šablóny/ adresár v adresári projektu takto:

$ mkdir -v {static, templates}

Vytvor home.html súbor v súbore šablóny/ adresár takto:

$ nano šablóny/home.html

Do poľa home.html súbor.


< html >
< hlava >
< meta názov='výrez' obsah='width = device-width, initial-scale = 1.0'>
< titul >Meteorologická stanica Raspberry Pi</ titul >
< odkaz rel=„šablóna štýlov“ typ='text/css'
href='{{url_for (' static ', filename =' style.css ')}}'/>
</ hlava >
< telo >
< div id='obsah'>
< h1 >Meteorologická stanica Raspberry Pi</ h1 >

< div trieda='data-content'>
< h2 >Teplota</ h2 >
< div trieda='rad údajov'>
< div trieda=„dátová bunka“ id='tempC'>
...
</ div >
< div trieda=„dátová bunka“ id='tempF'>
...
</ div >
</ div >
</ div >

< div trieda='data-content'>
< h2 >Tlak</ h2 >
< div trieda='rad údajov'>
< div trieda=„dátová bunka“ id='pressureMb'>
...
</ div >
< div trieda=„dátová bunka“ id='pressurePsi'>
...
</ div >
</ div >
< div trieda='rad údajov'>
< div trieda=„dátová bunka“ id='pressureHpa'>
...
</ div >
< div trieda=„dátová bunka“ id=„tlak P“>
...
</ div >
</ div >
</ div >

< div trieda='data-content'>
< h2 >Vlhkosť</ h2 >
< div trieda='rad údajov'>
< div trieda=„dátová bunka“ id=„vlhkosť“>
...
</ div >
</ div >
</ div >
</ div >

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

Potom stlačte + X nasledovaný A a zachrániť home.html súbor.

Vytvor style.css súbor v súbore statický/ adresár takto:

$ nano static/style.css

Do poľa zadajte nasledujúce kódy style.css súbor.

@import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
* {
vypchávka: 0;
marža: 0;
font-rodina: 'Robot', bezpatkový;
}
telo{
pozadie: # 737373;
}
h1{
displej: blok;
farba: #79DC7B;
zarovnanie textu: centrum;
hmotnosť písma: 400;
pozadie: # 000;
vypchávka: 0,5 em 0;
}
h2{
displej: blok;
pozadie: # 000;
farba: #fff;
zarovnanie textu: centrum;
hmotnosť písma: 400;
veľkosť písma: 1em;
}
.data-obsah {
marža: 10 pixelov;
hranica: 2px pevný čierna;
polomer hranice: 5 pixelov;
farba pozadia: #79DC7B;
}
.data-riadok {
displej:flex;
flex-direction:riadok;
}
.údajová bunka {
šírka: 100%;
výška: 80 pixlov;
displej:flex;
zarovnávacie položky: centrum;
ospravedlniť-obsah: centrum;
hmotnosť písma: odvážny;
veľkosť písma: 1,5 em;
farba: # 006902;
}
.údajová bunka:vznášať sa {
pozadie: # FFE891;
farba: # AA8600;
kurzor: ukazovateľ;
}

Potom stlačte + X nasledovaný A a zachrániť style.css súbor.

Vytvorte súbor app.js súbor v súbore statický/ adresár takto:

$ nano static/app.js

Do poľa app.js súbor.

okno.addEventListener('naložiť',Hlavná);
funkciuHlavná() {
funkciugetAPIData() {
kdehttp= NovýXMLHttpRequest();

http.onreadystatechange = funkciu() {
keby(toto.readyState === 4 && toto.postavenie === 200) {
aktualizovať(JSON.analyzovať(toto.responseText));
}
}

http.otvorené(„ZÍSKAŤ“, '/oheň', pravda);
http.poslať();
}


funkciuaktualizovať(apiData) {
kdetempC=dokument.getElementById('tempC');
kdeteplotaF=dokument.getElementById('tempF');
kdetlak Mb=dokument.getElementById('pressureMb');
kdetlakPsi=dokument.getElementById('pressurePsi');
kdetlakHpa=dokument.getElementById('pressureHpa');
kdetlak P.=dokument.getElementById(„tlak P“);
kdevlhkosť=dokument.getElementById(„vlhkosť“);

tempC.vnútorné HTML =parseFloat(apiData.teplota.C.).toFixed(2) + '° C';
teplotaF.vnútorné HTML =parseFloat(apiData.teplota.F).toFixed(2) + '° F';

tlak Mb.vnútorné HTML =parseFloat(apiData.tlak.mb).toFixed(2) + 'mb';
tlakPsi.vnútorné HTML =parseFloat(apiData.tlak.psi).toFixed(2) + 'psi';
tlakHpa.vnútorné HTML =parseFloat(apiData.tlak.hPa).toFixed(2) + 'hPa';
tlak P.vnútorné HTML =parseFloat(apiData.tlak.P).toFixed(2) + 'P';

vlhkosť.vnútorné HTML =parseFloat(apiData.vlhkosť).toFixed(2) + '%';
}


funkciuaplikácia() {
okno.setInterval(funkciu() {
getAPIData();
}, 5 000);
}

aplikácia();
}

Potom stlačte + X nasledovaný A a zachrániť app.js súbor.

Tu riadok 1 prevádzkuje Hlavná() funkciu, keď sa webová stránka dokončí načítanie. V Hlavná() funkcia, getAPIData () funkcia načítava údaje API počasia pomocou AJAX a volá aktualizovať () funkciu (v riadku 10) po úspešnom načítaní údajov. The aktualizovať () funkcia aktualizuje prvok webovej stránky pomocou údajov API.

V riadku 20 sa document.getElementById () metóda sa používa na získanie referencie na prvok webovej stránky s id tempC . Riadok 28 slúži na nahradenie obsahu prvku webovej stránky s id tempC s teplotou (v stupňoch Celzia) z API. Rovnakým spôsobom sa obsah všetkých webových prvkov (riadky 21 - 26) nahradí ich príslušnými údajmi API.

V aplikácia () funkcia, getAPIData () sa nazýva každých 5 sekúnd (5 000 milisekúnd), aby boli údaje o počasí v aplikácii o počasí aktuálne. Nakoniec, v riadku 46, aplikácia () funkcia je vykonaná.

Ak chcete webovú aplikáciu otestovať, zadajte nasledujúci príkaz:

$ FLASK_APP = spustenie banky server.py --host = 0.0.0.0

Aplikácia pre počasie by mala bežať na porte 5000 (predvolene).

Ak chcete otestovať, či Weather API funguje, spustite nasledujúci príkaz:

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

Ako vidíte, údaje rozhrania Weather API sa tlačia do konzoly. Preto API funguje.

Ak chcete otestovať aplikáciu Weather, navštívte http: // localhost: 5000 z webového prehliadača Chromium. Aplikácia Počasie by mala byť načítaná do webového prehliadača, ale najskôr by sa nemali zobrazovať žiadne údaje o počasí.

Po niekoľkých sekundách by aplikácia pre počasie mala dokončiť načítanie údajov o počasí z rozhrania API a zobraziť ich.

V ktoromkoľvek bode môžete stlačiť + C. zastaviť webový server.

Vytvorenie služby Systemd pre webovú aplikáciu Weather

V tejto sekcii vám ukážeme, ako vytvoriť súbor služby systemd pre aplikáciu počasie tak, aby sa automaticky spustil po zavedení.

Najprv vytvorte a meteorologická stanica.služba uložte do adresára projektu nasledovne:

$ nano meteorologická stanica. služba

Zadajte nasledujúce riadky kódu do súboru meteorologická stanica.služba súbor.

[Jednotka]
Popis = Webová aplikácia pre meteorologickú stanicu Raspberry Pi využívajúca klobúk Raspberry Pi Sense
After = network.target

[Služba]
WorkingDirectory =/home/pi/work
Prostredie = FLASK_APP = server.py
Prostredie = FLASK_ENV = výroba
ExecStart =/usr/bin/flask run --host = 0,0.0.0
StandardOutput = dediť
StandardError = dediť
Reštartovať = vždy
Používateľ = pi

[Inštalácia]
WantedBy = multi-user.target

Potom stlačte + X nasledovaný A a zachrániť meteorologická stanica.služba súbor.

Skopírujte súbor meteorologická stanica.služba súbor do /etc/systemd/system/ adresár s nasledujúcim príkazom:

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

Znova načítajte démonov systemd, aby sa zmeny prejavili nasledovne:

$ sudo systemctl daemon-reload

The meteorologická stanica služba systemd by mala byť v súčasnej dobe neaktívna, ako je znázornené na obrázku nižšie.

$ sudo systemctl status weather-station.service

Spustite meteorologická stanica službu s nasledujúcim príkazom:

$ sudo systemctl start weather-station.service

Ako vidíte, meteorologická stanica služba je teraz spustená.

$ sudo systemctl status weather-station.service

Teraz, keď meteorologická stanica služba funguje, môžete ju pridať k spusteniu systému Raspberry Pi OS pomocou nasledujúceho príkazu:

$ sudo systemctl povoliť službu weather-station.service

Reštartujte svoj Raspberry Pi pomocou nasledujúceho príkazu:

$ sudo reštart

Akonáhle sa váš Raspberry Pi spustí, meteorologická stanica služba by mala byť spustená, ako je znázornené na obrázku nižšie.

$ sudo systemctl status weather-station.service

Prístup k aplikácii Weather z iných zariadení

Na prístup k aplikácii o počasí z iných zariadení vo vašej domácej sieti potrebujete poznať IP adresu vášho Raspberry Pi. IP adresu vášho Raspberry Pi 4 môžete nájsť z rozhrania webovej správy vášho domáceho routera. V našom prípade je adresa IP 192.168.0.103, ale táto adresa bude pre vás odlišná, preto vo všetkých nasledujúcich krokoch túto adresu nahraďte svojou.

Ak máte prístup ku konzole Raspberry Pi, môžete spustiť nasledujúci príkaz a nájsť adresu IP.

$ hostname -I

Keď poznáte IP adresu vášho Raspberry Pi, môžete k nemu získať prístup z akéhokoľvek zariadenia vo vašej domácej sieti. Ako je znázornené na obrázku nižšie, k aplikácii o počasí sme sa dostali zo smartfónu s Androidom.

Záver

V tomto článku sme vám ukázali, ako pomocou klobúka Raspberry Pi Sense Hat postaviť meteorologickú stanicu Raspberry Pi. Použili sme zmyselný klobúk Knižnica Python na extrahovanie údajov o počasí z klobúka Raspberry Pi Sense Hat. Potom sme použili mikro webový rámec Flask Python na vytvorenie API pre počasie a webovej aplikácie. Webová aplikácia získava údaje o počasí z API pre počasie každých 5 sekúnd, aby bola webová aplikácia aktuálna s najnovšími údajmi o počasí.