Tartalomjegyzék:
- 1. lépés: BoM - Bill of Material
- 2. lépés: Az analóg UV -érzékelő
- 3. lépés: A kijelző felszerelése: OLED
- 4. lépés: Helyi UV -mérő
- 5. lépés: DHT22 telepítése a levegő hőmérsékletének és páratartalmának méréséhez
- 6. lépés: Adatok küldése a ThingSpeak.com webhelyre
- 7. lépés: Következteté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
2024 Szerző: John Day | [email protected]. Utoljára módosítva: 2024-02-01 14:40
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.
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ő
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
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ő
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
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):
- VCC (a 3.3V -hoz csatlakozunk a NodeMCU -tól);
- Adatok ki;
- Nincs csatlakoztatva és
- 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
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!
- Először is rendelkeznie kell fiókkal a ThinkSpeak.com webhelyen
- 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
- Frissítse az alábbi kódot a WiFi hálózatával és a Thinkspeak hitelesítő adataival
- 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
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:
Ü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:
Arduino kijelző hőmérséklete a TM1637 LED kijelzőn: 7 lépés
Arduino kijelző hőmérséklete a TM1637 LED kijelzőn: Ebben az oktatóanyagban megtanuljuk, hogyan kell megjeleníteni a hőmérsékletet a TM1637 LED kijelző és a DHT11 érzékelő és a Visuino segítségével. Nézze meg a videót
(IOT projekt) Időjárási adatok lekérése az ESP8266 és az Openweather API használatával: 5 lépés
(IOT Project) Időjárási adatok lekérése az ESP8266 és az Openweather API használatával: Ebben az utasításban egy egyszerű IOT projektet fogunk felépíteni, amelyben lekérjük városunk időjárási adatait az openweather.com/api webhelyről, és megjelenítjük azokat a Feldolgozó szoftver segítségével
A levegő minőségének követése a Grafana és a Raspberry Pi használatával: 7 lépés
A levegő minőségének nyomon követése a Grafana és a Raspberry Pi segítségével: Egy kis IOT projektet kerestem, és egy barátom ajánlotta, hogy nézzem meg ezt az oktatóanyagot: https: //dzone.com/articles/raspberry-pi-iot-sensor … javasoljuk, hogy kövesse az oktatóanyagot, hogy kövesse a Raspberry Pi beállítását a megfigyeléshez
Időjárási adatok a Google Táblázatok és a Google Script használatával: 7 lépés
Időjárási adatok a Google Táblázatok és a Google Script használatával: Ebben a Blogtutban az SHT25 szenzor leolvasásait az Adafruit huzzah ESP8266 segítségével elküldjük a Google lapjaira, ami segít az adatok internetre küldésében. Az adatok küldése a Google lap cellájába nagyon hasznos és az alapvető módszer az adatok mentésére
Autóriasztó távoli antenna rögzítése .: 5 lépés
Autóriasztó távoli antenna javítása .: Itt van a viper távirányítóm. Régi, és az eredeti antenna megsérült, és egy egyszerű vezeték váltotta fel. A huzal hatótávolsága körülbelül 80 láb látómezőre korlátozódik. Ezt a vezetéket ki akartam cserélni egy antennára, amely megfelel a 433 MHz -es frekvenciának