Sadržaj:

IoT Made Easy: Snimanje udaljenih vremenskih podataka: UV i zrak Temperatura i vlažnost: 7 koraka
IoT Made Easy: Snimanje udaljenih vremenskih podataka: UV i zrak Temperatura i vlažnost: 7 koraka

Video: IoT Made Easy: Snimanje udaljenih vremenskih podataka: UV i zrak Temperatura i vlažnost: 7 koraka

Video: IoT Made Easy: Snimanje udaljenih vremenskih podataka: UV i zrak Temperatura i vlažnost: 7 koraka
Video: REVAN - THE COMPLETE STORY 2024, Srpanj
Anonim
IoT Made Easy: Snimanje udaljenih vremenskih podataka: UV i temperatura zraka i vlažnost
IoT Made Easy: Snimanje udaljenih vremenskih podataka: UV i temperatura zraka i vlažnost

U ovom ćemo vodiču snimati udaljene podatke kao što su UV (ultraljubičasto zračenje), temperatura zraka i vlaga. Ti će podaci biti vrlo važni i koristit će se u budućoj cjelovitoj meteorološkoj postaji.

Blok dijagram pokazuje što ćemo dobiti na kraju.

Slika
Slika

Korak 1: BoM - Opis materijala

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

Senzor vlažnosti i temperature (DHT22) - 10,00 USD

UV senzor - 4,00 USD

OLED 12,00 USD

Oglasna ploča - 1,00 USD

Korak 2: Analogni UV senzor

Analogni UV senzor
Analogni UV senzor
Analogni UV senzor
Analogni UV senzor
Analogni UV senzor
Analogni UV senzor

Ovaj UV senzor generira analogni izlaz proporcionalan ultraljubičastom zračenju koje se nalazi na spektru osjetljivog svjetla. Koristi UV fotodiodu (na bazi galijevog nitrida) koja može detektirati raspon svjetlosti 240-370nm (koji pokriva UVB i većinu UVA spektra). Razina signala s fotodiode je vrlo mala, u razini nano-ampera, pa je modul ugrađen operativno pojačalo za pojačavanje signala na čitljiviju razinu volta (0 do 1 V).

Senzor i op-pojačalo mogu se napajati, spajanjem VCC na 3,3 V DC (ili 5 V DC) i GND na masu za napajanje. Analogni signal može se dobiti s OUT pina.

Njegov izlaz bit će u milivoltima i očitavat će ga analogni ulaz našeg NodeMCU -a. Nakon čitanja, trebali bismo ga "pretvoriti" (ili "preslikati") kako bi vrijednosti bolje upravljale kodom. To možemo učiniti pomoću funkcije readSensorUV ():

/ * Očitajte UV senzor u mV i nazovite izračun UV indeksa */

void readSensorUV () {bajt numOfReadings = 5; dataSensorUV = 0; for (int i = 0; i <numOfReadings; i ++) {dataSensorUV+= analogRead (sensorUVPin); kašnjenje (200); } dataSensorUV /= numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023.0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); }

Kad dobijemo UV podatke, možemo lako izračunati UV indeks kako je definirano u gornjoj tablici. Funkcija indexCalculate () će to učiniti umjesto nas:

/ * Izračun UV indeksa */

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

Korak 3: Instaliranje zaslona: OLED

Instaliranje zaslona: OLED
Instaliranje zaslona: OLED
Instaliranje zaslona: OLED
Instaliranje zaslona: OLED

U svrhu testiranja, na naš UV mjerač uključit ćemo OLED (ovaj korak je potpuno neobavezan).

Za vrijeme testiranja je u redu koristiti serijski monitor, ali što se događa kada koristite svoje prototipe daleko od računala u samostalnom načinu rada? U tu svrhu instalirajmo OLED zaslon, SSD1306, čije su glavne karakteristike:

  • Veličina zaslona: 0,96"
  • I2C IIC SPI serijski
  • 128X64
  • Bijela OLED LCD LED

Slijedite električni dijagram i spojite 4 pina našeg OLED -a:

  • VCC ide na 3.3V
  • GND ide na tlo
  • SCL ide na NodeMCU (GPIO 2) ==> D4
  • SDA ide na NodeMCU (GPIO 0) ==> D3

Nakon što smo povezali zaslon, preuzmimo i instalirajmo njegovu biblioteku na naš Arduino IDE: "ESP8266 OLED upravljački program za SSD1306 zaslon" koji je razvio Daniel Eichhorn (Pazite da koristite verziju 3.0.0 ili noviju!).

Instalirajte knjižnicu na svoj Arduino IDE, koji se može pronaći na SSD1306Wire.h

Nakon što ste ponovno pokrenuli IDE, knjižnica bi trebala biti već instalirana.

Knjižnica podržava I2C protokol za pristup OLED zaslonu pomoću ugrađene knjiž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; SSD1306Žični zaslon (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN);

Navedimo neke važne API -je koji će se koristiti s našim OLED zaslonom. Cjeloviti popis možete pronaći na gore navedenom GITHub -u.

A. Kontrola prikaza:

void init (); // Pokretanje zaslona

void displayOn (void); // Uključivanje zaslona void displayOff (void); // Isključivanje prikaza void clear (void); // Brisanje lokalnog međuspremnika piksela void flipScreenVertical (); // Okrenite zaslon naopako

B. Tekstualne operacije:

void drawString (int16_t x, int16_t y, tekst niza); // (xpos, ypos, "Tekst")

void setFont (const char* fontData); // Postavlja trenutni font.

Dostupni zadani fontovi:

  • ArialMT_Plain_10,
  • ArialMT_Plain_16,

  • ArialMT_Plain_24

Nakon što su instalirani i sami OLED i njegova knjižnica, napišimo jednostavan program za testiranje. Unesite ispod koda na IDE, rezultat bi trebao biti prikaz kao što je prikazano na gornjoj fotografiji:

* OLED */

#include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306Žični zaslon (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } void loop () {} / * Pokretanje i prikaz podataka o postavljanju na OLED * / void displaySetup () {display.init (); // inicijalizirati display display.clear (); // Očisti prikaz zaslona.flipScreenVertical (); // Okrenite zaslon naopačke display.display (); // Stavite podatke na zaslon Serial.println ("Pokretanje testa prikaza"); display.setFont (ArialMT_Plain_24); display.drawString (30, 0, "OLED"); // (xpos, ypos, "Text") display.setFont (ArialMT_Plain_16); display.drawString (18, 29, "Test je pokrenut"); display.setFont (ArialMT_Plain_10); display.drawString (10, 52, "Serijski BaudRate:"); display.drawString (90, 52, String (11500)); display.display (); // Stavite podatke na kašnjenje prikaza (3000); }

Gornji program se može preuzeti s mog GitHub -a:

ČvorMCU_OLED_TEST

Korak 4: Lokalni UV mjerač

Lokalni UV mjerač
Lokalni UV mjerač
Lokalni UV mjerač
Lokalni UV mjerač

Sada, s instaliranim OLED zaslonom, možemo spojiti bateriju i izvršiti neka daljinska ispitivanja pomoću našeg "UV mjerača"

#define SW_VERSION "UV_Sensor_V.1"

/ * UV senzor */ #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; SSD1306Žični zaslon (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } void loop () {readSensorUV (); displayUV (); kašnjenje (1000); } / * Pokretanje i prikaz podataka o postavljanju na OLED * / void displaySetup () {display.init (); // inicijalizirati display display.clear (); // Očisti prikaz zaslona.flipScreenVertical (); // Okrenite zaslon naopačke display.display (); // Stavite podatke na zaslon Serial.println ("Pokretanje testa UV senzora"); display.setFont (ArialMT_Plain_24); display.drawString (10, 0, "MJRoBot"); display.setFont (ArialMT_Plain_16); display.drawString (0, 29, "Test UV senzora"); display.setFont (ArialMT_Plain_10); display.drawString (0, 52, "SW Ver.:"); display.drawString (45, 52, SW_VERSION); display.display (); kašnjenje (3000); } / * Očitavanje UV senzora u mV i pozivanje izračuna UV indeksa * / void readSensorUV () {bajt numOfReadings = 5; dataSensorUV = 0; for (int i = 0; i <numOfReadings; i ++) {dataSensorUV+= analogRead (sensorUVPin); kašnjenje (200); } dataSensorUV /= numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023.0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); } / * Izračun UV indeksa * / 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; } /* Prikaz UV vrijednosti na lokalnom 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 indeks:"); display.setFont (ArialMT_Plain_24); display.drawString (82, 42, niz (indexUV)); display.display (); }

Gornji kod se može preuzeti s mog GitHuna: NodeMCU_UV_Sensor_OLED.ino

Korak 5: Instaliranje DHT22 za mjerenje temperature i vlažnosti zraka

Ugradnja DHT22 za mjerenje temperature i vlažnosti zraka
Ugradnja DHT22 za mjerenje temperature i vlažnosti zraka
Ugradnja DHT22 za mjerenje temperature i vlažnosti zraka
Ugradnja DHT22 za mjerenje temperature i vlažnosti zraka

Jedan od najčešće korištenih senzora za snimanje vremenskih podataka je DHT22 (ili njegov brat DHT11), digitalni senzor relativne vlažnosti i temperature. Koristi kapacitivni senzor vlage i termistor za mjerenje okolnog zraka i ispljunjuje digitalni signal na podatkovnom pinu (nisu potrebni analogni ulazi).

Senzor bi trebao imati napajanje između 3,3 V i 5 V i radit će od -40oC do +80oC s točnošću od +/- 0,5oC za temperaturu i +/- 2% za relativnu vlažnost. Također je važno imati na umu da je njegovo vrijeme očitavanja u prosjeku 2 sekunde (minimalno vrijeme između očitanja). Stranica Adafruit pruža mnogo informacija o DHT22 i njegovom bratu DHT11. Za više detalja posjetite DHT22/11 stranicu s uputama.

DHT22 ima 4 igle (okrenute prema senzoru, pin 1 je krajnje lijevo):

  1. VCC (spojit ćemo se na 3.3V iz NodeMCU -a);
  2. Podaci van;
  3. Nije povezan i
  4. Uzemljenje.

Nakon što ćete obično koristiti senzor na udaljenostima manjim od 20 m, između Data i VCC pinova trebao bi biti spojen 10K otpornik. Izlazni pin bit će spojen na NodeMCU pin D3 (pogledajte gornji dijagram). Nakon što je senzor instaliran na naš modul, preuzmite DHT biblioteku iz spremišta Adafruit GitHub i instalirajte je u datoteku svoje Arduino knjižnice. Nakon što ponovno učitate svoj Arduino IDE, trebala bi se instalirati "knjižnica DHT senzora".

Na početku koda moramo uključiti retke:

/* DHT22*/

#include "DHT.h" #define DHTPIN D2 #define DHTTYPE DHT22 DHT dht (DHTPIN, DHTTYPE); plutajuće brujanje = 0; temp. plovka = 0;

Bit će stvorena nova funkcija za očitavanje senzora:

/ * Dobijte DHT podatke */

void getDhtData (void) {float tempIni = temp; plutati humIni = brujati; temp = dht.readTemperature (); hum = dht.readHumidity (); if (isnan (hum) || isnan (temp)) // Provjerite neuspješno čitanje i prijevremeno izađite (za pokušaj ponovno). {Serial.println ("Nije uspjelo čitanje s DHT senzora!"); temp = tempIni; hum = humIni; povratak; }}

Cjelokupni kod, uključujući UV i DHT senzore, može se preuzeti s mog GitHub -a: NodeMCU_UV_DHT_Sensor_OLED

Korak 6: Slanje podataka na ThingSpeak.com

Slanje podataka na ThingSpeak.com
Slanje podataka na ThingSpeak.com
Slanje podataka na ThingSpeak.com
Slanje podataka na ThingSpeak.com
Slanje podataka na ThingSpeak.com
Slanje podataka na ThingSpeak.com

Do sada smo koristili samo NodeMCU ESP12-E kao običnu i običnu Arduino ploču. Naravno, samo smo "izgrebali" stvarni potencijal ovog spektakularnog malog čipa i sada je vrijeme za uzlijetanje u raj! Ili bolje zvijezdama! Eh … do oblaka!;-)

Započnimo!

  1. Prvo morate imati račun na ThinkSpeak.com
  2. Slijedite upute za stvaranje kanala i zabilježite svoj ID kanala i API API ključ
  3. Ažurirajte donji kôd svojom WiFi mrežom i vjerodajnicama za Thinkspeak
  4. Pokrenite program na IDE -u

Komentirajmo najvažnije dijelove koda:

Prvo, nazovimo biblioteku ESP8266, definirajmo WiFi klijenta i definirajmo lokalne vjerodajnice za usmjerivač i Thinkspeak:

/* ESP12-E & Thinkspeak*/

#include WiFiClient klijent; const char* MY_SSID = "VAŠ SSD ID OVDJE"; const char* MY_PWD = "TVOJA LOZINKA OVDJE"; const char* TS_SERVER = "api.thingspeak.com"; String TS_API_KEY = "VAŠ KANAL ZAPISNI KLJUČ API";

Drugo, uključimo vrlo važnu knjižnicu za IoT projekte: SimpleTimer.h:

/ * TIMER */

#include SimpleTimer mjerač vremena;

Treće, tijekom setup (), pokrenut ćemo serijsku komunikaciju, pozvati funkciju connectWiFi () i definirati mjerače vremena. Imajte na umu da redak koda: timer.setInterval (60000L, sendDataTS); će pozvati funkciju sendDataTS () svakih 60 sekundi, kako bi prenijeli podatke na ThinkSpeak kanal.

void setup ()

{… Serial.begin (115200); kašnjenje (10); … ConnectWifi (); timer.setInterval (60000L, sendDataTS); …}

Na kraju, ali ne najmanje važno, tijekom loop (), jedina naredba potrebna je pokretanje timera i to je to!

void loop ()

{… Timer.run (); // Pokreće SimpleTimer}

U nastavku možete vidjeti dvije važne funkcije koje se koriste za upravljanje komunikacijom Thinkspeak:

ESP12-E veza s vašom WiFi mrežom:

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

*Povezivanje WiFi *********************************************** ***/ void connectWifi () {Serial.print ("Spajanje na"+*MY_SSID); WiFi.počni (MY_SSID, MY_PWD); while (WiFi.status ()! = WL_CONNECTED) {odgoda (1000); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi povezan"); Serial.println (""); }

ESP12-E šalje podatke u ThinkSpeak:

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

*Slanje podataka na kanal Thinkspeak ****************************************** ******/ void sendDataTS (void) {if (client.connect (TS_SERVER, 80)) {String postStr = TS_API_KEY; postStr += "& polje1 ="; postStr += String (dataSensorUV); postStr += "& polje2 ="; postStr += String (indexUV); postStr += "& polje3 ="; postStr += String (temp); postStr += "& polje4 ="; postStr += String (pjevušenje); postStr += "\ r / n / r / n"; client.print ("POST /ažuriraj HTTP /1.1 / n"); client.print ("Domaćin: api.thingspeak.com / n"); client.print ("Veza: zatvori / 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); kašnjenje (1000); } poslano ++; client.stop (); }

Cjelokupni kod možete pronaći na mom GitHubu: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT

Nakon što kôd učitate na svoj NodeMCU. Spojimo vanjsku bateriju i napravimo neka mjerenja pod suncem. Stavio sam Remote Station na krov i počeo snimati podatke na ThingSpeak.com kao što je prikazano na gornjim fotografijama.

Korak 7: Zaključak

Zaključak
Zaključak

Kao i uvijek, nadam se da će ovaj projekt pomoći drugima da pronađu svoj put u uzbudljivi svijet elektronike!

Za detalje i konačni kôd posjetite moje skladište GitHub: RPi-NodeMCU-Weather-Station

Za više projekata posjetite moj blog: MJRoBot.org

Ostanite uz nas! Sljedeći vodič ćemo poslati podatke s udaljene meteorološke postaje na središnju, na temelju Raspberry Pi web poslužitelja:

Slika
Slika

Saludos s juga svijeta!

Vidimo se u mom sljedećem uputstvu!

Hvala vam, Marcelo

Preporučeni: