Rakenna oma Raspberry Pi -sääasema

Build Your Own Raspberry Pi Weather Station

Raspberry Pi Sense Hat on lisäkortti, jota voidaan käyttää Raspberry Pi -lautatietokoneiden kanssa. Raspberry Pi Sense Hatissa on 8 × 8 LED-näyttö ja 5 painikkeen joystick, ja se on varustettu seuraavilla antureilla:

  1. Gyroskooppi
  2. Kiihtyvyysmittari
  3. Magnetometri
  4. Lämpötila
  5. Ilmanpaine
  6. Kosteus

Tässä artikkelissa aion näyttää sinulle, miten voit luoda Python API -pohjaisen sääaseman verkkosovelluksen käyttämällä lämpötila , barometrinen paine ja kosteus Raspberry Pi Sense Hatun anturit. Tämän artikkelin seuraamiseksi tarvitset seuraavat asiat:



  1. Raspberry Pi 3 tai Raspberry Pi 4, jossa on verkkoyhteys.
  2. Raspberry Pi Sense Hat -moduuli.
  3. Micro-USB (Raspberry Pi 3) tai USB Type-C (Raspberry Pi 4) -virtasovitin.
  4. 16 Gt: n tai 32 Gt: n microSD -kortti Raspberry Pi -käyttöjärjestelmällä.
  5. Kannettava tietokone tai pöytätietokone VNC -etätyöpöytäkäyttöön tai SSH -yhteys Raspberry Pi: hen.

HUOMAUTUS: Tässä artikkelissa muodostamme yhteyden Raspberry Pi: hen etänä VNC: n tai SSH: n kautta käyttämällä Raspberry Pi: n päätöntä asetusta. Jos et halua käyttää Raspberry Pi -laitettasi etänä SSH: n tai VNC: n kautta, sinun on liitettävä näyttö, näppäimistö ja hiiri Raspberry Pi -laitteeseesi.



Lisätietoja Raspberry Pi OS -kuvan salaamisesta microSD -kortille on artikkelissa Raspberry Pi Imagerin asentaminen ja käyttö. Jos tarvitset apua Raspberry Pi -käyttöjärjestelmän asentamisessa Raspberry Pi -laitteeseesi, lue Raspberry Pi OS: n asentaminen Raspberry Pi 4: een . Jos tarvitset apua Raspberry Pi: n päätön määrityksessä, tutustu Raspberry Pi OS: n asentamiseen ja määrittämiseen Raspberry Pi 4: ssä ilman ulkoista näyttöä.



Raspberry Pi Sense Hatin yhdistäminen Raspberry Pi: hen

Raspberry Pi Sense Hat -sarjan mukana tulee Raspberry Pi Sense Hat -lisälevy, 40-nastainen uros-naaras-otsikko ja joitakin ruuveja ja välikappaleita.

Ennen kuin voit kiinnittää Sense Hat -levyn Raspberry Pi -laitteeseen, sinun on liitettävä 40-nastainen otsikko Sense Hat -hattuun. Liitä 40-nastaisen uros-naarasliittimen urosnastat Sense-hattuun alla olevien kuvien mukaisesti.



Raspberry Pi -piirilevyissä on 4 reikää, joilla voidaan kiinnittää lisälevyt tai kotelo. Kiinnitä lisäkortti asentamalla ruuvit Raspberry Pi -laitteen takaosasta alla olevien kuvien mukaisesti.

Liitä sitten välike ruuviin.

Kun olet lisännyt kaikki neljä ruuvia ja välikappaletta, Raspberry Pi: n pitäisi näyttää alla olevan kuvan mukaiselta.

Liitä Raspberry Pi Sense -hattu Raspberry Pi: n 40-nastaiseen GPIO-urosliitäntään alla olevien kuvien mukaisesti.

HUOMAUTUS: Ole varovainen irrottaessasi Raspberry Pi Sense Hat -hattua Raspberry Pi 40-nastaisesta GPIO-otsikosta, jotta Raspberry Pi GPIO: n tapit eivät taivu.

Kiinnitä Raspberry Pi Sense Hat neljällä jäljellä olevalla ruuvilla alla olevien kuvien mukaisesti.

Käynnistä Raspberry Pi

Nyt kun Raspberry Pi Sense Hat on liitetty Raspberry Pi -laitteeseen, aseta Raspberry Pi -käyttöjärjestelmää sisältävä microSD -kortti Raspberry Pi -laitteen microSD -korttipaikkaan, kytke virtajohto Raspberry Pi -laitteeseen ja käynnistä se.

Raspberry Pi Sense Hat Python -kirjaston asentaminen

Raspberry Pi Sense Hatin käyttämiseksi Raspberry Pi -laitteessa tunne-hattu Python -kirjasto on asennettava Raspberry Pi -käyttöjärjestelmään. The tunne-hattu kirjasto on saatavana Raspberry Pi OS: n virallisessa pakettivarastossa.

Raspberry Pi: n asentaminen tunne-hattu Python -kirjasto Raspberry Pi -käyttöjärjestelmässä, päivitä ensin APT -paketin arkiston välimuisti seuraavalla komennolla:

$ sudo apt päivitys

Suorita sitten seuraava komento:

$ sudo apt asentaa sense -hat -y

Flask Micro Web Framework Python -kirjaston asentaminen

Luomme sääsovelluksemme Flask Python -kehyksen avulla. Voit asentaa Flaskin Raspberry Pi OS: n virallisesta pakettivarastosta seuraavalla komennolla:

$ sudo apt asentaa python3 -flask -y

Projektihakemiston luominen

On hyvä idea luoda projektihakemisto projektitiedostojen järjestämiseksi. Luo projektihakemisto ~/työtä , käytä seuraavaa komentoa:

$ mkdir ~/työ

Kun projektihakemisto on luotu, siirry projektihakemistoon seuraavasti:

$ cd ~/työ

Raspberry Pi Sense Hatin testaus

Testataksemme, toimiiko Raspberry Pi Sense Hat, voimme kirjoittaa yksinkertaisen Python -testikomentosarjan. Voit luoda uuden Python -komentosarjan nimeltä test.py kanssa nano tekstieditori seuraavasti:

$ nano test.py

Kirjoita seuraava koodi test.py tiedosto. Rivin 1 tuonti SenseHat alkaen sense_hat moduuli, rivi 3 luo a SenseHat objekti ja tallentaa viitteen järkeä ja rivit 5–6 asettavat kaikkien 8 × 8 LEDien värin punaiseksi. Kun olet valmis, paina + X jonka jälkeen JA ja .

Voit suorittaa test.py Python -komentosarja seuraavalla komennolla:

$ python3 test.py

8 × 8 LED -matriisin pitäisi hehkua punaisena alla olevan kuvan mukaisesti.

Voit sammuttaa Sense Hat -merkkivalot suorittamalla asia selvä() menetelmässä ilman väriarvoa test.py Python -komentosarja, kuten alla olevassa kuvakaappauksessa näkyy, ja suorita test.py Python -skripti jälleen.

Sense Hatin LED -valot on nyt sammutettava, kuten alla olevassa kuvassa näkyy.

Jos Sense Hat toimii oikein, siirry seuraavaan osaan.

Säätietojen hakeminen Sense Hatista

Voit hakea sensoritietoja Sense Hatista erittäin helposti käyttämällä tunne-hattu Python -kirjasto. Voit noutaa sensoritietoja Sense Hatista luomalla uuden Python -komentosarjan read_sensor_data.py seuraavasti:

$ nano read_sensor_data.py

Kirjoita seuraava koodi read_sensor_data.py Python -tiedosto.

alkaensense_hattuontiSenseHat
alkaen aika tuontinukkua
järkeä=SenseHat()
järkeä.asia selvä()
sillä aikaa Totta:
tempC=järkeä.get_temperature()
tempF=tempC *(9/5)+32
paine=järkeä.saada_paine()
kosteus=järkeä.get_humidity()

Tulosta('Lämpötila: %.2f ° C/ %.2f ° F n''%(tempC,tempF))
Tulosta('Paine: %.2f mb n''%(paine))
Tulosta('Kosteus:%.2f %% n n''%(kosteus))
nukkua(5)

Kun olet valmis, paina + X jonka jälkeen JA ja .

Yllä olevassa koodissa rivit 1 ja 2 tuovat kaikki tarvittavat kirjastot, rivi 4 luo a SenseHat objekti, ja rivi 5 sammuttaa kaikki Sense Hat -merkkivalot käyttämällä asia selvä() menetelmä. Vaikka silmukka rivillä 7 on ääretön silmukka, joka suorittaa koodin riveillä 8–16 ikuisesti.

Rivillä 8, get_temperature () -menetelmää käytetään lämpötilatietojen (celsiusasteina) lukemiseen Sense Hatin kosteusanturista. Rivillä 9 lämpötilatiedot muutetaan Celsius -asteista Fahrenheit -asteiksi. Rivillä 10, get_pressure () Menetelmää käytetään ilmanpainetietojen (millibaareina) lukemiseen Sense Hatin paineanturista. Rivillä 11, get_humidity () menetelmää käytetään kosteustietojen ( %) lukemiseen Sense Hatin kosteusanturista.

Rivejä 13–15 käytetään anturitietojen tulostamiseen konsoliin ja rivillä 16 odotetaan 5 sekuntia ennen anturitietojen lukemista.

Voit suorittaa read_sensor_data.py Python -skripti seuraavasti:

$ python3 read_sensor_data.py

Kun komentosarja on suoritettu, anturitiedot tulostetaan konsoliin.

Nyt kun voimme lukea anturitiedot Sense Hatista, paina + C ohjelman pysäyttämiseksi.

Sääaseman verkkosovelluksen luominen

Tässä osiossa näytämme sinulle, kuinka voit luoda Python Flask -verkkokehyksen avulla sääsovellusliittymän ja sääsovelluksen. Sääsovellus käyttää säätietojen sovellusliittymää ja näyttää säätiedot reaaliajassa. Kaikki tässä osassa käsitellyt koodit ovat saatavilla GitHubissa osoitteessa shovon8 / vadelma-pi-sense-hat-sää-sovellus .

Luo ensin server.py Python -skripti projektihakemistossa seuraavasti:

$ nano server.py

Kirjoita seuraava koodi server.py Python -tiedosto.

alkaenpullotuontiPullo
alkaenpullotuontijsonify
alkaenpullotuontirender_template
alkaenpullotuontiurl_for
alkaensense_hattuontiSenseHat
sovellus=Pullo(__nimi__)
sovellus.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0
järkeä=SenseHat()
järkeä.asia selvä()
kanssasovellus.test_request_context():
url_for('staattinen',Tiedoston nimi='style.css')
url_for('staattinen',Tiedoston nimi='app.js')
@sovellus.reitti('/antaa potkut')
defantaa potkut():
tempC=järkeä.get_temperature()
tempF=tempC *(9/5)+32
paine=järkeä.saada_paine()
painePsi=paine *0,0145038
paine P=paine *100
kosteus=järkeä.get_humidity()

palatajsonify({
'lämpötila':{ 'C': lämpötila C, 'F': tempF},
'paine':{ 'mb': paine, 'hPa': paine,
'psi': painePsi, 'P': paineP},
'kosteus': kosteus
})
@sovellus.reitti('/')
defKoti():
palatarender_template('./home.html')

Paina sitten + X jonka jälkeen JA ja pelastamaan server.py Python -käsikirjoitus.

Yllä olevassa koodissa rivit 1–5 tuovat kaikki tarvittavat kirjastot, rivi 7 luo Flask -sovelluksen, rivi 11 luo SenseHat -objektin ja rivi 12 sammuttaa kaikki Sense Hat -merkkivalot. Rivi 8 poistaa Flask -sovelluksen web -välimuistin käytöstä. Koska tämä sovellus on kevyt, välimuistia ei tarvita. Jos haluat muokata sovellusta, web -välimuistin poistaminen käytöstä helpottaa testaamista.

Rivit 18–31 lukevat anturitiedot Sense Hatista ja palauttavat API -tiedot JSON -muodossa HTTP GET -pyynnöllä /antaa potkut verkkopalvelimen päätepiste. Rivit 37–39 palauttavat sääsovelluksen kotisivun / verkkopalvelimen päätepiste. Kotisivu on muodostettu home.html tiedosto, jonka pitäisi olla mallit/ projektihakemiston hakemistosta.

Linjoilla 14–16 käytetään pääsyä style.css ja app.js staattisia tiedostoja. Näiden tiedostojen pitäisi olla staattinen/ projektihakemiston hakemistosta. The style.css tiedostoa käytetään muotoiluun home.html kotisivu ja app.js tiedostoa käytetään API -tietojen pyytämiseen /antaa potkut päätepiste ja päivitä säätiedot home.html sivu 5 sekunnin välein.

Luo staattinen/ ja mallit/ hakemistosta projektihakemistossa seuraavasti:

$ mkdir -v {static, templates}

Luo home.html tiedosto mallit/ hakemisto seuraavasti:

$ nano templates/home.html

Kirjoita seuraava koodi home.html tiedosto.


< html >
< pää >
< meta nimi='näkymä' sisältö='width = device-width, initial-scale = 1.0'>
< otsikko >Raspberry Pi -sääasema</ otsikko >
< linkki rel='tyylitaulukko' tyyppi='text/css'
href='{{url_for (' static ', tiedostonimi =' style.css ')}}'/>
</ pää >
< vartalo >
< div id='sisältö'>
< h1 >Raspberry Pi -sääasema</ h1 >

< div luokka='data-sisältö'>
< h2 >Lämpötila</ h2 >
< div luokka='data-rivi'>
< div luokka='datasolu' id='tempC'>
...
</ div >
< div luokka='datasolu' id='tempF'>
...
</ div >
</ div >
</ div >

< div luokka='data-sisältö'>
< h2 >Paine</ h2 >
< div luokka='data-rivi'>
< div luokka='datasolu' id='paineMb'>
...
</ div >
< div luokka='datasolu' id='painePsi'>
...
</ div >
</ div >
< div luokka='data-rivi'>
< div luokka='datasolu' id='paineHpa'>
...
</ div >
< div luokka='datasolu' id='paineP'>
...
</ div >
</ div >
</ div >

< div luokka='data-sisältö'>
< h2 >Kosteus</ h2 >
< div luokka='data-rivi'>
< div luokka='datasolu' id='kosteus'>
...
</ div >
</ div >
</ div >
</ div >

< käsikirjoitus tyyppi='text/javascript' src='{{url_for (' static ', tiedostonimi =' app.js ')}}'></ käsikirjoitus >
</ vartalo >
</ html >

Paina sitten + X jonka jälkeen JA ja pelastamaan home.html tiedosto.

Luo style.css tiedosto staattinen/ hakemisto seuraavasti:

$ nano static/style.css

Kirjoita seuraavat koodit kohtaan style.css tiedosto.

@tuonti url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
* {
pehmuste: 0;
marginaali: 0;
fonttiperhe: 'Robotti', sans-serif;
}
vartalo{
tausta: # 737373;
}
h1{
näyttö: lohko;
väri: #79DC7B;
tekstin tasaus: keskusta;
fontin paino: 400;
tausta: # 000;
pehmuste: 0,5 em 0;
}
h2{
näyttö: lohko;
tausta: # 000;
väri: #F F F;
tekstin tasaus: keskusta;
fontin paino: 400;
Fonttikoko: 1em;
}
.data-content {
marginaali: 10 kuvapistettä;
raja: 2px kiinteä musta;
raja-säde: 5 kuvapistettä;
taustaväri: #79DC7B;
}
.datarivi {
näyttö:taipua;
joustava suunta:rivi;
}
.datasolu {
leveys: 100%;
korkeus: 80px;
näyttö:taipua;
kohdista kohteet: keskusta;
perustella sisältöä: keskusta;
fontin paino: lihavoitu;
Fonttikoko: 1.5em;
väri: # 006902;
}
.datasolu:leijua {
tausta: # FFE891;
väri: # AA8600;
kohdistin: osoitin;
}

Paina sitten + X jonka jälkeen JA ja pelastamaan style.css tiedosto.

Luo app.js tiedosto staattinen/ hakemisto seuraavasti:

$ nano static/app.js

Kirjoita seuraava koodi app.js tiedosto.

ikkuna.addEventListener('ladata',tärkein);
toimintotärkein() {
toimintogetAPIData() {
missähttp= UusiXMLHttpRequest();

http.jo vaihdossa = toiminto() {
jos(Tämä.readyState === 4 && Tämä.Tila === 200) {
päivittää(JSON.jäsentää(Tämä.responseText));
}
}

http.avata('SAADA', '/antaa potkut', totta);
http.lähettää();
}


toimintopäivittää(apiData) {
missätempC=asiakirja.getElementById('tempC');
missätempF=asiakirja.getElementById('tempF');
missäpaineMb=asiakirja.getElementById('paineMb');
missäpainePsi=asiakirja.getElementById('painePsi');
missäpaineHpa=asiakirja.getElementById('paineHpa');
missäpaine P=asiakirja.getElementById('paineP');
missäkosteus=asiakirja.getElementById('kosteus');

tempC.sisäinenHTML =parseFloat(apiData.lämpötila.C).toFixed(2) + '° C';
tempF.sisäinenHTML =parseFloat(apiData.lämpötila.F).toFixed(2) + '° F';

paineMb.sisäinenHTML =parseFloat(apiData.paine.mb).toFixed(2) + 'mb';
painePsi.sisäinenHTML =parseFloat(apiData.paine.psi).toFixed(2) + 'psi';
paineHpa.sisäinenHTML =parseFloat(apiData.paine.hPa).toFixed(2) + 'hPa';
paine P.sisäinenHTML =parseFloat(apiData.paine.P).toFixed(2) + 'P';

kosteus.sisäinenHTML =parseFloat(apiData.kosteus).toFixed(2) + '%';
}


toimintosovellus() {
ikkuna.setInterval(toiminto() {
getAPIData();
}, 5000);
}

sovellus();
}

Paina sitten + X jonka jälkeen JA ja pelastamaan app.js tiedosto.

Tässä rivi 1 kulkee pää () -toimintoa, kun verkkosivu latautuu. Kohteessa pää () toiminto, getAPIData () -toiminto hakee sää -API -tiedot AJAX: n avulla ja kutsuu päivittää() toiminto (rivillä 10), kun tiedot on haettu onnistuneesti. The päivittää() -toiminto päivittää verkkosivuelementin käyttämällä API -tietoja.

Rivillä 20, document.getElementById () -menetelmää käytetään verkkosivuelementin viitteen saamiseen tunnuksella tempC . Riviä 28 käytetään korvaamaan sen verkkosivuelementin sisältö, jolla on tunnus tempC lämpötilasta (Celsius) API: sta. Samalla tavalla kaikkien verkkoelementtien (rivit 21–26) sisältö korvataan vastaavilla API -tiedoilla.

Kohteessa sovellus() toiminto, getAPIData () soitetaan 5 sekunnin välein (5000 millisekuntia) pitääkseen säätiedot ajan tasalla sääsovelluksessa. Lopuksi rivillä 46, sovellus() toiminto suoritetaan.

Testaa verkkosovellus antamalla seuraava komento:

$ FLASK_APP = server.py -pullo suoritetaan -isäntä = 0.0.0.0

Sääsovelluksen pitäisi toimia portissa 5000 (oletuksena).

Testaa, toimiiko sääsovellusliittymä, suorittamalla seuraava komento:

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

Kuten näette, Weather API -tiedot tulostetaan konsoliin. Siksi API toimii.

Testaa Sää -sovellus osoitteessa http: // localhost: 5000 Chromium -selaimelta. Sääsovellus on ladattava verkkoselaimeen, mutta säätietoja ei tule näyttää aluksi.

Muutaman sekunnin kuluttua sääsovelluksen pitäisi lopettaa säätietojen noutaminen sovellusliittymästä ja näyttää se.

Voit milloin tahansa painaa + C verkkopalvelimen pysäyttämiseksi.

Systemd -palvelun luominen Weather Web Appille

Tässä osiossa näytämme sinulle, kuinka luoda järjestelmäsovellustiedosto sääsovellukselle, jotta se käynnistyy automaattisesti käynnistyksen yhteydessä.

Luo ensin sää-asema. palvelu tiedosto projektihakemistossasi seuraavasti:

$ nano-sääasema. palvelu

Kirjoita seuraavat koodirivit kohtaan sää-asema. palvelu tiedosto.

[Yksikkö]
Kuvaus = Raspberry Pi Weather Station -sovellus, joka käyttää Raspberry Pi Sense Hat -hattua
Jälkeen = network.target

[Palvelu]
WorkingDirectory =/koti/pi/työ
Ympäristö = FLASK_APP = server.py
Ympäristö = FLASK_ENV = tuotanto
ExecStart =/usr/bin/flask run -isäntä = 0.0.0.0
StandardOutput = peri
Vakiovirhe = peri
Käynnistä uudelleen = aina
Käyttäjä = pi

[Asentaa]
WantedBy = usean käyttäjän.target

Paina sitten + X jonka jälkeen JA ja pelastamaan sää-asema. palvelu tiedosto.

Kopioi sää-asema. palvelu tiedosto /etc/systemd/system/ hakemistoon seuraavalla komennolla:

$ sudo cp -v sää -asema.palvelu/etc/systemd/system/

Lataa järjestelmädemonit uudelleen, jotta muutokset tulevat voimaan seuraavasti:

$ sudo systemctl daemon-reload

The sääasema systemd -palvelun pitäisi olla tällä hetkellä passiivinen, kuten alla olevassa kuvakaappauksessa näkyy.

$ sudo systemctl status weather-station.service

Käynnistä sääasema palvelu seuraavalla komennolla:

$ sudo systemctl käynnistä sää-station.service

Kuten näette, sääasema palvelu on nyt käynnissä.

$ sudo systemctl status weather-station.service

Nyt kun sääasema palvelu toimii, voit lisätä sen Raspberry Pi OS -järjestelmän käynnistykseen seuraavalla komennolla:

$ sudo systemctl ota käyttöön sää-station.service

Käynnistä Raspberry Pi uudelleen seuraavalla komennolla:

$ sudo uudelleenkäynnistys

Kun Raspberry Pi -kengät on saapunut, sääasema palvelun pitäisi olla käynnissä, kuten alla olevassa kuvakaappauksessa näkyy.

$ sudo systemctl status weather-station.service

Sääsovelluksen käyttäminen muista laitteista

Jotta voit käyttää sääsovellusta muista kotiverkon laitteista, sinun on tiedettävä Raspberry Pi -laitteesi IP -osoite. Löydät Raspberry Pi 4 -laitteesi IP -osoitteen kotireitittimen web -käyttöliittymästä. Meidän tapauksessamme IP -osoite on 192.168.0.103, mutta tämä osoite on erilainen sinulle, joten muista korvata tämä osoite omasi kaikissa seuraavissa vaiheissa.

Jos sinulla on pääsy Raspberry Pi -konsoliin, voit suorittaa IP -osoitteen myös suorittamalla seuraavan komennon.

$ hostname -I

Kun tiedät Raspberry Pi -laitteen IP -osoitteen, voit käyttää sitä miltä tahansa kotiverkon laitteelta. Kuten alla olevasta kuvakaappauksesta näkyy, olemme päässeet sääsovellukseen Android -älypuhelimesta.

Johtopäätös

Tässä artikkelissa näytimme sinulle, miten voit käyttää Raspberry Pi Sense -hattua Raspberry Pi -sääaseman rakentamiseen. Käytimme tunne-hattu Python -kirjasto poimii säätiedot Raspberry Pi Sense Hatista. Sitten loimme sääsovellusliittymän ja verkkosovelluksen Flask Python -mikroverkkokehyksen avulla. Verkkosovellus saa säätiedot sovellusliittymästä 5 sekunnin välein pitääkseen verkkosovelluksen ajan tasalla uusimmista säätiedoista.