Tartalomjegyzék:

Az IoT Made Easy: Távoli időjárási adatok rögzítése: UV és a levegő hőmérséklete és páratartalma: 7 lépés
Az IoT Made Easy: Távoli időjárási adatok rögzítése: UV és a levegő hőmérséklete és páratartalma: 7 lépés

Videó: Az IoT Made Easy: Távoli időjárási adatok rögzítése: UV és a levegő hőmérséklete és páratartalma: 7 lépés

Videó: Az IoT Made Easy: Távoli időjárási adatok rögzítése: UV és a levegő hőmérséklete és páratartalma: 7 lépés
Videó: Garmin Forerunner 955 (Solar) полный обзор 2024, Július
Anonim
Az IoT Made Easy: Távoli időjárási adatok rögzítése: UV és levegő hőmérséklet és páratartalom
Az IoT Made Easy: Távoli időjárási adatok rögzítése: UV és levegő hőmérséklet és páratartalom

Ebben az oktatóanyagban távoli adatokat rögzítünk UV (ultraibolya sugárzás), léghőmérséklet és páratartalom formájában. Ezek az adatok nagyon fontosak lesznek, és felhasználásra kerülnek egy jövőbeni komplett meteorológiai állomáson.

A blokkdiagram megmutatja, hogy mit fogunk kapni a végén.

Kép
Kép

1. lépés: BoM - Bill of Material

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

Páratartalom és hőmérséklet érzékelő (DHT22) - 10,00 USD

UV -érzékelő - 4,00 USD

OLED USD 12.00

Kenyeretábla - 1,00 USD

2. lépés: Az analóg UV -érzékelő

Az analóg UV -érzékelő
Az analóg UV -érzékelő
Az analóg UV -érzékelő
Az analóg UV -érzékelő
Az analóg UV -érzékelő
Az analóg UV -érzékelő

Ez az UV-érzékelő a fényérzékelő spektrumon található ultraibolya sugárzással arányos analóg kimenetet generál. UV fotodiódát használ (Gallium Nitride alapján), amely képes érzékelni a 240-370 nm fénytartományt (amely lefedi az UVB-t és az UVA spektrum nagy részét). A fotodióda jelszintje nagyon kicsi, a nano-amper szintben, ezért a modul beépített egy operációs erősítőt, hogy a jelet olvashatóbb voltszintre (0-1V) erősítse.

Az érzékelő és az erősítő tápellátható, ha a VCC-t 3.3VDC-re (vagy 5VDC-re), a GND-t pedig a földre csatlakoztatja. Az analóg jel az OUT érintkezőből szerezhető be.

A kimenet millivoltban lesz, és a NodeMCU analóg bemenete fogja olvasni. Olvasás után "konvertálni" (vagy "leképezni") kell, hogy az értékeket jobban kezelje a kód. Ezt a readSensorUV () függvénnyel tehetjük meg:

/ * Olvassa el az UV -érzékelőt mV -ban, és hívja fel az UV -index számítását */

void readSensorUV () {byte numOfReadings = 5; dataSensorUV = 0; for (int i = 0; i <numOfReadings; i ++) {dataSensorUV+= analogRead (sensorUVPin); késleltetés (200); } dataSensorUV /= numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023.0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); }

Ha megvannak az UV adatok, könnyen kiszámíthatjuk az UV indexet a fenti táblázat szerint. Az indexCalculate () függvény megteszi helyettünk:

/ * UV -index kiszámítása */

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; else indexUV = 11; }

3. lépés: A kijelző felszerelése: OLED

Kijelző felszerelése: OLED
Kijelző felszerelése: OLED
Kijelző felszerelése: OLED
Kijelző felszerelése: OLED

Tesztelés céljából egy OLED -et fogunk elhelyezni az UV -mérőnkön (ez a lépés teljesen opcionális).

A tesztek során rendben van a soros monitor használata, de mi történik, ha a prototípusokat távol használja a számítógéptől önálló módban? Ehhez telepítsünk egy OLED kijelzőt, az SSD1306 -ot, amelynek fő jellemzői a következők:

  • Kijelző mérete: 0,96"
  • I2C IIC SPI sorozat
  • 128X64
  • Fehér OLED LCD LED

Kövesse az elektromos diagramot, és csatlakoztassa az OLED 4 tűjét:

  • A VCC 3.3V -ra megy
  • A GND a földre megy
  • Az SCL a NodeMCU -ba megy (GPIO 2) ==> D4
  • Az SDA a NodeMCU -ra megy (GPIO 0) ==> D3

Miután csatlakoztattuk a kijelzőt, töltsük le és telepítsük könyvtárát az Arduino IDE -re: a Daniel Eichhorn által kifejlesztett "ESP8266 OLED Driver for SSD1306 display" (Győződjön meg róla, hogy a 3.0.0 vagy újabb verziót használja!).

Telepítse a könyvtárat az Arduino IDE -re, amely megtalálható az SSD1306Wire.h webhelyen

Az IDE újraindítása után a könyvtárat már telepíteni kell.

A könyvtár támogatja az I2C protokollt az OLED kijelző eléréséhez a beépített Wire.h könyvtár használatával:

/ * OLED */

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

Soroljunk fel néhány fontos API -t, amelyeket OLED kijelzőn fogunk használni. A teljes lista megtalálható a fent megadott GITHub -on.

A. Kijelzővezérlés:

void init (); // Inicializálja a kijelzőt

void displayOn (void); // A kijelző bekapcsolása void displayOff (void); // Kapcsolja ki a kijelzőt void clear (void); // Törölje a helyi pixel puffer void flipScreenVertically (); // Fordítsa fejjel lefelé a kijelzőt

B. Szöveges műveletek:

void drawString (int16_t x, int16_t y, karakterlánc szöveg); // (xpos, ypos, "szöveg")

void setFont (const char* fontData); // Beállítja az aktuális betűtípust.

Elérhető alapértelmezett betűtípusok:

  • ArialMT_Plain_10,
  • ArialMT_Plain_16,

  • ArialMT_Plain_24

Miután mind az OLED, mind a könyvtára telepítve van, írjunk egy egyszerű programot annak tesztelésére. Írja be az alábbi kódot az IDE -be, az eredménynek a fenti képen látható kijelzőnek kell lennie:

* OLED */

#include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306Wire kijelző (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } void loop () {} / * Beállítási adatok kezdeményezése és megjelenítése OLED -en * / void displaySetup () {display.init (); // a kijelző megjelenítésének inicializálása.clear (); // A kijelző kijelzőjének törlése.flipScreenVertically (); // Fordítsa fejjel lefelé a kijelzőt.display (); // Adatok megjelenítése a kijelzőn Serial.println ("Kijelző teszt indítása"); display.setFont (ArialMT_Plain_24); display.drawString (30, 0, "OLED"); // (xpos, ypos, "Szöveg") display.setFont (ArialMT_Plain_16); display.drawString (18, 29, "Teszt elindítva"); display.setFont (ArialMT_Plain_10); display.drawString (10, 52, "Soros BaudRate:"); display.drawString (90, 52, karakterlánc (11500)); display.display (); // Adatok elhelyezése a kijelző késleltetésén (3000); }

A fenti program letölthető a GitHub -ból:

CsomópontMCU_OLED_Test

4. lépés: Helyi UV -mérő

Helyi UV -mérő
Helyi UV -mérő
Helyi UV -mérő
Helyi UV -mérő

Most, amikor az OLED kijelző telepítve van, csatlakoztathatunk egy akkumulátort, és elvégezhetünk néhány távoli tesztet az "UV -mérőnk" segítségével

#define SW_VERSION "UV_Sensor_V.1"

/ * UV -érzékelő */ #define sensorUVPin A0 int dataSensorUV = 0; int indexUV = 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 kijelző (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } void loop () {readSensorUV (); displayUV (); késleltetés (1000); } / * Beállítási adatok kezdeményezése és megjelenítése OLED -en * / void displaySetup () {display.init (); // a kijelző megjelenítésének inicializálása.clear (); // A kijelző kijelzőjének törlése.flipScreenVertically (); // Fordítsa fejjel lefelé a kijelzőt.display (); // Adatok megjelenítése a kijelzőn Serial.println ("UV -érzékelő teszt kezdeményezése"); display.setFont (ArialMT_Plain_24); display.drawString (10, 0, "MJRoBot"); display.setFont (ArialMT_Plain_16); display.drawString (0, 29, "UV -érzékelő teszt"); display.setFont (ArialMT_Plain_10); display.drawString (0, 52, "SW Ver.:"); display.drawString (45, 52, SW_VERSION); display.display (); késleltetés (3000); } / * Olvassa el az UV -érzékelőt mV -ban és hívja meg az UV -index számítását * / void readSensorUV () {byte numOfReadings = 5; dataSensorUV = 0; for (int i = 0; i <numOfReadings; i ++) {dataSensorUV+= analogRead (sensorUVPin); késleltetés (200); } dataSensorUV /= numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023.0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); } / * UV -index kiszámítása * / 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; else indexUV = 11; } /* UV -értékek megjelenítése a helyi OLED -en* / void displayUV () {display.clear (); display.setFont (ArialMT_Plain_16); display.drawString (20, 0, "UV -érzékelő"); display.drawString (0, 23, "UV (mV):"); display.drawString (80, 23, karakterlánc (dataSensorUV)); display.drawString (0, 48, "UV -index:"); display.setFont (ArialMT_Plain_24); display.drawString (82, 42, String (indexUV)); display.display (); }

A fenti kód letölthető a GitHun webhelyről: NodeMCU_UV_Sensor_OLED.ino

5. lépés: DHT22 telepítése a levegő hőmérsékletének és páratartalmának méréséhez

DHT22 telepítése a levegő hőmérsékletének és páratartalmának méréséhez
DHT22 telepítése a levegő hőmérsékletének és páratartalmának méréséhez
DHT22 telepítése a levegő hőmérsékletének és páratartalmának mérésére
DHT22 telepítése a levegő hőmérsékletének és páratartalmának mérésére

Az időjárási adatok rögzítéséhez az egyik leggyakrabban használt érzékelő a DHT22 (vagy a testvére DHT11), egy digitális relatív páratartalom és hőmérséklet érzékelő. Kapacitív páratartalom -érzékelőt és termisztor segítségével méri a környező levegőt, és digitális jelet köp az adatcsapra (nincs szükség analóg bemeneti tüskékre).

Az érzékelőt 3.3V és 5V között kell táplálni, és -40oC és +80oC között működik, +/- 0.5oC pontossággal a hőmérséklet és +/- 2% relatív páratartalom mellett. Azt is fontos szem előtt tartani, hogy az érzékelési periódusa átlagosan 2 másodperc (a leolvasások közötti minimális idő). Az Adafruit webhelye sok információt tartalmaz mind a DHT22 -ről, mind a testvéréről, a DHT11 -ről. További részletekért látogasson el a DHT22/11 bemutató oldalára.

A DHT22 -nek 4 csapja van (az érzékelővel szemben, az 1 -es tű maradt a legtöbb):

  1. VCC (a 3.3V -hoz csatlakozunk a NodeMCU -tól);
  2. Adatok ki;
  3. Nincs csatlakoztatva és
  4. Talaj.

Ha általában az érzékelőt 20 m -nél kisebb távolságon használja, akkor 10K ellenállást kell csatlakoztatni az adat- és VCC -tűk közé. A kimeneti csap csatlakozik a NodeMCU D3 csaphoz (lásd a fenti ábrát). Miután az érzékelőt telepítettük a modulunkba, töltse le a DHT könyvtárat az Adafruit GitHub lerakatából, és telepítse azt az Arduino Library fájljába. Az Arduino IDE újratöltése után telepíteni kell a "DHT érzékelő könyvtárat".

A kód elején meg kell adnunk a következő sorokat:

/* DHT22*/

#tartalmazza a "DHT.h" #define DHTPIN D2 #define DHTTYPE DHT22 DHT dht (DHTPIN, DHTTYPE); float hum = 0; lebegési hőmérséklet = 0;

Új funkció jön létre az érzékelő olvasásához:

/ * DHT adatok lekérése */

void getDhtData (void) {float tempIni = temp; float humIni = hum; temp = dht.readTemperature (); hum = dht.readHumidity (); if (isnan (hum) || isnan (temp)) // Ellenőrizze, hogy nem sikerült -e olvasni, és lépjen ki korán (újrapróbálkozáshoz). {Serial.println ("Nem sikerült olvasni a DHT érzékelőből!"); temp = tempIni; hum = humIni; Visszatérés; }}

A teljes kód, beleértve az UV- és DHT -érzékelőket, letölthető a GitHub -ból: NodeMCU_UV_DHT_Sensor_OLED

6. lépés: Adatok küldése a ThingSpeak.com webhelyre

Adatok küldése a ThingSpeak.com webhelyre
Adatok küldése a ThingSpeak.com webhelyre
Adatok küldése a ThingSpeak.com webhelyre
Adatok küldése a ThingSpeak.com webhelyre
Adatok küldése a ThingSpeak.com webhelyre
Adatok küldése a ThingSpeak.com webhelyre

Eddig csak a NodeMCU ESP12-E-t használtuk rendes és közönséges Arduino táblaként. Természetesen csak "megvakartuk" ennek a látványos kis chipnek a valódi potenciálját, és most itt az ideje, hogy felszálljunk a mennybe! Vagy jobb a csillagoknak! Ehh … a felhőbe!;-)

Kezdjük!

  1. Először is rendelkeznie kell fiókkal a ThinkSpeak.com webhelyen
  2. Kövesse az utasításokat a csatorna létrehozásához, és vegye figyelembe a csatornaazonosítót és az írási API -kulcsot
  3. Frissítse az alábbi kódot a WiFi hálózatával és a Thinkspeak hitelesítő adataival
  4. Futtassa a programot IDE -n

Írjuk meg a kód legfontosabb részeit:

Először hívjuk fel az ESP8266 könyvtárat, határozzuk meg a WiFi klienst, és határozzuk meg a helyi útválasztó és Thinkspeak hitelesítő adatait:

/* ESP12-E & Thinkspeak*/

#include WiFiClient client; const char* MY_SSID = "A SSD -ID IDE"; const char* MY_PWD = "A JELSZÓ ITT"; const char* TS_SERVER = "api.thingspeak.com"; String TS_API_KEY = "A CSATORNA ÍRÁS API KULCSA";

Másodszor, tegyünk bele egy nagyon fontos könyvtárat az IoT projektekhez: SimpleTimer.h:

/ * IDŐZÍTŐ */

#tartalmazza a SimpleTimer időzítőt;

Harmadszor, a setup () során soros kommunikációt kezdeményezünk, meghívjuk a connectWiFi () függvényt és meghatározzuk az időzítéseket. Ne feledje, hogy a kód sora: timer.setInterval (60000L, sendDataTS); 60 másodpercenként meghívja a sendDataTS () függvényt, hogy adatokat töltsön fel a ThinkSpeak csatornára.

üres beállítás ()

{… Serial.begin (115200); késleltetés (10); … ConnectWifi (); timer.setInterval (60000L, sendDataTS); …}

Végül, de nem utolsósorban, a ciklus () alatt az egyetlen szükséges parancs az időzítő elindítása és kész!

üres hurok ()

{… Timer.run (); // SimpleTimer kezdeményezése}

Az alábbiakban láthatja a Thinkspeak kommunikáció kezeléséhez használt két fontos funkciót:

ESP12-E kapcsolat a WiFi hálózattal:

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

*WiFi csatlakoztatása *********************************************** ***/ void connectWifi () {Serial.print ("Csatlakozás"+*MY_SSID); WiFi.begin (MY_SSID, MY_PWD); while (WiFi.status ()! = WL_CONNECTED) {delay (1000); Soros.nyomtatás ("."); } Soros.println (""); Serial.println ("WiFi csatlakozás"); Serial.println (""); }

Az ESP12-E adatokat küld a ThinkSpeak-hez:

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

*Adatok küldése a Thinkspeak csatornára ******************************************** ******/ void sendDataTS (void) {if (client.connect (TS_SERVER, 80)) {String postStr = TS_API_KEY; postStr += "& mező1 ="; postStr += Karakterlánc (dataSensorUV); postStr += "& field2 ="; postStr += Karakterlánc (indexUV); postStr += "& field3 ="; postStr += Karakterlánc (temp); postStr += "& field4 ="; postStr += Karakterlánc (hum); postStr += "\ r / n / r / n"; client.print ("POST /frissítés HTTP /1.1 / n"); client.print ("Gazdagép: api.thingspeak.com / n"); client.print ("Kapcsolat: bezár / n"); client.print ("X-THINGSPEAKAPIKEY:" + TS_API_KEY + "\ n"); client.print ("Content-Type: application/x-www-form-urlencoded / n"); client.print ("Content-Length:"); client.print (postStr.length ()); client.print ("\ n / n"); client.print (postStr); késleltetés (1000); } elküldve ++; client.stop (); }

A teljes kód megtalálható a GitHub -on: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT

Miután feltöltötte a kódot a NodeMCU -ba. Csatlakoztassunk egy külső akkumulátort, és végezzünk méréseket a nap alatt. Felteszem a távoli állomást a tetőre, és elkezdem rögzíteni az adatokat a ThingSpeak.com webhelyen, ahogy a fenti képeken látható.

7. lépés: Következtetés

Következtetés
Következtetés

Mint mindig, remélem, hogy ez a projekt segíthet másoknak is eligazodni az elektronika izgalmas világában!

A részletekért és a végső kódért keresse fel a GitHub letéteményemet: RPi-NodeMCU-Weather-Station

További projektekért látogasson el a blogomra: MJRoBot.org

Maradjon velünk! A következő oktatóanyag adatokat küld egy távoli időjárás -állomásról egy központira egy Raspberry Pi webszerver alapján:

Kép
Kép

Üdvözlet a világ déli részéről!

Találkozunk a következő tanításomban!

Köszönöm, Marcelo

Ajánlott: