Obsah:

Jednoduché IoT: Zachytávanie vzdialených údajov o počasí: UV a teplota a vlhkosť vzduchu: 7 krokov
Jednoduché IoT: Zachytávanie vzdialených údajov o počasí: UV a teplota a vlhkosť vzduchu: 7 krokov

Video: Jednoduché IoT: Zachytávanie vzdialených údajov o počasí: UV a teplota a vlhkosť vzduchu: 7 krokov

Video: Jednoduché IoT: Zachytávanie vzdialených údajov o počasí: UV a teplota a vlhkosť vzduchu: 7 krokov
Video: Lekársky diagnostický systém pre telemedicínske služby IDIS2GO 2024, Júl
Anonim
Jednoduchý internet vecí: Zachytávanie vzdialených údajov o počasí: teplota a vlhkosť UV a vzduchu
Jednoduchý internet vecí: Zachytávanie vzdialených údajov o počasí: teplota a vlhkosť UV a vzduchu

V tomto návode zachytíme vzdialené údaje ako UV (ultrafialové žiarenie), teplotu a vlhkosť vzduchu. Tieto údaje budú veľmi dôležité a budú použité v budúcej kompletnej meteorologickej stanici.

Blokový diagram ukazuje, čo na konci dostaneme.

Obrázok
Obrázok

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: Analógový UV senzor

Analógový UV senzor
Analógový UV senzor
Analógový UV senzor
Analógový UV senzor
Analógový UV senzor
Analógový UV senzor

Tento UV senzor generuje analógový výstup úmerný ultrafialovému žiareniu, ktoré sa nachádza v spektre snímajúcom svetlo. Využíva UV fotodiódu (na báze nitridu galia), ktorá dokáže detekovať rozsah svetla 240-370 nm (ktorý pokrýva UVB a väčšinu spektra UVA). Úroveň signálu z fotodiódy je na úrovni nanoampérov veľmi malá, takže modul má zabudovaný operačný zosilňovač na zosilnenie signálu na čitateľnejšiu úroveň napätia (0 až 1 V).

Senzor a operačný zosilňovač je možné napájať pripojením VCC na 3,3 V DC (alebo 5 V DC) a GND k uzemneniu napájania. Analógový signál je možné získať z kolíka OUT.

Jeho výstup bude v milivoltoch a bude ho čítať analógový vstup nášho NodeMCU. Po prečítaní by sme ho mali „previesť“(alebo „namapovať“), aby boli hodnoty lepšie spracované kódom. Môžeme to urobiť pomocou funkcie readSensorUV ():

/ * Prečítajte si UV senzor v mV a zavolajte výpočet UV indexu */

void readSensorUV () {byte numOfReadings = 5; dataSensorUV = 0; pre (int i = 0; i <numOfReadings; i ++) {dataSensorUV+= analogRead (sensorUVPin); oneskorenie (200); } dataSensorUV /= numOfReadings; dataSensorUV = (dataSensorUV * (3,3 / 1023,0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); }

Keď máme údaje o UV, môžeme ľahko vypočítať UV index podľa definície v predchádzajúcej tabuľke. Funkcia indexCalculate () to urobí za nás:

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

Krok 3: Inštalácia displeja: OLED

Inštalácia displeja: OLED
Inštalácia displeja: OLED
Inštalácia displeja: OLED
Inštalácia displeja: OLED

Na testovacie účely zaradíme OLED do nášho UV metra (tento krok je úplne voliteľný).

Počas testov je v poriadku používať sériový monitor, ale čo sa deje, keď používate prototypy ďaleko od počítača v samostatnom režime? Za týmto účelom nainštalujme OLED displej, SSD1306, ktorého hlavné charakteristiky sú:

  • Veľkosť displeja: 0,96"
  • Sériové I2C IIC SPI
  • 128 x 64
  • Biely OLED LCD LED

Postupujte podľa elektrického diagramu a pripojte 4 piny nášho OLED:

  • VCC ide na 3,3V
  • GND ide na zem
  • SCL prejde na NodeMCU (GPIO 2) ==> D4
  • SDA prejde na NodeMCU (GPIO 0) ==> D3

Hneď ako pripojíme displej, stiahneme a nainštalujeme jeho knižnicu do nášho Arduino IDE: „Ovládač OLED pre displej SSD1306 ESP8266“vyvinutý Danielom Eichhornom (uistite sa, že používate verziu 3.0.0 alebo väčšiu!).

Nainštalujte knižnicu do svojho Arduino IDE, ktoré nájdete na SSD1306Wire.h

Keď reštartujete IDE, knižnica by už mala byť nainštalovaná.

Knižnica podporuje protokol I2C na prístup k displeju OLED pomocou vstavanej knižnice 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 zoznam niektorých dôležitých API, ktoré budú použité s našim OLED displejom. Úplný zoznam nájdete na vyššie uvedenom GITHube.

A. Ovládanie displeja:

void init (); // Inicializácia displeja

void displayOn (void); // Zapnutie displeja void displayOff (void); // Vypnutie displeja void clear (void); // Vymazanie miestneho pixelového buffera prázdne flipScreenVertically (); // Otočte displej hore dnom

B. Textové operácie:

void drawString (int16_t x, int16_t y, reťazcový text); // (xpos, ypos, "text")

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

Dostupné predvolené písma:

  • ArialMT_Plain_10,
  • ArialMT_Plain_16,

  • ArialMT_Plain_24

Akonáhle je nainštalovaný samotný OLED a jeho knižnica, napíšte jednoduchý program na testovanie. Zadajte nižšie uvedený kód do svojho IDE, výsledkom by malo byť zobrazenie, ako je znázornené na vyššie uvedenej 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); void setup () {Serial.begin (115200); displaySetup (); } void loop () {} / * Spustenie a zobrazenie údajov o nastavení na OLED * / void displaySetup () {display.init (); // inicializácia displeja display.clear (); // Vymazanie displeja display.flipScreenVertically (); // Otočte displej hore nohami display.display (); // Vložiť údaje na displej Serial.println („Spustenie testu zobrazenia“); display.setFont (ArialMT_Plain_24); display.drawString (30, 0, "OLED"); // (xpos, ypos, "Text") display.setFont (ArialMT_Plain_16); display.drawString (18, 29, "Test spustený"); display.setFont (ArialMT_Plain_10); display.drawString (10, 52, "Sériová prenosová rýchlosť:"); display.drawString (90, 52, reťazec (11500)); display.display (); // Vloženie údajov na oneskorenie zobrazenia (3000); }

Vyššie uvedený program si môžete stiahnuť z môjho GitHubu:

NodeMCU_OLED_Test

Krok 4: Miestny UV merač

Miestny UV meter
Miestny UV meter
Miestny UV meter
Miestny UV meter

Teraz, keď je nainštalovaný OLED displej, môžeme pripojiť batériu a vykonať niekoľko diaľkových testov pomocou nášho „UV merača“

#define SW_VERSION "UV_Sensor_V.1"

/ * UV senzor */ #definovať 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); void setup () {Serial.begin (115200); displaySetup (); } void loop () {readSensorUV (); displayUV (); oneskorenie (1000); } / * Spustiť a zobraziť údaje o nastavení na OLED * / void displaySetup () {display.init (); // inicializácia displeja display.clear (); // Vymazanie displeja display.flipScreenVertically (); // Otočenie displeja hore nohami display.display (); // Zobrazenie údajov na displeji Serial.println („Spustenie testu senzora UV“); display.setFont (ArialMT_Plain_24); display.drawString (10, 0, "MJRoBot"); display.setFont (ArialMT_Plain_16); display.drawString (0, 29, "Test senzora UV"); display.setFont (ArialMT_Plain_10); display.drawString (0, 52, "SW Ver.:"); display.drawString (45, 52, SW_VERSION); display.display (); oneskorenie (3000); } / * Prečítajte si UV senzor v mV a zavolajte výpočet UV indexu * / void readSensorUV () {byte numOfReadings = 5; dataSensorUV = 0; pre (int i = 0; i <numOfReadings; i ++) {dataSensorUV+= analogRead (sensorUVPin); oneskorenie (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; } /* Zobrazenie hodnôt UV na miestnom OLED* / neplatné zobrazenieUV () {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 (); }

Vyššie uvedený kód je možné stiahnuť z môjho GitHun: NodeMCU_UV_Sensor_OLED.ino

Krok 5: Inštalácia DHT22 na meranie teploty vzduchu a vlhkosti

Inštalácia DHT22 na meranie teploty vzduchu a vlhkosti
Inštalácia DHT22 na meranie teploty vzduchu a vlhkosti
Inštalácia DHT22 na meranie teploty vzduchu a vlhkosti
Inštalácia DHT22 na meranie teploty vzduchu a vlhkosti

Jeden z najpoužívanejších senzorov na zaznamenávanie údajov o počasí je DHT22 (alebo jeho brat DHT11), digitálny snímač relatívnej vlhkosti a teploty. Na meranie okolitého vzduchu používa kapacitný snímač vlhkosti a termistor a na dátový kolík chrlí digitálny signál (nie sú potrebné žiadne analógové vstupné kolíky).

Senzor by mal byť napájaný medzi 3,3 V a 5 V a bude pracovať od -40 ° C do +80 ° C s presnosťou +/- 0,5 ° C na teplotu a +/- 2% na relatívnu vlhkosť. Je tiež dôležité mať na pamäti, že jeho doba snímania je v priemere 2 sekundy (minimálny čas medzi hodnotami). Stránka Adafruit poskytuje veľa informácií o DHT22 a jeho bratovi DHT11. Viac podrobností nájdete na stránke s návodom k DHT22/11.

DHT22 má 4 kolíky (otočené smerom k senzoru, kolík 1 je úplne vľavo):

  1. VCC (pripojíme sa na 3,3 V z NodeMCU);
  2. Výstup údajov;
  3. Nepripojené a
  4. Zem.

Akonáhle zvyčajne budete používať senzor na vzdialenosti menšie ako 20 m, medzi piny Data a VCC by mal byť zapojený odpor 10 K. Výstupný pin bude pripojený k pinu NodeMCU D3 (pozri obrázok vyššie). Akonáhle je senzor nainštalovaný do nášho modulu, stiahnite si knižnicu DHT z úložiska Adafruit GitHub a nainštalujte ju do súboru svojej knižnice Arduino. Keď znova načítate IDE Arduino, mala by byť nainštalovaná „knižnica senzorov DHT“.

Na začiatku kódu musíme zahrnúť riadky:

/* DHT22*/

#include "DHT.h" #define DHTPIN D2 #define DHTTYPE DHT22 DHT dht (DHTPIN, DHTTYPE); plavákový hukot = 0; float temp = 0;

Vytvorí sa nová funkcia na čítanie senzora:

/ * Získať údaje DHT */

void getDhtData (void) {float tempIni = temp; float humIni = hukot; temp = dht.readTemperature (); hum = dht.readHumidity (); if (isnan (hum) || isnan (temp)) // Skontrolujte, či niektoré čítanie zlyhalo, a ukončite operáciu predčasne (skúste to znova). {Serial.println ("Nepodarilo sa prečítať zo senzora DHT!"); temp = tempIni; hum = humIni; návrat; }}

Kompletný kód vrátane senzorov UV a DHT si môžete stiahnuť z môjho GitHub: NodeMCU_UV_DHT_Sensor_OLED

Krok 6: Odoslanie údajov na ThingSpeak.com

Odosielanie údajov na ThingSpeak.com
Odosielanie údajov na ThingSpeak.com
Odosielanie údajov na ThingSpeak.com
Odosielanie údajov na ThingSpeak.com
Odosielanie údajov na ThingSpeak.com
Odosielanie údajov na ThingSpeak.com

Doteraz sme NodeMCU ESP12-E používali iba ako bežnú a obyčajnú dosku Arduino. Samozrejme, že sme iba „poškriabali“skutočný potenciál tohto veľkolepého čipu a teraz je čas vzlietnuť do neba! Alebo lepšie ku hviezdam! Ehr … do cloudu!;-)

Poďme začať!

  1. Najprv musíte mať účet na ThinkSpeak.com
  2. Pri vytváraní kanála postupujte podľa týchto pokynov a poznačte si svoje ID kanála a kľúč rozhrania API na zápis
  3. Aktualizujte nižšie uvedený kód pomocou svojej siete WiFi a poverení Thinkspeak
  4. Spustite program na IDE

Poďme sa vyjadriť k najdôležitejším častiam kódu:

Najprv zavoláme knižnicu ESP8266, definujeme klienta WiFi a definujeme miestne poverenia smerovača a Thinkspeaku:

/* ESP12-E a Thinkspeak*/

#include WiFiClient klient; const char* MY_SSID = "VAŠE ID SSD TU"; const char* MY_PWD = "VAŠE HESLO TU"; const char* TS_SERVER = "api.thingspeak.com"; Reťazec TS_API_KEY = "KĽÚČ API VAŠEHO KANÁLU NA ZÁPIS";

Za druhé, zahrňme veľmi dôležitú knižnicu pre projekty IoT: SimpleTimer.h:

/ * ČASOVAČ */

#include Časovač SimpleTimer;

Po tretie, počas nastavenia () spustíme sériovú komunikáciu, zavoláme funkciu connectWiFi () a definujeme časovače. Všimnite si toho, že riadok kódu: timer.setInterval (60000L, sendDataTS); bude volať funkciu sendDataTS () každých 60 sekúnd, aby sa nahrali údaje na kanál ThinkSpeak.

neplatné nastavenie ()

{… Serial.begin (115200); oneskorenie (10); … ConnectWifi (); timer.setInterval (60 000 L, sendDataTS); …}

V neposlednom rade počas cyklu () je jediným potrebným príkazom spustenie časovača a je to!

prázdna slučka ()

{… Timer.run (); // Spustí SimpleTimer}

Nasledujú dve dôležité funkcie používané na zvládnutie komunikácie Thinkspeak:

Pripojenie ESP12-E k vašej WiFi sieti:

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

*Pripojenie WiFi ********************************************************* ***/ void connectWifi () {Serial.print ("Pripojenie k"+*MY_SSID); WiFi.begin (MY_SSID, MY_PWD); while (WiFi.status ()! = WL_CONNECTED) {oneskorenie (1000); Serial.print ("."); } Serial.println (""); Serial.println („WiFi pripojené“); Serial.println (""); }

ESP12-E odosielanie údajov do ThinkSpeak:

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

*Odosielanie údajov 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 /aktualizácia HTTP /1.1 / n"); client.print ("Hostiteľ: api.thingspeak.com / n"); client.print ("Pripojenie: zavrieť / n"); client.print ("X-THINGSPEAKAPIKEY:" + TS_API_KEY + "\ n"); client.print ("Content-Type: application/x-www-form-urlencoded / n"); client.print („Dĺžka obsahu:“); client.print (postStr.length ()); client.print ("\ n / n"); client.print (postStr); oneskorenie (1000); } odoslané ++; client.stop (); }

Kompletný kód nájdete na mojom GitHub: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT

Akonáhle budete mať kód nahraný na váš NodeMCU. Pripojme externú batériu a urobme meranie pod slnkom. Položil som vzdialenú stanicu na strechu a začínam zbierať údaje na ThingSpeak.com, ako je to znázornené na vyššie uvedených fotografiách.

Krok 7: Záver

Záver
Záver

Ako vždy, dúfam, že tento projekt pomôže iným nájsť si cestu do vzrušujúceho sveta elektroniky!

Podrobnosti a konečný kód nájdete v mojom depozitári GitHub: meteorologická stanica RPi-NodeMCU

Viac projektov nájdete na mojom blogu: MJRoBot.org

Zostaňte naladení! V nasledujúcom návode odošleme údaje zo vzdialenej meteorologickej stanice do centrálnej, založenej na webovom serveri Raspberry Pi:

Obrázok
Obrázok

Saludos z juhu sveta!

Uvidíme sa pri mojom ďalšom pokyne!

Ďakujem, Marcelo

Odporúča: