Obsah:

Snadné IoT: Zachycení vzdálených údajů o počasí: UV a teplota vzduchu a vlhkost: 7 kroků
Snadné IoT: Zachycení vzdálených údajů o počasí: UV a teplota vzduchu a vlhkost: 7 kroků

Video: Snadné IoT: Zachycení vzdálených údajů o počasí: UV a teplota vzduchu a vlhkost: 7 kroků

Video: Snadné IoT: Zachycení vzdálených údajů o počasí: UV a teplota vzduchu a vlhkost: 7 kroků
Video: ZIMNÍ DOVOLENÁ v Kanadě s rodinou ❄️ | Winter Wonderland + Daniel's Birthday! 2024, Červenec
Anonim
Snadné IoT: Zachycování vzdálených údajů o počasí: UV a teplota a vlhkost vzduchu
Snadné IoT: Zachycování vzdálených údajů o počasí: UV a teplota a vlhkost vzduchu

V tomto tutoriálu zachytíme vzdálená data jako UV (ultrafialové záření), teplotu a vlhkost vzduchu. Tato data budou velmi důležitá a budou použita v budoucí kompletní meteorologické stanici.

Blokový diagram ukazuje, co na konci dostaneme.

obraz
obraz

Krok 1: BoM - kusovník

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

Senzor vlhkosti a teploty (DHT22) - 10,00 USD

UV senzor - 4,00 USD

OLED 12,00 USD

Breadboard - 1,00 USD

Krok 2: Analogový UV senzor

Analogový UV senzor
Analogový UV senzor
Analogový UV senzor
Analogový UV senzor
Analogový UV senzor
Analogový UV senzor

Tento UV senzor generuje analogový výstup úměrný ultrafialovému záření, které se nachází ve spektru snímajícím světlo. Používá UV fotodiodu (na bázi nitridu galia), která dokáže detekovat rozsah světla 240-370 nm (který pokrývá UVB a většinu spektra UVA). Úroveň signálu z fotodiody je velmi malá, na úrovni nanoampérů, takže modul má zabudovaný operační zesilovač pro zesílení signálu na čitelnější úroveň napětí (0 až 1 V).

Senzor a operační zesilovač lze napájet připojením VCC k 3,3 V DC (nebo 5 V DC) a GND k napájecí zemi. Analogový signál lze získat z kolíku OUT.

Jeho výstup bude v milivoltech a bude čten analogovým vstupem našeho NodeMCU. Po přečtení bychom jej měli „převést“(nebo „namapovat“), aby byly hodnoty lépe zpracovány kódem. Můžeme to udělat pomocí funkce readSensorUV ():

/ * Odečtěte UV senzor v mV a zavolejte výpočet UV indexu */

void readSensorUV () {byte numOfReadings = 5; dataSensorUV = 0; pro (int i = 0; i <numOfReadings; i ++) {dataSensorUV+= analogRead (sensorUVPin); zpoždění (200); } dataSensorUV /= numOfReadings; dataSensorUV = (dataSensorUV * (3,3 / 1023,0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); }

Jakmile máme UV data, můžeme snadno vypočítat UV index, jak je definováno ve výše uvedené tabulce. Funkce indexCalculate () to udělá za nás:

/ * Výpočet UV indexu */

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; }

Krok 3: Instalace displeje: OLED

Instalace displeje: OLED
Instalace displeje: OLED
Instalace displeje: OLED
Instalace displeje: OLED

Pro testovací účely zahrneme do našeho UV metru OLED (Tento krok je zcela volitelný).

Během testů je v pořádku používat sériový monitor, ale co se děje, když používáte své prototypy daleko od počítače v samostatném režimu? Za tímto účelem nainstalujeme OLED displej, SSD1306, jehož hlavní charakteristiky jsou:

  • Velikost displeje: 0,96"
  • Sériové I2C IIC SPI
  • 128 x 64
  • Bílá OLED LCD LED

Postupujte podle elektrického schématu a připojte 4 piny našeho OLED:

  • VCC jde na 3,3V
  • GND jde na zem
  • SCL přejde na NodeMCU (GPIO 2) ==> D4
  • SDA přejde na NodeMCU (GPIO 0) ==> D3

Jakmile připojíme displej, stáhneme a nainstalujeme jeho knihovnu do našeho Arduino IDE: „Ovladač ESP8266 OLED pro displej SSD1306“vyvinutý Danielem Eichhornem (Ujistěte se, že používáte verzi 3.0.0 nebo vyšší!).

Nainstalujte si knihovnu do svého Arduino IDE, které najdete na SSD1306Wire.h

Jakmile restartujete IDE, knihovna by měla být již nainstalována.

Knihovna podporuje protokol I2C pro přístup k displeji OLED pomocí vestavěné knihovny Wire.h:

/ * OLED */

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

Uveďme si několik důležitých API, které budou použity s naším OLED displejem. Úplný seznam najdete na výše uvedeném GITHubu.

A. Ovládání displeje:

void init (); // Inicializace displeje

void displayOn (neplatné); // Zapněte displej void displayOff (void); // Vypnutí displeje void clear (void); // Vymažte místní mezipaměť pixelů flipScreenVertically (); // Otočte displej vzhůru nohama

B. Textové operace:

void drawString (int16_t x, int16_t y, řetězec textu); // (xpos, ypos, "text")

void setFont (const char* fontData); // Nastaví aktuální písmo.

Dostupné výchozí fonty:

  • ArialMT_Plain_10,
  • ArialMT_Plain_16,

  • ArialMT_Plain_24

Jakmile bude nainstalován samotný OLED i jeho knihovna, pojďme napsat jednoduchý program, který jej otestuje. Zadejte níže uvedený kód do IDE, výsledkem by měl být displej, jak je znázorněno na výše uvedené fotografii:

* OLED */

#include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306Wire display (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); neplatné nastavení () {Serial.begin (115200); displaySetup (); } void loop () {} / * Zahájení a zobrazení dat nastavení na OLED * / void displaySetup () {display.init (); // inicializace zobrazení display.clear (); // Vymazat zobrazení displeje.flipScreenVertically (); // Otočte displej vzhůru nohama display.display (); // Vložení dat na displej Serial.println ("Zahájení testu zobrazení"); display.setFont (ArialMT_Plain_24); display.drawString (30, 0, "OLED"); // (xpos, ypos, "Text") display.setFont (ArialMT_Plain_16); display.drawString (18, 29, "Test spuštěn"); display.setFont (ArialMT_Plain_10); display.drawString (10, 52, "Serial BaudRate:"); display.drawString (90, 52, String (11500)); display.display (); // Dát data na zpoždění zobrazení (3000); }

Výše uvedený program lze stáhnout z mého GitHubu:

NodeMCU_OLED_Test

Krok 4: Místní UV měřič

Místní UV měřič
Místní UV měřič
Místní UV měřič
Místní UV měřič

Nyní, když je nainstalován OLED displej, můžeme připojit baterii a provést několik dálkových testů pomocí našeho „UV měřiče“

#define SW_VERSION "UV_Sensor_V.1"

/ * UV senzor */ #definovat senzorUVPin 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 display (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); neplatné nastavení () {Serial.begin (115200); displaySetup (); } void loop () {readSensorUV (); displayUV (); zpoždění (1000); } / * Zahajte a zobrazte data nastavení na OLED * / void displaySetup () {display.init (); // inicializace zobrazení display.clear (); // Vymazat zobrazení displeje.flipScreenVertically (); // Otočte displej vzhůru nohama display.display (); // Umístění dat na displej Serial.println ("Zahájení testu UV senzoru"); display.setFont (ArialMT_Plain_24); display.drawString (10, 0, "MJRoBot"); display.setFont (ArialMT_Plain_16); display.drawString (0, 29, "Test UV senzoru"); display.setFont (ArialMT_Plain_10); display.drawString (0, 52, "SW Ver.:"); display.drawString (45, 52, SW_VERSION); display.display (); zpoždění (3000); } / * Přečíst UV senzor v mV a zavolat výpočet UV indexu * / void readSensorUV () {byte numOfReadings = 5; dataSensorUV = 0; pro (int i = 0; i <numOfReadings; i ++) {dataSensorUV+= analogRead (sensorUVPin); zpoždění (200); } dataSensorUV /= numOfReadings; dataSensorUV = (dataSensorUV * (3,3 / 1023,0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); } / * Výpočet UV indexu * / neplatný 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; } /* Zobrazit hodnoty UV na místním OLED* / void displayUV () {display.clear (); display.setFont (ArialMT_Plain_16); display.drawString (20, 0, "UV senzor"); display.drawString (0, 23, "UV (mV):"); display.drawString (80, 23, String (dataSensorUV)); display.drawString (0, 48, "UV index:"); display.setFont (ArialMT_Plain_24); display.drawString (82, 42, String (indexUV)); display.display (); }

Výše uvedený kód lze stáhnout z mého GitHun: NodeMCU_UV_Sensor_OLED.ino

Krok 5: Instalace DHT22 pro měření teploty a vlhkosti vzduchu

Instalace DHT22 pro měření teploty a vlhkosti vzduchu
Instalace DHT22 pro měření teploty a vlhkosti vzduchu
Instalace DHT22 pro měření teploty a vlhkosti vzduchu
Instalace DHT22 pro měření teploty a vlhkosti vzduchu

Jedním z nejpoužívanějších senzorů pro sběr dat o počasí je DHT22 (nebo jeho bratr DHT11), digitální senzor relativní vlhkosti a teploty. K měření okolního vzduchu používá kapacitní senzor vlhkosti a termistor a na datový pin chrlí digitální signál (nejsou potřeba žádné analogové vstupní piny).

Senzor by měl být napájen mezi 3,3 V a 5 V a bude pracovat od -40 ° C do +80 ° C s přesností +/- 0,5 ° C pro teplotu a +/- 2% pro relativní vlhkost. Je také důležité mít na paměti, že jeho doba snímání je v průměru 2 sekundy (minimální doba mezi hodnotami). Stránka Adafruit poskytuje mnoho informací o DHT22 a jeho bratru DHT11. Další podrobnosti naleznete na stránce s návodem k DHT22/11.

DHT22 má 4 piny (čelem k senzoru, kolík 1 je nejvíce vlevo):

  1. VCC (připojíme se na 3,3 V z NodeMCU);
  2. Výstup dat;
  3. Není připojeno a
  4. Přízemní.

Jakmile obvykle použijete senzor na vzdálenosti menší než 20 m, měl by být mezi piny Data a VCC připojen odpor 10 K. Výstupní pin bude připojen k pinu NodeMCU D3 (viz obrázek výše). Jakmile je senzor nainstalován v našem modulu, stáhněte si knihovnu DHT z úložiště Adafruit GitHub a nainstalujte ji do souboru knihovny Arduino. Jakmile znovu načtete IDE Arduino, měla by být nainstalována „knihovna snímačů DHT“.

Na začátku kódu musíme zahrnout řádky:

/* DHT22*/

#include "DHT.h" #define DHTPIN D2 #define DHTTYPE DHT22 DHT dht (DHTPIN, DHTTYPE); float brum = 0; float temp = 0;

Bude vytvořena nová funkce pro čtení senzoru:

/ * Získat data DHT */

void getDhtData (void) {float tempIni = temp; float humIni = hukot; temp = dht.readTemperature (); hum = dht.readHumidity (); if (isnan (hum) || isnan (temp)) // Zkontrolujte, zda některá čtení selhala, a ukončete předčasně (zkuste to znovu). {Serial.println ("Selhalo čtení ze senzoru DHT!"); temp = tempIni; hum = humIni; vrátit se; }}

Kompletní kód včetně snímačů UV a DHT lze stáhnout z mého GitHub: NodeMCU_UV_DHT_Sensor_OLED

Krok 6: Odeslání dat na ThingSpeak.com

Odesílání dat na ThingSpeak.com
Odesílání dat na ThingSpeak.com
Odesílání dat na ThingSpeak.com
Odesílání dat na ThingSpeak.com
Odesílání dat na ThingSpeak.com
Odesílání dat na ThingSpeak.com

Doposud jsme NodeMCU ESP12-E používali pouze jako běžnou a obyčejnou desku Arduino. Samozřejmě, že jsme pouze „poškrábali“skutečný potenciál tohoto velkolepého malého čipu a nyní je čas vzlétnout do nebe! Nebo lépe ke hvězdám! Ehr … do cloudu!;-)

Pojďme začít!

  1. Nejprve musíte mít účet na ThinkSpeak.com
  2. Podle pokynů vytvořte kanál a poznamenejte si své ID kanálu a klíč API pro zápis
  3. Aktualizujte níže uvedený kód pomocí své WiFi sítě a pověření Thinkspeak
  4. Spusťte program na IDE

Pojďme si okomentovat nejdůležitější části kódu:

Nejprve zavoláme knihovnu ESP8266, definujeme klienta WiFi a definujeme místní pověření routeru a Thinkspeaku:

/* ESP12-E & Thinkspeak*/

#include WiFiClient klient; const char* MY_SSID = "VAŠE ID SSD ZDE"; const char* MY_PWD = "VAŠE HESLO ZDE"; const char* TS_SERVER = "api.thingspeak.com"; Řetězec TS_API_KEY = "KLÍČ API VAŠEHO KANÁLU NA ZÁPIS";

Za druhé, pojďme zahrnout velmi důležitou knihovnu pro projekty IoT: SimpleTimer.h:

/ * ČASOVAČ */

#include Časovač SimpleTimer;

Za třetí, během instalace () zahájíme sériovou komunikaci, zavoláme funkci connectWiFi () a definujeme časovače. Všimněte si, že řádek kódu: timer.setInterval (60000L, sendDataTS); zavolá funkci sendDataTS () každých 60 sekund, aby nahrál data na kanál ThinkSpeak.

neplatné nastavení ()

{… Serial.begin (115200); zpoždění (10); … ConnectWifi (); timer.setInterval (60000L, sendDataTS); …}

V neposlední řadě je během cyklu () jediným potřebným příkazem spuštění časovače a je to!

prázdná smyčka ()

{… Timer.run (); // Zahájí SimpleTimer}

Níže vidíte dvě důležité funkce používané ke zpracování komunikace Thinkspeak:

Připojení ESP12-E k vaší WiFi síti:

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

*Připojení WiFi ************************************************* ***/ void connectWifi () {Serial.print ("Připojování k"+*MY_SSID); WiFi.begin (MY_SSID, MY_PWD); while (WiFi.status ()! = WL_CONNECTED) {zpoždění (1000); Serial.print ("."); } Serial.println (""); Serial.println („WiFi připojeno“); Serial.println (""); }

ESP12-E odesílání dat do ThinkSpeak:

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

*Odesílání dat na Thinkspeak Channel ******************************************** ******/ void sendDataTS (void) {if (client.connect (TS_SERVER, 80)) {String postStr = TS_API_KEY; postStr += "& field1 ="; postStr += String (dataSensorUV); postStr += "& field2 ="; postStr += String (indexUV); postStr += "& field3 ="; postStr += String (temp); postStr += "& field4 ="; postStr += String (brum); postStr += "\ r / n / r / n"; client.print ("POST /aktualizace HTTP /1.1 / n"); client.print ("Host: api.thingspeak.com / n"); client.print ("Připojení: zavřít / n"); client.print ("X-THINGSPEAKAPIKEY:" + TS_API_KEY + "\ n"); client.print ("Content-Type: application/x-www-form-urlencoded / n"); client.print ("Délka obsahu:"); client.print (postStr.length ()); client.print ("\ n / n"); client.print (postStr); zpoždění (1000); } odesláno ++; client.stop (); }

Kompletní kód najdete na mém GitHubu: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT

Jakmile budete mít kód nahraný na váš NodeMCU. Připojte externí baterii a proveďte nějaké měření pod sluncem. Umístil jsem vzdálenou stanici na střechu a začínám zaznamenávat data na ThingSpeak.com, jak je znázorněno na fotografiích výše.

Krok 7: Závěr

Závěr
Závěr

Jako vždy doufám, že tento projekt pomůže ostatním najít cestu do vzrušujícího světa elektroniky!

Podrobnosti a konečný kód najdete na mém depozitáři GitHub: RPi-NodeMCU-Weather-Station

Pro více projektů navštivte můj blog: MJRoBot.org

Zůstaňte naladěni! V dalším tutoriálu odešleme data ze vzdálené meteorologické stanice do centrální, založené na webovém serveru Raspberry Pi:

obraz
obraz

Saludos z jihu světa!

Uvidíme se v mém dalším pokynu!

Děkuji, Marcelo

Doporučuje: