Sadržaj:
- Korak 1: BoM - Predmet materijala
- Korak 2: Analogni UV senzor
- Korak 3: Instaliranje ekrana: OLED
- Korak 4: Lokalni UV mjerač
- Korak 5: Instaliranje DHT22 za mjerenje temperature i vlažnosti zraka
- Korak 6: Slanje podataka na ThingSpeak.com
- Korak 7: Zaključak
Video: IoT je postao jednostavan: Snimanje udaljenih vremenskih podataka: UV i temperatura zraka i vlažnost: 7 koraka
2024 Autor: John Day | [email protected]. Zadnja izmjena: 2024-02-01 14:39
U ovom vodiču snimit ćemo udaljene podatke kao što su UV (ultraljubičasto zračenje), temperatura zraka i vlažnost. Ti će podaci biti vrlo važni i koristiti će se u budućoj kompletnoj meteorološkoj stanici.
Blok dijagram pokazuje šta ćemo dobiti na kraju.
Korak 1: BoM - Predmet materijala
NodeMCU (ESP8266-12E) - 9,00 USD
Senzor vlažnosti i temperature (DHT22) - 10,00 USD
UV senzor - 4,00 USD
OLED USD 12,00
Oglasna ploča - 1,00 USD
Korak 2: Analogni UV senzor
Ovaj UV senzor proizvodi analogni izlaz proporcionalan ultraljubičastom zračenju koje se nalazi na spektru osjetljivog svjetla. Koristi UV fotodiodu (na bazi galijevog nitrida) koja može detektirati raspon svjetlosti 240-370nm (koji pokriva UVB i većinu UVA spektra). Nivo signala sa fotodiode je vrlo mali, na nivou nano-ampera, pa je modul ugrađen operativno pojačalo za pojačavanje signala na čitljiviji nivo volta (0 do 1V).
Senzor i op-pojačalo mogu se napajati povezivanjem VCC-a na 3.3VDC (ili 5VDC) i GND na uzemljenje. Analogni signal se može dobiti sa OUT pina.
Njegov izlaz bit će u milivoltima i čitat će ga analogni ulaz našeg NodeMCU -a. Nakon čitanja, trebali bismo ga "pretvoriti" (ili "preslikati") kako bi vrijednosti bolje upravljale kodom. To možemo učiniti pomoću funkcije readSensorUV ():
/ * Pročitajte UV senzor u mV i nazovite izračun UV indeksa */
void readSensorUV () {bajt numOfReadings = 5; dataSensorUV = 0; for (int i = 0; i <numOfReadings; i ++) {dataSensorUV+= analogRead (sensorUVPin); kašnjenje (200); } dataSensorUV /= numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023.0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); }
Kad dobijemo UV podatke, lako možemo izračunati UV indeks kako je definirano u gornjoj tablici. Funkcija indexCalculate () će to učiniti umjesto nas:
/ * Izračun UV indeksa */
void indexCalculate () {if (dataSensorUV <227) indexUV = 0; else if (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; else if (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; else if (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; else if (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; else if (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; else if (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; else if (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; else if (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; else if (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; else if (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; else indexUV = 11; }
Korak 3: Instaliranje ekrana: OLED
Za potrebe testiranja, na naš UV mjerač ćemo uključiti OLED (ovaj korak je potpuno neobavezan).
U redu je tokom testiranja koristiti serijski monitor, ali šta se dešava kada koristite svoje prototipe daleko od računara u samostalnom režimu? U tu svrhu instalirajmo OLED ekran, SSD1306, čije su glavne karakteristike:
- Veličina ekrana: 0,96"
- I2C IIC SPI Serijski
- 128X64
- Bijela OLED LCD LED
Slijedite električni dijagram i spojite 4 pina našeg OLED -a:
- VCC prelazi na 3.3V
- GND ide na zemlju
- SCL ide na NodeMCU (GPIO 2) ==> D4
- SDA ide na NodeMCU (GPIO 0) ==> D3
Nakon što povežemo ekran, preuzmimo i instalirajmo njegovu biblioteku na naš Arduino IDE: "ESP8266 OLED upravljački program za SSD1306 ekran" koji je razvio Daniel Eichhorn (Obavezno koristite verziju 3.0.0 ili noviju!).
Instalirajte biblioteku na svoj Arduino IDE, koji se može pronaći na SSD1306Wire.h
Nakon što ponovno pokrenete IDE, biblioteka bi trebala biti već instalirana.
Biblioteka podržava I2C protokol za pristup OLED ekranu pomoću ugrađene Wire.h biblioteke:
/ * 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 prikaz (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN);
Navedimo neke važne API -je koji će se koristiti s našim OLED ekranom. Kompletna lista može se pronaći na gore navedenom GITHub -u.
A. Kontrola prikaza:
void init (); // Inicijalizacija prikaza
void displayOn (void); // Uključivanje prikaza void displayOff (void); // Isključivanje prikaza void clear (void); // Brisanje lokalnog međuspremnika piksela void flipScreenVertical (); // Okrenite ekran naopako
B. Tekstualne operacije:
void drawString (int16_t x, int16_t y, tekst niza); // (xpos, ypos, "Tekst")
void setFont (const char* fontData); // Postavlja trenutni font.
Dostupni zadani fontovi:
- ArialMT_Plain_10,
-
ArialMT_Plain_16,
- ArialMT_Plain_24
Kada se instaliraju i sam OLED i njegova biblioteka, napišimo jednostavan program za testiranje. Unesite sa donjim kodom u IDE, rezultat bi trebao biti prikaz kao što je prikazano na gornjoj 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 prikaz (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } void loop () {} / * Pokretanje i prikaz podataka o postavljanju na OLED * / void displaySetup () {display.init (); // inicijaliziranje prikaza display.clear (); // Očisti prikaz ekrana.flipScreenVertical (); // Okrenite zaslon naopačke display.display (); // Stavite podatke na ekran Serial.println ("Pokretanje testa prikaza"); display.setFont (ArialMT_Plain_24); display.drawString (30, 0, "OLED"); // (xpos, ypos, "Text") display.setFont (ArialMT_Plain_16); display.drawString (18, 29, "Test je pokrenut"); display.setFont (ArialMT_Plain_10); display.drawString (10, 52, "Serijska brzina prijenosa:"); display.drawString (90, 52, String (11500)); display.display (); // Stavljanje podataka na kašnjenje prikaza (3000); }
Gornji program se može preuzeti sa mog GitHub -a:
NodeMCU_OLED_Test
Korak 4: Lokalni UV mjerač
Sada, s instaliranim OLED zaslonom, možemo spojiti bateriju i izvršiti neka daljinska testiranja pomoću našeg "UV mjerača"
#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 prikaz (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } void loop () {readSensorUV (); displayUV (); kašnjenje (1000); } / * Pokretanje i prikaz podataka o postavljanju na OLED * / void displaySetup () {display.init (); // inicijaliziranje prikaza display.clear (); // Očisti prikaz ekrana.flipScreenVertical (); // Okrenite zaslon naopačke display.display (); // Stavite podatke na ekran Serial.println ("Pokretanje testa UV senzora"); display.setFont (ArialMT_Plain_24); display.drawString (10, 0, "MJRoBot"); display.setFont (ArialMT_Plain_16); display.drawString (0, 29, "Test UV senzora"); display.setFont (ArialMT_Plain_10); display.drawString (0, 52, "SW Ver.:"); display.drawString (45, 52, SW_VERSION); display.display (); kašnjenje (3000); } / * Očitavanje UV senzora u mV i pozivanje izračunavanja UV indeksa * / void readSensorUV () {bajt numOfReadings = 5; dataSensorUV = 0; for (int i = 0; i <numOfReadings; i ++) {dataSensorUV+= analogRead (sensorUVPin); kašnjenje (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; else if (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; else if (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; else if (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; else if (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; else if (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; else if (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; else if (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; else if (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; else if (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; else if (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; else indexUV = 11; } /* Prikaz UV vrijednosti na lokalnom 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, String (indexUV)); display.display (); }
Gornji kod se može preuzeti sa mog GitHuna: NodeMCU_UV_Sensor_OLED.ino
Korak 5: Instaliranje DHT22 za mjerenje temperature i vlažnosti zraka
Jedan od najčešće korištenih senzora za snimanje vremenskih podataka je DHT22 (ili njegov brat DHT11), digitalni senzor relativne vlažnosti i temperature. Koristi kapacitivni senzor vlažnosti i termistor za mjerenje okolnog zraka i izbacuje digitalni signal na pin podataka (nisu potrebni analogni ulazi).
Senzor bi trebao biti napajan između 3.3V i 5V i radit će od -40oC do +80oC s točnošću od +/- 0,5oC za temperaturu i +/- 2% za relativnu vlažnost. Također je važno imati na umu da je njegovo vrijeme očitavanja u prosjeku 2 sekunde (minimalno vrijeme između očitanja). Stranica Adafruit pruža mnogo informacija o DHT22 i njegovom bratu DHT11. Za više detalja, posjetite stranicu vodiča DHT22/11.
DHT22 ima 4 pina (okrenut prema senzoru, pin 1 je krajnje lijevo):
- VCC (povezat ćemo se na 3.3V iz NodeMCU -a);
- Data out;
- Nije povezan i
- Ground.
Nakon što ćete obično koristiti senzor na udaljenostima manjim od 20 m, 10K otpornik bi trebao biti spojen između Data i VCC pinova. Izlazni pin će biti spojen na NodeMCU pin D3 (pogledajte gornji dijagram). Nakon što je senzor instaliran na naš modul, preuzmite DHT biblioteku iz spremišta Adafruit GitHub i instalirajte je u datoteku Arduino biblioteke. Nakon što ponovo učitate svoj Arduino IDE, "DHT senzorska biblioteka" bi trebala biti instalirana.
Na početku koda moramo uključiti redove:
/* DHT22*/
#include "DHT.h" #define DHTPIN D2 #define DHTTYPE DHT22 DHT dht (DHTPIN, DHTTYPE); float hum = 0; float temp = 0;
Bit će stvorena nova funkcija za očitavanje senzora:
/ * Dobijte DHT podatke */
void getDhtData (void) {float tempIni = temp; plutati humIni = brujati; temp = dht.readTemperature (); hum = dht.readHumidity (); if (isnan (hum) || isnan (temp)) // Provjerite da li je čitanje bilo neuspješno i izađite ranije (da pokušate ponovo). {Serial.println ("Očitavanje sa DHT senzora nije uspjelo!"); temp = tempIni; hum = humIni; return; }}
Kompletan kod, uključujući UV i DHT senzore, možete preuzeti sa mog GitHub -a: NodeMCU_UV_DHT_Sensor_OLED
Korak 6: Slanje podataka na ThingSpeak.com
Do sada smo koristili samo NodeMCU ESP12-E kao običnu i običnu Arduino ploču. Naravno, samo smo "izgrebali" pravi potencijal ovog spektakularnog malog čipa i sada je vrijeme za uzlijetanje u raj! Ili bolje do zvezda! Eh… do oblaka!;-)
Počnimo!
- Prvo morate imati račun na ThinkSpeak.com
- Slijedite upute za kreiranje kanala i zapišite svoj ID kanala i API API ključ
- Ažurirajte donji kod sa svojom WiFi mrežom i vjerodajnicama za Thinkspeak
- Pokrenite program na IDE -u
Komentirajmo najvažnije dijelove koda:
Prvo, nazovimo biblioteku ESP8266, definirajmo WiFi klijenta i definirajmo lokalne vjerodajnice za usmjerivač i Thinkspeak:
/* ESP12-E & Thinkspeak*/
#include WiFiClient klijent; const char* MY_SSID = "VAŠ SSD ID OVDJE"; const char* MY_PWD = "VAŠA LOZINKA OVDJE"; const char* TS_SERVER = "api.thingspeak.com"; String TS_API_KEY = "VAŠ KANAL ZAPISNI KLJUČ API";
Drugo, uključimo vrlo važnu biblioteku za IoT projekte: SimpleTimer.h:
/ * TIMER */
#include SimpleTimer timer;
Treće, tijekom setup (), inicirat ćemo serijsku komunikaciju, pozvati funkciju connectWiFi () i definirati tajmere. Imajte na umu da red koda: timer.setInterval (60000L, sendDataTS); će pozvati funkciju sendDataTS () svakih 60 sekundi, kako bi otpremili podatke na ThinkSpeak kanal.
void setup ()
{… Serial.begin (115200); kašnjenje (10); … ConnectWifi (); timer.setInterval (60000L, sendDataTS); …}
Najzad, ali ne i najmanje važno, tokom loop (), potrebna je samo naredba da se pokrene tajmer i to je to!
void loop ()
{… Timer.run (); // Pokreće SimpleTimer}
U nastavku možete vidjeti dvije važne funkcije koje se koriste za rukovanje Thinkspeak komunikacijom:
ESP12-E veza s vašom WiFi mrežom:
/***************************************************
*Povezivanje WiFi *********************************************** ***/ void connectWifi () {Serial.print ("Povezivanje sa"+*MY_SSID); WiFi.begin (MY_SSID, MY_PWD); while (WiFi.status ()! = WL_CONNECTED) {kašnjenje (1000); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi povezan"); Serial.println (""); }
ESP12-E šalje podatke u ThinkSpeak:
/***************************************************
*Slanje podataka na kanal Thinkspeak ****************************************** ******/ void sendDataTS (void) {if (client.connect (TS_SERVER, 80)) {String postStr = TS_API_KEY; postStr += "& polje1 ="; postStr += String (dataSensorUV); postStr += "& polje2 ="; postStr += String (indexUV); postStr += "& polje3 ="; postStr += String (temp); postStr += "& field4 ="; postStr += String (hum); postStr += "\ r / n / r / n"; client.print ("POST /ažuriraj HTTP /1.1 / n"); client.print ("Domaćin: api.thingspeak.com / n"); client.print ("Veza: zatvori / n"); client.print ("X-THINGSPEAKAPIKEY:" + TS_API_KEY + "\ n"); client.print ("Content-Type: application/x-www-form-urlencoded / n"); client.print ("Content-Length:"); client.print (postStr.length ()); client.print ("\ n / n"); client.print (postStr); kašnjenje (1000); } poslano ++; client.stop (); }
Kompletan kod možete pronaći na mom GitHub -u: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT
Nakon što ste kod učitali na svoj NodeMCU. Spojimo vanjsku bateriju i izvršimo neka mjerenja pod suncem. Stavio sam Remote Station na krov i počeo snimati podatke na ThingSpeak.com kao što je prikazano na gornjim fotografijama.
Korak 7: Zaključak
Kao i uvijek, nadam se da će ovaj projekt pomoći drugima da pronađu svoj put u uzbudljivi svijet elektronike!
Za detalje i konačni kod posjetite moje skladište GitHub: RPi-NodeMCU-Weather-Station
Za više projekata posjetite moj blog: MJRoBot.org
Ostanite s nama! Sljedeći vodič ćemo poslati podatke s udaljene meteorološke stanice na centralnu, na temelju Raspberry Pi web servera:
Saludos sa juga svijeta!
Vidimo se u mom sljedećem uputstvu!
Hvala ti, Marcelo
Preporučuje se:
Kako napraviti snimač podataka o vlažnosti i temperaturi u stvarnom vremenu s Arduino UNO i SD-karticom - DHT11 Zapisnik podataka Simulacija u Proteusu: 5 koraka
Kako napraviti snimač podataka o vlažnosti i temperaturi u stvarnom vremenu s Arduino UNO i SD-karticom | DHT11 Simulator zapisnika podataka u Proteusu: Uvod: zdravo, ovdje Liono Maker, ovdje je YouTube veza. Radimo na kreativnom projektu s Arduinom i radimo na ugrađenim sistemima. Zapisnik podataka: Zapisnik podataka (također zapisnik podataka ili snimač podataka) je elektronički uređaj koji bilježi podatke tokom vremena sa
Otkrivanje zagađenja zraka + filtriranje zraka: 4 koraka
Otkrivanje zagađenja zraka + filtriranje zraka: Učenici (Aristobulus Lam, Victor Sim, Nathan Rosenzweig i Declan Loges) njemačke švicarske međunarodne škole radili su s osobljem MakerBay -a na stvaranju integriranog sistema mjerenja zagađenja zraka i efikasnosti filtriranja zraka. Ovo
ARUPI - jeftina automatizovana jedinica za snimanje/autonomna jedinica za snimanje (ARU) za ekologe zvuka: 8 koraka (sa slikama)
ARUPI - Jeftina automatizovana jedinica za snimanje/Autonomna jedinica za snimanje (ARU) za ekologe zvuka: Ovu instrukciju napisao je Anthony Turner. Projekt je razvijen uz veliku pomoć Shed -a na Računskoj školi Univerziteta u Kentu (gospodin Daniel Knox je bio od velike pomoći!). Pokazat će vam kako izgraditi automatizirano audio snimanje u
HRV (kućni izmjenjivač zraka) Arduino kontroler s ekonomizatorom zraka: 7 koraka (sa slikama)
HRV (kućni izmjenjivač zraka) Arduino kontroler s ekonomizatorom zraka: HRV Arduino kontroler s ekonomizatorom zrakaMoja povijest s ovim projektom je da živim u Minnesoti i moja ploča je pržena na mom LifeBreath 155Max HRV -u. Nisam htio platiti 200 dolara za novu. Uvijek sam želio nešto s grijehom ekonomizatora zraka
EAL-Industri4.0-RFID prikupljanje podataka do baze podataka: 10 koraka (sa slikama)
EAL-Industri4.0-RFID podatkovno prikupljanje podataka u bazi podataka: Ovaj projektni upravitelj opsamlira sve podatke i podatke, registrovane kao identifikator u vašoj bazi podataka. RFID, zaostajanje podataka u MySQL bazi podataka. node-RED, samo ažuriranje i ponašanje u skladu sa općenitim podacima u et C# programu koji se formira u aplikaciji Windows Form