Kazalo:

IoT Made Easy: Zajem oddaljenih vremenskih podatkov: UV in zrak Temperatura in vlažnost: 7 korakov
IoT Made Easy: Zajem oddaljenih vremenskih podatkov: UV in zrak Temperatura in vlažnost: 7 korakov

Video: IoT Made Easy: Zajem oddaljenih vremenskih podatkov: UV in zrak Temperatura in vlažnost: 7 korakov

Video: IoT Made Easy: Zajem oddaljenih vremenskih podatkov: UV in zrak Temperatura in vlažnost: 7 korakov
Video: Брайан Китинг и Ли Кронин: Жизнь во Вселенной 2024, November
Anonim
IoT Made Easy: Zajem oddaljenih vremenskih podatkov: UV in temperatura zraka ter vlažnost
IoT Made Easy: Zajem oddaljenih vremenskih podatkov: UV in temperatura zraka ter vlažnost

V tem vodiču bomo zajemali oddaljene podatke, kot so UV (ultravijolično sevanje), temperatura zraka in vlažnost. Ti podatki bodo zelo pomembni in bodo uporabljeni v prihodnji popolni vremenski postaji.

Blok diagram prikazuje, kaj bomo dobili na koncu.

Slika
Slika

1. korak: BoM - materialni material

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

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

UV senzor - 4,00 USD

OLED 12,00 USD

Ogledna plošča - 1,00 USD

Korak: Analogni UV -senzor

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

Ta UV-senzor ustvarja analogni izhod, sorazmeren ultravijoličnemu sevanju, ki ga najdemo v spektru zaznavanja svetlobe. Uporablja UV fotodiodo (na osnovi galijevega nitrida), ki lahko zazna 240-370 nm obseg svetlobe (ki pokriva UVB in večino UVA spektra). Raven signala s fotodiode je v nano-amperskem nivoju zelo majhna, zato je modul vgrajen operacijski ojačevalnik za ojačanje signala na bolj berljivo napetost (0 do 1 V).

Senzor in op-amp lahko napajate tako, da priključite VCC na 3.3VDC (ali 5VDC) in GND na ozemljitveno maso. Analogni signal lahko dobite z izhoda OUT.

Njegov izhod bo v milivoltih in ga bo prebral analogni vhod našega NodeMCU. Ko ga preberemo, ga moramo "pretvoriti" (ali "preslikati"), da bo koda bolje obravnavala vrednosti. To lahko storimo s funkcijo readSensorUV ():

/ * Preberite UV senzor v mV in pokličite izračun UV indeksa */

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

Ko imamo UV podatke, lahko enostavno izračunamo UV indeks, kot je opredeljeno v zgornji tabeli. Funkcija indexCalculate () bo to naredila namesto nas:

/ * Izračun UV indeksa */

void indexCalculate () {if (dataSensorUV <227) indexUV = 0; sicer če (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; sicer če (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; sicer če (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; sicer če (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; sicer če (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; sicer če (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; sicer, če (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; sicer če (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; sicer če (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; sicer če (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; else indexUV = 11; }

3. korak: Namestitev zaslona: OLED

Namestitev zaslona: OLED
Namestitev zaslona: OLED
Namestitev zaslona: OLED
Namestitev zaslona: OLED

Za preskusne namene bomo na naš UV -meter vključili OLED (ta korak je popolnoma neobvezen).

Med preskusi je v redu uporabljati serijski monitor, toda kaj se zgodi, ko prototipe uporabljate daleč od računalnika v samostojnem načinu? V ta namen namestimo zaslon OLED, SSD1306, katerega glavne značilnosti so:

  • Velikost zaslona: 0,96"
  • Serija I2C IIC SPI
  • 128 x 64
  • Bela OLED LCD LED

Sledite električnemu diagramu in priključite 4 zatiče našega OLED -a:

  • VCC gre na 3.3V
  • GND gre na tla
  • SCL gre na NodeMCU (GPIO 2) ==> D4
  • SDA gre v NodeMCU (GPIO 0) ==> D3

Ko povežemo zaslon, naložimo in namestimo njegovo knjižnico v naš Arduino IDE: "ESP8266 OLED gonilnik za zaslon SSD1306", ki ga je razvil Daniel Eichhorn (Prepričajte se, da uporabljate različico 3.0.0 ali več!).

Namestite knjižnico v svoj Arduino IDE, ki ga najdete na SSD1306Wire.h

Ko znova zaženete IDE, mora biti knjižnica že nameščena.

Knjižnica podpira protokol I2C za dostop do zaslona OLED z vgrajeno knjižnico 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);

Naštejmo nekaj pomembnih API -jev, ki bodo uporabljeni z zaslonom OLED. Celoten seznam najdete na zgoraj navedenem GITHubu.

A. Nadzor prikaza:

void init (); // Inicializirajte zaslon

void displayOn (void); // Vklopite zaslon void displayOff (void); // izklop zaslona off void clear (void); // Počisti lokalni medpomnilnik slikovnih pik void flipScreenVertical (); // Obrnite zaslon na glavo

B. Besedilne operacije:

void drawString (int16_t x, int16_t y, besedilo niza); // (xpos, ypos, "Besedilo")

void setFont (const char* fontData); // Nastavi trenutno pisavo.

Razpoložljive privzete pisave:

  • ArialMT_Plain_10,
  • ArialMT_Plain_16,

  • ArialMT_Navaden_24

Ko sta nameščena tako OLED kot njegova knjižnica, napišemo preprost program, ki ga bo preizkusil. Vnesite s spodnjo kodo v IDE, rezultat naj bo prikaz, kot je prikazano na zgornji 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 () {} / * Zagon in prikaz nastavitvenih podatkov na OLED * / void displaySetup () {display.init (); // inicializiramo display display.clear (); // Počisti prikaz zaslona.flipScreenVertical (); // Obrnite zaslon na glavo display.display (); // Dajte podatke na zaslon Serial.println ("Začetek preskusa prikaza"); display.setFont (ArialMT_Plain_24); display.drawString (30, 0, "OLED"); // (xpos, ypos, "Besedilo") display.setFont (ArialMT_Plain_16); display.drawString (18, 29, "Test je začel"); display.setFont (ArialMT_Plain_10); display.drawString (10, 52, "Serijski BaudRate:"); display.drawString (90, 52, String (11500)); display.display (); // Podatke o zakasnitvi prikaza (3000); }

Zgornji program lahko prenesete z mojega GitHub -a:

NodeMCU_OLED_Test

4. korak: Lokalni UV -merilnik

Lokalni UV merilnik
Lokalni UV merilnik
Lokalni UV merilnik
Lokalni UV merilnik

Zdaj, ko je nameščen zaslon OLED, lahko povežemo baterijo in opravimo nekaj preskusov na daljavo z uporabo "UV -merilnika"

#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 (); zamuda (1000); } / * Zagon in prikaz nastavitvenih podatkov na OLED * / void displaySetup () {display.init (); // inicializiramo display display.clear (); // Počisti prikaz zaslona.flipScreenVertical (); // Obrnite zaslon na glavo display.display (); // Dajte podatke na zaslon Serial.println ("Začetek preskusa senzorja UV"); display.setFont (ArialMT_Plain_24); display.drawString (10, 0, "MJRoBot"); display.setFont (ArialMT_Plain_16); display.drawString (0, 29, "Test senzorja UV"); display.setFont (ArialMT_Plain_10); display.drawString (0, 52, "SW Ver.:"); display.drawString (45, 52, SW_VERSION); display.display (); zamuda (3000); } / * Preberite UV senzor v mV in pokličite izračun UV indeksa * / void readSensorUV () {bajt numOfReadings = 5; dataSensorUV = 0; for (int i = 0; i <numOfReadings; i ++) {dataSensorUV+= analogRead (sensorUVPin); zamuda (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; sicer če (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; sicer če (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; sicer če (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; sicer če (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; sicer če (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; sicer če (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; sicer, če (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; sicer če (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; sicer če (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; sicer če (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; else indexUV = 11; } /* Prikaz UV vrednosti na lokalnem 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 (); }

Zgornjo kodo lahko prenesete z mojega GitHuna: NodeMCU_UV_Sensor_OLED.ino

5. korak: Namestitev DHT22 za merjenje temperature in vlažnosti zraka

Namestitev DHT22 za merjenje temperature in vlažnosti zraka
Namestitev DHT22 za merjenje temperature in vlažnosti zraka
Namestitev DHT22 za merjenje temperature in vlažnosti zraka
Namestitev DHT22 za merjenje temperature in vlažnosti zraka

Eden najpogosteje uporabljenih senzorjev za zajemanje vremenskih podatkov je DHT22 (ali njegov brat DHT11), digitalni senzor relativne vlažnosti in temperature. Uporablja kapacitivni senzor vlažnosti in termistor za merjenje zraka v okolici in izpljune digitalni signal na podatkovni zatič (brez analognih vhodnih zatičev).

Senzor mora biti napajan med 3,3 V in 5 V in bo deloval od -40oC do +80oC z natančnostjo +/- 0,5oC za temperaturo in +/- 2% za relativno vlažnost. Pomembno je tudi upoštevati, da je njegovo zaznavanje v povprečju 2 sekundi (najmanjši čas med odčitki). Spletno mesto Adafruit ponuja veliko informacij o DHT22 in njegovem bratu DHT11. Za več podrobnosti obiščite stran Vadnica DHT22/11.

DHT22 ima 4 zatiče (obrnjen proti senzorju, pin 1 je najbolj levi):

  1. VCC (priključili se bomo na 3.3V iz NodeMCU);
  2. Izhod podatkov;
  3. Ni povezan in
  4. Tla.

Ko boste običajno uporabljali senzor na razdaljah, manjših od 20 m, je treba med zatiči Data in VCC priključiti 10K upor. Izhodni pin bo povezan z nožico NodeMCU D3 (glej zgornji diagram). Ko je senzor nameščen v našem modulu, prenesite knjižnico DHT iz skladišča Adafruit GitHub in jo namestite v datoteko Arduino's Library. Ko znova naložite svoj Arduino IDE, je treba namestiti "knjižnico senzorjev DHT".

Na začetku kode moramo vključiti vrstice:

/* DHT22*/

#include "DHT.h" #define DHTPIN D2 #define DHTTYPE DHT22 DHT dht (DHTPIN, DHTTYPE); plavajoče brujanje = 0; plavajoča temp = 0;

Za branje senzorja bo ustvarjena nova funkcija:

/ * Pridobite podatke DHT */

void getDhtData (void) {float tempIni = temp; plavajoči humIni = brnenje; temp = dht.readTemperature (); hum = dht.readHumidity (); if (isnan (hum) || isnan (temp)) // Preverite, ali je kakšno branje neuspešno, in zapustite predčasno (poskusite znova). {Serial.println ("Odčitavanje s senzorja DHT ni uspelo!"); temp = tempIni; hum = humIni; vrnitev; }}

Celotno kodo, vključno s senzorji UV in DHT, lahko prenesete z mojega GitHub -a: NodeMCU_UV_DHT_Sensor_OLED

6. korak: Pošiljanje podatkov na ThingSpeak.com

Pošiljanje podatkov na ThingSpeak.com
Pošiljanje podatkov na ThingSpeak.com
Pošiljanje podatkov na ThingSpeak.com
Pošiljanje podatkov na ThingSpeak.com
Pošiljanje podatkov na ThingSpeak.com
Pošiljanje podatkov na ThingSpeak.com

Doslej smo NodeMCU ESP12-E uporabljali le kot običajno in običajno ploščo Arduino. Seveda smo le »opraskali« pravi potencial tega spektakularnega malega čipa in zdaj je čas za vzlet v nebesa! Ali bolje do zvezd! Eh… v oblak!;-)

Začnimo!

  1. Najprej morate imeti račun na ThinkSpeak.com
  2. Sledite navodilom za ustvarjanje kanala in upoštevajte svoj ID kanala in napis API -ja
  3. Spodnjo kodo posodobite z omrežjem WiFi in poverilnicami Thinkspeak
  4. Zaženite program v IDE

Komentirajmo najpomembnejše dele kode:

Najprej pokličimo knjižnico ESP8266, opredelimo odjemalca WiFi in določimo lokalne poverilnice usmerjevalnika in Thinkspeak:

/* ESP12-E & Thinkspeak*/

#include odjemalca WiFiClient; const char* MY_SSID = "VAŠ ID SSD -ja TUKAJ"; const char* MY_PWD = "Tvoja geslo TUKAJ"; const char* TS_SERVER = "api.thingspeak.com"; String TS_API_KEY = "KLJUČ VPISA KANALA V VAŠ KANAL";

Drugič, vključimo zelo pomembno knjižnico za projekte IoT: SimpleTimer.h:

/ * TIMER */

#include časovnik SimpleTimer;

Tretjič, med nastavitvijo () bomo sprožili serijsko komunikacijo, poklicali funkcijo connectWiFi () in določili časovnike. Upoštevajte, da vrstica kode: timer.setInterval (60000L, sendDataTS); bo vsakih 60 sekund poklical funkcijo sendDataTS (), da bo naložil podatke v kanal ThinkSpeak.

void setup ()

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

Nenazadnje je med zanko () potreben samo ukaz, da sproži časovnik in to je to!

void loop ()

{… Timer.run (); // Zažene SimpleTimer}

Spodaj si lahko ogledate dve pomembni funkciji, ki se uporabljata za komunikacijo Thinkspeak:

Povezava ESP12-E z vašim omrežjem WiFi:

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

*Povezovanje WiFi *********************************************** ***/ void connectWifi () {Serial.print ("Povezovanje z"+*MY_SSID); WiFi.začetek (MY_SSID, MY_PWD); while (WiFi.status ()! = WL_CONNECTED) {zakasnitev (1000); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi povezan"); Serial.println (""); }

ESP12-E pošilja podatke v ThinkSpeak:

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

*Pošiljanje podatkov kanalu Thinkspeak ****************************************** ******/ void sendDataTS (void) {if (client.connect (TS_SERVER, 80)) {String postStr = TS_API_KEY; postStr += "& polje1 ="; postStr += niz (dataSensorUV); postStr += "& polje2 ="; postStr += niz (indexUV); postStr += "& field3 ="; postStr += niz (temp); postStr += "& field4 ="; postStr += String (hum); postStr += "\ r / n / r / n"; client.print ("POST /posodobi HTTP /1.1 / n"); client.print ("Gostitelj: api.thingspeak.com / n"); client.print ("Povezava: zaprta / n"); client.print ("X-THINGSPEAKAPIKEY:" + TS_API_KEY + "\ n"); client.print ("Vrsta vsebine: aplikacija/x-www-form-urlencoded / n"); client.print ("Content-Length:"); client.print (postStr.length ()); client.print ("\ n / n"); client.print (postStr); zamuda (1000); } poslano ++; client.stop (); }

Celotno kodo najdete na mojem GitHubu: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT

Ko naložite kodo v svoj NodeMCU. Priključimo zunanjo baterijo in naredimo nekaj meritev pod soncem. Oddaljeno postajo postavim na streho in začnem zajemati podatke na ThingSpeak.com, kot je prikazano na zgornjih fotografijah.

7. korak: Zaključek

Zaključek
Zaključek

Kot vedno upam, da lahko ta projekt pomaga drugim najti pot v razburljiv svet elektronike!

Za podrobnosti in končno kodo obiščite moj skladišče GitHub: RPi-NodeMCU-Weather-Station

Za več projektov obiščite moj blog: MJRoBot.org

Ostani na vezi! V naslednji vadnici bomo podatke iz oddaljene vremenske postaje poslali na osrednjo na podlagi spletnega strežnika Raspberry Pi:

Slika
Slika

Saludos z juga sveta!

Se vidimo v mojem naslednjem navodilu!

Hvala vam, Marcelo

Priporočena: