Zbuduj własną stację pogodową Raspberry Pi

Build Your Own Raspberry Pi Weather Station



Raspberry Pi Sense Hat to dodatkowa płytka, która może być używana z komputerami jednopłytowymi Raspberry Pi. Raspberry Pi Sense Hat ma wyświetlacz 8×8 ​​LED i 5-przyciskowy joystick oraz jest wyposażony w następujące czujniki:

  1. Żyroskop
  2. Akcelerometr
  3. Magnetometr
  4. Temperatura
  5. Ciśnienie barometryczne
  6. Wilgotność

W tym artykule pokażę, jak stworzyć aplikację internetową stacji pogodowej opartą na API Pythona za pomocą temperatura , ciśnienie barometryczne , oraz wilgotność czujniki Raspberry Pi Sense Hat. Aby śledzić ten artykuł, będziesz potrzebować:







  1. Raspberry Pi 3 lub Raspberry Pi 4 z łącznością sieciową.
  2. Moduł Raspberry Pi Sense Hat.
  3. Zasilacz micro-USB (Raspberry Pi 3) lub USB Type-C (Raspberry Pi 4).
  4. Karta microSD 16 GB lub 32 GB z Raspberry Pi OS.
  5. Laptop lub komputer stacjonarny do zdalnego dostępu do pulpitu VNC lub dostępu SSH do Raspberry Pi.

NOTATKA: W tym artykule połączymy się zdalnie z Raspberry Pi przez VNC lub SSH, korzystając z bezgłowej konfiguracji Raspberry Pi. Jeśli nie chcesz uzyskać zdalnego dostępu do Raspberry Pi przez SSH lub VNC, musisz podłączyć monitor, klawiaturę i mysz do Raspberry Pi.



Aby dowiedzieć się, jak sflashować obraz Raspberry Pi OS na kartę microSD, zapoznaj się z artykułem Jak zainstalować i używać Raspberry Pi Imager . Jeśli potrzebujesz pomocy w instalacji Raspberry Pi OS na swoim Raspberry Pi, przeczytaj Jak zainstalować system operacyjny Raspberry Pi na Raspberry Pi 4? . Jeśli potrzebujesz pomocy z bezgłową konfiguracją Raspberry Pi, sprawdź Jak zainstalować i skonfigurować Raspberry Pi OS na Raspberry Pi 4 bez zewnętrznego monitora .



Podłączanie kapelusza Raspberry Pi Sense do Raspberry Pi

Zestaw Raspberry Pi Sense Hat jest dostarczany z płytą dodatkową Raspberry Pi Sense Hat, 40-stykowym złączem męskim-żeńskim oraz kilkoma śrubami i przekładkami.





Zanim będziesz mógł podłączyć płytkę Sense Hat do Raspberry Pi, musisz podłączyć 40-pinowe złącze do Sense Hat. Podłącz męskie styki 40-stykowego złącza męsko-żeńskiego do Sense Hat, jak pokazano na poniższych obrazkach.



Komputery jednopłytkowe Raspberry Pi mają 4 otwory, które można wykorzystać do zamocowania płytek dodatkowych lub obudowy. Aby przymocować płytkę dodatkową, włóż śruby z tyłu Raspberry Pi, jak pokazano na poniższych obrazkach.

Następnie przymocuj podkładkę do śruby.

Po dodaniu wszystkich czterech śrub i przekładek Twój Raspberry Pi powinien wyglądać tak, jak pokazano na poniższym obrazku.

Podłącz Raspberry Pi Sense Hat do 40-pinowego męskiego złącza GPIO Raspberry Pi, jak pokazano na poniższych obrazkach.

NOTATKA: Zachowaj ostrożność podczas odłączania Raspberry Pi Sense Hat od 40-pinowego złącza GPIO Raspberry Pi, aby uniknąć zgięcia pinów Raspberry Pi GPIO.

Za pomocą czterech pozostałych śrub przymocuj Raspberry Pi Sense Hat, jak pokazano na poniższych obrazkach.

Włączanie Raspberry Pi

Teraz, gdy Raspberry Pi Sense Hat jest podłączony do Raspberry Pi, włóż kartę microSD z Raspberry Pi OS do gniazda karty microSD Raspberry Pi, podłącz kabel zasilający do Raspberry Pi i włącz go.

Instalowanie biblioteki Raspberry Pi Sense Hat Python

Aby użyć Raspberry Pi Sense Hat na Raspberry Pi, nakrycie głowy W Raspberry Pi OS musi być zainstalowana biblioteka Python. ten nakrycie głowy Biblioteka jest dostępna w oficjalnym repozytorium pakietów Raspberry Pi OS.

Aby zainstalować Raspberry Pi nakrycie głowy Biblioteka Pythona na Raspberry Pi OS, najpierw zaktualizuj pamięć podręczną repozytorium pakietów APT za pomocą następującego polecenia:

$ sudo apt aktualizacja

Następnie uruchom następujące polecenie:

$ sudo apt install sense-hat -y

Instalowanie biblioteki Flask Micro Web Framework Pythona

Do stworzenia naszej aplikacji pogodowej użyjemy frameworka Flask Python. Możesz zainstalować Flask z oficjalnego repozytorium pakietów Raspberry Pi OS za pomocą następującego polecenia:

$ sudo apt install python3-flask -y

Tworzenie katalogu projektów

Dobrym pomysłem jest utworzenie katalogu projektu w celu uporządkowania plików projektu. Aby utworzyć katalog projektu ~/praca , użyj następującego polecenia:

$ mkdir ~/praca

Po utworzeniu katalogu projektu przejdź do katalogu projektu w następujący sposób:

$ cd ~/praca

Testowanie kapelusza Raspberry Pi Sense

Aby sprawdzić, czy Raspberry Pi Sense Hat działa, możemy napisać prosty testowy skrypt w Pythonie. Możesz stworzyć nowy skrypt Pythona o nazwie test.py z nano edytor tekstu w następujący sposób:

$ nano test.py

Wprowadź następujący kod w test.py plik. Import linii 1 SenseHat od kapelusz_sensu moduł, linia 3 tworzy a SenseHat obiekt i przechowuje odwołanie w sens zmienna, a linie 5–6 ustawiają kolor wszystkich diod LED 8×8 na czerwony. Gdy skończysz, naciśnij + x śledzony przez ORAZ oraz .

Możesz uruchomić test.py Skrypt Pythona z następującym poleceniem:

$ python3 test.py

Matryca LED 8×8 powinna świecić się na czerwono, jak pokazano na poniższym obrazku.

Aby wyłączyć diody LED Sense Hat, uruchom jasne() metoda bez żadnej wartości koloru w test.py Skrypt Pythona, jak pokazano na poniższym zrzucie ekranu, i uruchom test.py Znowu skrypt Pythona.

Diody LED Sense Hat powinny być teraz wyłączone, jak pokazano na poniższym obrazku.

Jeśli Sense Hat działa prawidłowo, przejdź do następnej sekcji.

Pobieranie danych pogodowych z Sense Hat

Możesz bardzo łatwo uzyskać dane czujnika z Sense Hat za pomocą nakrycie głowy Biblioteka Pythona. Aby pobrać dane z czujników z Sense Hat, możesz utworzyć nowy skrypt w języku Python read_sensor_data.py następująco:

$ nano read_sensor_data.py

Wprowadź następujący kod w read_sensor_data.py Plik Pythona.

zkapelusz_sensuimportSenseHat
z czas importspać
sens=SenseHat()
sens.jasne()
podczas Prawdziwe:
tempC=sens.pobierz_temperaturę()
tempF=tempC *(9/5)+32
nacisk=sens.get_pressure()
wilgotność=sens.uzyskać_wilgotność()

wydrukować('Temperatura: %.2f°C/%.2f°F '%(tempC,tempF))
wydrukować('Ciśnienie: %.2f mb '%(nacisk))
wydrukować('Wilgotność: %.2f%% '%(wilgotność))
spać(5)

Gdy skończysz, naciśnij + x śledzony przez ORAZ oraz .

W powyższym kodzie wiersze 1 i 2 importują wszystkie wymagane biblioteki, wiersz 4 tworzy a SenseHat obiekt, a linia 5 wyłącza wszystkie diody LED Sense Hat za pomocą jasne() metoda. Pętla while w linii 7 jest nieskończoną pętlą, która będzie uruchamiać kod w liniach 8-16 na zawsze.

W wierszu 8 pobierz_temperaturę() Metoda służy do odczytu danych temperatury (w stopniach Celsjusza) z czujnika wilgotności Sense Hat. W wierszu 9 dane dotyczące temperatury są konwertowane ze stopni Celsjusza na stopnie Fahrenheita. W wierszu 10, pobierz_ciśnienie() Metoda służy do odczytu danych dotyczących ciśnienia powietrza (w milibarach) z czujnika ciśnienia Sense Hat. W wierszu 11 pobierz_wilgotność() Metoda służy do odczytu danych dotyczących wilgotności (w %) z czujnika wilgotności Sense Hat.

Wiersze 13–15 służą do drukowania danych z czujnika na konsoli, a wiersz 16 służy do odczekania 5 sekund przed ponownym odczytaniem danych z czujnika.

Możesz uruchomić read_sensor_data.py Skrypt Pythona w następujący sposób:

$ python3 read_sensor_data.py

Po uruchomieniu skryptu dane czujnika zostaną wydrukowane na konsoli.

Teraz, gdy możemy odczytać dane czujnika z Sense Hat, naciśnij + C aby zatrzymać program.

Tworzenie aplikacji internetowej stacji pogodowej

W tej sekcji pokażemy, jak używać frameworka internetowego Python Flask do tworzenia interfejsu API pogody i aplikacji pogodowej. Aplikacja pogodowa uzyska dostęp do API danych pogodowych i pokaże dane pogodowe w czasie rzeczywistym. Cały kod omówiony w tej sekcji jest dostępny na GitHub pod adresem shovon8 / aplikacja-pogoda-malina-pi-sense .

Najpierw utwórz serwer.py Skrypt Pythona w katalogu projektu w następujący sposób:

$ nano serwer.py

Wprowadź następujący kod w serwer.py Plik Pythona.

zkolbaimportKolba
zkolbaimportjsonify
zkolbaimportrender_template
zkolbaimporturl_for
zkapelusz_sensuimportSenseHat
aplikacja=Kolba(__Nazwa__)
aplikacja.konfiguracja[„SEND_FILE_MAX_AGE_DEFAULT”] = 0
sens=SenseHat()
sens.jasne()
zaplikacja.test_request_context():
url_for('statyczny',Nazwa pliku=„styl.css”)
url_for('statyczny',Nazwa pliku=„app.js”)
@aplikacja.trasa('/ogień')
definitywnieogień():
tempC=sens.pobierz_temperaturę()
tempF=tempC *(9/5)+32
nacisk=sens.get_pressure()
ciśnieniePsi=nacisk *0,0145038
ciśnienieP=nacisk *100
wilgotność=sens.uzyskać_wilgotność()

powrótjsonify({
'temperatura':{ 'C': tempC, 'F': tempF},
'nacisk':{ „mb”: nacisk, „hPa”: nacisk,
„psi”: ciśnienie Psi, 'P': ciśnienieP},
'wilgotność': wilgotność
})
@aplikacja.trasa('/')
definitywnieDom():
powrótrender_template('./home.html')

Następnie wciśnij + x śledzony przez ORAZ oraz uratować serwer.py Skrypt Pythona.

W powyższym kodzie wiersze 1-5 importują wszystkie wymagane biblioteki, wiersz 7 tworzy aplikację Flask, wiersz 11 tworzy obiekt SenseHat, a wiersz 12 wyłącza wszystkie diody LED Sense Hat. Linia 8 wyłącza buforowanie sieci Web dla aplikacji Flask. Ponieważ ta aplikacja jest lekka, nie ma potrzeby buforowania. Jeśli chcesz zmodyfikować aplikację, wyłączenie buforowania sieci Web znacznie ułatwi testowanie.

Linie 18–31 odczytują dane czujnika z Sense Hat i zwracają dane API w formacie JSON na żądanie HTTP GET w /ogień punkt końcowy serwera WWW. Wiersze od 37 do 39 zwracają stronę główną aplikacji pogodowej na / punkt końcowy serwera WWW. Strona główna jest renderowana z home.html plik, który powinien znajdować się w szablony/ katalog katalogu projektu.

Linie 14-16 służą do umożliwienia dostępu do styl.css oraz app.js pliki statyczne. Te pliki powinny znajdować się w statyczny/ katalog katalogu projektu. ten styl.css plik jest używany do stylizacji home.html strona główna, a app.js plik służy do żądania danych API z /ogień punkt końcowy i zaktualizuj dane pogodowe na home.html stronę co 5 sekund.

Utwórz statyczny/ oraz szablony/ katalog w katalogu projektu w następujący sposób:

$ mkdir -v {statyczne,szablony}

Stwórz home.html plik w szablony/ katalog w następujący sposób:

$ szablony nano/home.html

Wprowadź następujący kod w home.html plik.


< html >
< głowa >
< meta Nazwa=„widnia” zadowolony='szerokość=szerokość-urządzenia, początkowa skala=1.0'>
< tytuł >Stacja pogodowa Raspberry Pi</ tytuł >
< połączyć rel=„arkusz stylów” rodzaj=„tekst/css”
href='{{ url_for('static', file) }}'/>
</ głowa >
< ciało >
< div NS='zadowolony'>
< h1 >Stacja pogodowa Raspberry Pi</ h1 >

< div klasa=„zawartość danych”>
< h2 >Temperatura</ h2 >
< div klasa=„wiersz danych”>
< div klasa=„komórka danych” NS=„TempC”>
...
</ div >
< div klasa=„komórka danych” NS='tempF'>
...
</ div >
</ div >
</ div >

< div klasa=„zawartość danych”>
< h2 >Nacisk</ h2 >
< div klasa=„wiersz danych”>
< div klasa=„komórka danych” NS='ciśnienieMb'>
...
</ div >
< div klasa=„komórka danych” NS=„ciśnieniePsi”>
...
</ div >
</ div >
< div klasa=„wiersz danych”>
< div klasa=„komórka danych” NS=„ciśnienieHpa”>
...
</ div >
< div klasa=„komórka danych” NS=„ciśnienieP”>
...
</ div >
</ div >
</ div >

< div klasa=„zawartość danych”>
< h2 >Wilgotność</ h2 >
< div klasa=„wiersz danych”>
< div klasa=„komórka danych” NS='wilgotność'>
...
</ div >
</ div >
</ div >
</ div >

< scenariusz rodzaj=„tekst/skrypt JavaScript” src='{{ url_for('static', file) }}'></ scenariusz >
</ ciało >
</ html >

Następnie wciśnij + x śledzony przez ORAZ oraz uratować home.html plik.

Stwórz styl.css plik w statyczny/ katalog w następujący sposób:

$ nano static/style.css

Wprowadź następujące kody w styl.css plik.

@import adres URL(„https://fonts.googleapis.com/css2?family=Roboto&display=swap”);
* {
wyściółka: 0;
margines: 0;
rodzina czcionek: 'Robot', bezszeryfowy;
}
ciało{
tło: # 737373;
}
h1{
wyświetlacz: blok;
kolor: #79DC7B;
wyrównanie tekstu: środek;
grubość czcionki: 400;
tło: # 000;
wyściółka: 0.5em 0;
}
h2{
wyświetlacz: blok;
tło: # 000;
kolor: #ffff;
wyrównanie tekstu: środek;
grubość czcionki: 400;
rozmiar czcionki: 1em;
}
.zawartość-danych {
margines: 10px;
granica: 2px solidny czarny;
promień-granicy: 5px;
kolor tła: #79DC7B;
}
.wiersz danych {
wyświetlacz:przewód;
kierunek ugięcia:wiersz;
}
.data-komórka {
szerokość: 100%;
wzrost: 80px;
wyświetlacz:przewód;
wyrównaj-elementy: środek;
uzasadnić-treść: środek;
grubość czcionki: pogrubiony;
rozmiar czcionki: 1,5 em;
kolor: # 006902;
}
.data-komórka:unosić się {
tło: # FFE891;
kolor: #AA8600;
kursor: wskaźnik;
}

Następnie wciśnij + x śledzony przez ORAZ oraz uratować styl.css plik.

Stworzyć app.js plik w statyczny/ katalog w następujący sposób:

$ nano statyczne/app.js

Wprowadź następujący kod w app.js plik.

okno.addEventListener('Załaduj',Główny);
funkcjonowaćGłówny() {
funkcjonowaćpobierz dane API() {
gdziehttp= NowyŻądanie XMLHttp();

http.onreadystatechange = funkcjonować() {
Jeśli(ten.stan gotowości === 4 && ten.status === 200) {
aktualizacja(JSON.analizować(ten.tekst odpowiedzi));
}
}

http.otwarty('DOSTWAĆ', '/ogień', prawda);
http.wysłać();
}


funkcjonowaćaktualizacja(apiData) {
gdzietempC=dokument.getElementById(„TempC”);
gdzietempF=dokument.getElementById('tempF');
gdzieciśnienieMb=dokument.getElementById('ciśnienieMb');
gdzieciśnieniePsi=dokument.getElementById(„ciśnieniePsi”);
gdzieciśnienieHpa=dokument.getElementById(„ciśnienieHpa”);
gdzieciśnienieP=dokument.getElementById(„ciśnienieP”);
gdziewilgotność=dokument.getElementById('wilgotność');

temp.C.wewnętrznyHTML =parseFloat(apiData.temperatura.C).do Naprawiono(2) + „° C”;
tempF.wewnętrznyHTML =parseFloat(apiData.temperatura.F).do Naprawiono(2) + „°F”;

ciśnienieMb.wewnętrznyHTML =parseFloat(apiData.nacisk.mb).do Naprawiono(2) + „mb”;
ciśnieniePsi.wewnętrznyHTML =parseFloat(apiData.nacisk.psi).do Naprawiono(2) + „psi”;
ciśnienieHpa.wewnętrznyHTML =parseFloat(apiData.nacisk.hPa).do Naprawiono(2) + 'hPa';
ciśnienieP.wewnętrznyHTML =parseFloat(apiData.nacisk.P).do Naprawiono(2) + ' P';

wilgotność.wewnętrznyHTML =parseFloat(apiData.wilgotność).do Naprawiono(2) + '%';
}


funkcjonowaćaplikacja() {
okno.ustaw interwał(funkcjonować() {
pobierz dane API();
}, 5000);
}

aplikacja();
}

Następnie wciśnij + x śledzony przez ORAZ oraz uratować app.js plik.

Tutaj linia 1 prowadzi Główny() funkcja po zakończeniu ładowania strony internetowej. w Główny() funkcja, pobierz dane API () funkcja pobiera dane API pogody za pomocą AJAX i wywołuje aktualizacja() funkcja (w wierszu 10) po pomyślnym pobraniu danych. ten aktualizacja() funkcja aktualizuje element strony internetowej za pomocą danych API.

W wierszu 20 document.getElementById() Metoda służy do uzyskania odwołania do elementu strony internetowej o identyfikatorze tempC . Linia 28 służy do zastąpienia treści elementu strony internetowej, który ma identyfikator tempC z temperaturą (w stopniach Celsjusza) z API. W ten sam sposób zawartość wszystkich elementów internetowych (linie 21–26) jest zastępowana odpowiednimi danymi API.

w aplikacja() funkcja, pobierz dane API () jest wywoływana co 5 sekund (5000 milisekund), aby zapewnić aktualność danych pogodowych w aplikacji pogodowej. Wreszcie, w wierszu 46, aplikacja() funkcja jest wykonywana.

Aby przetestować aplikację internetową, wpisz następujące polecenie:

$ FLASK_APP=server.py kolba uruchom --host=0.0.0.0

Aplikacja pogodowa powinna działać na porcie 5000 (domyślnie).

Aby sprawdzić, czy interfejs Weather API działa, uruchom następujące polecenie:

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

Jak widać, dane Weather API są drukowane na konsoli. Dlatego API działa.

Aby przetestować aplikację Pogoda, odwiedź http://localhost:5000 z przeglądarki internetowej Chromium. Aplikacja Pogoda powinna być załadowana w przeglądarce internetowej, ale na początku nie powinny być wyświetlane żadne dane pogodowe.

Po kilku sekundach aplikacja pogodowa powinna zakończyć pobieranie danych pogodowych z API i wyświetlić je.

W dowolnym momencie możesz nacisnąć + C aby zatrzymać serwer WWW.

Tworzenie usługi Systemd dla aplikacji Weather Web

W tej sekcji pokażemy, jak utworzyć plik usługi systemd dla aplikacji pogodowej, aby uruchamiał się automatycznie po uruchomieniu.

Najpierw utwórz stacja pogodowa.serwis plik w katalogu projektu w następujący sposób:

$Nano stacja pogodowa.serwis

Wprowadź następujące wiersze kodu w stacja pogodowa.serwis plik.

[Jednostka]
Opis=Aplikacja internetowa stacji pogodowej Raspberry Pi wykorzystująca Raspberry Pi Sense Hat
Po=sieć.cel

[Praca]
Katalog Roboczy=/dom/pi/praca
Środowisko=FLASK_APP=server.py
Środowisko=FLASK_ENV=produkcja
ExecStart=/usr/bin/flask run --host=0.0.0.0
StandardOutput=dziedzicz
Błąd standardowy=dziedziczy
Uruchom ponownie = zawsze
Użytkownik=pi

[Zainstalować]
WantedBy=wielu użytkowników.cel

Następnie wciśnij + x śledzony przez ORAZ oraz uratować stacja pogodowa.serwis plik.

Skopiuj stacja pogodowa.serwis plik do /etc/systemd/system/ katalog za pomocą następującego polecenia:

$ sudo cp -v stacja pogodowa.service /etc/systemd/system/

Przeładuj demony systemd, aby zmiany zaczęły obowiązywać w następujący sposób:

$ sudo systemctl demon-reload

ten stacja pogodowa usługa systemd powinna być w tej chwili nieaktywna, jak pokazano na poniższym zrzucie ekranu.

$ sudo systemctl status weather-station.service

Zacząć stacja pogodowa usługa za pomocą następującego polecenia:

$ sudo systemctl start weather-station.service

Jak widać, stacja pogodowa usługa jest teraz uruchomiona.

$ sudo systemctl status weather-station.service

Teraz, gdy stacja pogodowa usługa działa, możesz dodać ją do startu systemu Raspberry Pi OS za pomocą polecenia:

$ sudo systemctl włącz stację pogodową

Uruchom ponownie Raspberry Pi za pomocą następującego polecenia:

$ restart sudo

Po uruchomieniu Raspberry Pi, stacja pogodowa usługa powinna być uruchomiona, jak pokazano na poniższym zrzucie ekranu.

$ sudo systemctl status weather-station.service

Uzyskiwanie dostępu do aplikacji pogodowej z innych urządzeń

Aby uzyskać dostęp do aplikacji pogodowej z innych urządzeń w sieci domowej, musisz znać adres IP swojego Raspberry Pi. Adres IP Raspberry Pi 4 można znaleźć w interfejsie zarządzania siecią routera domowego. W naszym przypadku adres IP to 192.168.0.103, ale ten adres będzie dla Ciebie inny, więc pamiętaj o zastąpieniu tego adresu swoim we wszystkich kolejnych krokach.

Jeśli masz dostęp do konsoli Raspberry Pi, możesz uruchomić następujące polecenie, aby znaleźć również adres IP.

$ nazwa hosta -I

Gdy znasz adres IP swojego Raspberry Pi, możesz uzyskać do niego dostęp z dowolnego urządzenia w sieci domowej. Jak pokazano na poniższym zrzucie ekranu, uzyskaliśmy dostęp do aplikacji pogodowej ze smartfona z Androidem.

Wniosek

W tym artykule pokazaliśmy, jak wykorzystać Raspberry Pi Sense Hat do zbudowania stacji pogodowej Raspberry Pi. Użyliśmy nakrycie głowy Biblioteka Pythona do wyodrębniania danych pogodowych z Raspberry Pi Sense Hat. Następnie wykorzystaliśmy framework sieciowy Flask Python micro do stworzenia interfejsu API pogody i aplikacji internetowej. Aplikacja internetowa pobiera dane pogodowe z interfejsu API pogody co 5 sekund, aby aktualizować aplikację internetową o najnowsze dane pogodowe.