Izgradite vlastitu meteorološku stanicu Raspberry Pi

Build Your Own Raspberry Pi Weather Station

Raspberry Pi Sense Hat dodatak je koji se može koristiti s jednokrilnim računalima Raspberry Pi. Raspberry Pi Sense Hat ima 8 × 8 LED zaslon i joystick s 5 tipki, a dolazi sa sljedećim senzorima:

  1. Žiroskop
  2. Brzinomjer
  3. Magnetometar
  4. Temperatura
  5. Tlak zraka
  6. Vlažnost

U ovom članku pokazat ću vam kako izraditi web aplikaciju meteorološke stanice temeljenu na Python API -ju pomoću temperatura , tlak zraka , i vlažnost senzori šešira Raspberry Pi Sense. Za nastavak ovog članka trebat će vam sljedeće:



  1. Raspberry Pi 3 ili Raspberry Pi 4 s mrežnim povezivanjem.
  2. Modul šešira Raspberry Pi Sense.
  3. Adapter za napajanje mikro-USB (Raspberry Pi 3) ili USB Type-C (Raspberry Pi 4).
  4. MicroSD kartica od 16 GB ili 32 GB s Raspberry Pi OS.
  5. Prijenosno ili stolno računalo za VNC pristup udaljenoj radnoj površini ili SSH pristup Raspberry Pi.

BILJEŠKA: U ovom članku povezat ćemo se na Raspberry Pi daljinski putem VNC -a ili SSH -a pomoću bezglavog postavljanja Raspberry Pi -a. Ako ne želite daljinski pristupiti svom Raspberry Pi -u putem SSH -a ili VNC -a, morat ćete spojiti monitor, tipkovnicu i miša na svoj Raspberry Pi.



Da biste saznali kako prenijeti sliku Raspberry Pi OS na microSD karticu, pogledajte Kako instalirati i koristiti Raspberry Pi Imager. Ako vam je potrebna pomoć pri instaliranju Raspberry Pi OS -a na svoj Raspberry Pi, pročitajte Kako instalirati Raspberry Pi OS na Raspberry Pi 4 . Ako vam je potrebna pomoć oko bezglavog postavljanja Raspberry Pi, provjerite Kako instalirati i konfigurirati Raspberry Pi OS na Raspberry Pi 4 bez vanjskog monitora.



Povezivanje Raspberry Pi Sense Hat s Raspberry Pi

Raspberry Pi Sense Hat komplet dolazi s dodatnom pločom Raspberry Pi Sense Hat, 40-pinskim zaglavljem muško-žensko, te nekim vijcima i odstojnicima.

Prije nego što možete pričvrstiti ploču Sense Hat na Raspberry Pi, morate spojiti 40-pinsko zaglavlje na Sense Hat. Spojite muške iglice 40-pinskog muško-ženskog zaglavlja na Sense Hat kao što je prikazano na donjim slikama.



Računari s jednom pločom Raspberry Pi imaju 4 rupe koje se mogu koristiti za pričvršćivanje dodatnih ploča ili kućišta. Za pričvršćivanje dodatne ploče umetnite vijke sa stražnje strane Raspberry Pi, kao što je prikazano na donjim slikama.

Zatim spojite odstojnik na vijak.

Nakon što dodate sva četiri vijka i odstojnike, vaš Raspberry Pi trebao bi izgledati kao što je prikazano na donjoj slici.

Spojite Raspberry Pi Sense Hat na 40-pinsko GPIO muško zaglavlje Raspberry Pi, kao što je prikazano na donjim slikama.

BILJEŠKA: Budite oprezni dok odvajate Raspberry Pi Sense Hat iz Raspberry Pi 40-pinskog GPIO zaglavlja kako biste izbjegli savijanje pinova Raspberry Pi GPIO.

S četiri preostala vijka pričvrstite Raspberry Pi Sense Hat, kao što je prikazano na donjim slikama.

Uključuje Raspberry Pi

Sada kada je Raspberry Pi Sense Hat povezan s Raspberry Pi, umetnite microSD karticu s Raspberry Pi OS -om u utor za microSD karticu na Raspberry Pi -u, spojite kabel za napajanje na Raspberry Pi i uključite ga.

Instaliranje Raspberry Pi Sense Hat Python biblioteke

Za korištenje Raspberry Pi Sense Hat na Raspberry Pi, osjetilni šešir Python knjižnica mora biti instalirana na Raspberry Pi OS. The osjetilni šešir knjižnica dostupna je u službenom spremištu paketa Raspberry Pi OS.

Za instaliranje Raspberry Pi osjetilni šešir Python knjižnica na Raspberry Pi OS -u, prvo ažurirajte predmemoriju spremišta paketa APT sljedećom naredbom:

$ sudo apt ažuriranje

Zatim pokrenite sljedeću naredbu:

$ sudo apt install sense -hat -y

Instaliranje Python biblioteke Flask Micro Web Framework

Koristit ćemo okvir Flask Python za izradu naše aplikacije za vremensku prognozu. Flask možete instalirati iz službenog spremišta paketa Raspberry Pi OS sa sljedećom naredbom:

$ sudo apt install python3 -flask -y

Stvaranje direktorija projekta

Bilo bi dobro stvoriti direktorij projekta za organiziranje datoteka projekta. Za stvaranje direktorija projekta ~/rad , upotrijebite sljedeću naredbu:

$ mkdir ~/rad

Nakon što se stvori direktorij projekta, idite do direktorija projekta na sljedeći način:

$ cd ~/rad

Testiranje šešira Raspberry Pi Sense

Kako bismo provjerili radi li Raspberry Pi Sense Hat, možemo napisati jednostavnu testnu Python skriptu. Možete stvoriti novu Python skriptu pod nazivom test.py sa nano uređivač teksta na sljedeći način:

$ nano test.py

Unesite sljedeći kôd u test.py datoteka. Linija 1 uvozi SenseHat od smisao_šas modul, redak 3 stvara a SenseHat objekt i sprema referencu u osjećaj varijabla, a linije 5–6 postavljaju boju svih 8 × 8 LED dioda u crvenu. Kada završite, pritisnite + x slijedi I i .

Možete pokrenuti test.py Python skripta sa sljedećom naredbom:

$ python3 test.py

LED matrica 8 × 8 trebala bi svijetliti crvenom bojom kao što je prikazano na donjoj slici.

Da biste isključili LED diode Sense Hat -a, pokrenite čisto() metoda bez vrijednosti boje u test.py Python skriptu, kao što je prikazano na slici ispod, i pokrenite test.py Opet Python skripta.

LED diode Sense Hat sada bi trebale biti isključene, kao što je prikazano na donjoj slici.

Ako Sense Hat radi ispravno, prijeđite na sljedeći odjeljak.

Dobivanje vremenskih podataka iz Sense Hat -a

Pomoću osjetilni šešir Python biblioteka. Da biste dohvatili podatke senzora iz Sense Hat -a, možete stvoriti novu Python skriptu read_sensor_data.py kako slijedi:

$ nano read_sensor_data.py

Unesite sljedeći kôd u read_sensor_data.py Python datoteka.

izsmisao_šasuvozSenseHat
iz vrijeme uvozspavati
osjećaj=SenseHat()
osjećaj.čisto()
dok Pravi:
tempC=osjećaj.get_temperature()
tempF=tempC *(9/5)+32
pritisak=osjećaj.dobiti_pritisak()
vlažnost=osjećaj.get_humidity()

ispisati('Temperatura: %.2f ° C/ %. 2f ° F n'%(tempC,tempF))
ispisati('Tlak: %.2f mb n'%(pritisak))
ispisati('Vlažnost:%.2f %% n n'%(vlažnost))
spavati(5)

Kada završite, pritisnite + x slijedi I i .

U gornjem kodu, retci 1 i 2 uvoze sve potrebne knjižnice, redak 4 stvara a SenseHat objekt, a redak 5 isključuje sve LED diode Sense Hat pomoću čisto() metoda. Dok petlja u retku 7 beskonačna je petlja koja će vječno pokretati kôd u retcima 8–16.

U retku 8, get_temperature () Metoda se koristi za čitanje podataka o temperaturi (u stupnjevima Celzijusa) s osjetnika vlažnosti Sense Hat. U retku 9 podaci o temperaturi pretvaraju se iz stupnjeva Celzijusa u stupnjeve Fahrenheita. U retku 10, get_pressure () metoda se koristi za čitanje podataka o tlaku zraka (u milibarima) s osjetnika tlaka Sense Hat. U retku 11, get_humidity () Metoda se koristi za čitanje podataka o vlažnosti zraka (u %) s senzora vlažnosti Sense Hat.

Redci 13–15 koriste se za ispis podataka senzora na konzolu, a redak 16 koristi se za čekanje 5 sekundi prije ponovnog čitanja podataka senzora.

Možete pokrenuti read_sensor_data.py Python skripta na sljedeći način:

$ python3 read_sensor_data.py

Nakon pokretanja skripte, podaci senzora će se ispisati na konzolu.

Sada kada možemo pročitati podatke senzora iz Sense Hat -a, pritisnite + C da biste zaustavili program.

Izrada web aplikacije vremenske postaje

U ovom odjeljku pokazat ćemo vam kako koristiti web okvir Python Flask za stvaranje vremenskog API -ja i vremenske aplikacije. Vremenska aplikacija pristupit će API -ju vremenskih podataka i prikazivati ​​vremenske podatke u stvarnom vremenu. Sav kôd o kojem se govori u ovom odjeljku dostupan je na GitHub -u na adresi shovon8 / malina-pi-sense-hat-vremenska-aplikacija .

Prvo stvorite a server.py Python skripta u direktoriju projekta na sljedeći način:

$ nano server.py

Unesite sljedeći kôd u server.py Python datoteka.

iztikvicauvozBoca
iztikvicauvozjsonify
iztikvicauvozrender_template
iztikvicauvozurl_za
izsmisao_šasuvozSenseHat
app=Boca(__Ime__)
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0
osjećaj=SenseHat()
osjećaj.čisto()
sapp.test_zahtjev_kontekst():
url_za('statički',naziv datoteke='style.css')
url_za('statički',naziv datoteke='app.js')
@app.rutu('/vatra')
defvatra():
tempC=osjećaj.get_temperature()
tempF=tempC *(9/5)+32
pritisak=osjećaj.dobiti_pritisak()
pritisakPsi=pritisak *0,0145038
pritisakP=pritisak *100
vlažnost=osjećaj.get_humidity()

povratakjsonify({
'temperatura':{ 'C': tempC, 'F': tempF},
'pritisak':{ 'mb': pritisak, 'hPa': pritisak,
'psi': pritisakPsi, 'P': pritisakP},
'vlažnost': vlaga
})
@app.rutu('/')
defDom():
povratakrender_template('./home.html')

Zatim pritisnite + x slijedi I i za spremanje server.py Python skripta.

U gornjem kodu, retci 1-5 uvoze sve potrebne knjižnice, redak 7 stvara aplikaciju Flask, redak 11 stvara objekt SenseHat, a redak 12 isključuje sve LED diode Sense Hat -a. Redak 8 onemogućuje predmemoriranje weba za aplikaciju Flask. Budući da je ova aplikacija lagana, nema potrebe za predmemoriranjem. Ako želite izmijeniti aplikaciju, onemogućivanje web cachinga uvelike će olakšati testiranje.

Redci 18–31 čitaju podatke senzora iz Sense Hat -a i vraćaju API podatke u JSON formatu na HTTP GET zahtjevu u /vatra krajnja točka web poslužitelja. Reci 37–39 vraćaju početnu stranicu web -aplikacije za vremensku prognozu na / krajnja točka web poslužitelja. Početna stranica generirana je iz dom.html datoteku, koja bi trebala biti u predlošci/ direktorij direktorija projekta.

Linije 14–16 koriste se za omogućavanje pristupa datoteci stil.css i app.js statičke datoteke. Te bi datoteke trebale biti u statički/ direktorij direktorija projekta. The stil.css datoteka se koristi za oblikovanje dom.html početnu stranicu i app.js datoteka koristi se za traženje API podataka od /vatra krajnju točku i ažurirati vremenske podatke na dom.html stranicu svakih 5 sekundi.

Kreirajte statički/ i predlošci/ direktorij u direktoriju projekta na sljedeći način:

$ mkdir -v {static, predlošci}

Stvoriti dom.html datoteku u predlošci/ imenik na sljedeći način:

$ nano predlošci/home.html

Unesite sljedeći kôd u dom.html datoteka.


< html >
< glava >
< meta Ime='okvir za prikaz' sadržaj='width = device-width, initial-scale = 1,0'>
< titula >Meteorološka stanica Raspberry Pi</ titula >
< veza rel='stilska tablica' tip='text/css'
href='{{url_for (' static ', filename =' style.css ')}}'/>
</ glava >
< tijelo >
< div iskaznica='sadržaj'>
< h1 >Meteorološka stanica Raspberry Pi</ h1 >

< div razred='data-content'>
< h2 >Temperatura</ h2 >
< div razred='podatkovni red'>
< div razred='podatkovna ćelija' iskaznica='tempC'>
...
</ div >
< div razred='podatkovna ćelija' iskaznica='tempF'>
...
</ div >
</ div >
</ div >

< div razred='data-content'>
< h2 >Pritisak</ h2 >
< div razred='podatkovni red'>
< div razred='podatkovna ćelija' iskaznica='pressureMb'>
...
</ div >
< div razred='podatkovna ćelija' iskaznica='pressurePsi'>
...
</ div >
</ div >
< div razred='podatkovni red'>
< div razred='podatkovna ćelija' iskaznica='pressureHpa'>
...
</ div >
< div razred='podatkovna ćelija' iskaznica='pressureP'>
...
</ div >
</ div >
</ div >

< div razred='data-content'>
< h2 >Vlažnost</ h2 >
< div razred='podatkovni red'>
< div razred='podatkovna ćelija' iskaznica='vlažnost'>
...
</ div >
</ div >
</ div >
</ div >

< skripta tip='tekst/javascript' src='{{url_for (' static ', filename =' app.js ')}}'></ skripta >
</ tijelo >
</ html >

Zatim pritisnite + x slijedi I i za spremanje dom.html datoteka.

Stvoriti stil.css datoteku u statički/ imenik na sljedeći način:

$ nano static/style.css

Unesite sljedeće kodove u stil.css datoteka.

@uvoz url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
* {
punjenje: 0;
margina: 0;
font-family: 'Robot', sans-serif;
}
tijelo{
pozadini: # 737373;
}
h1{
prikaz: blok;
boja: #79DC7B;
poravnati tekst: centar;
font-weight: 400;
pozadini: # 000;
punjenje: 0,5em 0;
}
h2{
prikaz: blok;
pozadini: # 000;
boja: #F F F;
poravnati tekst: centar;
font-weight: 400;
veličina fonta: 1em;
}
.podatkovni sadržaj {
margina: 10 piksela;
granica: 2 piksela čvrsta crno;
granica-radijus: 5 piksela;
boja pozadine: #79DC7B;
}
.podatkovni red {
prikaz:savijati;
flex-smjer:red;
}
.podatkovna ćelija {
širina: 100%;
visina: 80 piksela;
prikaz:savijati;
align-items: centar;
opravdati-sadržaj: centar;
font-weight: podebljano;
veličina fonta: 1,5em;
boja: # 006902;
}
.podatkovna ćelija:lebdjeti {
pozadini: # FFE891;
boja: # AA8600;
pokazivač: pokazivač;
}

Zatim pritisnite + x slijedi I i za spremanje stil.css datoteka.

Napravite app.js datoteku u statički/ imenik na sljedeći način:

$ nano static/app.js

Unesite sljedeći kôd u app.js datoteka.

prozor.addEventListener('opterećenje',glavni);
funkcijaglavni() {
funkcijagetAPIData() {
gdjehttp= noviXMLHttpRequest();

http.onreadystatechange = funkcija() {
ako(ovaj.readyState === 4 && ovaj.status === 200) {
ažuriranje(JSON.raščlaniti(ovaj.responseText));
}
}

http.otvorena('DOBITI', '/vatra', pravi);
http.poslati();
}


funkcijaažuriranje(apiData) {
gdjetempC=dokument.getElementById('tempC');
gdjetempF=dokument.getElementById('tempF');
gdjepritisakMb=dokument.getElementById('pressureMb');
gdjepritisakPsi=dokument.getElementById('pressurePsi');
gdjepritisakHpa=dokument.getElementById('pressureHpa');
gdjepritisakP=dokument.getElementById('pressureP');
gdjevlažnost=dokument.getElementById('vlažnost');

tempC.unutarnji HTML =parseFloat(apiData.temperatura.C).to Fixed(2) + '° C';
tempF.unutarnji HTML =parseFloat(apiData.temperatura.Ž).to Fixed(2) + '° F';

pritisakMb.unutarnji HTML =parseFloat(apiData.pritisak.mb).to Fixed(2) + 'mb';
pritisakPsi.unutarnji HTML =parseFloat(apiData.pritisak.psi).to Fixed(2) + 'psi';
pritisakHpa.unutarnji HTML =parseFloat(apiData.pritisak.hPa).to Fixed(2) + 'hPa';
pritisakP.unutarnji HTML =parseFloat(apiData.pritisak.P).to Fixed(2) + 'P';

vlažnost.unutarnji HTML =parseFloat(apiData.vlažnost).to Fixed(2) + '%';
}


funkcijaapp() {
prozor.setInterval(funkcija() {
getAPIData();
}, 5000);
}

app();
}

Zatim pritisnite + x slijedi I i za spremanje app.js datoteka.

Ovdje linija 1 vodi glavni() funkcija kada se web stranica dovrši s učitavanjem. U glavni() funkciju, getAPIData () funkcija dohvaća podatke vremenskog API -ja pomoću AJAX -a i poziva datoteku ažuriranje() funkciju (u retku 10) nakon što su podaci uspješno dohvaćeni. The ažuriranje() funkcija ažurira element web stranice pomoću podataka API -ja.

U retku 20, document.getElementById () metoda koristi se za dobivanje reference elementa web stranice s id -om tempC . Redak 28 koristi se za zamjenu sadržaja elementa web stranice koji ima id tempC s temperaturom (u Celzijusima) iz API -ja. Na isti način, sadržaj svih web elemenata (retci 21-26) zamjenjuje se odgovarajućim API podacima.

U app () funkciju, getAPIData () se poziva svakih 5 sekundi (5000 milisekundi) kako bi se vremenski podaci ažurirali u aplikaciji za vrijeme. Konačno, u retku 46 app () funkcija se izvršava.

Za testiranje web aplikacije unesite sljedeću naredbu:

$ FLASK_APP = server.py pokretanje tikvice --host = 0.0.0.0

Vremenska aplikacija trebala bi se izvoditi na priključku 5000 (prema zadanim postavkama).

Da biste provjerili radi li Weather API, pokrenite sljedeću naredbu:

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

Kao što vidite, podaci Weather API -ja ispisuju se na konzoli. Stoga API radi.

Da biste testirali aplikaciju Weather, posjetite http: // localhost: 5000 iz web preglednika Chromium. Aplikaciju Vrijeme trebalo bi učitati u web preglednik, ali u početku se ne bi trebali prikazivati ​​vremenski podaci.

Nakon nekoliko sekundi, vremenska aplikacija trebala bi dovršiti dohvaćanje vremenskih podataka iz API -ja i prikazati ih.

U bilo kojem trenutku možete pritisnuti + C za zaustavljanje web poslužitelja.

Izrada Systemd usluge za web -aplikaciju Weather

U ovom odjeljku pokazat ćemo vam kako stvoriti sistemsku datoteku usluge za vremensku aplikaciju tako da se automatski pokreće pri pokretanju.

Prvo stvorite a meteorološka stanica.usluga datoteku u direktoriju vašeg projekta na sljedeći način:

$ nano weather-station.service

Unesite sljedeće retke koda u meteorološka stanica.usluga datoteka.

[Jedinica]
Opis = Web -aplikacija vremenske postaje Raspberry Pi pomoću Raspberry Pi Sense šešira
Nakon = mreža.cilj

[Servis]
WorkingDirectory =/dom/pi/posao
Okruženje = FLASK_APP = server.py
Okoliš = FLASK_ENV = proizvodnja
ExecStart =/usr/bin/flask run --host = 0.0.0.0
StandardOutput = naslijediti
StandardError = naslijediti
Ponovno pokretanje = uvijek
Korisnik = pi

[Instalirati]
WantedBy = višekorisnički cilj

Zatim pritisnite + x slijedi I i za spremanje meteorološka stanica.usluga datoteka.

Kopirajte meteorološka stanica.usluga datoteku u /etc/systemd/system/ imenik sa sljedećom naredbom:

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

Ponovno učitajte sistemske demone da bi promjene stupile na snagu na sljedeći način:

$ sudo systemctl daemon-reload

The meteorološka stanica usluga systemd trenutno bi trebala biti neaktivna, kao što je prikazano na slici ispod.

$ sudo systemctl status weather-station.service

Pokrenite meteorološka stanica servis sa sljedećom naredbom:

$ sudo systemctl start weather-station.service

Kao što vidite, meteorološka stanica usluga sada radi.

$ sudo systemctl status weather-station.service

Sada kada je meteorološka stanica usluga radi, možete je dodati pokretanju sustava Raspberry Pi OS sljedećom naredbom:

$ sudo systemctl enable weather-station.service

Ponovo pokrenite Raspberry Pi sljedećom naredbom:

$ sudo ponovno podizanje sustava

Nakon što vaše čizme Raspberry Pi postanu, meteorološka stanica usluga bi trebala biti pokrenuta, kao što je prikazano na slici ispod.

$ sudo systemctl status weather-station.service

Pristup aplikaciji Weather s drugih uređaja

Da biste pristupili aplikaciji za vrijeme s drugih uređaja u vašoj kućnoj mreži, morate znati IP adresu vašeg Raspberry Pi. IP adresu vašeg Raspberry Pi 4 možete pronaći na web sučelju vašeg kućnog usmjerivača. U našem slučaju, IP adresa je 192.168.0.103, ali ova će vam adresa biti drugačija, stoga u svim narednim koracima ovu adresu zamijenite svojom.

Ako imate pristup Raspberry Pi konzoli, možete pokrenuti sljedeću naredbu kako biste pronašli i IP adresu.

$ hostname -Ja

Nakon što saznate IP adresu vašeg Raspberry Pi, možete joj pristupiti s bilo kojeg uređaja u vašoj kućnoj mreži. Kao što je prikazano na slici ispod, aplikaciji za vremensku prognozu pristupili smo s Android pametnog telefona.

Zaključak

U ovom članku pokazali smo vam kako koristiti Raspberry Pi Sense Hat za izgradnju meteorološke postaje Raspberry Pi. Koristili smo osjetilni šešir Python knjižnica za izdvajanje vremenskih podataka iz Raspberry Pi Sense Hat -a. Zatim smo koristili mikro web okvir Flask Python za stvaranje vremenskog API -ja i web aplikacije. Web -aplikacija svakih 5 sekundi dobiva vremenske podatke iz vremenskog API -ja kako bi web -aplikacija bila u tijeku s najnovijim vremenskim podacima.