Innholdsfortegnelse:

IoT Made Easy: Capture Remote Weather Data: UV and Air Temperature & Fuktighet: 7 trinn
IoT Made Easy: Capture Remote Weather Data: UV and Air Temperature & Fuktighet: 7 trinn

Video: IoT Made Easy: Capture Remote Weather Data: UV and Air Temperature & Fuktighet: 7 trinn

Video: IoT Made Easy: Capture Remote Weather Data: UV and Air Temperature & Fuktighet: 7 trinn
Video: Tesla Model S: Defroster Test during Ice Storm on the Ice-T 2024, Juli
Anonim
IoT Made Easy: Fanger eksterne værdata: UV og lufttemperatur og fuktighet
IoT Made Easy: Fanger eksterne værdata: UV og lufttemperatur og fuktighet

På denne opplæringen vil vi fange eksterne data som UV (ultrafiolett stråling), lufttemperatur og fuktighet. Disse dataene vil være svært viktige og vil bli brukt i en fremtidig komplett værstasjon.

Blokkediagrammet viser hva vi får på slutten.

Bilde
Bilde

Trinn 1: BoM - materialregning

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

Fuktighets- og temperatursensor (DHT22) - USD 10,00

UV -sensor - USD 4,00

OLED USD 12,00

Brødbrett - USD 1,00

Trinn 2: Den analoge UV -sensoren

Den analoge UV -sensoren
Den analoge UV -sensoren
Den analoge UV -sensoren
Den analoge UV -sensoren
Den analoge UV -sensoren
Den analoge UV -sensoren

Denne UV-sensoren genererer en analog utgang proporsjonal med ultrafiolett stråling som finnes på det lysfølende spekteret. Den bruker en UV-fotodiode (basert på Gallium Nitride), som kan oppdage 240-370nm lysområdet (som dekker UVB og det meste av UVA-spektrum). Signalnivået fra fotodioden er veldig lite, i nano-ampernivået, så modulen har innebygd en operasjonsforsterker for å forsterke signalet til et mer lesbart voltnivå (0 til 1V).

Sensoren og op-forsterkeren kan drives, ved å koble VCC til 3.3VDC (eller 5VDC) og GND til strømnettet. Det analoge signalet kan hentes fra OUT -pinnen.

Utgangen vil være i millivolt og vil bli lest av den analoge inngangen til vår NodeMCU. Når det er lest, bør vi "konvertere" (eller "kartlegge") det for at verdier skal håndteres bedre av koden. Vi kan gjøre det med funksjonen readSensorUV ():

/ * Les 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 enkelt beregne UV -indeksen som definert i tabellen ovenfor. Funksjonen indexCalculate () vil gjøre det for oss:

/ * 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; annet indexUV = 11; }

Trinn 3: Installere en skjerm: OLED

Installere en skjerm: OLED
Installere en skjerm: OLED
Installere en skjerm: OLED
Installere en skjerm: OLED

For testformål vil vi inkludere en OLED på UV -måleren vår (Dette trinnet er helt valgfritt).

Det er OK under tester å bruke Serial Monitor, men hva skjer når du bruker prototypene langt fra PC-en i en frittstående modus? For det, la oss installere en OLED -skjerm, SSD1306, som har hovedtrekkene:

  • Skjermstørrelse: 0,96"
  • I2C IIC SPI Serial
  • 128X64
  • Hvit OLED LCD LED

Følg det elektriske diagrammet og koble de fire pinnene på OLED -en vår:

  • 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 koblet til skjermen, la oss laste ned og installere biblioteket på vår Arduino IDE: "ESP8266 OLED Driver for SSD1306 display" utviklet av Daniel Eichhorn (Sørg for at du bruker versjon 3.0.0 eller større!).

Installer biblioteket på Arduino IDE, som du finner på SSD1306Wire.h

Når du har startet IDE på nytt, bør biblioteket allerede være installert.

Biblioteket støtter I2C-protokoll for å få tilgang til OLED-skjermen ved hjelp av det innebygde Wire.h-biblioteket:

/ * OLED */

#include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306Wire -skjerm (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN);

La oss liste noen viktige API -er som skal brukes med OLED -skjermen. Den komplette listen finner du på GITHub gitt ovenfor.

A. Skjermkontroll:

ugyldig init (); // Initialiser displayet

void displayOn (void); // Slå skjermen på void displayOff (void); // Slå av displayet void clear (void); // Slett det lokale pikselbufferrommet flipScreenVertically (); // Snu skjermen opp ned

B. Tekstoperasjoner:

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

void setFont (const char* fontData); // Angir gjeldende skrift.

Tilgjengelige standardskrifttyper:

  • ArialMT_Plain_10,
  • ArialMT_Plain_16,

  • ArialMT_Plain_24

Når både selve OLED -en og biblioteket er installert, la oss skrive et enkelt program for å teste det. Skriv inn koden på IDE -en din, resultatet skal være et display som vist på bildet ovenfor:

* OLED */

#include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306Wire -skjerm (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); ugyldig oppsett () {Serial.begin (115200); displaySetup (); } void loop () {} / * Start og vis oppsettdata på OLED * / void displaySetup () {display.init (); // initialiser display display.clear (); // Fjern visning display.flipScreenVertically (); // Snu skjermen opp ned display.display (); // Legg data på displayet Serial.println ("Starter displaytest"); display.setFont (ArialMT_Plain_24); display.drawString (30, 0, "OLED"); // (xpos, ypos, "Text") display.setFont (ArialMT_Plain_16); display.drawString (18, 29, "Test startet"); display.setFont (ArialMT_Plain_10); display.drawString (10, 52, "Serial BaudRate:"); display.drawString (90, 52, String (11500)); display.display (); // Legg data på skjermforsinkelse (3000); }

Programmet ovenfor kan lastes ned fra min GitHub:

NodeMCU_OLED_Test

Trinn 4: En lokal UV -måler

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

Nå, med OLED -skjermen installert, kan vi koble til et batteri og gjøre noen fjerntester med vårt "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 -skjerm (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); ugyldig oppsett () {Serial.begin (115200); displaySetup (); } void loop () {readSensorUV (); displayUV (); forsinkelse (1000); } / * Start og vis oppsettdata på OLED * / void displaySetup () {display.init (); // initialiser display display.clear (); // Fjern visning display.flipScreenVertically (); // Snu skjermen opp ned display.display (); // Legg data på displayet Serial.println ("Initiating UV Sensor Test"); 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); } / * Les UV -sensor i mV og ring 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; annet indexUV = 11; } /* Vis UV -verdier på lokal OLED* / ugyldig 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 (); }

Koden ovenfor kan lastes ned fra min GitHun: NodeMCU_UV_Sensor_OLED.ino

Trinn 5: Installere en DHT22 for lufttemperatur- og fuktighetsmålinger

Installere en DHT22 for lufttemperatur- og fuktighetsmålinger
Installere en DHT22 for lufttemperatur- og fuktighetsmålinger
Installere en DHT22 for lufttemperatur- og fuktighetsmålinger
Installere en DHT22 for lufttemperatur- og fuktighetsmålinger

En av de mest brukte sensorene for å fange værdata er DHT22 (eller broren DHT11), en digital relativ fuktighets- og temperatursensor. Den bruker en kapasitiv fuktighetssensor og en termistor for å måle luften rundt og spytter ut et digitalt signal på datapinnen (ingen analoge inngangspinner er nødvendig).

Sensoren skal drives mellom 3,3V og 5V og vil fungere fra -40oC til +80oC med en nøyaktighet på +/- 0,5oC for temperatur og +/- 2% for relativ fuktighet. Det er også viktig å huske på at dens registreringsperiode i gjennomsnitt er 2 sekunder (minimum tid mellom avlesningene). Nettstedet til Adafruit gir mye informasjon om både DHT22 og broren DHT11. For mer informasjon, vennligst besøk DHT22/11 opplæringsside.

DHT22 har 4 pinner (vendt mot sensoren, pin 1 er den mest venstre):

  1. VCC (vi kobler til 3.3V fra NodeMCU);
  2. Data ut;
  3. Ikke tilkoblet og
  4. Bakke.

Når du vanligvis bruker sensoren på avstander mindre enn 20m, bør en 10K motstand kobles mellom data- og VCC -pinner. Utgangspinnen blir koblet til NodeMCU -pinne D3 (se diagrammet ovenfor). Når sensoren er installert på modulen vår, laster du ned DHT -biblioteket fra Adafruit GitHub -depotet og installerer det i Arduino's Library -filen. Når du har lastet inn Arduino IDE igjen, bør "DHT -sensorbiblioteket" installeres.

I begynnelsen av koden må vi inkludere linjene:

/* DHT22*/

#include "DHT.h" #define DHTPIN D2 #define DHTTYPE DHT22 DHT dht (DHTPIN, DHTTYPE); flyte nynning = 0; flyte temp = 0;

En ny funksjon vil bli opprettet for å lese sensoren:

/ * Få DHT -data */

void getDhtData (void) {float tempIni = temp; float humIni = hum; temp = dht.readTemperature (); hum = dht.readHumidity (); if (isnan (hum) || isnan (temp)) // Sjekk om noen lesinger mislyktes, og avslutt tidlig (for å prøve igjen). {Serial.println ("Kunne ikke lese fra DHT -sensor!"); temp = tempIni; hum = humIni; komme tilbake; }}

Den komplette koden inkludert UV- og DHT -sensorene kan lastes ned fra min GitHub: NodeMCU_UV_DHT_Sensor_OLED

Trinn 6: Sende 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

Så langt har vi bare brukt NodeMCU ESP12-E som et vanlig og vanlig Arduino-bord. Selvfølgelig har vi bare "skrapet" det virkelige potensialet til denne spektakulære lille brikken, og nå er det på tide å ta av til himmelen! Eller bedre til stjernene! Ehr … til skyen!;-)

La oss begynne!

  1. Først må du ha en konto på ThinkSpeak.com
  2. Følg instruksjonene for å opprette en kanal, og noter deg kanal -ID -en og skrive API -nøkkelen
  3. Oppdater koden nedenfor med ditt WiFi -nettverk og Thinkspeak -legitimasjon
  4. Kjør programmet på IDE

La oss kommentere koden viktigste delene:

La oss først ringe ESP8266 -biblioteket, definere WiFi -klienten og definere din lokale ruter og Thinkspeak -legitimasjon:

/* ESP12-E & Thinkspeak*/

#inkludere WiFiClient -klient; const char* MY_SSID = "DIN SSD -ID HER"; const char* MY_PWD = "DITT PASSORD HER"; const char* TS_SERVER = "api.thingspeak.com"; String TS_API_KEY = "DIN KANAL SKRIV API -NØKKEL";

For det andre, la oss inkludere et veldig viktig bibliotek for IoT -prosjekter: SimpleTimer.h:

/ * TIMER */

#inkludere SimpleTimer timer;

For det tredje, under oppsett (), vil vi starte seriell kommunikasjon, ringe funksjonen connectWiFi () og definere tidtakerne. Vær oppmerksom på at kodelinjen: timer.setInterval (60000L, sendDataTS); ringer funksjonen sendDataTS () hvert 60. sekund for å laste opp data til ThinkSpeak -kanalen.

ugyldig oppsett ()

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

Til slutt, men ikke minst, under loop (), er den eneste kommandoen som trengs å starte timeren og det er det!

hulrom ()

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

Nedenfor kan du se de to viktige funksjonene som brukes til å håndtere Thinkspeak -kommunikasjon:

ESP12-E-tilkobling med ditt WiFi-nettverk:

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

*Koble til WiFi ********************************************** ***/ void connectWifi () {Serial.print ("Koble til"+*MY_SSID); WiFi.begynner (MY_SSID, MY_PWD); mens (WiFi.status ()! = WL_CONNECTED) {forsinkelse (1000); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi tilkoblet"); Serial.println (""); }

ESP12-E som 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 /oppdater HTTP /1.1 / n"); client.print ("Vert: api.thingspeak.com / n"); client.print ("Tilkobling: lukk / n"); client.print ("X-THINGSPEAKAPIKEY:" + TS_API_KEY + "\ n"); client.print ("Innholdstype: application/x-www-form-urlencoded / n"); client.print ("Content-Length:"); client.print (postStr.length ()); client.print ("\ n / n"); client.print (postStr); forsinkelse (1000); } sendt ++; client.stop (); }

Den komplette koden finnes på min GitHub: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT

Når du har lastet opp koden til NodeMCU. La oss koble til et eksternt batteri og gjøre noen målinger under solen. Jeg legger fjernstasjonen på taket og begynner å fange data på ThingSpeak.com som vist på bildene ovenfor.

Trinn 7: Konklusjon

Konklusjon
Konklusjon

Som alltid håper jeg at dette prosjektet kan hjelpe andre å finne veien inn i den spennende elektronikkverdenen!

For detaljer og siste kode, vennligst besøk mitt GitHub-depot: RPi-NodeMCU-Weather-Station

For flere prosjekter, vennligst besøk bloggen min: MJRoBot.org

Følg med! Neste opplæring sender vi data fra en ekstern værstasjon til en sentral, basert på en Raspberry Pi Web -server:

Bilde
Bilde

Hilsener fra den sørlige verden!

Se deg i min neste instruerbare!

Takk skal du ha, Marcelo

Anbefalt: