Kazalo:
- 1. korak: BoM - materialni material
- Korak: Analogni UV -senzor
- 3. korak: Namestitev zaslona: OLED
- 4. korak: Lokalni UV -merilnik
- 5. korak: Namestitev DHT22 za merjenje temperature in vlažnosti zraka
- 6. korak: Pošiljanje podatkov na ThingSpeak.com
- 7. korak: Zaključek
Video: IoT Made Easy: Zajem oddaljenih vremenskih podatkov: UV in zrak Temperatura in vlažnost: 7 korakov
2024 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2024-02-01 14:42
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.
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
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
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
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
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):
- VCC (priključili se bomo na 3.3V iz NodeMCU);
- Izhod podatkov;
- Ni povezan in
- 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
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!
- Najprej morate imeti račun na ThinkSpeak.com
- Sledite navodilom za ustvarjanje kanala in upoštevajte svoj ID kanala in napis API -ja
- Spodnjo kodo posodobite z omrežjem WiFi in poverilnicami Thinkspeak
- 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
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:
Saludos z juga sveta!
Se vidimo v mojem naslednjem navodilu!
Hvala vam, Marcelo
Priporočena:
Kako narediti snemalnik podatkov o vlažnosti in temperaturi v realnem času z Arduino UNO in kartico SD - Simulacija zapisovalnika podatkov DHT11 v Proteusu: 5 korakov
Kako narediti snemalnik podatkov o vlažnosti in temperaturi v realnem času z Arduino UNO in kartico SD | Simulacija zapisovalnika podatkov DHT11 v Proteusu: Uvod: zdravo, to je Liono Maker, tukaj je povezava YouTube. Z Arduinom ustvarjamo projekt in delamo na vgrajenih sistemih. Data-Logger: Zapisovalnik podatkov (tudi zapisovalnik podatkov ali zapisovalnik podatkov) je elektronska naprava, ki sčasoma beleži podatke z
Zajem slike pri gibanju in e -pošta: 6 korakov
Zajemanje slik in gibanje, ki se sproži z gibanjem: Gradimo na prejšnjih projektih ESP32-CAM in gradimo sistem za zajem slike, ki sproži gibanje, ki pošilja tudi e-poštno sporočilo s sliko kot prilogo. Ta gradnja uporablja ploščo ESP32-CAM skupaj s senzorskim modulom PIR, ki temelji na AM312
Kraken Jr. IoT App Tutorial 2. del - Zajem kode Cid in Auth: 4 koraki
Kraken Jr. IoT App Tutorial 2. del - Zajem kode Cid in Auth: Vadnica 1. del (registracija in aktivacija e -pošte) Vadnica 2. del (Zajem kode Cid in Auth) Vadnica 3. del (Registracija Arduino) Registracija novega krmilnika v vašem Kraken Jr. Aplikacija je enostavna. Vendar pa boste za sprejem potrebovali nekaj korakov
[Arduino Robot] Kako narediti robota za zajem gibanja - Robot Thumbs - Servo motor - Izvorna koda: 26 korakov (s slikami)
[Arduino Robot] Kako narediti robota za zajem gibanja | Robot Thumbs | Servo motor | Izvorna koda: Thumbs Robot. Uporabil je potenciometer servo motorja MG90S. To je zelo zabavno in enostavno! Koda je zelo preprosta. To je le okoli 30 vrstic. Izgleda kot posnetek gibanja. Prosimo, pustite kakršno koli vprašanje ali mnenje! [Navodilo] Izvorna koda https: //github.c
EAM-Industri4.0-RFID zbirka podatkov do baze podatkov: 10 korakov (s slikami)
EAM-Industri4.0-RFID podatkovno razvrščanje podatkovnih zbirk v zbirko podatkov: Dette projekt omhandler opsamling af v æ gtdata, register up identiteter vha. RFID, zaostajanje podatkov v bazi podatkov MySQL vha. node-RED, samostojno obnašanje in ravnanje z opsamlede podatki v programu et C#, ki se oblikujejo v aplikaciji Windows Form.