Innholdsfortegnelse:
- Trinn 1: BoM - materialregning
- Trinn 2: Den analoge UV -sensoren
- Trinn 3: Installere en skjerm: OLED
- Trinn 4: En lokal UV -måler
- Trinn 5: Installere en DHT22 for lufttemperatur- og fuktighetsmålinger
- Trinn 6: Sende data til ThingSpeak.com
- Trinn 7: Konklusjon
Video: IoT Made Easy: Capture Remote Weather Data: UV and Air Temperature & Fuktighet: 7 trinn
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-02-01 14:41
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.
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
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
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
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
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):
- VCC (vi kobler til 3.3V fra NodeMCU);
- Data ut;
- Ikke tilkoblet og
- 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
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!
- Først må du ha en konto på ThinkSpeak.com
- Følg instruksjonene for å opprette en kanal, og noter deg kanal -ID -en og skrive API -nøkkelen
- Oppdater koden nedenfor med ditt WiFi -nettverk og Thinkspeak -legitimasjon
- 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
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:
Hilsener fra den sørlige verden!
Se deg i min neste instruerbare!
Takk skal du ha, Marcelo
Anbefalt:
Overvåk temperatur og fuktighet med AM2301 på NodeMCU & Blynk: 3 trinn
Overvåk temperatur og fuktighet med AM2301 på NodeMCU & Blynk: Det er et veldig kjent faktum at i de fleste bransjer spiller vertikal, temperatur, fuktighet, trykk, luftkvalitet, vannkvalitet etc. viktige faktorer som må overvåkes kontinuerlig og nødvendig varslingssystemer må være på plass når verdien
Motion Triggered Image Capture and Email: 6 trinn
Motion Triggered Image Capture and Email: Vi bygger videre på de tidligere ESP32-CAM-prosjektene og bygger et bevegelsesutløst bildeopptakssystem som også sender en e-post med bildet som vedlegg. Denne bygningen bruker ESP32-CAM-kortet sammen med en PIR-sensormodul som er basert på AM312
Kraken Jr. IoT App Tutorial Part 2 - Capture Cid and Auth Code: 4 Steps
Kraken Jr. IoT App Tutorial Part 2 - Capture Cid and Auth Code: Tutorial Part 1 (Email Registration and Activation) Tutorial Part 2 (Capture Cid and Auth Code) Tutorial Part 3 (Arduino Registration) Registrering av en ny kontroller i din Kraken Jr. Appen er enkel. Det vil imidlertid kreve deg et par trinn for å imøtekomme
Raspberry PI Logging av temperatur og fuktighet, Cloud Weather Station, Wifi og mobilstatistikk: 6 trinn
Raspberry PI Temperatur- og fuktighetslogging, Cloud Weather Station, Wifi og mobile statistikker: Med Raspberry PI -enhet kan du logge temperatur- og fuktighetsdata utenfor, i rom, drivhus, laboratorium, kjølerom eller andre steder helt gratis. Dette eksemplet vil vi bruke til å logge temperatur og fuktighet. Enheten vil være koblet til internett v
One More Arduino Weather Station (ESP-01 & BMP280 & DHT11 & OneWire): 4 trinn
One More Arduino Weather Station (ESP-01 & BMP280 & DHT11 & OneWire): Her kan du finne en iterasjon av bruk av OneWire med de få pinnene på en ESP-01. valg (du må ha legitimasjon …) Samler sansedata fra en BMP280 og en DHT11