Inhaltsverzeichnis:

Intelligentes verteiltes IoT-Wetterüberwachungssystem mit NodeMCU - Gunook
Intelligentes verteiltes IoT-Wetterüberwachungssystem mit NodeMCU - Gunook

Video: Intelligentes verteiltes IoT-Wetterüberwachungssystem mit NodeMCU - Gunook

Video: Intelligentes verteiltes IoT-Wetterüberwachungssystem mit NodeMCU - Gunook
Video: Top 10 IoT Projects 2023 | Smart IoT Projects | Applications Of IoT | Simplilearn 2024, Juli
Anonim
Intelligentes verteiltes IoT-Wetterüberwachungssystem mit NodeMCU
Intelligentes verteiltes IoT-Wetterüberwachungssystem mit NodeMCU

Sie alle kennen vielleicht die traditionelle Wetterstation; aber haben Sie sich schon einmal gefragt, wie das eigentlich funktioniert? Da die traditionelle Wetterstation teuer und sperrig ist, ist die Dichte dieser Stationen pro Flächeneinheit sehr gering, was zur Ungenauigkeit der Daten beiträgt. Ich erkläre Ihnen wie: Angenommen, eine Station befindet sich mitten in einer Stadt und sie ist die einzige Station, die sich im Umkreis von 'x' Metern befindet, kann leicht verzerrt werden, wenn in der Nähe ein Schadstoff verursachender Stoff vorhanden ist der Station, die den gesamten Bereich mit einem Radius von x Metern als verschmutzt anzeigt, da diese einzelne Station für die Ermittlung der Wetterdaten des gesamten Bereichs verantwortlich ist.

Um dieses Problem zu überwinden, muss die Dichte der Module erhöht werden, was nur möglich ist, wenn die Module billiger sind und eine geringere Grundfläche benötigen als die bestehenden.

Aus diesem Grund ist meine vorgeschlagene Lösung die perfekte Lösung für dieses Problem. Sie kostet weniger als 10 US-Dollar und liegt auch leicht auf meiner Handfläche.

Wie es funktioniert…

Es gibt 3 Hauptteile dieses Projekts.

Geräteseite:

Das Gerät ist ein im Bild gezeigtes IoT-Modul, das alle 'x' Zeitintervalle die Wetterdaten an den Server sendet. Die Daten umfassen die aktuellen Wetterdaten, den geografischen Standort des Moduls; d.h. seine Koordinaten, seine MAC-Adresse; um das Gerät eindeutig zu identifizieren, die Firmware-Version, auf der es gerade läuft. Die Geräteseite umfasst über das Gebiet verteilte N-Module, die aktiv Daten zum Server beitragen.

Serverseitig:

Wie der Name vermuten lässt, ist es der zentrale Server, der verschiedene Vorgänge wie den Empfang der Daten von den Modulen und das Speichern in der Datenbank, das Aktualisieren des Moduls mit der neuesten Firmware, wenn es auf einer älteren Version läuft, das Senden der Wetterdaten an die Auftraggeber auf Anfrage.

Kunden-/Benutzerseite:

Es ist der Endbenutzer, der die Wetterdaten vom Server anfordert. Der Client sendet den aktuellen Standort und basierend auf dem Standort berechnet der Server die Entfernung zwischen dem Client und allen Modulen und sendet die Wetterdaten des nächstgelegenen Moduls an den Client, die als genau angesehen werden.

Lieferungen

  • KnotenMCU (ESP8266-12E)
  • DHT11 (Feuchte- und Temperatursensor)
  • BMP180 (Druck- und Temperatursensor)
  • MQ-135 (Luftqualitätsindexsensor)
  • USB-Kabel (zum Hochladen des Programms)
  • 5 Volt Netzteil
  • Kondensatoren (Optional: parallel zur Stromleitung zu platzieren)
  • Arduino IDE (Um das Programm zu debuggen und hochzuladen)
  • POSTMAN-Anwendung (optional: zum Debuggen der API)
  • Eine Website (um den PHP- und MySQL-Server zu hosten)

Schritt 1: Löten Sie alle Komponenten und laden Sie das Programm auf die NodeMCU hoch

Löten Sie alle Komponenten und laden Sie das Programm auf die NodeMCU hoch
Löten Sie alle Komponenten und laden Sie das Programm auf die NodeMCU hoch
Löten Sie alle Komponenten und laden Sie das Programm auf die NodeMCU hoch
Löten Sie alle Komponenten und laden Sie das Programm auf die NodeMCU hoch

Löten Sie alle Komponenten an die NodeMCU wie im Schaltplan auf einem Perfboard gezeigt. Löten Sie außerdem einen Kondensator parallel zu den Stromleitungen, da der Strom während des aktiven Sendens und Empfangens von Daten ansteigt.

Nach Abschluss der Lötarbeiten laden Sie den bereitgestellten Code in der Datei "code.c" hoch.

Hinweis: Vergessen Sie nicht, die Anmeldeinformationen durch Ihre eigenen Anmeldeinformationen zu ersetzen. Legen Sie auch die Datei mit dem Namen "html_file.h" in den Arduino-Skizzenordner. Alle in diesem Projekt verwendeten Header-Dateien finden Sie hier

Merkmale des Codes:

Access Point: Da es in der Massenproduktion schwierig ist, jedes Modul mit den Zugangsdaten zu programmieren, hostet das Modul beim ersten Booten eine Webseite, um die Zugangsdaten des WLANs zu akzeptieren, mit dem sich die Module verbinden müssen, und speichert es für die spätere Verwendung im EEPROM.

Sobald die Anmeldeinformationen konfiguriert sind, überprüft die NodeMCU das EEPROM auf Anmeldeinformationen und stellt eine Verbindung zu den im EEPROM vorhandenen WLAN-Anmeldeinformationen her.

Nach erfolgreicher Verbindung mit dem WLAN beginnt die NodeMCU alle 'x' Zeitintervalle mit dem Hochladen der Daten auf den Server, die Daten umfassen Wetterdaten, MAC-Adresse des Moduls, Version der Firmware, geografischer Standort des Geräts.

OTA-Update: Das Modul sucht auch jeden Tag zu einer bestimmten, im Code angegebenen Zeit nach neuen Firmware-Updates. Diese Funktion ist nützlich, da es für keinen Hersteller möglich ist, das Programm eines einzelnen Moduls zu ändern, falls Änderungen vorgenommen werden müssen.

Watchdog-Timer: Es muss eine Möglichkeit geben, sich selbst ohne menschliches Eingreifen wiederherzustellen, wenn er stecken bleibt oder abstürzt. Dies kann durch die Verwendung des Watchdog-Timers erreicht werden. Dies funktioniert folgendermaßen: Es gibt eine Interrupt-Subroutine, die jede Sekunde ausgeführt wird. Der ISR inkrementiert den Zähler bei jeder Ausführung und prüft, ob der Zähler den maximalen Zählerstand erreicht hat. Sobald der Zähler den Maximalwert erreicht, setzt sich das Modul selbst zurück, wenn es abgestürzt ist. Im Normalbetrieb wird der Zähler immer zurückgesetzt, bevor er den maximalen Zählerstand erreicht.

Schritt 2: Konfigurieren des SQL-Servers

Konfigurieren des SQL-Servers
Konfigurieren des SQL-Servers

Das Setup von SQL Server ist ebenfalls sehr einfach. Erstellen Sie einfach eine Datenbank in SQL Server und importieren Sie die Einstellung, indem Sie die Datei "database_structure.txt" importieren. Sie finden die Datei in diesem Schritt. Da das instructable nicht erlaubt, ".sql" -Dateien hochzuladen, habe ich die Datei in ".txt" umbenannt.

Hinweis: Benennen Sie die Datei von ".txt" in ".sql" um.

Schritt 3: Konfigurieren des Dateiservers

Die Konfiguration des Servers ist wirklich einfach, wenn Sie eine Website besitzen und diese online gehostet wird. Ich werde nicht den gesamten Vorgang des Einrichtens einer Website und des Hostens durchgehen, da dies den Rahmen dieses Tutorials sprengen würde. Sie können es jedoch auf Ihrem eigenen PC als localhost hosten, um die Funktion der Dateien zu testen.

Da das Instructable das Hochladen von PHP-Dateien nicht zulässt, habe ich die Dateien in ".txt" umbenannt.

Hinweis: Bitte benennen Sie die Erweiterung der Dateien in ".php" um. Vergessen Sie auch nicht, die Zugangsdaten der Datei "config.php" zu ändern.

Laden Sie einfach die Dateien auf den Server hoch und Sie können loslegen.

Ich gebe Ihnen kurze Informationen zu den PHP-Dateien.

db_config.php:

In dieser Datei sind alle für die Verbindung mit dem SQL-Server erforderlichen Anmeldeinformationen gespeichert.

db_connect:

In dieser Datei ist die für die Datenbankverbindung benötigte Klasse vorhanden.

insert.php:

Die NodeMCU ruft diese PHP-Datei auf, um die Daten mit der Methode GET auf den Server hochzuladen. Diese Datei ist auch dafür verantwortlich, dieselben Daten auf dem SQL-Server zu speichern.

abrufen.php:

Der Benutzer/Client ruft dieses PHP mit der Methode GET auf. Der Server berechnet die Entfernung zwischen dem Benutzer und allen Modulen. Dann werden die Daten des nächstgelegenen Moduls als Antwort an den Client im JSON/XML-Format nach Wunsch des Clients gesendet.

update.php:

Diese PHP-Datei wird vom Modul jeden Tag zu einer bestimmten Zeit aufgerufen, um zu überprüfen, ob das Modul die neueste Version der Firmware ausführt. Legen Sie einfach die neueste ".bin"-Datei auf dem Dateiserver ab und geben Sie das Verzeichnis der Datei in der Variablen der Datei an.

Wenn diese vielen Dateien zunächst entmutigend erscheinen, habe ich im nächsten Schritt die Benutzerdokumentation eingefügt.

Schritt 4: Benutzerdokumentation

Benutzerdokumentation
Benutzerdokumentation
Benutzerdokumentation
Benutzerdokumentation

Einführung:

Die Wetter-API bietet eine einfache Schnittstelle, um die Wetterdaten für Orte auf der Erdoberfläche anzufordern. Sie fordern die Wetterinformationen für ein bestimmtes Breiten-/Längen-Paar mit dem angegebenen Ausgabeformat an. Die API gibt den Temperatur-, Feuchtigkeits-, Druck- und Luftqualitätsindex zurück, der zuletzt vom nächstgelegenen Modul vom angeforderten Standort aufgezeichnet wurde.

Bevor Sie beginnen:

Dieses Dokument richtet sich an Website- und mobile Entwickler, die Wetterinformationen in eine zu entwickelnde Anwendung aufnehmen möchten. Es stellt die Verwendung der API und Referenzmaterial zu den verfügbaren Parametern vor.

Anfragen zu Wetterdaten:

Wetter-API-Anfragen werden als URL-String erstellt. Die API gibt Wetterdaten für einen Punkt auf der Erde zurück, der durch ein Breiten-/Längen-Paar angegeben wird. Beachten Sie, dass die Genauigkeit der Wetterdaten direkt proportional zur Dichte der in einem Bereich platzierten Module ist.

Eine Wetter-API-Anfrage hat die folgende Form:

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

Dabei kann Ausgabeformat(format) einer der folgenden Werte sein:

  • JSON (empfohlen), gibt die Ausgabe in JavaScript Object Notation (JSON) an; oder
  • XML, gibt die Ausgabe in XML an, die in den Knoten eingeschlossen ist.

Anfrageparameter:

Wie bei allen URLs üblich, werden Parameter durch das kaufmännische Und (&) getrennt. Die Liste der Parameter und ihrer möglichen Werte ist unten angegeben.

Erforderliche Parameter:

  • lat: Stellt den Breitengrad eines Standorts dar, der gesucht werden soll. (z. B. lat=19.56875)
  • lon: Stellt den Längengrad eines nachzuschlagenden Standorts dar. (z. B. lon=72.97568)

Optionale Parameter:

format: Gibt das Antwortausgabeformat der Wetterdaten an. Es kann entweder JSON oder XML sein. Der Standardwert ist JSON. (z. B. format=json oder format=xml)

Wetterantworten:

Für jede gültige Anfrage gibt der Zeitzonendienst eine Antwort in dem Format zurück, das in der Anfrage-URL angegeben ist. Jede Antwort enthält die folgenden Elemente:

  • Erfolg: ein Wert, der den Status der Antwort angibt.

    • 0: negativ; zeigt an, dass die Anforderung fehlerhaft war.
    • 1: Bejahend; zeigt an, dass die Anfrage erfolgreich war.
  • Nachricht: eine Zeichenfolge, die den Grund für die fehlerhafte Anforderung angibt. Nur verfügbar, wenn der Status negativ ist.
  • data: ein Array mit mehreren Wetterparametern.

    • temp: die Temperaturdaten.
    • hum: die Feuchte-Anwesenheitsdaten.
    • pres: die absoluten Druckdaten.
    • aqi: der aktuelle Luftqualitätsindex.

Die Beispielantwort beider Formate ist in den Bildern zu sehen.

Schritt 5: Moduleinrichtung

Modul-Setup
Modul-Setup
Modul-Setup
Modul-Setup

Ein Zugangspunkt wird erstellt und eine Webseite wird auf einer IP-Adresse (Standard: 192.168.4.1) gehostet, um die Zugangsdaten vom Gerätemanager/Benutzer beim allerersten Start zu erhalten oder wenn das Modul die bereits gespeicherten Zugangsdaten nicht im EEPROM.

Der Benutzer muss die SSID und das Passwort eingeben, mit denen sich das Modul verbinden soll. Breiten- und Längengrad werden automatisch ausgefüllt, wenn Sie dem Browser den Zugriff auf den Standort erlauben.

Sobald alle Details eingegeben sind, klicken Sie auf die Schaltfläche "SEND" und dann werden alle Anmeldeinformationen in das EEPROM des Moduls geschrieben.

Dieser Schritt ist sehr wichtig, da es bei der Massenproduktion der Module nicht möglich ist, alle Module mit ihren genauen Standortdaten und WLAN-Zugangsdaten zu programmieren. Es ist auch nicht ratsam, die Anmeldeinformationen im Programm fest zu codieren, da wir das Modul, wenn wir das Modul an einen anderen Ort verlagern oder die WLAN-Anmeldeinformationen ändern möchten, das Modul neu programmieren müssen. Um diesen Ärger zu vermeiden, ist die Ersteinrichtungsfunktion implementiert.

Schritt 6: Jetzt ist es an der Zeit, Daten in die Cloud bereitzustellen

Jetzt ist es an der Zeit, Daten in die Cloud bereitzustellen
Jetzt ist es an der Zeit, Daten in die Cloud bereitzustellen
Jetzt ist es an der Zeit, Daten in die Cloud bereitzustellen
Jetzt ist es an der Zeit, Daten in die Cloud bereitzustellen

Nachdem alle vorherigen Schritte abgeschlossen sind, ist es nun an der Zeit, das Modul die Daten auf den Server hochladen zu lassen. Es beginnt automatisch mit dem Hochladen, sobald Sie die Anmeldeinformationen gespeichert haben.

Es ruft die "insert.php" als API-Aufruf auf, wobei alle Parameter zum Senden in der GET-Methode übergeben werden.

Der folgende Codeausschnitt zeigt, wie die Parameter verarbeitet werden.

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

Auf diese Weise beginnen alle Module mit dem Hochladen der Daten.

Hinweis: Senken Sie die Upload-Frequenz im Code, wenn Sie das Gefühl haben, dass der Server überlastet wird.

Schritt 7: Over the Air (OTA) Update

Over the Air (OTA)-Update
Over the Air (OTA)-Update

Nachdem das Modul fertig eingerichtet ist und mit dem Hochladen der Daten beginnt, sucht es jeden Tag zu einer bestimmten im Programm angegebenen Zeit nach Firmware-Updates. Wenn es eine findet, lädt es die darin enthaltene Binärdatei herunter und flasht sie. Wenn dies nicht der Fall ist, wird der normale Vorgang des Hochladens der Daten fortgesetzt.

Um nach einem neuen Update zu suchen, ruft das Modul die "update.php" auf, indem es die MAC-Adresse in seinem Request-Header sendet. Der Server prüft dann, ob für diese spezielle MAC-Adresse ein neues Update vorliegt. Wenn ja, sendet er als Antwort die Binärdatei der neuesten Firmware.

Es prüft auch, ob alle erforderlichen Header für die Basisauthentifizierung des Moduls erforderlich sind.

Schritt 8: Wie Benutzer/Client auf die Daten zugreifen können…

Wie Benutzer/Client auf die Daten zugreifen können…
Wie Benutzer/Client auf die Daten zugreifen können…
Wie Benutzer/Client auf die Daten zugreifen können…
Wie Benutzer/Client auf die Daten zugreifen können…
Wie Benutzer/Client auf die Daten zugreifen können…
Wie Benutzer/Client auf die Daten zugreifen können…

Es ist ziemlich einfach, auf die Daten vom Server zuzugreifen. Allein durch den Aufruf der "retrieve.php" erhalten wir als Antwort die Wetterdaten im JSON-Format. Danach müssen nur noch die JSON-Daten geparst werden, um auf die einzelnen Elemente zuzugreifen. Ähnlich verhält es sich mit der XML-Antwort. Der Benutzer kann jederzeit das bevorzugte Antwortformat angeben, mit dem der Benutzer bequem arbeiten kann. Wenn der Benutzer das Format nicht angibt, ist das Standardformat JSON.

Mit dem POSTMAN-Tool wird eine Beispielanfrage gestellt, um die Funktion der API zu überprüfen.

Ein Beispiel für das Parsen von JSON-Antworten in Javascript ist im folgenden Code-Snippet dargestellt.

var url = "https://example.com/retrieve.php?lat=19.044848&lon=72.8464373";Funktion httpGet(theUrl) { var xmlHttp = new XMLHttpRequest(); xmlHttp.open("GET", theUrl, false); // false für synchrone Anfrage xmlHttp.send(null); xmlHttp.responseText zurückgeben; } var myVar = httpGet(url); var obj = JSON.parse(myVar); document.getElementById("aqi").innerHTML = obj.data[0].aqi; document.getElementById("temperature").innerHTML = Math.round(obj.data[0].temp) + "°C"; document.getElementById("temp").innerHTML = Math.round(obj.data[0].temp) + "°C"; document.getElementById("humidity").innerHTML = Math.round(obj.data[0].hum) + "%"; document.getElementById("pressure").innerHTML = Math.round(obj.data[0].pres) + " mb";

Der Quellcode der HTML-Beispielseite, die die JSON-Antwort analysiert, ist am Ende dieses Schritts verfügbar.

Hinweis: Ändern Sie die Erweiterung der Datei in ".html".

Schritt 9: Einschränkungen dieses Projekts

  • Das Projekt verwendet GET, um die Daten zu senden; Auch wenn es sich nicht um sensible Daten handelt, können die Daten leicht manipuliert werden, da es keinen Mechanismus zur Überprüfung der Authentizität der Quelle gibt, abgesehen von der Überprüfung der Header, die leicht geändert werden können und sogar ein normales Gerät gefälscht werden kann wie ein Wettermodul aussehen.
  • Da das Modul ausschließlich auf andere Zugangspunkte (WIFI) angewiesen ist, um die Daten zu senden, die in den meisten Fällen von anderen Organisationen stammen. Wenn der Zugangspunkt aus irgendeinem Grund außer Betrieb ist, kann das Modul keine Daten senden.
  • Obwohl das Projekt darauf ausgerichtet ist, die Genauigkeit des bestehenden Systems zu erhöhen, ist der auf dem Markt erhältliche Sensor weniger genau als erwartet, was dazu führt, dass sein Hauptzweck verfehlt wird.
  • Bei der Planung des Projekts habe ich geplant, einen Modus einzubeziehen, in dem der Server den Datenwert basierend auf dem Standort zur Fehlerkorrektur mittelt. Bei der Implementierung dieser Funktion wurde mir jedoch klar, dass einige APIs von Drittanbietern erforderlich sind, um die Koordinaten in geografische Regionen zu übersetzen.

Schritt 10: Weitere Verbesserungen, die an diesem Projekt vorgenommen werden können

  • Die Genauigkeit des Moduls kann weiter verbessert werden, indem die Sensoren speziell auf den jeweiligen Einsatzzweck zugeschnitten werden, anstatt das auf dem Markt erhältliche generische Modul zu verwenden.
  • Das Modul kann so modifiziert werden, dass es noch unabhängiger arbeitet, indem ein spezieller Chip verwendet wird, der drahtlos mit den Mobilfunkmasten kommuniziert, um die Daten zu senden und so die Fehlertoleranz zu verbessern.
  • Solarpanel und Batteriesystem können in Verbindung mit dem Deep-Sleep-Modus von ESP verwendet werden, wodurch die Energieeffizienz verbessert und von einer externen Stromversorgung unabhängiger wird.
  • POST kann verwendet werden, um Daten mit einem Authentifizierungsmechanismus zu senden, z. B. mit zyklischen Codes für jede Datenübertragung.
  • Anstelle von NodeMCU, einem Prototyping-Board, können wir in der Massenproduktion einen kundenspezifischen Mikrocontroller verwenden, der nicht nur die Kosten senkt, sondern auch die Systemressourcen optimal nutzt.
  • In Verbindung mit der Google-Geolocation-API und einer Verbindung mit jedem verfügbaren offenen WIFI kann das Modul arbeiten, ohne es zu konfigurieren; bereit, Daten ab Werk zu übertragen, ohne dass irgendwelche Einstellungen erforderlich sind.

Schritt 11: Ein paar Worte für das Publikum

Ein paar Worte für das Publikum
Ein paar Worte für das Publikum

Hey Leute, mir ist klar, dass dies überhaupt kein anfängerfreundliches Tutorial ist, da ich nicht jedes einzelne Detail erwähnt habe, das behandelt werden muss. Und auch dieses Projekt ist wirklich riesig, um in einem Instructable abgedeckt zu werden. Trotzdem habe ich mein Bestes gegeben, um jeden wichtigen Aspekt des Projekts abzudecken. Ich weiß auch, dass ein Video, das die Arbeit des Projekts zeigt, wirklich großartig gewesen wäre, aber da dies meine erste Anleitung ist und um ehrlich zu sein, dies meine erste Veröffentlichung von etwas Ähnlichem ist, war ich ziemlich nervös, vor einem zu stehen Kamera.

Wenn Sie Hilfe bei der Erstellung dieses Projekts oder Ähnlichem benötigen, wenden Sie sich einfach an [email protected] oder Sie können wie immer einen Kommentar hinterlassen. Ich werde versuchen, euch nach besten Kräften zu helfen.

Dankeschön!!

Empfohlen: