Raspberry Pi

Bouw je eigen Raspberry Pi-weerstation

Bouw je eigen Raspberry Pi-weerstation
Raspberry Pi Sense Hat is een add-on board dat kan worden gebruikt met Raspberry Pi single-board computersboard. De Raspberry Pi Sense Hat heeft een 8×8 LED-display en een joystick met 5 knoppen en is uitgerust met de volgende sensoren:

  1. Gyroscoop
  2. Versnellingsmeter
  3. Magnetometer
  4. Temperatuur
  5. Barometrische druk
  6. Vochtigheid

In dit artikel laat ik je zien hoe je een op Python API gebaseerde webapplicatie voor weerstations kunt maken met behulp van de temperatuur-, barometrische druk, en vochtigheid sensoren van de Raspberry Pi Sense Hat. Om dit artikel te volgen, hebt u het volgende nodig:

  1. Een Raspberry Pi 3 of Raspberry Pi 4 met netwerkconnectiviteit.
  2. Een Raspberry Pi Sense Hat-module.
  3. Een micro-USB (Raspberry Pi 3) of USB Type-C (Raspberry Pi 4) voedingsadapter.
  4. Een 16 GB of 32 GB microSD-kaart met Raspberry Pi OS.
  5. Een laptop of een desktopcomputer voor externe VNC-desktoptoegang of SSH-toegang tot de Raspberry Pi.

OPMERKING: In dit artikel zullen we op afstand verbinding maken met de Raspberry Pi via VNC of SSH met behulp van de headless setup van de Raspberry Pi. Als u geen toegang wilt tot uw Raspberry Pi op afstand via SSH of VNC, moet u een monitor, een toetsenbord en een muis aansluiten op uw Raspberry Pi.

Voor meer informatie over het flashen van de Raspberry Pi OS-afbeelding op een microSD-kaart, raadpleegt u De Raspberry Pi Imager installeren en gebruiken. Als je hulp nodig hebt bij het installeren van Raspberry Pi OS op je Raspberry Pi, lees dan Hoe installeer je Raspberry Pi OS op Raspberry Pi 4. Als je hulp nodig hebt bij de headless setup van Raspberry Pi, ga dan naar Hoe te installeren en configureren Raspberry Pi OS op Raspberry Pi 4 zonder externe monitor.

Raspberry Pi Sense Hat verbinden met Raspberry Pi

Raspberry Pi Sense Hat-kit wordt geleverd met het Raspberry Pi Sense Hat-uitbreidingsbord, een 40-pins mannelijk-naar-vrouwelijk kopstuk en enkele schroeven en afstandhouders.

Voordat je het Sense Hat-bord op de Raspberry Pi kunt aansluiten, moet je de 40-pins header op de Sense Hat aansluiten. Sluit de mannelijke pinnen van de 40-pins mannelijk-vrouwelijke header aan op de Sense Hat zoals weergegeven in de onderstaande afbeeldingen:.

Raspberry Pi-computers met één bord hebben 4 gaten die kunnen worden gebruikt om uitbreidingskaarten of een behuizing te bevestigen. Om het uitbreidingsbord te bevestigen, plaatst u schroeven vanaf de achterkant van de Raspberry Pi, zoals weergegeven in de onderstaande afbeeldingen:.

Sluit vervolgens een afstandsstuk aan op de schroef.

Zodra je alle vier de schroeven en afstandhouders hebt toegevoegd, zou je Raspberry Pi eruit moeten zien zoals in de onderstaande afbeelding:.

Sluit de Raspberry Pi Sense Hat aan op de 40-pins GPIO mannelijke header van de Raspberry Pi, zoals weergegeven in de onderstaande afbeeldingen:.

OPMERKING: Wees voorzichtig bij het loskoppelen van de Raspberry Pi Sense Hat van de Raspberry Pi 40-pins GPIO-header om te voorkomen dat de pinnen van de Raspberry Pi GPIO buigen.

Zet de Raspberry Pi Sense Hat vast met de vier resterende schroeven, zoals weergegeven in de onderstaande afbeeldingen:.

De Raspberry Pi aanzetten

Nu de Raspberry Pi Sense Hat is aangesloten op de Raspberry Pi, plaatst u de microSD-kaart met Raspberry Pi OS in de microSD-kaartsleuf van de Raspberry Pi, sluit u de voedingskabel aan op de Raspberry Pi en zet u hem aan.

De Raspberry Pi Sense Hat Python-bibliotheek installeren

Om Raspberry Pi Sense Hat op de Raspberry Pi te gebruiken, zin-hat Python-bibliotheek moet zijn geïnstalleerd op het Raspberry Pi-besturingssysteem. De zin-hat bibliotheek is beschikbaar in de officiële pakketrepository van Raspberry Pi OS.

De Raspberry Pi installeren zin-hat Python-bibliotheek op het Raspberry Pi-besturingssysteem, update eerst de APT-pakketrepository-cache met de volgende opdracht:

$ sudo apt-update

Voer vervolgens de volgende opdracht uit:

$ sudo apt install sense-hat -y

De Flask Micro Web Framework Python-bibliotheek installeren

We zullen het Flask Python-framework gebruiken om onze weertoepassing te maken. Je kunt Flask installeren vanuit de officiële pakketrepository van Raspberry Pi OS met de volgende opdracht:

$ sudo apt install python3-flask -y

Een projectmap maken Creating

Het is een goed idee om een ​​projectmap te maken om uw projectbestanden te ordenen. Een projectmap maken: ~/werk, gebruik het volgende commando:

$ mkdir ~/werk

Nadat de projectdirectory is gemaakt, navigeert u als volgt naar de projectdirectory:

$ cd ~/werk

De Raspberry Pi Sense-hoed testen

Om te testen of de Raspberry Pi Sense Hat werkt, kunnen we een eenvoudig test Python-script schrijven. U kunt een nieuw Python-script maken met de naam test.py met de nano tekstverwerker als volgt:

$ nano-test.py

Voer de volgende code in het test.py het dossier. Regel 1 invoer SenseHat van de sense_hat module, regel 3 maakt a SenseHat object en slaat een verwijzing op in de zin variabel, en lijnen 5-6 stellen de kleur van alle 8×8 LED's in op rood. Als u klaar bent, drukt u op + X gevolgd door Y en .

U kunt de test.py Python-script met het volgende commando:

$ python3-test.py

De 8 × 8 LED-matrix moet rood oplichten, zoals weergegeven in de onderstaande afbeelding:.

Om de LED's van de Sense Hat uit te schakelen, voert u de Doorzichtig() methode zonder enige kleurwaarde in de test.py Python-script, zoals weergegeven in de onderstaande schermafbeelding, en voer de test.py Python-script opnieuw.

De LED's van de Sense Hat moeten nu uitgeschakeld zijn, zoals weergegeven in de onderstaande afbeelding image.

Als de Sense Hat goed werkt, ga dan verder met het volgende gedeelte.

Weergegevens ophalen van Sense Hat

U kunt heel eenvoudig sensorgegevens van de Sense Hat verkrijgen door gebruik te maken van de zin-hat Python-bibliotheek. Om sensorgegevens uit de Sense Hat op te halen, kun je een nieuw Python-script maken read_sensor_data.py als volgt:

$ nano read_sensor_data.py

Voer de volgende code in de read_sensor_data.py Python-bestand.

van sense_hat importeer SenseHat
van tijd import slaap
zin = SenseHat()
zin.Doorzichtig()
terwijl waar:
tempC = gevoel.get_temperatuur()
tempF = tempC * (9/5) + 32
druk = gevoel.get_pressure()
vochtigheid = gevoel.get_humidity()
print("Temperatuur: %.2f°C/%.2f°F\n" % (tempC, tempF))
print("Druk: %.2f mb\n" % (druk))
print("Vochtigheid: %.2f%%\n\n" % (vochtigheid))
slapen(5)

Als u klaar bent, drukt u op + X gevolgd door Y en .

In de bovenstaande code importeren regel 1 en 2 alle vereiste bibliotheken, regel 4 creëert a SenseHat object, en regel 5 schakelt alle LED's van de Sense Hat uit met behulp van de Doorzichtig() methode. De while-lus in regel 7 is een oneindige lus die de code in regel 8-16 voor altijd zal uitvoeren.

In regel 8, de get_temperatuur() methode wordt gebruikt om de temperatuurgegevens (in graden Celsius) van de vochtigheidssensor van de Sense Hat . te lezen. In regel 9 worden de temperatuurgegevens omgezet van graden Celsius naar graden Fahrenheit. In regel 10, de get_pressure() methode wordt gebruikt om de luchtdrukgegevens (in millibars) van de druksensor van de Sense Hat . uit te lezen. In lijn 11, de get_humidity() methode wordt gebruikt om de vochtigheidsgegevens (in %) van de vochtigheidssensor van de Sense Hat . uit te lezen.

Regels 13-15 worden gebruikt om de sensorgegevens naar de console af te drukken en regel 16 wordt gebruikt om 5 seconden te wachten voordat de sensorgegevens opnieuw worden gelezen.

U kunt de read_sensor_data.py Python-script als volgt:

$ python3 read_sensor_data.py

Zodra het script is uitgevoerd, worden sensorgegevens naar de console afgedrukt.

Nu we de sensorgegevens van de Sense Hat kunnen lezen, drukt u op + C om het programma te stoppen.

Een weerstation-webapp maken

In deze sectie laten we u zien hoe u het Python Flask-webframework gebruikt om een ​​weer-API en een weertoepassing te maken create. De weertoepassing heeft toegang tot de weergegevens-API en toont de weergegevens in realtime. Alle code die in deze sectie wordt besproken, is beschikbaar op GitHub op shovon8/raspberry-pi-sense-hat-weather-app.

Maak eerst een server.py Python-script in de projectdirectory als volgt:

$ nano-server.py

Voer de volgende code in de server.py Python-bestand.

uit kolf import Flask
uit kolf import jsonify
uit kolf import render_template
from flask import url_for
van sense_hat importeer SenseHat
app = Kolf(__naam__)
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0
zin = SenseHat()
zin.Doorzichtig()
met app.test_request_context():
url_for('static', bestandsnaam='style.css')
url_for('static', bestandsnaam='app.js')
@app.route('/api')
def api():
tempC = gevoel.get_temperatuur()
tempF = tempC * (9/5) + 32
druk = gevoel.get_pressure()
drukPsi = druk * 0.0145038
drukP = druk * 100
vochtigheid = gevoel.get_humidity()
return jsonify(
"temperatuur": "C": tempC, "F": tempF ,
"druk": "mb": druk, "hPa": druk,
"psi": drukPsi, "P": drukP ,
"vochtigheid": vochtigheid
)
@app.route('/')
zeker thuis():
return render_template('./huis.html')

Druk vervolgens op + X gevolgd door Y en om de te redden server.py Python-script.

In de bovenstaande code importeren regels 1-5 alle vereiste bibliotheken, regel 7 maakt een Flask-app, regel 11 maakt een SenseHat-object en regel 12 schakelt alle LED's van de Sense Hat uit. Lijn 8 schakelt webcaching uit voor de Flask-app. Omdat deze app licht van gewicht is, is caching niet nodig. Als je de app wilt wijzigen, dan maakt het uitschakelen van webcaching het testen veel gemakkelijker.

Regels 18-31 lezen de sensorgegevens van de Sense Hat en retourneren de API-gegevens in JSON-indeling op HTTP GET-verzoek in de /api eindpunt van de webserver. Regels 37-39 keren terug naar de startpagina van de weerwebapp op de / eindpunt van de webserver. De startpagina wordt weergegeven vanaf de huis.html bestand, dat in de zou moeten staan Sjablonen/ directory van de projectdirectory.

Lijnen 14-16 worden gebruikt om toegang te verlenen tot de stijl.css en app.js statische bestanden. Deze bestanden moeten in de statisch/ directory van de projectdirectory. De stijl.css bestand wordt gebruikt om de huis.html startpagina, en de app.js bestand wordt gebruikt om de API-gegevens op te vragen bij de /api eindpunt en update de weergegevens op de huis.html pagina elke 5 seconden.

Maak de statisch/ en Sjablonen/ directory in de projectdirectory als volgt:

$ mkdir -v statisch,sjablonen

Maak een huis.html bestand in de Sjablonen/ map als volgt:

$ nano-sjablonen/home.html

Voer de volgende code in de huis.html het dossier.





Raspberry Pi weerstation
href=" url_for('static', bestandsnaam="style .).css") "/>



Raspberry Pi weerstation



Temperatuur












Druk




















Vochtigheid











Druk vervolgens op + X gevolgd door Y en om de te redden huis.html het dossier.

Maak een stijl.css bestand in de statisch/ map als volgt:

$ nano statisch/stijl.css

Voer de volgende codes in de stijl.css het dossier.

@import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
*
opvulling: 0;
marge: 0;
font-familie: 'Roboto', schreefloos;

lichaam
achtergrond: #737373;

h1
weergave: blok;
kleur: #79DC7B;
tekst uitlijnen: midden;
lettergewicht: 400;
achtergrond: #000;
opvulling: 0.5em 0;

h2
weergave: blok;
achtergrond: #000;
kleur: #fff;
tekst uitlijnen: midden;
lettergewicht: 400;
lettergrootte: 1em;

.data-inhoud
marge: 10px;
rand: 2px effen zwart;
grens-radius: 5px;
achtergrondkleur: #79DC7B;

.data-rij
weergave: flexibel;
flex-richting: rij;

.datacel
breedte: 100%;
hoogte: 80px;
weergave: flexibel;
align-items: midden;
rechtvaardigen-inhoud: centrum;
lettergewicht: vet;
lettergrootte: 1.5em;
kleur: #006902;

.datacel:hover
achtergrond: #FFE891;
kleur: #AA8600;
cursor: aanwijzer;

Druk vervolgens op + X gevolgd door Y en om de te redden stijl.css het dossier.

Creëer een app.js bestand in de statisch/ map als volgt:

$ nano statisch/app.js

Voer de volgende code in de app.js het dossier.

venster.addEventListener('load', main);
functie hoofd()
functie getAPIData()
var http = nieuwe XMLHttpRequest();
http.onreadystatechange = functie()
als dit.readyState === 4 && dit.status === 200)
update (JSON).ontleden (dit.responseText));


http.open("GET", "/api", waar);
http.sturen();

functie-update (apiData)
var tempC = document.getElementById("tempC");
var tempF = document.getElementById("tempF");
var drukMb = document.getElementById("pressureMb");
var drukPsi = document.getElementById("drukPsi");
var drukHpa = document.getElementById("drukHpa");
var drukP = document.getElementById("drukP");
var vochtigheid = document.getElementById("vochtigheid");
tempC.innerHTML = parseFloat(apiData.temperatuur-.C).naarVast(2) + "°C";
tempF.innerHTML = parseFloat(apiData.temperatuur-.V).naar Vast(2) + "°F";
drukMb.innerHTML = parseFloat(apiData.druk.mb).toVast(2) + "mb";
drukPsi.innerHTML = parseFloat(apiData.druk.psi).toVast(2) + "psi";
drukHpa.innerHTML = parseFloat(apiData.druk.hPa).naarVast(2) + "hPa";
drukP.innerHTML = parseFloat(apiData.druk.P).naar Vast(2) + "P";
vochtigheid.innerHTML = parseFloat(apiData.vochtigheid).naarVast(2) + "%";

functie-app()
venster.setInterval(functie()
getAPIData();
, 5000);

app();

Druk vervolgens op + X gevolgd door Y en om de te redden app.js het dossier.

Hier voert lijn 1 de hoofd() functie wanneer de webpagina klaar is met laden. In de hoofd() functie, de getAPIData() functie haalt de weer-API-gegevens op met behulp van AJAX en roept de bijwerken() functie (in regel 10) zodra de gegevens met succes zijn opgehaald. De bijwerken() functie werkt het webpagina-element bij met behulp van de API-gegevens.

In regel 20, de document.getElementById() methode wordt gebruikt om de referentie van het webpagina-element te krijgen met de id tempC. Regel 28 wordt gebruikt om de inhoud van het webpagina-element met de id . te vervangen tempC met de temperatuur (in Celsius) van de API. Op dezelfde manier wordt de inhoud van alle webelementen (regels 21-26) vervangen door hun respectievelijke API-gegevens.

In de app() functie, de getAPIData() wordt elke 5 seconden (5000 milliseconden) gebeld om de weergegevens up-to-date te houden in de weer-app. Eindelijk, in regel 46, de app() functie wordt uitgevoerd.

Voer de volgende opdracht in om de web-app te testen:

$ FLASK_APP=server.py flask run --host=0.0.0.0

De weer-app zou op poort 5000 moeten draaien (standaard).

Voer de volgende opdracht uit om te testen of de Weather API werkt:

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

Zoals u kunt zien, worden de Weather API-gegevens afgedrukt naar de console. Daarom werkt de API.

Om de Weer-app te testen, gaat u naar http://localhost:5000 vanuit een Chromium-webbrowser. De Weer-app moet in de webbrowser worden geladen, maar er mogen eerst geen weergegevens worden weergegeven.

Na een paar seconden moet de weer-app klaar zijn met het ophalen van de weergegevens van de API en deze weergeven.

U kunt op elk moment op drukken + C om de webserver te stoppen.

Systemd-service maken voor de weerwebapp

In dit gedeelte laten we u zien hoe u een systemd-servicebestand voor de weer-app maakt, zodat deze automatisch start bij het opstarten.

Maak eerst een weerstation.onderhoud bestand als volgt in uw projectdirectory:

$ nano weerstation.onderhoud

Voer de volgende regels code in de weerstation.onderhoud het dossier.

[Eenheid]
Description=Web-app Raspberry Pi-weerstation met Raspberry Pi Sense Hat
Na=netwerk.doelwit
[Onderhoud]
WorkingDirectory=/home/pi/werk
Omgeving=FLASK_APP=server.py
Omgeving=FLASK_ENV=productie
ExecStart=/usr/bin/flask run --host=0.0.0.0
StandardOutput=overnemen
StandardError=overnemen
Opnieuw opstarten=altijd
Gebruiker=pi
[Installeren]
WantedBy=meerdere gebruikers.doelwit

Druk vervolgens op + X gevolgd door Y en om de te redden weerstation.onderhoud het dossier.

Kopieer de weerstation.onderhoud bestand naar de /etc/systemd/system/ map met het volgende commando:

$ sudo cp -v weerstation.service /etc/systemd/system/

Laad de systemd-daemons opnieuw om de wijzigingen als volgt door te voeren:

$ sudo systemctl daemon-reload

De weerstation systemd-service zou op dit moment inactief moeten zijn, zoals weergegeven in de onderstaande schermafbeelding.

$ sudo systemctl status weerstation.onderhoud

Start de weerstation service met het volgende commando:

$ sudo systemctl start weerstation.onderhoud

Zoals je kunt zien, is de weerstation service is nu actief.

$ sudo systemctl status weerstation.onderhoud

Nu dat de weerstation service werkt, kunt u deze toevoegen aan het opstarten van het systeem van Raspberry Pi OS met de volgende opdracht:

$ sudo systemctl weerstation inschakelen.onderhoud

Start je Raspberry Pi opnieuw op met de volgende opdracht:

$ sudo opnieuw opstarten

Zodra je Raspberry Pi opstart, zal de weerstation service zou moeten draaien, zoals weergegeven in de onderstaande schermafbeelding.

$ sudo systemctl status weerstation.onderhoud

Toegang tot de weer-app vanaf andere apparaten

Om toegang te krijgen tot de weer-app vanaf andere apparaten in je thuisnetwerk, moet je het IP-adres van je Raspberry Pi weten. U kunt het IP-adres van uw Raspberry Pi 4 vinden via de webbeheerinterface van uw thuisrouter. In ons geval is het IP-adres 192.168.0.103, maar dit adres zal voor jou anders zijn, dus zorg ervoor dat je dit adres vervangt door het jouwe in alle volgende stappen.

Als je toegang hebt tot de Raspberry Pi-console, kun je de volgende opdracht uitvoeren om ook het IP-adres te vinden:.

$ hostnaam -I

Zodra je het IP-adres van je Raspberry Pi weet, heb je er toegang toe vanaf elk apparaat in je thuisnetwerk. Zoals te zien is in de onderstaande schermafbeelding, hebben we de weer-app geopend vanaf een Android-smartphone.

Conclusie

In dit artikel hebben we je laten zien hoe je de Raspberry Pi Sense Hat kunt gebruiken om een ​​Raspberry Pi weerstation te bouwen. We gebruikten de zin-hat Python-bibliotheek om weergegevens te extraheren uit de Raspberry Pi Sense Hat. Vervolgens hebben we het Flask Python micro-webframework gebruikt om een ​​weer-API en een webtoepassing te maken. De web-app ontvangt elke 5 seconden de weergegevens van de weer-API om de web-app up-to-date te houden met de nieuwste weergegevens.

OpenTTD versus Simutrans
Je eigen transportsimulatie maken kan leuk, ontspannend en buitengewoon aanlokkelijk zijn. Daarom moet je ervoor zorgen dat je zoveel mogelijk spellen...
OpenTTD-zelfstudie
OpenTTD is een van de meest populaire simulatiegames voor bedrijven die er zijn. In dit spel moet je een geweldig transportbedrijf creëren. U begint e...
SuperTuxKart voor Linux
SuperTuxKart is een geweldige titel die is ontworpen om je de Mario Kart-ervaring gratis te bieden op je Linux-systeem. Het is behoorlijk uitdagend en...