Spisu treści:

Inteligentny rozproszony system monitorowania pogody IoT przy użyciu NodeMCU: 11 kroków
Inteligentny rozproszony system monitorowania pogody IoT przy użyciu NodeMCU: 11 kroków

Wideo: Inteligentny rozproszony system monitorowania pogody IoT przy użyciu NodeMCU: 11 kroków

Wideo: Inteligentny rozproszony system monitorowania pogody IoT przy użyciu NodeMCU: 11 kroków
Wideo: Wielkie dane, wielki problem - Inteligentne rozmowy - ElasticStack z Kafką? Dystrybucja danych 2024, Lipiec
Anonim
Inteligentny rozproszony system monitorowania pogody IoT za pomocą NodeMCU
Inteligentny rozproszony system monitorowania pogody IoT za pomocą NodeMCU

Wszyscy możecie być świadomi tradycyjnej stacji pogodowej; ale czy zastanawiałeś się kiedyś, jak to właściwie działa? Ponieważ tradycyjna stacja pogodowa jest kosztowna i nieporęczna, gęstość tych stacji na jednostkę powierzchni jest bardzo mniejsza, co przyczynia się do niedokładności danych. Wyjaśnię ci, jak: Załóżmy, że stacja znajduje się w środku miasta i jest jedyną stacją, która znajduje się w promieniu „x” metra, może być łatwo zafałszowana, jeśli w pobliżu znajduje się jakikolwiek czynnik powodujący zanieczyszczenie stacji pokazującej cały obszar o promieniu „x” jako zanieczyszczony, ponieważ ta pojedyncza stacja jest odpowiedzialna za określenie danych pogodowych dla całego obszaru.

Aby przezwyciężyć ten problem, należy zwiększyć gęstość modułów, co jest możliwe tylko wtedy, gdy moduły są tańsze i zajmują mniej miejsca niż istniejący.

To jest powód, dla którego moje zaproponowane przeze mnie rozwiązanie jest idealnym rozwiązaniem tego problemu. Kosztuje mniej niż 10 dolarów, a także łatwo spoczywa na mojej dłoni.

Jak to działa…

Ten projekt składa się z 3 głównych części.

Strona urządzenia:

Urządzenie to pokazany na obrazku moduł IoT, który przesyła dane pogodowe na serwer w odstępach czasu „x”. Dane obejmują rzeczywiste dane pogodowe, położenie geograficzne modułu; tj. jego współrzędne, jego adres MAC; aby jednoznacznie zidentyfikować urządzenie, wersję oprogramowania, na której aktualnie działa. Strona urządzenia składa się z N-modułów rozmieszczonych na całym obszarze, aktywnie przesyłających dane do serwera.

Po stronie serwera:

Jak sama nazwa wskazuje, jest to scentralizowany serwer, który obsługuje kilka operacji, takich jak odbieranie danych z modułów i przechowywanie ich w bazie danych, aktualizacja modułu do najnowszego oprogramowania, jeśli działa na starszej wersji, wysyłanie danych pogodowych do klient na życzenie.

Strona klienta/użytkownika:

To użytkownik końcowy żąda od serwera danych o pogodzie. Klient wysyła aktualną lokalizację i na podstawie lokalizacji serwer oblicza odległość między klientem a wszystkimi modułami i wysyła dane pogodowe najbliższego modułu do klienta, który uważa się za dokładny.

Kieszonkowe dzieci

  • NodeMCU (ESP8266-12E)
  • DHT11 (czujnik wilgotności i temperatury)
  • BMP180 (czujnik ciśnienia i temperatury)
  • MQ-135 (czujnik wskaźnika jakości powietrza)
  • kabel USB (do wgrania programu)
  • Zasilanie 5 V
  • Kondensatory (opcjonalnie: do umieszczenia równolegle do linii energetycznej)
  • Arduino IDE (do debugowania i wgrania programu)
  • Aplikacja POSTMAN (opcjonalnie: do debugowania API)
  • Strona internetowa (do obsługi serwera PHP i MySQL)

Krok 1: Przylutuj wszystkie komponenty i prześlij program do NodeMCU

Przylutuj Wszystkie Komponenty i prześlij Program do NodeMCU
Przylutuj Wszystkie Komponenty i prześlij Program do NodeMCU
Przylutuj Wszystkie Komponenty i prześlij Program do NodeMCU
Przylutuj Wszystkie Komponenty i prześlij Program do NodeMCU

Przylutuj wszystkie komponenty do NodeMCU, jak pokazano na schemacie obwodu na płycie perf. Ponadto przylutuj kondensator równolegle do linii energetycznych, ponieważ podczas aktywnego przesyłania i odbierania danych napięcie wzrasta.

Po zakończeniu prac lutowniczych wgraj kod podany w pliku "code.c".

Uwaga: Nie zapomnij zastąpić poświadczeń własnymi poświadczeniami. Umieść również plik o nazwie „html_file.h” w folderze szkicu arduino. Wszystkie pliki nagłówkowe używane w tym projekcie można znaleźć tutaj

Cechy kodu:

Punkt dostępowy: Ponieważ trudno jest zaprogramować każdy moduł z danymi uwierzytelniającymi w masowej produkcji, przy pierwszym uruchomieniu moduł udostępnia stronę internetową, która akceptuje dane uwierzytelniające Wi-Fi, z którym moduły muszą się połączyć, i przechowuje ją w pamięci EEPROM do późniejszego wykorzystania.

Po skonfigurowaniu poświadczeń NodeMCU sprawdza EEPROM pod kątem poświadczeń i łączy się z poświadczeniami WiFi obecnymi w EEPROM.

Po udanym połączeniu się z WiFi, NodeMCU zaczyna przesyłać dane na serwer co interwał „x”, dane obejmują dane pogodowe, adres MAC modułu, wersję oprogramowania, położenie geograficzne urządzenia.

Aktualizacja OTA: Moduł sprawdza również dostępność nowej aktualizacji oprogramowania codziennie o określonej godzinie określonej w kodzie. Ta funkcja jest przydatna, ponieważ żaden producent nie może kontynuować i zmieniać programu pojedynczego modułu w przypadku konieczności wprowadzenia jakichkolwiek zmian.

Watchdog Timer: Atlast musi istnieć sposób na odzyskanie siebie bez interwencji człowieka, jeśli utknie lub ulegnie awarii. Można to osiągnąć za pomocą timera Watchdog. Działa to w następujący sposób: istnieje podprocedura przerwania, która działa co sekundę. ISR zwiększa licznik za każdym razem, gdy jest wykonywany i sprawdza, czy licznik osiągnął maksymalną wartość. Gdy licznik osiągnie wartość maksymalną, moduł resetuje się, zakładając, że uległ awarii. Podczas normalnej pracy licznik zawsze jest resetowany, zanim osiągnie maksymalną wartość.

Krok 2: Konfiguracja serwera SQL

Konfiguracja serwera SQL
Konfiguracja serwera SQL

Konfiguracja SQL Server jest również bardzo prosta. Po prostu utwórz bazę danych na serwerze SQL i zaimportuj ustawienia, importując plik o nazwie „database_structure.txt”. Możesz znaleźć plik w tym kroku. Ponieważ instrukcje nie pozwalają na przesyłanie plików „.sql”, zmieniłem nazwę pliku na „.txt”.

Uwaga: Zmień nazwę pliku z „.txt” na „.sql”.

Krok 3: Konfiguracja serwera plików

Konfiguracja serwera jest naprawdę łatwa, jeśli jesteś właścicielem strony internetowej i jest ona hostowana online. Nie będę przechodził przez całą procedurę zakładania strony internetowej i jej hostingu, ponieważ wykracza to poza zakres tego samouczka. Ale możesz umieścić go na swoim komputerze jako localhost, aby wypróbować działanie plików.

Ponieważ Instructable nie pozwala na przesyłanie plików PHP, zmieniłem nazwy plików na ".txt".

Uwaga: Zmień nazwę rozszerzenia plików na ".php". Nie zapomnij również zmienić poświadczeń pliku "config.php".

Wystarczy wgrać pliki na serwer i gotowe.

Dam ci krótką informację o plikach PHP.

db_config.php:

W tym pliku przechowywane są wszystkie poświadczenia wymagane do połączenia z serwerem SQL.

db_connect:

W tym pliku znajduje się klasa potrzebna do połączenia z bazą danych.

wstaw.php:

NodeMCU wywołuje ten plik PHP w celu przesłania danych na serwer przy użyciu metody GET. Ten plik jest również odpowiedzialny za przechowywanie tych samych danych na serwerze SQL.

pobierz.php:

Użytkownik/Klient wywołuje ten PHP za pomocą metody GET. Serwer oblicza odległość pomiędzy użytkownikiem a wszystkimi modułami. Następnie dane najbliższego modułu są wysyłane jako odpowiedź do klienta w preferowanym przez klienta formacie JSON/XML.

aktualizacja.php:

Ten plik PHP jest wywoływany przez moduł codziennie o określonej godzinie w celu sprawdzenia, czy moduł ma uruchomioną najnowszą wersję oprogramowania układowego. Wystarczy umieścić najnowszy plik ".bin" na serwerze plików i określić katalog pliku w zmiennej pliku.

Jeśli te wiele plików na początku wydaje się zniechęcające, w następnym kroku zamieściłem dokumentację użytkownika.

Krok 4: Dokumentacja użytkownika

Dokumentacja użytkownika
Dokumentacja użytkownika
Dokumentacja użytkownika
Dokumentacja użytkownika

Wstęp:

Weather API zapewnia prosty interfejs do żądania danych pogodowych dla lokalizacji na powierzchni ziemi. Żądasz informacji o pogodzie dla określonej pary szerokości i długości geograficznej z określonym formatem wyjściowym. API zwraca temperaturę, wilgotność, ciśnienie i wskaźnik jakości powietrza, który został ostatnio zarejestrowany przez najbliższy moduł z żądanej lokalizacji.

Zanim zaczniesz:

Ten dokument jest przeznaczony dla programistów witryn i urządzeń mobilnych, którzy chcą dołączyć informacje o pogodzie do tworzonej aplikacji. Wprowadza wykorzystanie przy użyciu API i materiałów referencyjnych na dostępnych parametrach.

Prośby o dane pogodowe:

Żądania interfejsu Weather API są konstruowane jako ciąg adresu URL. API zwraca dane pogodowe dla punktu na ziemi określonego przez parę szerokości i długości geograficznej. Należy zauważyć, że dokładność danych pogodowych jest wprost proporcjonalna do gęstości modułów umieszczonych na danym obszarze.

Żądanie Weather API ma następującą postać:

example.com/retrieve.php?lat=25.96446&lon=53.9443&format=json

Gdzie format(format) wyjściowy może być jedną z następujących wartości:

  • JSON (zalecane), wskazuje dane wyjściowe w JavaScript Object Notation (JSON); lub
  • XML wskazuje dane wyjściowe w formacie XML, opakowane w węźle.

Parametry żądania:

Jak to jest standardem we wszystkich adresach URL, parametry są oddzielane za pomocą znaku ampersand (&). Poniżej podano listę parametrów i ich możliwe wartości.

Wymagane parametry:

  • lat: Reprezentuje szerokość geograficzną lokalizacji do wyszukania. (np. łat=19.56875)
  • lon: Reprezentuje długość geograficzną lokalizacji do wyszukania. (np. lon=72,97568)

Parametry opcjonalne:

format: Określa format wyjściowy odpowiedzi danych pogodowych. Może to być JSON lub XML. Wartość domyślna to JSON. (np. format=json lub format=xml)

Odpowiedzi pogodowe:

W przypadku każdego prawidłowego żądania usługa strefy czasowej zwróci odpowiedź w formacie wskazanym w adresie URL żądania. Każda odpowiedź będzie zawierać następujące elementy:

  • sukces: wartość wskazująca status odpowiedzi.

    • 0: Negatywne; wskazuje, że żądanie było zniekształcone.
    • 1: twierdząco; wskazuje, że żądanie powiodło się.
  • komunikat: ciąg wskazujący przyczynę nieprawidłowości w żądaniu. Dostępne tylko wtedy, gdy stan jest negatywny.
  • dane: tablica z wieloma parametrami pogodowymi.

    • temp: dane temperatury.
    • hum: dane o obecności wilgotności.
    • pres: dane dotyczące ciśnienia bezwzględnego.
    • aqi: obecny wskaźnik jakości powietrza.

Przykładowe odpowiedzi obu formatów można zobaczyć na zdjęciach.

Krok 5: Konfiguracja modułu

Konfiguracja modułu
Konfiguracja modułu
Konfiguracja modułu
Konfiguracja modułu

Tworzony jest punkt dostępu, a strona internetowa jest hostowana pod adresem IP (domyślnie: 192.168.4.1), aby otrzymać dane uwierzytelniające od menedżera urządzeń/użytkownika przy pierwszym uruchomieniu lub jeśli moduł nie znajdzie już zapisanych danych uwierzytelniających w EEPROM.

Użytkownik musi wprowadzić identyfikator SSID i hasło, z którym chce się połączyć moduł. Szerokość i długość geograficzna są wypełniane automatycznie, jeśli zezwolisz przeglądarce na dostęp do lokalizacji.

Po wprowadzeniu wszystkich danych kliknij przycisk „WYŚLIJ”, a następnie wszystkie dane uwierzytelniające zostaną zapisane w pamięci EEPROM modułu.

Ten krok jest bardzo ważny, ponieważ podczas masowej produkcji modułów nie jest możliwe zaprogramowanie wszystkich modułów za pomocą dokładnych danych o lokalizacji i danych uwierzytelniających Wi-Fi. Nie zaleca się również zakodowania danych uwierzytelniających na stałe w programie, ponieważ jeśli w ogóle będziemy musieli przenieść moduł w inne miejsce lub chcemy zmienić dane uwierzytelniające WiFi, będziemy musieli przeprogramować moduł. Aby uniknąć tego problemu, zaimplementowano funkcję początkowej konfiguracji.

Krok 6: Teraz nadszedł czas, aby przekazać dane do chmury

Teraz nadszedł czas, aby przekazać dane do chmury
Teraz nadszedł czas, aby przekazać dane do chmury
Teraz nadszedł czas, aby przekazać dane do chmury
Teraz nadszedł czas, aby przekazać dane do chmury

Po wykonaniu wszystkich poprzednich kroków nadszedł czas, aby moduł przesłał dane na serwer. Po zapisaniu poświadczeń rozpocznie się automatyczne przesyłanie.

Wywołuje "insert.php" jako wywołanie API z przekazaniem wszystkich parametrów do wysłania w metodzie GET.

Poniższy fragment kodu przedstawia sposób przetwarzania parametrów.

if (isset($_GET['temp']) && isset($_GET['hum']) && isset($_GET['pres']) && isset($_GET['aqi']) && isset($_GET ['mac']) && isset($_GET['lat']) && isset($_GET['lon '])) 2. { 3. // program główny 4. }

W ten sposób wszystkie moduły zaczynają przesyłać dane.

Uwaga: Zmniejsz częstotliwość wysyłania w kodzie, jeśli czujesz, że serwer jest przeciążony.

Krok 7: Aktualizacja Over the Air (OTA)

Aktualizacja OTA (Over the Air)
Aktualizacja OTA (Over the Air)

Po skonfigurowaniu modułu i rozpoczęciu przesyłania danych, codziennie o określonej godzinie, o której mowa w programie, sprawdza dostępność aktualizacji oprogramowania. Jeśli znajdzie, pobiera i flashuje znajdujący się w nim plik binarny. A jeśli tak się nie stanie, kontynuowana jest normalna operacja przesyłania danych.

Aby sprawdzić nową aktualizację, moduł wywołuje „update.php”, wysyłając adres MAC w nagłówku żądania. Następnie serwer sprawdza, czy ten konkretny adres MAC ma nową aktualizację, jeśli tak, to w odpowiedzi wysyła plik binarny najnowszego oprogramowania układowego.

Sprawdza również wszystkie niezbędne nagłówki wymagane do podstawowego uwierzytelnienia modułu.

Krok 8: Jak użytkownik/klient może uzyskać dostęp do danych…

W jaki sposób użytkownik/klient może uzyskać dostęp do danych…
W jaki sposób użytkownik/klient może uzyskać dostęp do danych…
W jaki sposób użytkownik/klient może uzyskać dostęp do danych…
W jaki sposób użytkownik/klient może uzyskać dostęp do danych…
W jaki sposób użytkownik/klient może uzyskać dostęp do danych…
W jaki sposób użytkownik/klient może uzyskać dostęp do danych…

Dostęp do danych z serwera jest dość prosty. Wystarczy wywołać "retrieve.php", otrzymamy w odpowiedzi dane pogodowe w formacie JSON. Następnie wystarczy przeanalizować dane JSON, aby uzyskać dostęp do poszczególnych elementów. Podobnie jest z odpowiedzią XML. Użytkownik zawsze może określić preferowany format odpowiedzi, z którym wygodnie pracuje. Jeśli użytkownik nie określi formatu, domyślnym formatem jest JSON.

Przykładowe żądanie jest wykonywane za pomocą narzędzia POSTMAN w celu sprawdzenia działania API.

Przykład parsowania odpowiedzi JSON w javascript jest pokazany na poniższym fragmencie kodu.

var url = "https://example.com/retrieve.php?lat=19.044848&lon=72.8464373";function httpGet(theUrl) { var xmlHttp = new XMLHttpRequest(); xmlHttp.open("POBIERZ", adres URL, fałsz); // false dla żądania synchronicznego xmlHttp.send(null); zwróć xmlHttp.responseText; } var mojaZm = httpPobierz(url); var obj = JSON.parse(myVar); document.getElementById("aqi").innerHTML = obj.data[0].aqi; document.getElementById("temperatura").innerHTML = Math.round(obj.data[0].temp) + "°C"; document.getElementById("temp").innerHTML = Math.round(obj.data[0].temp) + "°C"; document.getElementById("wilgotność").innerHTML = Math.round(obj.data[0].hum) + "%"; document.getElementById("presja").innerHTML = Math.round(obj.data[0].pres) + "mb";

Kod źródłowy przykładowej strony HTML, która analizuje odpowiedź JSON, jest dostępny na końcu tego kroku.

Uwaga: Zmień rozszerzenie pliku na „.html”.

Krok 9: Ograniczenia tego projektu

  • Projekt wykorzystuje GET do wysyłania danych; mimo że nie zajmuje się danymi wrażliwymi, danymi można łatwo manipulować, ponieważ nie ma żadnego mechanizmu sprawdzania autentyczności źródła poza sprawdzaniem nagłówków, które można łatwo zmodyfikować, a nawet zwykłe urządzenie można sfałszować wyglądać jak moduł pogodowy.
  • Ponieważ moduł polega wyłącznie i jest zależny od innego punktu dostępowego (WIFI) do przesyłania danych, które w większości przypadków będą pochodziły z innych organizacji. Jeśli z jakiegoś powodu punkt dostępowy nie będzie działał, moduł nie będzie mógł wysyłać danych.
  • Mimo że projekt ma na celu zwiększenie dokładności istniejącego systemu, czujnik dostępny na rynku jest mniej dokładny niż oczekiwano, co w rezultacie prowadzi do zawodności swojego głównego celu.
  • Planując projekt zaplanowałem włączenie trybu, w którym serwer uśrednia wartość danych na podstawie lokalizacji w celu korekcji błędów. Ale po wdrożeniu tej funkcji zdałem sobie sprawę, że potrzebne są interfejsy API innych firm, aby przetłumaczyć współrzędne na regiony geograficzne.

Krok 10: Dalsze ulepszenia, które można wprowadzić w tym projekcie

  • Dokładność modułu można dodatkowo poprawić, dostosowując czujniki specjalnie do określonego celu zamiast używania modułu ogólnego dostępnego na rynku.
  • Moduł można zmodyfikować, aby działał jeszcze bardziej niezależnie, za pomocą specjalnego chipa, który bezprzewodowo komunikuje się z wieżami komórkowymi w celu przesyłania danych, poprawiając w ten sposób odporność na uszkodzenia.
  • Panel słoneczny i system baterii mogą być używane w połączeniu z trybem głębokiego uśpienia ESP, poprawiając w ten sposób wydajność energetyczną i czyniąc ją bardziej niezależną od zewnętrznego źródła zasilania.
  • POST może być używany do wysyłania danych z pewnym mechanizmem uwierzytelniania, takim jak używanie kodów cyklicznych dla każdej transmisji danych.
  • Zamiast NodeMCU, który jest płytą prototypową, w masowej produkcji możemy użyć niestandardowego mikrokontrolera, który nie tylko obniża koszty, ale także najlepiej wykorzystuje zasoby systemowe.
  • W połączeniu z API geolokalizacji Google i połączeniem się z dowolną dostępną otwartą siecią WIFI, moduł może działać bez konieczności konfigurowania; gotowy do przesyłania danych z fabryki bez jakiejkolwiek konfiguracji.

Krok 11: Kilka słów dla publiczności

Kilka słów dla słuchaczy
Kilka słów dla słuchaczy

Hej, zdaję sobie sprawę, że to wcale nie jest samouczek przyjazny dla początkujących, ponieważ nie wspomniałem o każdym szczególe, który powinien zostać omówiony. A także ten projekt jest naprawdę rozległy, aby można go było omówić w Instructable. Mimo to starałem się jak najlepiej opisać każdy ważny aspekt projektu. Wiem również, że film prezentujący działanie projektu byłby naprawdę świetny, ale ponieważ jest to moja pierwsza instruktaż i szczerze mówiąc, jest to moja pierwsza publikacja czegoś podobnego, byłem dość zdenerwowany, aby być przed kamera.

Jeśli potrzebujesz pomocy w tworzeniu tego projektu lub czegoś podobnego, po prostu skontaktuj się ze mną pod adresem [email protected] lub jak zwykle możesz zostawić komentarz. Postaram się wam pomóc najlepiej jak potrafię.

Dziękuję Ci!!

Zalecana: