Obsah:
- Krok 1: BoM - kusovník
- Krok 2: Analogový UV senzor
- Krok 3: Instalace displeje: OLED
- Krok 4: Místní UV měřič
- Krok 5: Instalace DHT22 pro měření teploty a vlhkosti vzduchu
- Krok 6: Odeslání dat na ThingSpeak.com
- Krok 7: Závěr
Video: Snadné IoT: Zachycení vzdálených údajů o počasí: UV a teplota vzduchu a vlhkost: 7 kroků
2024 Autor: John Day | [email protected]. Naposledy změněno: 2024-02-01 14:39
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.
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
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
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č
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
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):
- VCC (připojíme se na 3,3 V z NodeMCU);
- Výstup dat;
- Není připojeno a
- 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
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!
- Nejprve musíte mít účet na ThinkSpeak.com
- Podle pokynů vytvořte kanál a poznamenejte si své ID kanálu a klíč API pro zápis
- Aktualizujte níže uvedený kód pomocí své WiFi sítě a pověření Thinkspeak
- 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
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:
Saludos z jihu světa!
Uvidíme se v mém dalším pokynu!
Děkuji, Marcelo
Doporučuje:
Teplota a vlhkost pomocí ESP32-DHT22-MQTT-MySQL-PHP: 7 kroků
Teplota a vlhkost pomocí ESP32-DHT22-MQTT-MySQL-PHP: Moje přítelkyně chtěla skleník, tak jsem jí udělal. Chtěl jsem ale uvnitř skleníku snímač teploty a vlhkosti. Tak jsem googlil pro příklady a začal experimentovat. Můj závěr byl, že všechny příklady, které jsem našel, nebyly přesně takové, jaké
Automatizace skleníku pomocí LoRa! (Část 1) -- Senzory (teplota, vlhkost, vlhkost půdy): 5 kroků
Automatizace skleníku pomocí LoRa! (Část 1) || Senzory (teplota, vlhkost, vlhkost půdy): V tomto projektu vám ukážu, jak jsem automatizoval skleník. To znamená, že vám ukážu, jak jsem postavil skleník a jak jsem zapojil napájecí a automatizační elektroniku. Také vám ukážu, jak naprogramovat desku Arduino, která používá L
Meteostanice Arduino využívající BMP280 -DHT11 - teplota, vlhkost a tlak: 8 kroků
Meteostanice Arduino pomocí BMP280 -DHT11 - teplota, vlhkost a tlak: V tomto tutoriálu se naučíme, jak vytvořit meteorologickou stanici, která bude na displeji TFT 7735 zobrazovat TEPLOTU, VLHKOST A TLAK. Podívejte se na ukázkové video
WEMOS D1 teplota/vlhkost IoT: 6 kroků
WEMOS D1 Temp/Humidity IoT: Jedná se o jednoduchý projekt sestavení, připojení a kompilace, který vám pomůže se snímačem teploty a vlhkosti IoT, který se připojuje k WiFi a „hlásí“vaše data na platformu Blynk IoT. Usnadnění monitorování z vašeho smartphonu. Kromě toho
DIY MusiLED, hudební synchronizované LED diody s aplikací Windows a Linux na jedno kliknutí (32bitová a 64bitová). Snadné obnovení, snadné použití, snadné přenesení: 3 kroky
DIY MusiLED, synchronizované LED diody hudby s aplikací Windows a Linux jediným kliknutím (32bitová a 64bitová). Snadno se obnovuje, snadno se používá a snadno se přenáší: Tento projekt vám pomůže připojit 18 LED diod (6 červených + 6 modrých + 6 žlutých) k desce Arduino a analyzovat signály zvukové karty vašeho počítače v reálném čase a přenášet je do LED diody je rozsvítí podle efektů rytmu (Snare, High Hat, Kick)