Sadržaj:

IoT je postao jednostavan: Snimanje udaljenih vremenskih podataka: UV i temperatura zraka i vlažnost: 7 koraka
IoT je postao jednostavan: Snimanje udaljenih vremenskih podataka: UV i temperatura zraka i vlažnost: 7 koraka

Video: IoT je postao jednostavan: Snimanje udaljenih vremenskih podataka: UV i temperatura zraka i vlažnost: 7 koraka

Video: IoT je postao jednostavan: Snimanje udaljenih vremenskih podataka: UV i temperatura zraka i vlažnost: 7 koraka
Video: Part 1 - Tom Swift in the Caves of Ice Audiobook by Victor Appleton (Chs 1-11) 2024, Juli
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 vodiču snimit ćemo udaljene podatke kao što su UV (ultraljubičasto zračenje), temperatura zraka i vlažnost. Ti će podaci biti vrlo važni i koristiti će se u budućoj kompletnoj meteorološkoj stanici.

Blok dijagram pokazuje šta ćemo dobiti na kraju.

Image
Image

Korak 1: BoM - Predmet materijala

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

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

UV senzor - 4,00 USD

OLED USD 12,00

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 proizvodi 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). Nivo signala sa fotodiode je vrlo mali, na nivou nano-ampera, pa je modul ugrađen operativno pojačalo za pojačavanje signala na čitljiviji nivo volta (0 do 1V).

Senzor i op-pojačalo mogu se napajati povezivanjem VCC-a na 3.3VDC (ili 5VDC) i GND na uzemljenje. Analogni signal se može dobiti sa OUT pina.

Njegov izlaz bit će u milivoltima i čitat ć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 ():

/ * Proč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, lako možemo 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 ekrana: OLED

Instaliranje ekrana: OLED
Instaliranje ekrana: OLED
Instaliranje ekrana: OLED
Instaliranje ekrana: OLED

Za potrebe testiranja, na naš UV mjerač ćemo uključiti OLED (ovaj korak je potpuno neobavezan).

U redu je tokom testiranja koristiti serijski monitor, ali šta se dešava kada koristite svoje prototipe daleko od računara u samostalnom režimu? U tu svrhu instalirajmo OLED ekran, SSD1306, čije su glavne karakteristike:

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

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

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

Nakon što povežemo ekran, preuzmimo i instalirajmo njegovu biblioteku na naš Arduino IDE: "ESP8266 OLED upravljački program za SSD1306 ekran" koji je razvio Daniel Eichhorn (Obavezno koristite verziju 3.0.0 ili noviju!).

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

Nakon što ponovno pokrenete IDE, biblioteka bi trebala biti već instalirana.

Biblioteka podržava I2C protokol za pristup OLED ekranu pomoću ugrađene Wire.h biblioteke:

/ * 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 prikaz (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN);

Navedimo neke važne API -je koji će se koristiti s našim OLED ekranom. Kompletna lista može se pronaći na gore navedenom GITHub -u.

A. Kontrola prikaza:

void init (); // Inicijalizacija prikaza

void displayOn (void); // Uključivanje prikaza void displayOff (void); // Isključivanje prikaza void clear (void); // Brisanje lokalnog međuspremnika piksela void flipScreenVertical (); // Okrenite ekran 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

Kada se instaliraju i sam OLED i njegova biblioteka, napišimo jednostavan program za testiranje. Unesite sa donjim kodom u 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 prikaz (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 (); // inicijaliziranje prikaza display.clear (); // Očisti prikaz ekrana.flipScreenVertical (); // Okrenite zaslon naopačke display.display (); // Stavite podatke na ekran 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, "Serijska brzina prijenosa:"); display.drawString (90, 52, String (11500)); display.display (); // Stavljanje podataka na kašnjenje prikaza (3000); }

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

NodeMCU_OLED_Test

Korak 4: Lokalni UV mjerač

Lokalni UV merač
Lokalni UV merač
Lokalni UV merač
Lokalni UV merač

Sada, s instaliranim OLED zaslonom, možemo spojiti bateriju i izvršiti neka daljinska testiranja 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 prikaz (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 (); // inicijaliziranje prikaza display.clear (); // Očisti prikaz ekrana.flipScreenVertical (); // Okrenite zaslon naopačke display.display (); // Stavite podatke na ekran 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čunavanja 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, String (indexUV)); display.display (); }

Gornji kod se može preuzeti sa 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 vlažnosti i termistor za mjerenje okolnog zraka i izbacuje digitalni signal na pin podataka (nisu potrebni analogni ulazi).

Senzor bi trebao biti napajan između 3.3V i 5V 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 stranicu vodiča DHT22/11.

DHT22 ima 4 pina (okrenut prema senzoru, pin 1 je krajnje lijevo):

  1. VCC (povezat ćemo se na 3.3V iz NodeMCU -a);
  2. Data out;
  3. Nije povezan i
  4. Ground.

Nakon što ćete obično koristiti senzor na udaljenostima manjim od 20 m, 10K otpornik bi trebao biti spojen između Data i VCC pinova. Izlazni pin će biti 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 Arduino biblioteke. Nakon što ponovo učitate svoj Arduino IDE, "DHT senzorska biblioteka" bi trebala biti instalirana.

Na početku koda moramo uključiti redove:

/* DHT22*/

#include "DHT.h" #define DHTPIN D2 #define DHTTYPE DHT22 DHT dht (DHTPIN, DHTTYPE); float hum = 0; float temp = 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 da li je čitanje bilo neuspješno i izađite ranije (da pokušate ponovo). {Serial.println ("Očitavanje sa DHT senzora nije uspjelo!"); temp = tempIni; hum = humIni; return; }}

Kompletan kod, uključujući UV i DHT senzore, možete preuzeti sa 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" pravi potencijal ovog spektakularnog malog čipa i sada je vrijeme za uzlijetanje u raj! Ili bolje do zvezda! Eh… do oblaka!;-)

Počnimo!

  1. Prvo morate imati račun na ThinkSpeak.com
  2. Slijedite upute za kreiranje kanala i zapišite svoj ID kanala i API API ključ
  3. Ažurirajte donji kod sa 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 = "VAŠA LOZINKA OVDJE"; const char* TS_SERVER = "api.thingspeak.com"; String TS_API_KEY = "VAŠ KANAL ZAPISNI KLJUČ API";

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

/ * TIMER */

#include SimpleTimer timer;

Treće, tijekom setup (), inicirat ćemo serijsku komunikaciju, pozvati funkciju connectWiFi () i definirati tajmere. Imajte na umu da red koda: timer.setInterval (60000L, sendDataTS); će pozvati funkciju sendDataTS () svakih 60 sekundi, kako bi otpremili podatke na ThinkSpeak kanal.

void setup ()

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

Najzad, ali ne i najmanje važno, tokom loop (), potrebna je samo naredba da se pokrene tajmer i to je to!

void loop ()

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

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

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

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

*Povezivanje WiFi *********************************************** ***/ void connectWifi () {Serial.print ("Povezivanje sa"+*MY_SSID); WiFi.begin (MY_SSID, MY_PWD); while (WiFi.status ()! = WL_CONNECTED) {kašnjenje (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 += "& field4 ="; postStr += String (hum); 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 (); }

Kompletan kod možete pronaći na mom GitHub -u: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT

Nakon što ste kod učitali na svoj NodeMCU. Spojimo vanjsku bateriju i izvršimo 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 kod posjetite moje skladište GitHub: RPi-NodeMCU-Weather-Station

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

Ostanite s nama! Sljedeći vodič ćemo poslati podatke s udaljene meteorološke stanice na centralnu, na temelju Raspberry Pi web servera:

Image
Image

Saludos sa juga svijeta!

Vidimo se u mom sljedećem uputstvu!

Hvala ti, Marcelo

Preporučuje se: