Indholdsfortegnelse:

IoT Made Easy: Optagelse af fjerntliggende vejrdata: UV og lufttemperatur og luftfugtighed: 7 trin
IoT Made Easy: Optagelse af fjerntliggende vejrdata: UV og lufttemperatur og luftfugtighed: 7 trin

Video: IoT Made Easy: Optagelse af fjerntliggende vejrdata: UV og lufttemperatur og luftfugtighed: 7 trin

Video: IoT Made Easy: Optagelse af fjerntliggende vejrdata: UV og lufttemperatur og luftfugtighed: 7 trin
Video: Суп на Всю Семью! РАССОЛЬНИК в КАЗАНЕ! КАК ПРИГОТОВИТЬ 2024, Juli
Anonim
IoT Made Easy: Optagelse af fjernvejrdata: UV og lufttemperatur og luftfugtighed
IoT Made Easy: Optagelse af fjernvejrdata: UV og lufttemperatur og luftfugtighed

På denne vejledning registrerer vi fjerndata som UV (ultraviolet stråling), lufttemperatur og fugtighed. Disse data vil være meget vigtige og vil blive brugt i en fremtidig komplet vejrstation.

Blokdiagrammet viser, hvad vi får i slutningen.

Billede
Billede

Trin 1: BoM - regning af materiale

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

Fugtigheds- og temperatursensor (DHT22) - USD10,00

UV -sensor - 4,00 USD

OLED USD 12,00

Brødbræt - USD 1,00

Trin 2: Den analoge UV -sensor

Den analoge UV -sensor
Den analoge UV -sensor
Den analoge UV -sensor
Den analoge UV -sensor
Den analoge UV -sensor
Den analoge UV -sensor

Denne UV-sensor genererer en analog udgang, der er proportional med ultraviolet stråling, der findes på det lysfølende spektrum. Den bruger en UV-fotodiode (baseret på Gallium Nitride), som kan registrere 240-370nm lysinterval (som dækker UVB og det meste af UVA-spektrum). Signalniveauet fra fotodioden er meget lille i nano-amperniveauet, så modulet har integreret en operationsforstærker for at forstærke signalet til et mere læseligt volt-niveau (0 til 1V).

Sensoren og op-amp kan forsynes ved at tilslutte VCC til 3,3VDC (eller 5VDC) og GND til strømforsyning. Det analoge signal kan hentes fra OUT -stiften.

Dens output vil være i millivolt og vil blive læst af den analoge input af vores NodeMCU. Når det er læst, skal vi "konvertere" (eller "kort") det for at værdier håndteres bedre af koden. Vi kan gøre det med funktionen readSensorUV ():

/ * Læs UV -sensor i mV og ring til UV -indeksberegning */

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

Når vi har UV -dataene, kan vi let beregne UV -indekset som defineret i ovenstående tabel. Funktionen indexCalculate () gør det for os:

/ * UV -indeksberegning */

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

Trin 3: Installation af en skærm: OLED

Installation af en skærm: OLED
Installation af en skærm: OLED
Installation af en skærm: OLED
Installation af en skærm: OLED

Til testformål vil vi inkludere en OLED på vores UV -måler (Dette trin er fuldstændigt valgfrit).

Det er OK under test, at bruge Serial Monitor, men hvad sker der, når du bruger dine prototyper langt fra din pc i en stand-alone-tilstand? Til det, lad os installere en OLED -skærm, SSD1306, som har hovedkarakteristika:

  • Skærmstørrelse: 0,96"
  • I2C IIC SPI Serial
  • 128X64
  • Hvid OLED LCD LED

Følg det elektriske diagram og tilslut de 4 ben på vores OLED:

  • VCC går til 3,3V
  • GND går til jorden
  • SCL går til NodeMCU (GPIO 2) ==> D4
  • SDA går til NodeMCU (GPIO 0) ==> D3

Når vi har tilsluttet skærmen, lad os downloade og installere dets bibliotek på vores Arduino IDE: "ESP8266 OLED Driver til SSD1306 display" udviklet af Daniel Eichhorn (Sørg for at du bruger version 3.0.0 eller større!).

Installer biblioteket på din Arduino IDE, der findes på SSD1306Wire.h

Når du har genstartet IDE, skal biblioteket allerede være installeret.

Biblioteket understøtter I2C-protokol for at få adgang til OLED-skærmen ved hjælp af det indbyggede Wire.h-bibliotek:

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

Lad os liste nogle vigtige API'er, der vil blive brugt med vores OLED -skærm. Den komplette liste findes på GITHub'en ovenfor.

A. Skærmkontrol:

ugyldig init (); // Initialiser displayet

void displayOn (void); // Tænd for displayet void displayOff (void); // Sluk displayet for void clear (void); // Ryd den lokale pixelbuffer, void flipScreenVertically (); // Vend skærmen på hovedet

B. Tekstoperationer:

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

void setFont (const char* fontData); // Indstiller den aktuelle skrifttype.

Tilgængelige standard skrifttyper:

  • ArialMT_Plain_10,
  • ArialMT_Plain_16,

  • ArialMT_Plain_24

Når både selve OLED og biblioteket er installeret, lad os skrive et simpelt program for at teste det. Indtast med følgende kode på din IDE, resultatet skal være et display som vist på ovenstående foto:

* 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); ugyldig opsætning () {Serial.begin (115200); displaySetup (); } void loop () {} / * Start og vis konfigurationsdata på OLED * / void displaySetup () {display.init (); // initialiser display display.clear (); // Ryd display display.flipScreenVertically (); // Vend displayet på hovedet display.display (); // Sæt data på displayet Serial.println ("Initierer displaytest"); display.setFont (ArialMT_Plain_24); display.drawString (30, 0, "OLED"); // (xpos, ypos, "tekst") display.setFont (ArialMT_Plain_16); display.drawString (18, 29, "Test påbegyndt"); display.setFont (ArialMT_Plain_10); display.drawString (10, 52, "Serial BaudRate:"); display.drawString (90, 52, String (11500)); display.display (); // Sæt data på displayforsinkelse (3000); }

Ovenstående program kan downloades fra min GitHub:

NodeMCU_OLED_Test

Trin 4: Et lokalt UV -måler

En lokal UV -måler
En lokal UV -måler
En lokal UV -måler
En lokal UV -måler

Nu, med OLED -skærmen installeret, kan vi tilslutte et batteri og lave nogle fjerntest ved hjælp af vores "UV -måler"

#define SW_VERSION "UV_Sensor_V.1"

/ * UV Sensor */ #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; SSD1306Wire display (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); ugyldig opsætning () {Serial.begin (115200); displaySetup (); } void loop () {readSensorUV (); displayUV (); forsinkelse (1000); } / * Start og vis konfigurationsdata på OLED * / void displaySetup () {display.init (); // initialiser display display.clear (); // Ryd display display.flipScreenVertically (); // Vend displayet på hovedet display.display (); // Sæt data på displayet Serial.println ("Initiering af UV -sensortest"); display.setFont (ArialMT_Plain_24); display.drawString (10, 0, "MJRoBot"); display.setFont (ArialMT_Plain_16); display.drawString (0, 29, "UV -sensortest"); display.setFont (ArialMT_Plain_10); display.drawString (0, 52, "SW Ver.:"); display.drawString (45, 52, SW_VERSION); display.display (); forsinkelse (3000); } / * Læs UV -sensor i mV og kalder UV -indeksberegning * / void readSensorUV () {byte numOfReadings = 5; dataSensorUV = 0; for (int i = 0; i <numOfReadings; i ++) {dataSensorUV+= analogRead (sensorUVPin); forsinkelse (200); } dataSensorUV /= numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023.0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); } / * UV -indeksberegning * / void indexCalculate () {if (dataSensorUV <227) indexUV = 0; ellers hvis (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; ellers hvis (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; ellers hvis (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; ellers hvis (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; ellers hvis (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; ellers hvis (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; ellers hvis (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; ellers hvis (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; ellers hvis (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; ellers hvis (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; ellers indexUV = 11; } /* Vis UV -værdier på lokal OLED* / void displayUV () {display.clear (); display.setFont (ArialMT_Plain_16); display.drawString (20, 0, "UV -sensor"); 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 (); }

Ovenstående kode kan downloades fra min GitHun: NodeMCU_UV_Sensor_OLED.ino

Trin 5: Installation af en DHT22 til lufttemperatur- og fugtighedsmålinger

Installation af en DHT22 til målinger af lufttemperatur og luftfugtighed
Installation af en DHT22 til målinger af lufttemperatur og luftfugtighed
Installation af en DHT22 til målinger af lufttemperatur og luftfugtighed
Installation af en DHT22 til målinger af lufttemperatur og luftfugtighed

En af de mest anvendte sensorer til registrering af vejrdata er DHT22 (eller det er bror DHT11), en digital relativ luftfugtigheds- og temperatursensor. Den bruger en kapacitiv fugtighedsføler og en termistor til at måle den omgivende luft og spytter et digitalt signal ud på datapinden (ingen analoge indgangsstifter er nødvendige).

Sensoren skal drives mellem 3,3V og 5V og fungerer fra -40oC til +80oC med en nøjagtighed på +/- 0,5oC for temperatur og +/- 2% for relativ luftfugtighed. Det er også vigtigt at huske på, at dens registreringsperiode i gennemsnit er 2 sekunder (minimum tid mellem aflæsninger). Adafruit -webstedet giver mange oplysninger om både DHT22 og dets bror DHT11. For flere detaljer, besøg venligst DHT22/11 vejledningsside.

DHT22 har 4 ben (mod sensoren, pin 1 er den mest venstre):

  1. VCC (vi opretter forbindelse til 3.3V fra NodeMCU);
  2. Data ud;
  3. Ikke tilsluttet og
  4. Jord.

Når du normalt vil bruge sensoren på afstande mindre end 20m, skal en 10K modstand forbindes mellem Data og VCC ben. Outputstiften tilsluttes NodeMCU pin D3 (se diagrammet ovenfor). Når sensoren er installeret på vores modul, skal du downloade DHT -biblioteket fra Adafruit GitHub -arkivet og installere det i din Arduino's Library -fil. Når du genindlæser din Arduino IDE, skal "DHT -sensorbiblioteket" installeres.

I begyndelsen af koden skal vi inkludere linjerne:

/* DHT22*/

#include "DHT.h" #define DHTPIN D2 #define DHTTYPE DHT22 DHT dht (DHTPIN, DHTTYPE); float hum = 0; flyde temp = 0;

En ny funktion vil blive oprettet for at aflæse sensoren:

/ * Få DHT -data */

void getDhtData (void) {float tempIni = temp; float humIni = hum; temp = dht.readTemperature (); hum = dht.readHumidity (); if (isnan (hum) || isnan (temp)) // Kontroller, om nogen læsning mislykkedes, og afslut tidligt (for at prøve igen). {Serial.println ("Kunne ikke læse fra DHT -sensor!"); temp = tempIni; hum = humIni; Vend tilbage; }}

Den komplette kode inklusive UV- og DHT -sensorerne kan downloades fra min GitHub: NodeMCU_UV_DHT_Sensor_OLED

Trin 6: Send data til ThingSpeak.com

Sender data til ThingSpeak.com
Sender data til ThingSpeak.com
Sender data til ThingSpeak.com
Sender data til ThingSpeak.com
Sender data til ThingSpeak.com
Sender data til ThingSpeak.com

Indtil videre har vi kun brugt NodeMCU ESP12-E som et almindeligt og almindeligt Arduino-bord. Selvfølgelig har vi kun "skrabet" det virkelige potentiale i denne spektakulære lille chip, og nu er det tid til at tage til himlen! Eller bedre til stjernerne! Ehr … til skyen!;-)

Lad os begynde!

  1. Først skal du have en konto på ThinkSpeak.com
  2. Følg instruktionerne for at oprette en kanal og notere dit kanal -id og skrive API -nøgle
  3. Opdater nedenstående kode med dit WiFi -netværk og Thinkspeak -legitimationsoplysninger
  4. Kør programmet på IDE

Lad os kommentere de vigtigste dele af koden:

Lad os først ringe til ESP8266 -biblioteket, definere WiFi -klienten og definere din lokale router og Thinkspeak -legitimationsoplysninger:

/* ESP12-E & Thinkspeak*/

#inklusiv WiFiClient -klient; const char* MY_SSID = "DIT SSD -ID HER"; const char* MY_PWD = "DIT KODEORD"; const char* TS_SERVER = "api.thingspeak.com"; String TS_API_KEY = "DIN CHANNEL WRITE API NØGLE";

For det andet, lad os inkludere et meget vigtigt bibliotek til IoT -projekter: SimpleTimer.h:

/ * TIMER */

#inkludere SimpleTimer timer;

For det tredje vil vi under opsætningen () starte seriel kommunikation, kalde funktionen connectWiFi () og definere timerne. Bemærk, at kodelinjen: timer.setInterval (60000L, sendDataTS); kalder funktionen sendDataTS () hvert 60. sekund for at uploade data til ThinkSpeak -kanalen.

ugyldig opsætning ()

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

Til sidst men ikke mindst, under loop (), er den eneste kommando, der er nødvendig, at starte timeren og det er det!

hulrum ()

{… Timer.run (); // Starter SimpleTimer}

Nedenfor kan du se de to vigtige funktioner, der bruges til at håndtere Thinkspeak -kommunikation:

ESP12-E-forbindelse til dit WiFi-netværk:

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

*Tilslutning af WiFi *********************************************** ***/ void connectWifi () {Serial.print ("Opretter forbindelse til"+*MY_SSID); WiFi. Begyndt (MY_SSID, MY_PWD); mens (WiFi.status ()! = WL_CONNECTED) {forsinkelse (1000); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi -forbindelse"); Serial.println (""); }

ESP12-E sender data til ThinkSpeak:

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

*Sender data til 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 (hum); postStr += "\ r / n / r / n"; client.print ("POST /opdater HTTP /1.1 / n"); client.print ("Host: api.thingspeak.com / n"); client.print ("Forbindelse: tæt / n"); client.print ("X-THINGSPEAKAPIKEY:" + TS_API_KEY + "\ n"); client.print ("Indholdstype: application/x-www-form-urlencoded / n"); client.print ("Indholdslængde:"); client.print (postStr.length ()); client.print ("\ n / n"); client.print (postStr); forsinkelse (1000); } sendt ++; client.stop (); }

Den komplette kode findes på min GitHub: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT

Når du har uploadet koden til din NodeMCU. Lad os tilslutte et eksternt batteri og foretage nogle målinger under solen. Jeg satte fjernstationen på taget og begyndte at fange data på ThingSpeak.com som vist på ovenstående fotos.

Trin 7: Konklusion

Konklusion
Konklusion

Som altid håber jeg, at dette projekt kan hjælpe andre med at finde vej til den spændende elektronikverden!

For detaljer og endelig kode, besøg mit GitHub-depot: RPi-NodeMCU-Weather-Station

For flere projekter, besøg min blog: MJRoBot.org

Bliv hængende! Næste vejledning sender vi data fra en fjernvejrstation til en central, baseret på en Raspberry Pi webserver:

Billede
Billede

Saludos fra den sydlige del af verden!

Vi ses i min næste instruerbare!

Tak skal du have, Marcelo

Anbefalede: