Inhoudsopgave:

Slim gedistribueerd IoT-weerbewakingssysteem met NodeMCU - Ajarnpa
Slim gedistribueerd IoT-weerbewakingssysteem met NodeMCU - Ajarnpa

Video: Slim gedistribueerd IoT-weerbewakingssysteem met NodeMCU - Ajarnpa

Video: Slim gedistribueerd IoT-weerbewakingssysteem met NodeMCU - Ajarnpa
Video: Van Leeuwenhoeklezing: De energietransitie in de woonomgeving | John Schmitz 2024, Juli-
Anonim
Slim gedistribueerd IoT-weerbewakingssysteem met NodeMCU
Slim gedistribueerd IoT-weerbewakingssysteem met NodeMCU

U kent misschien allemaal het traditionele weerstation; maar heb je je ooit afgevraagd hoe het eigenlijk werkt? Aangezien het traditionele weerstation kostbaar en omvangrijk is, is de dichtheid van deze stations per oppervlakte-eenheid zeer gering, hetgeen bijdraagt aan de onnauwkeurigheid van de gegevens. Ik zal je uitleggen hoe: Stel dat een station zich midden in een stad bevindt en het is het enige station dat zich in een straal van 'x' meter bevindt, dan kan het gemakkelijk bevooroordeeld zijn als er een vervuilingsveroorzaker in de buurt aanwezig is van het station dat het hele gebied met een straal van 'x' meter als vervuild aangeeft, aangezien dat ene station verantwoordelijk is voor het bepalen van de weergegevens van het hele gebied.

Om dit probleem op te lossen, moet de dichtheid van de modules worden verhoogd, wat alleen mogelijk is als de modules goedkoper zijn en een kleinere voetafdruk hebben dan de bestaande.

Dit is de reden waarom mijn voorgestelde oplossing de perfecte oplossing is voor dit probleem. Het kost minder dan $ 10 en rust ook gemakkelijk op mijn handpalm.

Hoe het werkt…

Er zijn 3 grote delen van dit project.

Apparaatzijde:

Het apparaat is een IoT-module die in de afbeelding wordt weergegeven en die elke 'x'-interval de weergegevens naar de server stuurt. De gegevens omvatten de actuele weergegevens, de geografische locatie van de module; d.w.z. de coördinaten, het MAC-adres; om het apparaat uniek te identificeren, de firmwareversie waarop het momenteel wordt uitgevoerd. De apparaatzijde bestaat uit N-modules die zijn verdeeld over het gebied en die actief gegevens bijdragen aan de server.

Server-kant:

Zoals de naam al doet vermoeden, is het de gecentraliseerde server die verschillende bewerkingen afhandelt, zoals het ontvangen van de gegevens van de modules en het opslaan in de database, het bijwerken van de module met de nieuwste firmware als deze op een oudere versie draait, het verzenden van de weergegevens naar de opdrachtgever op aanvraag.

Klant/Gebruikerskant:

Het is de eindgebruiker die de weergegevens opvraagt bij de server. De client stuurt de huidige locatie en op basis van de locatie berekent de server de afstand tussen de client en alle modules en stuurt de weergegevens van de dichtstbijzijnde module naar de client die als nauwkeurig wordt beschouwd.

Benodigdheden

  • NodeMCU (ESP8266-12E)
  • DHT11 (Vochtigheids- en temperatuursensor)
  • BMP180 (Druk- en Temperatuursensor)
  • MQ-135 (luchtkwaliteitsindexsensor)
  • USB-kabel (om het programma te uploaden)
  • 5 volt voeding
  • Condensatoren (Optioneel: parallel aan de powerline te plaatsen)
  • Arduino IDE (om het programma te debuggen en te uploaden)
  • POSTMAN-toepassing (optioneel: om de API te debuggen)
  • Een website (om de PHP- en MySQL-server te hosten)

Stap 1: Soldeer alle componenten en upload het programma naar de NodeMCU

Soldeer alle componenten en upload het programma naar de NodeMCU
Soldeer alle componenten en upload het programma naar de NodeMCU
Soldeer alle componenten en upload het programma naar de NodeMCU
Soldeer alle componenten en upload het programma naar de NodeMCU

Soldeer alle componenten aan de NodeMCU zoals weergegeven in het schakelschema op een perf-bord. Soldeer ook een condensator parallel aan de powerlines, aangezien de stroompieken tijdens het actief verzenden en ontvangen van gegevens.

Zodra het soldeerwerk is voltooid, uploadt u de code in het bestand "code.c".

Opmerking: vergeet niet de inloggegevens te vervangen door uw eigen inloggegevens. Plaats ook het bestand met de naam "html_file.h" in de arduino-schetsmap. Alle headerbestanden die in dit project worden gebruikt, zijn hier te vinden

Kenmerken van de code:

Toegangspunt: aangezien het moeilijk is om elke module met de referenties in massaproductie te programmeren, host de module een webpagina bij de eerste keer opstarten om de inloggegevens van de WiFi te accepteren waarmee de modules verbinding moeten maken en slaat deze op in de EEPROM voor later gebruik.

Nadat de inloggegevens zijn geconfigureerd, controleert de NodeMCU de EEPROM op inloggegevens en maakt verbinding met de WiFi-inloggegevens die aanwezig zijn in de EEPROM.

Nadat de NodeMCU met succes verbinding heeft gemaakt met wifi, begint de NodeMCU met het uploaden van de gegevens naar de server om de 'x' tijdsinterval, de gegevens omvatten weergegevens, MAC-adres van de module, versie van de firmware, geografische locatie van het apparaat.

OTA-update: De module controleert ook elke dag op nieuwe firmware-updates op een specifiek tijdstip dat in de code is gespecificeerd. Deze functie is handig omdat het voor geen enkele fabrikant mogelijk is om het programma van een individuele module te wijzigen in het geval er wijzigingen moeten worden aangebracht.

Watchdog Timer: Atlast moet een manier zijn om zichzelf te herstellen zonder menselijke tussenkomst als het vastloopt of crasht. Dit kan worden bereikt door de Watchdog-timer te gebruiken. De manier waarop dit werkt is: er is een subroutine Interrupt die elke seconde wordt uitgevoerd. De ISR verhoogt de teller elke keer dat deze wordt uitgevoerd en controleert of de teller de maximale telling heeft bereikt. Zodra de teller de maximale waarde bereikt, reset de module zichzelf, ervan uitgaande dat deze is gecrasht. Bij normaal bedrijf wordt de teller altijd gereset voordat deze de maximale telling bereikt.

Stap 2: De SQL Server configureren

De SQL Server configureren
De SQL Server configureren

De installatie van SQL Server is ook heel eenvoudig. Maak gewoon een database in SQL-server en importeer de instelling door het bestand met de naam "database_structure.txt" te importeren. U vindt het bestand in deze stap. Omdat de instructable het uploaden van ".sql" -bestanden niet toestaat, heb ik het bestand hernoemd naar ".txt".

Opmerking: Hernoem het bestand van ".txt" naar ".sql".

Stap 3: De bestandsserver configureren

Het configureren van de server is heel eenvoudig als u een website bezit en deze online wordt gehost. Ik zal niet de hele procedure van het opzetten van een website en het hosten ervan doornemen, omdat dit buiten het bestek van deze tutorial valt. Maar je kunt het op je eigen pc hosten als localhost om de werking van de bestanden te proberen.

Omdat de Instructable niet toestaat om PHP-bestanden te uploaden, heb ik de bestanden hernoemd naar ".txt".

Opmerking: hernoem de extensie van de bestanden naar ".php". Vergeet ook niet de inloggegevens van het bestand "config.php" te wijzigen.

Upload de bestanden naar de server en u kunt aan de slag.

Ik zal je korte informatie geven over de PHP-bestanden.

db_config.php:

In dit bestand worden alle referenties opgeslagen die nodig zijn om verbinding te maken met de SQL-server.

db_connect:

In dit bestand is de klasse die nodig is voor de databaseverbinding aanwezig.

invoegen.php:

De NodeMCU roept dit PHP-bestand aan voor het uploaden van de gegevens naar de server met behulp van de GET-methode. Dit bestand is ook verantwoordelijk voor het opslaan van dezelfde gegevens op de SQL-server.

ophalen.php:

De gebruiker/client roept deze PHP aan met behulp van de GET-methode. De server berekent de afstand tussen de gebruiker en alle modules. Vervolgens worden de gegevens van de dichtstbijzijnde module als reactie naar de klant verzonden in JSON/XML-indeling, zoals de klant de voorkeur geeft.

update.php:

Dit PHP-bestand wordt elke dag op een bepaald tijdstip door de module aangeroepen om te controleren of de module de laatste versie van de firmware draait. Plaats gewoon het nieuwste ".bin"-bestand in de bestandsserver en specificeer de map van het bestand in de variabele van het bestand.

Als deze vele bestanden in eerste instantie ontmoedigend lijken, heb ik de gebruikersdocumentatie in de volgende stap opgenomen.

Stap 4: Gebruikersdocumentatie

Gebruikersdocumentatie
Gebruikersdocumentatie
Gebruikersdocumentatie
Gebruikersdocumentatie

Invoering:

De Weather API biedt een eenvoudige interface om de weergegevens op te vragen voor locaties op het aardoppervlak. U vraagt de weersinformatie op voor een specifiek breedtegraad/lengtegraad-paar met het opgegeven uitvoerformaat. De API retourneert de temperatuur, vochtigheid, druk en luchtkwaliteitsindex die het laatst is geregistreerd door de dichtstbijzijnde module vanaf de gevraagde locatie.

Voordat je begint:

Dit document is bedoeld voor website- en mobiele ontwikkelaars die weersinformatie willen opnemen in een applicatie die in ontwikkeling is. Het introduceert het gebruik met behulp van de API en referentiemateriaal op de beschikbare parameters.

Verzoeken om weersgegevens:

Weather API-verzoeken worden geconstrueerd als een URL-tekenreeks. De API retourneert weergegevens voor een punt op de aarde, gespecificeerd door een breedtegraad/lengtegraad-paar. Merk op dat de nauwkeurigheid van de weergegevens recht evenredig is met de dichtheid van de modules die in een gebied zijn geplaatst.

Een Weather API-verzoek heeft de volgende vorm:

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

Waar uitvoerformaat (formaat) een van de volgende waarden kan zijn:

  • JSON (aanbevolen), geeft uitvoer aan in JavaScript Object Notation (JSON); of
  • XML, geeft uitvoer in XML aan, verpakt in het knooppunt.

Verzoekparameters:

Zoals standaard in alle URL's, worden parameters gescheiden met het ampersand-teken (&). De lijst met parameters en hun mogelijke waarden worden hieronder aangegeven.

Vereiste parameters:

  • lat: Vertegenwoordigt een breedtegraad van een locatie om op te zoeken. (bijv. lat=19.56875)
  • lon: Vertegenwoordigt een lengtegraad van een locatie om op te zoeken. (bijv. lon=72.97568)

Optionele parameters:

formaat: Specificeert het antwoord-uitvoerformaat van de weergegevens. Het kan JSON of XML zijn. De standaardwaarde is JSON. (bijv. format=json of format=xml)

Weer reacties:

Voor elk geldig verzoek retourneert de tijdzoneservice een antwoord in het formaat dat is aangegeven in de verzoek-URL. Elk antwoord zal de volgende elementen bevatten:

  • succes: een waarde die de status van het antwoord aangeeft.

    • 0: Negatief; geeft aan dat het verzoek onjuist was.
    • 1: bevestigend; geeft aan dat het verzoek is gelukt.
  • bericht: een tekenreeks die de reden aangeeft voor de afwijking van het verzoek. Alleen beschikbaar als de status negatief is.
  • data: een array met meerdere weerparameters.

    • temp: de temperatuurgegevens.
    • brom: de vochtigheidsaanwezigheidsgegevens.
    • pres: de absolute drukgegevens.
    • aqi: de huidige luchtkwaliteitsindex.

De voorbeeldreacties van beide formaten zijn te zien in de afbeeldingen.

Stap 5: Module-instelling

Module-instelling
Module-instelling
Module-instelling
Module-instelling

Er wordt een toegangspunt gemaakt en een webpagina wordt gehost op een IP-adres (standaard: 192.168.4.1) om de inloggegevens van de apparaatbeheerder/gebruiker te ontvangen bij de allereerste keer opstarten of als de module de reeds opgeslagen inloggegevens niet vindt in de EEPROM.

De gebruiker moet de SSID en het wachtwoord invoeren waarmee de gebruiker de module wil verbinden. De breedte- en lengtegraad worden automatisch ingevuld als u de browser toegang geeft tot de locatie.

Nadat alle gegevens zijn ingevoerd, klikt u op de knop "VERZENDEN" en worden alle inloggegevens in de EEPROM van de module geschreven.

Deze stap is zeer cruciaal, aangezien het tijdens de massaproductie van de modules niet haalbaar is om alle modules te programmeren met de exacte locatiegegevens en WiFi-referenties. Het is ook niet aan te raden om de inloggegevens in het programma hard te coderen, want als we de module naar een andere locatie moeten verplaatsen of de wifi-inloggegevens willen wijzigen, moeten we de module opnieuw programmeren. Om dit gedoe te voorkomen, is de initiële instellingsfunctie geïmplementeerd.

Stap 6: Nu is het tijd om gegevens bij te dragen aan de cloud

Nu is het tijd om gegevens bij te dragen aan de cloud
Nu is het tijd om gegevens bij te dragen aan de cloud
Nu is het tijd om gegevens bij te dragen aan de cloud
Nu is het tijd om gegevens bij te dragen aan de cloud

Nadat alle voorgaande stappen zijn voltooid, is het nu tijd om de module de gegevens naar de server te laten uploaden. Het begint automatisch met uploaden zodra u de inloggegevens hebt opgeslagen.

Het roept de "insert.php" aan als een API-aanroep waarbij alle parameters worden doorgegeven om in de GET-methode te verzenden.

Het onderstaande codefragment laat zien hoe de parameters worden verwerkt.

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

Zo beginnen alle modules met het uploaden van de gegevens.

Opmerking: verlaag de uploadfrequentie in de code als u denkt dat de server overbelast raakt.

Stap 7: Over the Air (OTA)-update

Over the Air (OTA)-update
Over the Air (OTA)-update

Nadat de module helemaal is ingesteld en begint met het uploaden van de gegevens, controleert deze elke dag op firmware-updates op een specifiek tijdstip dat in het programma wordt vermeld. Als het er een vindt, downloadt en flitst het het binaire bestand erin. En als dat niet het geval is, wordt de normale bewerking van het uploaden van de gegevens voortgezet.

Om te controleren of er een nieuwe update is, roept de module de "update.php" aan door het MAC-adres in de verzoekheader te sturen. De server controleert vervolgens of dat specifieke MAC-adres een nieuwe update heeft, zo ja, dan stuurt het als reactie het binaire bestand van de nieuwste firmware.

Het controleert ook op alle benodigde headers die nodig zijn voor basisverificatie van de module.

Stap 8: Hoe gebruiker/cliënt toegang heeft tot de gegevens…

Hoe gebruiker/cliënt toegang heeft tot de gegevens…
Hoe gebruiker/cliënt toegang heeft tot de gegevens…
Hoe gebruiker/cliënt toegang heeft tot de gegevens…
Hoe gebruiker/cliënt toegang heeft tot de gegevens…
Hoe gebruiker/cliënt toegang heeft tot de gegevens…
Hoe gebruiker/cliënt toegang heeft tot de gegevens…

Het is vrij eenvoudig om toegang te krijgen tot de gegevens van de server. Gewoon door "retrieve.php" aan te roepen, krijgen we de weergegevens als antwoord in JSON-indeling. Daarna is het gewoon een kwestie van de JSON-gegevens ontleden om toegang te krijgen tot de afzonderlijke elementen. Vergelijkbaar is met XML-antwoord. De gebruiker kan altijd het gewenste reactieformaat specificeren waarin de gebruiker zich prettig voelt om mee te werken. Als de gebruiker de indeling niet opgeeft, is de standaardindeling JSON.

Er wordt een voorbeeldverzoek gedaan met behulp van de POSTMAN-tool om de werking van de API te controleren.

Een voorbeeld van het ontleden van een JSON-antwoord in javascript wordt weergegeven in het onderstaande codefragment.

var url = "https://example.com/retrieve.php?lat=19.044848&lon=72.8464373";function httpGet(theUrl) { var xmlHttp = new XMLHttpRequest(); xmlHttp.open("GET", theUrl, false); // false voor synchrone aanvraag xmlHttp.send (null); xmlHttp.responsText teruggeven; } var mijnVar = httpGet(url); var obj = JSON.parse(mijnVar); document.getElementById("aqi").innerHTML = obj.data[0].aqi; document.getElementById("temperatuur").innerHTML = Math.round(obj.data[0].temp) + "°C"; document.getElementById("temp").innerHTML = Math.round(obj.data[0].temp) + "°C"; document.getElementById("vochtigheid").innerHTML = Math.round(obj.data[0].hum) + "%"; document.getElementById("druk").innerHTML = Math.round(obj.data[0].pres) + "mb";

De broncode van de HTML-voorbeeldpagina die het JSON-antwoord parseert, is beschikbaar aan het einde van deze stap.

Opmerking: Wijzig de extensie van het bestand in ".html".

Stap 9: Beperkingen van dit project

  • Het project gebruikt GET om de gegevens te verzenden; ook al gaat het niet om gevoelige gegevens, de gegevens kunnen gemakkelijk worden gemanipuleerd omdat het geen mechanisme heeft om de authenticiteit van de bron te controleren, afgezien van het controleren van de headers, die gemakkelijk kunnen worden gewijzigd en zelfs een normaal apparaat kan worden vervalst om op een weermodule te lijken.
  • Omdat de module uitsluitend vertrouwt en afhankelijk is van een ander toegangspunt (WIFI) om de gegevens te verzenden, die in de meeste gevallen van andere organisaties zouden zijn. Als het toegangspunt om de een of andere reden niet in gebruik is, zou de module geen gegevens kunnen verzenden.
  • Hoewel het project is gebouwd om de nauwkeurigheid van het bestaande systeem te vergroten, is de op de markt beschikbare sensor minder nauwkeurig dan verwacht, wat tot gevolg heeft dat het hoofddoel niet wordt gehaald.
  • Bij het plannen van het project was ik van plan een modus op te nemen waarin de server de gegevenswaarde gemiddeld op basis van locatie voor foutcorrectie. Maar toen ik deze functie implementeerde, realiseerde ik me dat er API's van derden nodig waren om de coördinaten naar geografische regio's te vertalen.

Stap 10: Verdere verbeteringen die aan dit project kunnen worden aangebracht

  • De nauwkeurigheid van de module kan verder worden verbeterd door de sensoren speciaal op het specifieke doel af te stemmen in plaats van de generieke module die op de markt verkrijgbaar is.
  • De module kan worden aangepast om nog onafhankelijker te werken door een speciale chip te gebruiken die draadloos communiceert met Cell-towers om de gegevens te verzenden, waardoor de fouttolerantie wordt verbeterd.
  • Zonnepaneel en batterijsysteem kunnen worden gebruikt in combinatie met de diepe slaapmodus van ESP, waardoor de energie-efficiëntie wordt verbeterd en het onafhankelijker wordt van een externe voeding.
  • POST kan worden gebruikt om gegevens te verzenden met een authenticatiemechanisme, zoals het gebruik van cyclische codes voor elke verzending van gegevens.
  • In plaats van NodeMCU, dat een prototyping-bord is, kunnen we een aangepaste microcontroller in massaproductie gebruiken die niet alleen de kosten verlaagt, maar ook optimaal gebruik maakt van de systeembronnen.
  • In combinatie met de geolocatie-API van Google en verbinding met elke beschikbare open WIFI, kan de module werken zonder deze zelfs maar te configureren; klaar om gegevens uit de fabriek te verzenden zonder enige configuratie.

Stap 11: Een paar woorden voor het publiek

Een paar woorden voor het publiek
Een paar woorden voor het publiek

Hallo allemaal, ik realiseer me dat dit helemaal geen beginnersvriendelijke tutorial is, omdat ik niet elk detail heb genoemd dat moet worden behandeld. En ook dit project is echt enorm om te worden behandeld in een Instructable. Toch heb ik mijn best gedaan om elk belangrijk aspect van het project te behandelen. Ik weet ook dat een video waarin de werking van het project wordt getoond echt geweldig zou zijn geweest, maar aangezien dit mijn eerste instructable is en om eerlijk te zijn, dit is mijn eerste publicatie van iets wat hierop lijkt, was ik behoorlijk nerveus om voor een camera.

Als jullie hulp nodig hebben bij het maken van dit project of iets dergelijks, neem dan contact met me op via [email protected] of je kunt zoals altijd een reactie plaatsen. Ik zal proberen jullie zo goed mogelijk te helpen.

Bedankt!!

Aanbevolen: