Turinys:

„IoT Made Easy“: nuotolinių orų duomenų fiksavimas: UV ir oro temperatūra bei drėgmė: 7 žingsniai
„IoT Made Easy“: nuotolinių orų duomenų fiksavimas: UV ir oro temperatūra bei drėgmė: 7 žingsniai

Video: „IoT Made Easy“: nuotolinių orų duomenų fiksavimas: UV ir oro temperatūra bei drėgmė: 7 žingsniai

Video: „IoT Made Easy“: nuotolinių orų duomenų fiksavimas: UV ir oro temperatūra bei drėgmė: 7 žingsniai
Video: NOOBS PLAY CALL OF DUTY MOBILE FROM START LIVE 2024, Liepa
Anonim
„IoT Made Easy“: nuotolinių orų duomenų fiksavimas: UV ir oro temperatūra bei drėgmė
„IoT Made Easy“: nuotolinių orų duomenų fiksavimas: UV ir oro temperatūra bei drėgmė

Šioje pamokoje mes užfiksuosime nuotolinius duomenis kaip UV (ultravioletinė spinduliuotė), oro temperatūrą ir drėgmę. Šie duomenys bus labai svarbūs ir bus naudojami būsimoje pilnoje orų stotyje.

Blokinė diagrama parodo, ką gausime pabaigoje.

Vaizdas
Vaizdas

1 žingsnis: „BoM - Bill of Material“

„NodeMCU“(ESP8266-12E) - 9,00 USD

Drėgmės ir temperatūros jutiklis (DHT22) - 10,00 USD

UV jutiklis - 4,00 USD

OLED USD 12.00

Duonos lenta - 1,00 USD

2 žingsnis: Analoginis UV jutiklis

Analoginis UV jutiklis
Analoginis UV jutiklis
Analoginis UV jutiklis
Analoginis UV jutiklis
Analoginis UV jutiklis
Analoginis UV jutiklis

Šis UV jutiklis generuoja analoginį išėjimą, proporcingą ultravioletinei spinduliuotei, esančiai šviesos jutimo spektre. Jis naudoja UV fotodiodą (pagrįstą galio nitridu), kuris gali aptikti 240–370 nm šviesos diapazoną (kuris apima UVB ir didžiąją UVA spektro dalį). Signalo lygis iš fotodiodo yra labai mažas, nano-amperų lygyje, todėl modulis turi įmontuotą operacinį stiprintuvą, kuris sustiprina signalą iki labiau įskaitomo voltinio lygio (nuo 0 iki 1 V).

Jutiklis ir stiprintuvas gali būti maitinami, prijungus VCC prie 3.3VDC (arba 5VDC) ir GND prie maitinimo įžeminimo. Analoginį signalą galima gauti iš OUT kaiščio.

Jo išvestis bus milivoltais ir bus skaitoma naudojant mūsų „NodeMCU“analoginę įvestį. Perskaitę turėtume jį „konvertuoti“(arba „susieti“), kad reikšmės būtų geriau apdorojamos kodu. Tai galime padaryti naudodami funkciją readSensorUV ():

/ * Perskaitykite UV jutiklį mV ir paskambinkite UV indekso apskaičiavimui */

void readSensorUV () {baitas numOfReadings = 5; dataSensorUV = 0; for (int i = 0; i <numOfReadings; i ++) {dataSensorUV+= analogRead (sensorUVPin); vėlavimas (200); } dataSensorUV /= numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023,0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); }

Gavę UV duomenis, galime lengvai apskaičiuoti UV indeksą, kaip apibrėžta aukščiau esančioje lentelėje. Funkcija indexCalculate () tai padarys už mus:

/ * UV indekso apskaičiavimas */

void indexCalculate () {if (dataSensorUV <227) indexUV = 0; else if (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; else if (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; else if (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; else if (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; else if (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; else if (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; else if (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; else if (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; else if (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; else if (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; kitaip indeksasUV = 11; }

3 veiksmas: ekrano įdiegimas: OLED

Ekrano įdiegimas: OLED
Ekrano įdiegimas: OLED
Ekrano įdiegimas: OLED
Ekrano įdiegimas: OLED

Bandymo tikslais į UV matuoklį įtrauksime OLED (šis žingsnis yra visiškai neprivalomas).

Bandymų metu galima naudoti serijinį monitorių, bet kas atsitinka, kai naudojate savo prototipus toli nuo kompiuterio atskiru režimu? Norėdami tai padaryti, įdiekime OLED ekraną SSD1306, kurio pagrindinės charakteristikos yra šios:

  • Ekrano dydis: 0,96"
  • I2C IIC SPI serija
  • 128X64
  • Baltas OLED LCD LED

Sekite elektros schemą ir prijunkite 4 OLED kaiščius:

  • VCC pereina prie 3.3V
  • GND eina į žemę
  • SCL eina į „NodeMCU“(GPIO 2) ==> D4
  • SDA eina į „NodeMCU“(GPIO 0) ==> D3

Prijungę ekraną, atsisiųskime ir įdiekime jo biblioteką į „Arduino IDE“: „ESP8266 OLED Driver for SSD1306 display“, sukurtą Danielio Eichhorno (įsitikinkite, kad naudojate 3.0.0 ar naujesnę versiją!).

Įdiekite biblioteką „Arduino IDE“, kurią rasite SSD1306Wire.h

Kai iš naujo paleisite IDE, biblioteka turėtų būti jau įdiegta.

Biblioteka palaiko I2C protokolą, kad galėtų pasiekti OLED ekraną naudojant įmontuotą „Wire.h“biblioteką:

/ * OLED */

#include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306Wire ekranas (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN);

Išvardinkime keletą svarbių API, kurios bus naudojamos su mūsų OLED ekranu. Visą sąrašą rasite aukščiau pateiktame „GITHub“.

A. Ekrano valdymas:

void init (); // Inicijuoti ekraną

void displayOn (negalioja); // Įjungti ekraną void displayOff (void); // Išjungti ekraną void clear (void); // Išvalyti vietinio pikselių buferio void flipScreenVertically (); // Apverskite ekraną aukštyn kojom

B. Teksto operacijos:

void drawString (int16_t x, int16_t y, eilutės tekstas); // (xpos, ypos, „Tekstas“)

void setFont (const char* fontData); // Nustato dabartinį šriftą.

Galimi numatytieji šriftai:

  • „ArialMT_Plain_10“,
  • „ArialMT_Plain_16“,

  • ArialMT_Plain_24

Įdiegę ir patį OLED, ir jo biblioteką, parašykime paprastą programą, kad ją išbandytume. Įveskite žemiau esantį kodą savo IDE, rezultatas turėtų būti ekranas, kaip parodyta aukščiau esančioje nuotraukoje:

* OLED */

#include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306Wire ekranas (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } void loop () {} / * Inicijuoti ir rodyti sąrankos duomenis OLED * / void displaySetup () {display.init (); // inicijuoti ekrano rodymą.clear (); // Išvalyti ekrano ekraną.flipScreenVertically (); // Apverskite ekraną aukštyn kojom. Display (); // Įdėkite duomenis į ekraną Serial.println ("Inicijuojamas ekrano testas"); display.setFont („ArialMT_Plain_24“); display.drawString (30, 0, "OLED"); // (xpos, ypos, "Tekstas") display.setFont (ArialMT_Plain_16); display.drawString (18, 29, „Bandymas pradėtas“); display.setFont („ArialMT_Plain_10“); display.drawString (10, 52, „Serial BaudRate:“); display.drawString (90, 52, eilutė (11500)); display.display (); // Įdėti duomenis į ekrano uždelsimą (3000); }

Aukščiau pateiktą programą galima atsisiųsti iš „GitHub“:

MazgasMCU_OLED_Test

4 žingsnis: vietinis UV matuoklis

Vietinis UV matuoklis
Vietinis UV matuoklis
Vietinis UV matuoklis
Vietinis UV matuoklis

Dabar, įdiegę OLED ekraną, galime prijungti akumuliatorių ir atlikti kai kuriuos nuotolinius bandymus naudodami „UV matuoklį“

#define SW_VERSION "UV_Sensor_V.1"

/ * UV jutiklis */ #define sensorUVPin A0 int dataSensorUV = 0; int indeksasUV = 0; / * OLED */ #include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306Wire ekranas (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } void loop () {readSensorUV (); displayUV (); vėlavimas (1000); } / * Inicijuoti ir rodyti sąrankos duomenis OLED * / void displaySetup () {display.init (); // inicijuoti ekrano rodymą.clear (); // Išvalyti ekrano ekraną.flipScreenVertically (); // Apverskite ekraną aukštyn kojom. Display (); // Pateikite duomenis į ekraną Serial.println ("UV jutiklio bandymo inicijavimas"); display.setFont („ArialMT_Plain_24“); display.drawString (10, 0, „MJRoBot“); display.setFont („ArialMT_Plain_16“); display.drawString (0, 29, „UV jutiklio testas“); display.setFont („ArialMT_Plain_10“); display.drawString (0, 52, "SW Ver.:"); display.drawString (45, 52, SW_VERSION); display.display (); vėlavimas (3000); } / * Skaityti UV jutiklį mV ir iškviesti UV indekso apskaičiavimą * / void readSensorUV () {baitas numOfReadings = 5; dataSensorUV = 0; for (int i = 0; i <numOfReadings; i ++) {dataSensorUV+= analogRead (sensorUVPin); vėlavimas (200); } dataSensorUV /= numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023,0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); } / * UV indekso apskaičiavimas * / void indexCalculate () {if (dataSensorUV <227) indexUV = 0; else if (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; else if (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; else if (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; else if (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; else if (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; else if (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; else if (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; else if (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; else if (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; else if (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; kitaip indeksasUV = 11; } /* Rodyti UV reikšmes vietiniame OLED* / void displayUV () {display.clear (); display.setFont („ArialMT_Plain_16“); display.drawString (20, 0, „UV jutiklis“); display.drawString (0, 23, "UV (mV):"); display.drawString (80, 23, eilutė (dataSensorUV)); display.drawString (0, 48, "UV indeksas:"); display.setFont („ArialMT_Plain_24“); display.drawString (82, 42, eilutė (indexUV)); display.display (); }

Pirmiau pateiktą kodą galima atsisiųsti iš „GitHun“: NodeMCU_UV_Sensor_OLED.ino

5 žingsnis: DHT22 įrengimas oro temperatūrai ir drėgmei matuoti

DHT22 įrengimas oro temperatūrai ir drėgmei matuoti
DHT22 įrengimas oro temperatūrai ir drėgmei matuoti
DHT22 įrengimas oro temperatūrai ir drėgmei matuoti
DHT22 įrengimas oro temperatūrai ir drėgmei matuoti

Vienas iš dažniausiai naudojamų jutiklių orų duomenims fiksuoti yra skaitmeninis santykinės drėgmės ir temperatūros jutiklis DHT22 (arba jo brolis DHT11). Jis naudoja talpinį drėgmės jutiklį ir termistorių, kad išmatuotų aplinkinį orą, ir išspjauna skaitmeninį signalą ant duomenų kaiščio (nereikia analoginių įvesties kaiščių).

Jutiklis turi būti maitinamas nuo 3,3 V iki 5 V, jis veiks nuo -40 oC iki +80 oC, o tikslumas-+/- 0,5 oC esant temperatūrai ir +/- 2% santykiniam drėgnumui. Taip pat svarbu nepamiršti, kad jo jutimo laikotarpis yra vidutiniškai 2 sekundės (minimalus laikas tarp rodmenų). „Adafruit“svetainėje pateikiama daug informacijos apie DHT22 ir jos brolį DHT11. Norėdami gauti daugiau informacijos, apsilankykite DHT22/11 mokymo programos puslapyje.

DHT22 turi 4 kaiščius (nukreipti į jutiklį, 1 kaištis yra labiausiai paliktas):

  1. VCC (prisijungsime prie 3.3V iš „NodeMCU“);
  2. Duomenys išvesti;
  3. Neprisijungęs ir
  4. Gruntas.

Paprastai jutiklį naudosite mažesniais nei 20 m atstumais, tarp duomenų ir VCC kaiščių reikia prijungti 10K rezistorių. Išvesties kaištis bus prijungtas prie „NodeMCU“kaiščio D3 (žr. Aukščiau pateiktą schemą). Kai jutiklis bus įdiegtas mūsų modulyje, atsisiųskite DHT biblioteką iš „Adafruit GitHub“saugyklos ir įdiekite ją į „Arduino“bibliotekos failą. Kai iš naujo įkeliate „Arduino IDE“, reikia įdiegti „DHT jutiklių biblioteką“.

Kodo pradžioje turime įtraukti šias eilutes:

/* DHT22*/

#įtraukti „DHT.h“#define DHTPIN D2 #define DHTTYPE DHT22 DHT dht (DHTPIN, DHTTYPE); plūduriuoti hum = 0; plūdės temperatūra = 0;

Bus sukurta nauja jutiklio nuskaitymo funkcija:

/ * Gaukite DHT duomenis */

void getDhtData (void) {float tempIni = temp; plūdė humIni = hum; temp = dht.readTemperature (); hum = dht.readHumidity (); if (isnan (hum) || isnan (temp)) // Patikrinkite, ar nepavyko nuskaityti, ir išjunkite anksti (bandyti dar kartą). {Serial.println ("Nepavyko nuskaityti iš DHT jutiklio!"); temp = tempIni; hum = humIni; grįžti; }}

Visą kodą, įskaitant UV ir DHT jutiklius, galite atsisiųsti iš „GitHub“: NodeMCU_UV_DHT_Sensor_OLED

6 veiksmas: duomenų siuntimas į „ThingSpeak.com“

Duomenų siuntimas į ThingSpeak.com
Duomenų siuntimas į ThingSpeak.com
Duomenų siuntimas į ThingSpeak.com
Duomenų siuntimas į ThingSpeak.com
Duomenų siuntimas į ThingSpeak.com
Duomenų siuntimas į ThingSpeak.com

Iki šiol „NodeMCU ESP12-E“naudojome tik kaip įprastą ir paprastą „Arduino“plokštę. Žinoma, mes tik „subraižėme“tikrąjį šio įspūdingo mažo lusto potencialą ir dabar laikas pakilti į dangų! Arba geriau į žvaigždes! Eh … į debesį!;-)

Pradėkime!

  1. Pirma, jūs turite turėti paskyrą „ThinkSpeak.com“
  2. Vykdykite instrukcijas, kad sukurtumėte kanalą, ir atkreipkite dėmesį į kanalo ID ir „Write API Key“
  3. Atnaujinkite žemiau esantį kodą naudodami „WiFi“tinklą ir „Thinkspeak“prisijungimo duomenis
  4. Paleiskite programą IDE

Pakomentuokime svarbiausias kodo dalis:

Pirmiausia paskambinkime ESP8266 bibliotekai, apibrėžkime „WiFi“klientą ir apibrėžkime savo vietinio maršrutizatoriaus ir „Thinkspeak“kredencialus:

/* ESP12-E ir „Thinkspeak“*/

#įtraukti „WiFiClient“klientą; const char* MY_SSID = "JŪSŲ SSD ID ČIA"; const char* MY_PWD = "JŪSŲ Slaptažodis ČIA"; const char* TS_SERVER = "api.thingspeak.com"; Styga TS_API_KEY = "JŪSŲ KANALO RAŠYMO API RAKTAS";

Antra, įtraukime labai svarbią biblioteką, skirtą daiktų interneto projektams: SimpleTimer.h:

/ * LAIKMATAS */

#įtraukti „SimpleTimer“laikmatį;

Trečia, sąrankos metu () inicijuosime nuoseklųjį ryšį, iškviesime funkciją connectWiFi () ir nustatysime laikmačius. Atkreipkite dėmesį, kad kodo eilutė: timer.setInterval (60000L, sendDataTS); iškvies funkciją sendDataTS () kas 60 sekundžių, kad įkelti duomenis į „ThinkSpeak“kanalą.

negaliojanti sąranka ()

{… Serial.begin (115200); vėlavimas (10); … ConnectWifi (); timer.setInterval (60000L, sendDataTS); …}

Galiausiai, bet ne mažiau svarbu, kad ciklo () metu vienintelė reikalinga komanda būtų paleisti laikmatį ir viskas!

tuštumos kilpa ()

{… Timer.run (); // Inicijuoja „SimpleTimer“}

Žemiau galite pamatyti dvi svarbias funkcijas, naudojamas „Thinkspeak“ryšiui tvarkyti:

ESP12-E ryšys su „WiFi“tinklu:

/***************************************************

*„WiFi“prijungimas *********************************************** ***/ void connectWifi () {Serial.print ("Prisijungimas prie"+*MY_SSID); „WiFi.begin“(MY_SSID, MY_PWD); while (WiFi.status ()! = WL_CONNECTED) {delay (1000); Serijinis atspaudas ("."); } Serial.println (""); Serial.println („WiFi prijungtas“); Serial.println (""); }

ESP12-E siunčia duomenis į „ThinkSpeak“:

/***************************************************

*Duomenų siuntimas į „Thinkspeak“kanalą ******************************************* ******/ void sendDataTS (void) {if (client.connect (TS_SERVER, 80)) {String postStr = TS_API_KEY; postStr += "& field1 ="; postStr += Styga (dataSensorUV); postStr += "& field2 ="; postStr += Styga (indexUV); postStr += "& field3 ="; postStr += Styga (temp); postStr += "& field4 ="; postStr += Styga (hum); postStr += "\ r / n / r / n"; client.print ("POST /atnaujinti HTTP /1.1 / n"); client.print ("Priegloba: api.thingspeak.com / n"); client.print ("Ryšys: uždaryti / n"); client.print ("X-THINGSPEAKAPIKEY:" + TS_API_KEY + "\ n"); client.print ("Turinio tipas: application/x-www-form-urlencoded / n"); client.print ("Turinio ilgis:"); client.print (postStr.length ()); client.print ("\ n / n"); client.print (postStr); vėlavimas (1000); } išsiųstas ++; client.stop (); }

Visą kodą galite rasti mano „GitHub“: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT

Kai įkeliate kodą į „NodeMCU“. Prijunkime išorinę bateriją ir atlikime matavimus po saule. Padedu nuotolinę stotį ant stogo ir pradedu fiksuoti duomenis ThingSpeak.com, kaip parodyta aukščiau esančiose nuotraukose.

7 žingsnis: Išvada

Išvada
Išvada

Kaip visada, tikiuosi, kad šis projektas gali padėti kitiems rasti kelią į jaudinantį elektronikos pasaulį!

Norėdami gauti daugiau informacijos ir galutinį kodą, apsilankykite mano „GitHub“saugykloje: RPi-NodeMCU-Weather-Station

Norėdami gauti daugiau projektų, apsilankykite mano tinklaraštyje: MJRoBot.org

Sekite naujienas! Kita pamoka atsiųsime duomenis iš nuotolinės oro stoties į centrinę, pagrįstą „Raspberry Pi“žiniatinklio serveriu:

Vaizdas
Vaizdas

Saludos iš pasaulio pietų!

Iki pasimatymo mano kitoje pamokoje!

Ačiū, Marcelo

Rekomenduojamas: