Turinys:

„Smart Distributed IoT Weather“stebėjimo sistema naudojant „NodeMCU“: 11 žingsnių
„Smart Distributed IoT Weather“stebėjimo sistema naudojant „NodeMCU“: 11 žingsnių

Video: „Smart Distributed IoT Weather“stebėjimo sistema naudojant „NodeMCU“: 11 žingsnių

Video: „Smart Distributed IoT Weather“stebėjimo sistema naudojant „NodeMCU“: 11 žingsnių
Video: CS50 2015 – 10-я неделя 2024, Liepa
Anonim
„Smart Distributed IoT Weather“stebėjimo sistema naudojant „NodeMCU“
„Smart Distributed IoT Weather“stebėjimo sistema naudojant „NodeMCU“

Jūs visi galbūt žinote apie tradicinę orų stotį; bet ar kada susimąstėte, kaip tai iš tikrųjų veikia? Kadangi tradicinė orų stotis yra brangi ir didelė, šių stočių tankis ploto vienete yra labai mažas, o tai prisideda prie duomenų netikslumo. Paaiškinsiu, kaip: Tarkime, kad stotis yra miesto viduryje ir tai yra vienintelė stotis, esanti x metro spinduliu, todėl ji gali būti lengvai šališka, jei netoliese yra taršą sukeliančių veiksnių. stoties, kurioje visas „x“metro spindulio plotas yra užterštas, nes ta vienintelė stotis yra atsakinga už visos vietovės orų duomenų nustatymą.

Norint išspręsti šią problemą, reikia padidinti modulių tankį, o tai įmanoma tik tuo atveju, jei moduliai yra pigesni ir užima mažesnį pėdsaką nei esamas.

Dėl šios priežasties mano siūlomas sprendimas yra puikus šios problemos sprendimas, jis kainuoja mažiau nei 10 USD ir taip pat lengvai remiasi į mano delną.

Kaip tai veikia…

Yra 3 pagrindinės šio projekto dalys.

Įrenginio pusė:

Įrenginys yra paveikslėlyje parodytas daiktų interneto modulis, siunčiantis orų duomenis į serverį kas x kartą. Duomenys apima faktinius orų duomenis, modulio geografinę vietą; y., jo koordinatės, MAC adresas; kad būtų galima unikaliai identifikuoti įrenginį, programinės įrangos versiją, kurioje jis šiuo metu veikia. Įrenginio pusėje yra N moduliai, paskirstyti visoje srityje, aktyviai teikiantys duomenis į serverį.

Serverio pusėje:

Kaip rodo pavadinimas, centralizuotas serveris atlieka kelias operacijas, pavyzdžiui, priima duomenis iš modulių ir saugo juos duomenų bazėje, atnaujina modulį naujausia programine įranga, jei jis veikia senesnėje versijoje, siunčia orų duomenis į klientas pagal pageidavimą.

Kliento/vartotojo pusė:

Galutinis vartotojas iš serverio prašo orų duomenų. Klientas siunčia esamą vietą ir, atsižvelgdamas į vietą, serveris apskaičiuoja atstumą tarp kliento ir visų modulių ir siunčia klientui artimiausio modulio orų duomenis, kurie laikomi tiksliais.

Prekės

  • „NodeMCU“(ESP8266-12E)
  • DHT11 (drėgmės ir temperatūros jutiklis)
  • BMP180 (slėgio ir temperatūros jutiklis)
  • MQ-135 (oro kokybės indekso jutiklis)
  • USB kabelis (norint įkelti programą)
  • 5 voltų maitinimo šaltinis
  • Kondensatoriai (pasirinktinai: statomi lygiagrečiai elektros linijai)
  • „Arduino IDE“(norint derinti ir įkelti programą)
  • POSTMAN programa (pasirenkama: norint derinti API)
  • Svetainė (PHP ir MySQL serverių prieglobai)

1 žingsnis: lituokite visus komponentus ir įkelkite programą į „NodeMCU“

Lituokite visus komponentus ir įkelkite programą į „NodeMCU“
Lituokite visus komponentus ir įkelkite programą į „NodeMCU“
Lituokite visus komponentus ir įkelkite programą į „NodeMCU“
Lituokite visus komponentus ir įkelkite programą į „NodeMCU“

Lituokite visus komponentus į „NodeMCU“, kaip parodyta perjungimo plokštės schemoje. Be to, lydėkite kondensatorių lygiagrečiai elektros linijoms, nes aktyviai perduodant ir gaunant duomenis padidėja galia.

Kai litavimo darbai bus atlikti, įkelkite failą „code.c“pateiktą kodą.

Pastaba: nepamirškite pakeisti įgaliojimų savo kredencialais. Taip pat įdėkite failą pavadinimu „html_file.h“į „arduino“eskizų aplanką. Visus šiame projekte naudojamus antraštės failus galite rasti čia

Kodo ypatybės:

Prieigos taškas: kadangi masinėje gamyboje sudėtinga užprogramuoti kiekvieną modulį su kredencialais, modulis pirmą kartą įkeldamas priglobia tinklalapį, kad galėtų priimti „WiFi“, prie kurio turi būti prijungti moduliai, prisijungimo duomenis ir išsaugoti EEPROM, kad vėliau juos būtų galima naudoti.

Kai įgaliojimai sukonfigūruoti, „NodeMCU“patikrina, ar EEPROM nėra įgaliojimų, ir prisijungia prie „WiFi“prisijungimo duomenų, esančių EEPROM.

Sėkmingai prisijungęs prie „WiFi“, „NodeMCU“pradeda įkelti duomenis į serverį kas „x“intervalą, į duomenis įeina orų duomenys, modulio MAC adresas, programinės aparatinės įrangos versija, įrenginio geografinė vieta.

OTA atnaujinimas: modulis taip pat tikrina, ar nėra naujos programinės įrangos atnaujinimo kiekvieną dieną tam tikru laiku, nurodytu kode. Ši funkcija yra naudinga, nes nė vienas gamintojas negali tęsti ir keisti atskiro modulio programos, jei reikia ką nors pakeisti.

„Watchdog“laikmatis: „Atlast“turi būti būdas atsigauti be žmogaus įsikišimo, jei jis užstringa ar sugenda. Tai galima pasiekti naudojant „Watchdog“laikmatį. Tai veikia taip: Yra pertraukos pertrauka, kuri veikia kiekvieną sekundę. ISR kiekvieną kartą padidina skaitiklį ir patikrina, ar skaitiklis pasiekė maksimalų skaičių. Kai skaitiklis pasiekia maksimalią vertę, modulis atsistato, jei jis sugenda. Įprastai veikiant, skaitiklis visada atstatomas, kol nepasiekia maksimalaus skaičiaus.

2 veiksmas: SQL serverio konfigūravimas

SQL serverio konfigūravimas
SQL serverio konfigūravimas

SQL serverio sąranka taip pat yra labai paprasta. Tiesiog sukurkite duomenų bazę SQL serveryje ir importuokite nustatymą importuodami failą pavadinimu „database_structure.txt“. Failą galite rasti atlikę šį veiksmą. Kadangi instrukcija neleidžia įkelti „.sql“failų, pervadinau failą į „.txt“.

Pastaba: pervardykite failą iš „.txt“į „.sql“.

3 veiksmas: failų serverio konfigūravimas

Serverio konfigūravimas yra tikrai lengvas, jei turite svetainę ir ji yra priglobta internete. Aš neatliksiu visos svetainės nustatymo ir jos prieglobos procedūros, nes tai nepatenka į šios pamokos taikymo sritį. Bet jūs galite priglobti jį savo kompiuteryje kaip „localhost“, kad išbandytumėte failų veikimą.

Kadangi „Instructable“neleidžia įkelti PHP failų, pervadinau failus į „.txt“.

Pastaba: pervardykite failų plėtinį į „.php“. Taip pat nepamirškite pakeisti „config.php“failo kredencialų.

Tiesiog įkelkite failus į serverį ir viskas gerai.

Pateiksiu trumpą informaciją apie PHP failus.

db_config.php:

Šiame faile išsaugomi visi prisijungimo prie SQL serverio prisijungimo duomenys.

db_connect:

Šiame faile yra klasė, reikalinga duomenų bazės prijungimui.

insert.php:

„NodeMCU“vadina šį PHP failą, kad būtų galima įkelti duomenis į serverį naudojant GET metodą. Šis failas taip pat yra atsakingas už tų pačių duomenų saugojimą SQL serveryje.

retrieve.php:

Vartotojas/klientas vadina šį PHP naudodami GET metodą. Serveris apskaičiuoja atstumą tarp vartotojo ir visų modulių. Tada artimiausio modulio duomenys siunčiami kaip atsakas klientui JSON/XML formatu, kaip pageidauja klientas.

update.php:

Į šį PHP failą modulis skambina kiekvieną dieną tam tikru laiku, kad patikrintų, ar modulyje veikia naujausia programinės įrangos versija. Tiesiog įdėkite naujausią „.bin“failą į failų serverį ir nurodykite failo katalogą failo kintamajame.

Jei šie failai iš pradžių atrodo bauginantys, į kitą veiksmą įtraukiau vartotojo dokumentus.

4 žingsnis: vartotojo dokumentacija

Vartotojo dokumentacija
Vartotojo dokumentacija
Vartotojo dokumentacija
Vartotojo dokumentacija

Įvadas:

„Weather API“suteikia paprastą sąsają, skirtą užklausti orų duomenis apie vietoves žemės paviršiuje. Jūs prašote orų informacijos apie konkrečią platumos/ilgumos porą, nurodytą išvesties formatą. API grąžina temperatūros, drėgmės, slėgio ir oro kokybės indeksą, kurį paskutinį kartą užregistravo artimiausias modulis iš pageidaujamos vietos.

Prieš tau pradedant:

Šis dokumentas skirtas svetainių ir mobiliųjų įrenginių kūrėjams, norintiems į orų informaciją įtraukti kuriamą programą. Jame pristatomas naudojimas naudojant API ir informacinę medžiagą apie galimus parametrus.

Orų duomenų užklausos:

„Weather“API užklausos sudaromos kaip URL eilutė. API grąžina žemės taško orų duomenis, nurodytus platumos/ilgumos pora. Atminkite, kad orų duomenų tikslumas yra tiesiogiai proporcingas tam tikroje vietoje esančių modulių tankiui.

„Weather“API užklausa pateikiama tokia forma:

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

Kur išvesties formatas (formatas) gali būti bet kuri iš šių reikšmių:

  • JSON (rekomenduojama), nurodo išvestį „JavaScript Object Notation“(JSON); arba
  • XML, nurodo išvestį XML, apvyniotą mazge.

Užklausos parametrai:

Kaip įprasta visuose URL, parametrai atskiriami naudojant simbolį „&“(&). Parametrų sąrašas ir galimos jų vertės yra pažymėti žemiau.

Reikalingi parametrai:

  • lat: nurodo vietos platumą, kurią reikia ieškoti. (pvz., latas = 19,56875)
  • lon: nurodo ieškomos vietos ilgumą. (pvz., lon = 72.97568)

Pasirenkami parametrai:

formatas: nurodo orų duomenų atsako išvesties formatą. Tai gali būti JSON arba XML. Numatytasis yra JSON. (pvz., formatas = json arba formatas = xml)

Atsakymai į orus:

Į kiekvieną galiojančią užklausą laiko juostos tarnyba pateiks atsakymą tokiu formatu, kuris nurodytas užklausos URL. Kiekviename atsakyme bus šie elementai:

  • sėkmė: reikšmė, nurodanti atsakymo būseną.

    • 0: neigiamas; rodo, kad užklausa buvo netinkamai suformuota.
    • 1: teigiamas; rodo, kad prašymas buvo patenkintas.
  • pranešimas: eilutė, nurodanti užklausos klaidos priežastį. Galima tik tada, kai būsena yra neigiama.
  • duomenys: masyvas su keliais oro parametrais.

    • temp: temperatūros duomenys.
    • hum: drėgmės buvimo duomenys.
    • pres: absoliutaus slėgio duomenys.
    • aqi: dabartinis oro kokybės indeksas.

Abiejų formatų atsako pavyzdžiai matomi paveikslėliuose.

5 žingsnis: modulio sąranka

Modulio sąranka
Modulio sąranka
Modulio sąranka
Modulio sąranka

Sukuriamas prieigos taškas ir tinklalapis priglobiamas IP adresu (numatytasis: 192.168.4.1), kad būtų galima gauti kredencialus iš įrenginio tvarkyklės/vartotojo pirmą kartą paleidžiant arba jei modulis neranda jau išsaugotų kredencialų EEPROM.

Vartotojas turi įvesti SSID ir slaptažodį, prie kurio vartotojas nori prisijungti. Platuma ir ilguma automatiškai užpildomos, jei leidžiate naršyklei pasiekti vietą.

Įvedę visą informaciją, spustelėkite mygtuką „SEND“, o tada visi įgaliojimai įrašomi į modulio EEPROM.

Šis žingsnis yra labai svarbus, nes masiškai gaminant modulius neįmanoma programuoti visų modulių pagal tikslius vietos duomenis ir „WiFi“prisijungimo duomenis. Taip pat nepatartina programoje patvirtinti prisijungimo kodo, nes jei mums išvis reikia perkelti modulį į kitą vietą arba norime pakeisti „WiFi“prisijungimo duomenis, turėsime perprogramuoti modulį. Siekiant išvengti šio vargo, įgyvendinama pradinė sąrankos funkcija.

6 žingsnis: Dabar atėjo laikas įnešti duomenų į debesį

Dabar atėjo laikas įnešti duomenų į debesį
Dabar atėjo laikas įnešti duomenų į debesį
Dabar atėjo laikas įnešti duomenų į debesį
Dabar atėjo laikas įnešti duomenų į debesį

Atlikus visus ankstesnius veiksmus, atėjo laikas leisti moduliui įkelti duomenis į serverį. Išsaugojus kredencialus, jis automatiškai pradedamas įkelti.

Jis vadina „insert.php“kaip API skambutį, perduodamas visus parametrus siųsti GET metodu.

Žemiau pateiktas kodo fragmentas parodo, kaip apdorojami parametrai.

if (isset ($ _ GET ['temp']) && isset ($ _ GET ['hum']) && isset ($ _ GET ['pres']) && isset ($ _ GET ['aqi']) && isset ($ _ GET ['mac']) && isset ($ _ GET ['lat']) && isset ($ _ GET ['lon']))) 2. {3. // pagrindinė programa 4.}

Panašiai visi moduliai pradeda įkelti duomenis.

Pastaba: sumažinkite kodo įkėlimo dažnį, jei manote, kad serveris perkrautas.

7 veiksmas: „Air“(OTA) atnaujinimas

„Over the Air“(OTA) atnaujinimas
„Over the Air“(OTA) atnaujinimas

Kai visas modulis yra nustatytas ir pradedamas įkelti duomenys, jis kiekvieną dieną tikrina, ar nėra programinės įrangos atnaujinimų tam tikru programoje nurodytu laiku. Jei jis randa, jis atsisiunčia ir mirksi dvejetainį failą. O jei ne, toliau tęsiama įprasta duomenų įkėlimo operacija.

Norėdami patikrinti, ar nėra naujo atnaujinimo, modulis iškviečia „update.php“, siunčiant MAC adresą savo užklausos antraštėje. Tada serveris patikrina, ar tas konkretus MAC adresas yra atnaujintas, jei taip, tada atsakydamas siunčia naujausios programinės įrangos dvejetainį failą.

Ji taip pat patikrina visas būtinas antraštes, reikalingas pagrindiniam modulio autentifikavimui.

8 veiksmas: kaip vartotojas/klientas gali pasiekti duomenis …

Kaip vartotojas/klientas gali pasiekti duomenis …
Kaip vartotojas/klientas gali pasiekti duomenis …
Kaip vartotojas/klientas gali pasiekti duomenis …
Kaip vartotojas/klientas gali pasiekti duomenis …
Kaip vartotojas/klientas gali pasiekti duomenis …
Kaip vartotojas/klientas gali pasiekti duomenis …

Prieiga prie duomenų iš serverio yra gana paprasta. Tiesiog paskambinę „retrieve.php“, mes gausime orų duomenis atsakydami JSON formatu. Po to tereikia išanalizuoti JSON duomenis, kad būtų galima pasiekti atskirus elementus. Panašiai yra ir su XML atsakymu. Vartotojas visada gali nurodyti pageidaujamą atsakymo formatą, kuriuo vartotojui patogu dirbti. Jei vartotojas nenurodo formato, numatytasis formatas yra JSON.

Paraiškos pavyzdys pateikiamas naudojant POSTMAN įrankį, kad būtų patikrintas API veikimas.

Toliau pateiktame kodo fragmente pateiktas JSON atsakymo analizės „JavaScript“pavyzdys.

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); // klaidinga sinchroninei užklausai xmlHttp.send (null); return xmlHttp.responseText; } var myVar = httpGet (url); var obj = JSON.parse (myVar); document.getElementById ("aqi"). internalHTML = obj.data [0].aqi; document.getElementById ("temperatūra"). internalHTML = Math.round (obj.data [0].temp) + "° C"; document.getElementById ("temp"). internalHTML = Math.round (obj.data [0].temp) + "° C"; document.getElementById ("drėgmė"). internalHTML = Math.round (obj.data [0].hum) + "%"; document.getElementById ("slėgis"). internalHTML = Math.round (obj.data [0].pres) + "mb";

Šio veiksmo pabaigoje galite rasti pavyzdinio HTML puslapio, kuriame analizuojamas JSON atsakymas, šaltinio kodą.

Pastaba: pakeiskite failo plėtinį į „.html“.

9 žingsnis: šio projekto apribojimai

  • Projektas naudoja GET duomenims siųsti; nors ir nesusiję su neskelbtinais duomenimis, duomenimis galima lengvai manipuliuoti, nes jie neturi jokio mechanizmo šaltinio autentiškumui patikrinti, išskyrus antraščių tikrinimą, kurį galima lengvai pakeisti ir net įprastą įrenginį galima suklastoti atrodyti kaip oro modulis.
  • Kadangi modulis tik remiasi ir priklauso nuo kito prieigos taško (WIFI), kad išsiųstų duomenis, kurie dažniausiai būtų kitų organizacijų. Jei prieigos taškas dėl kokių nors priežasčių neveikia, modulis negalės siųsti duomenų.
  • Nors projektas yra sukurtas siekiant padidinti esamos sistemos tikslumą, rinkoje esantis jutiklis yra mažiau tikslus, nei tikėtasi, todėl jo pagrindinis tikslas nepavyks.
  • Planuodamas projektą planavau įtraukti režimą, kuriame serveris apskaičiuoja duomenų vertę pagal klaidų taisymo vietą. Tačiau įdiegęs šią funkciją supratau, kad norint išversti koordinates į geografinius regionus, reikia tam tikrų trečiųjų šalių API.

10 veiksmas: tolesni šio projekto patobulinimai

  • Modulio tikslumą galima dar labiau pagerinti specialiai pritaikius jutiklius konkrečiam tikslui, o ne naudojant rinkoje esantį bendrąjį modulį.
  • Modulį galima modifikuoti taip, kad jis veiktų dar savarankiškiau, naudojant specialų lustą, kuris belaidžiu ryšiu palaiko ryšį su „Cell-towers“ir siunčia duomenis, taip pagerindamas gedimų toleravimą.
  • Saulės skydelį ir akumuliatorių sistemą galima naudoti kartu su ESP gilaus miego režimu, taip padidinant energijos vartojimo efektyvumą ir padedant labiau nepriklausyti nuo išorinio maitinimo šaltinio.
  • POST gali būti naudojamas duomenims siųsti naudojant tam tikrą autentifikavimo mechanizmą, pvz., Naudojant ciklinius kodus kiekvienam duomenų perdavimui.
  • Vietoj „NodeMCU“, kuri yra prototipų kūrimo plokštė, masinėje gamyboje galime naudoti pasirinktinį mikrovaldiklį, kuris ne tik sumažina išlaidas, bet ir geriausiai išnaudoja sistemos išteklius.
  • Kartu su „Google“geografinės vietos nustatymo API ir prisijungimu prie bet kurio turimo atviro WIFI modulis gali veikti net jo nesukonfigūravus; pasiruošę perduoti duomenis iš gamyklos be jokios sąrankos.

11 žingsnis: keli žodžiai auditorijai

Keletas žodžių publikai
Keletas žodžių publikai

Sveiki, vaikinai, aš suprantu, kad tai visai ne pradedantiesiems tinkama pamoka, nes nepaminėjau kiekvienos detalės, kurią reikia aprėpti. Be to, šis projektas yra tikrai platus, kad būtų įtrauktas į „Instructable“. Vis dėlto stengiausi apimti kiekvieną svarbų projekto aspektą. Taip pat žinau, kad vaizdo įrašas, kuriame būtų parodytas projekto veikimas, būtų buvęs tikrai puikus, tačiau kadangi tai yra mano pirmas pamokomas dalykas ir, tiesą pasakius, tai yra mano pirmasis panašios publikacijos leidinys, labai jaudinausi būdama priešais fotoaparatas.

Jei jums reikia pagalbos kuriant šį projektą ar ką nors panašaus, tiesiog susisiekite su manimi adresu [email protected] arba kaip visada galite parašyti komentarą. Pasistengsiu jums padėti, vaikinai, kiek galėsiu.

Ačiū!!

Rekomenduojamas: