Turinys:
- 1 žingsnis: „BoM - Bill of Material“
- 2 žingsnis: Analoginis UV jutiklis
- 3 veiksmas: ekrano įdiegimas: OLED
- 4 žingsnis: vietinis UV matuoklis
- 5 žingsnis: DHT22 įrengimas oro temperatūrai ir drėgmei matuoti
- 6 veiksmas: duomenų siuntimas į „ThingSpeak.com“
- 7 žingsnis: Išvada
Video: „IoT Made Easy“: nuotolinių orų duomenų fiksavimas: UV ir oro temperatūra bei drėgmė: 7 žingsniai
2024 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2024-02-01 14:41
Šioje pamokoje mes užfiksuosime nuotolinius duomenis kaip UV (ultravioletinė spinduliuotė), oro temperatūrą ir drėgmę. Šie duomenys bus labai svarbūs ir bus naudojami būsimoje pilnoje orų stotyje.
Blokinė diagrama parodo, ką gausime pabaigoje.
1 žingsnis: „BoM - Bill of Material“
„NodeMCU“(ESP8266-12E) - 9,00 USD
Drėgmės ir temperatūros jutiklis (DHT22) - 10,00 USD
UV jutiklis - 4,00 USD
OLED USD 12.00
Duonos lenta - 1,00 USD
2 žingsnis: Analoginis UV jutiklis
Šis UV jutiklis generuoja analoginį išėjimą, proporcingą ultravioletinei spinduliuotei, esančiai šviesos jutimo spektre. Jis naudoja UV fotodiodą (pagrįstą galio nitridu), kuris gali aptikti 240–370 nm šviesos diapazoną (kuris apima UVB ir didžiąją UVA spektro dalį). Signalo lygis iš fotodiodo yra labai mažas, nano-amperų lygyje, todėl modulis turi įmontuotą operacinį stiprintuvą, kuris sustiprina signalą iki labiau įskaitomo voltinio lygio (nuo 0 iki 1 V).
Jutiklis ir stiprintuvas gali būti maitinami, prijungus VCC prie 3.3VDC (arba 5VDC) ir GND prie maitinimo įžeminimo. Analoginį signalą galima gauti iš OUT kaiščio.
Jo išvestis bus milivoltais ir bus skaitoma naudojant mūsų „NodeMCU“analoginę įvestį. Perskaitę turėtume jį „konvertuoti“(arba „susieti“), kad reikšmės būtų geriau apdorojamos kodu. Tai galime padaryti naudodami funkciją readSensorUV ():
/ * Perskaitykite UV jutiklį mV ir paskambinkite UV indekso apskaičiavimui */
void readSensorUV () {baitas numOfReadings = 5; dataSensorUV = 0; for (int i = 0; i <numOfReadings; i ++) {dataSensorUV+= analogRead (sensorUVPin); vėlavimas (200); } dataSensorUV /= numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023,0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); }
Gavę UV duomenis, galime lengvai apskaičiuoti UV indeksą, kaip apibrėžta aukščiau esančioje lentelėje. Funkcija indexCalculate () tai padarys už mus:
/ * UV indekso apskaičiavimas */
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; kitaip indeksasUV = 11; }
3 veiksmas: ekrano įdiegimas: OLED
Bandymo tikslais į UV matuoklį įtrauksime OLED (šis žingsnis yra visiškai neprivalomas).
Bandymų metu galima naudoti serijinį monitorių, bet kas atsitinka, kai naudojate savo prototipus toli nuo kompiuterio atskiru režimu? Norėdami tai padaryti, įdiekime OLED ekraną SSD1306, kurio pagrindinės charakteristikos yra šios:
- Ekrano dydis: 0,96"
- I2C IIC SPI serija
- 128X64
- Baltas OLED LCD LED
Sekite elektros schemą ir prijunkite 4 OLED kaiščius:
- VCC pereina prie 3.3V
- GND eina į žemę
- SCL eina į „NodeMCU“(GPIO 2) ==> D4
- SDA eina į „NodeMCU“(GPIO 0) ==> D3
Prijungę ekraną, atsisiųskime ir įdiekime jo biblioteką į „Arduino IDE“: „ESP8266 OLED Driver for SSD1306 display“, sukurtą Danielio Eichhorno (įsitikinkite, kad naudojate 3.0.0 ar naujesnę versiją!).
Įdiekite biblioteką „Arduino IDE“, kurią rasite SSD1306Wire.h
Kai iš naujo paleisite IDE, biblioteka turėtų būti jau įdiegta.
Biblioteka palaiko I2C protokolą, kad galėtų pasiekti OLED ekraną naudojant įmontuotą „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 ekranas (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN);
Išvardinkime keletą svarbių API, kurios bus naudojamos su mūsų OLED ekranu. Visą sąrašą rasite aukščiau pateiktame „GITHub“.
A. Ekrano valdymas:
void init (); // Inicijuoti ekraną
void displayOn (negalioja); // Įjungti ekraną void displayOff (void); // Išjungti ekraną void clear (void); // Išvalyti vietinio pikselių buferio void flipScreenVertically (); // Apverskite ekraną aukštyn kojom
B. Teksto operacijos:
void drawString (int16_t x, int16_t y, eilutės tekstas); // (xpos, ypos, „Tekstas“)
void setFont (const char* fontData); // Nustato dabartinį šriftą.
Galimi numatytieji šriftai:
- „ArialMT_Plain_10“,
-
„ArialMT_Plain_16“,
- ArialMT_Plain_24
Įdiegę ir patį OLED, ir jo biblioteką, parašykime paprastą programą, kad ją išbandytume. Įveskite žemiau esantį kodą savo IDE, rezultatas turėtų būti ekranas, kaip parodyta aukščiau esančioje nuotraukoje:
* OLED */
#include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306Wire ekranas (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } void loop () {} / * Inicijuoti ir rodyti sąrankos duomenis OLED * / void displaySetup () {display.init (); // inicijuoti ekrano rodymą.clear (); // Išvalyti ekrano ekraną.flipScreenVertically (); // Apverskite ekraną aukštyn kojom. Display (); // Įdėkite duomenis į ekraną Serial.println ("Inicijuojamas ekrano testas"); display.setFont („ArialMT_Plain_24“); display.drawString (30, 0, "OLED"); // (xpos, ypos, "Tekstas") display.setFont (ArialMT_Plain_16); display.drawString (18, 29, „Bandymas pradėtas“); display.setFont („ArialMT_Plain_10“); display.drawString (10, 52, „Serial BaudRate:“); display.drawString (90, 52, eilutė (11500)); display.display (); // Įdėti duomenis į ekrano uždelsimą (3000); }
Aukščiau pateiktą programą galima atsisiųsti iš „GitHub“:
MazgasMCU_OLED_Test
4 žingsnis: vietinis UV matuoklis
Dabar, įdiegę OLED ekraną, galime prijungti akumuliatorių ir atlikti kai kuriuos nuotolinius bandymus naudodami „UV matuoklį“
#define SW_VERSION "UV_Sensor_V.1"
/ * UV jutiklis */ #define sensorUVPin A0 int dataSensorUV = 0; int indeksasUV = 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 ekranas (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } void loop () {readSensorUV (); displayUV (); vėlavimas (1000); } / * Inicijuoti ir rodyti sąrankos duomenis OLED * / void displaySetup () {display.init (); // inicijuoti ekrano rodymą.clear (); // Išvalyti ekrano ekraną.flipScreenVertically (); // Apverskite ekraną aukštyn kojom. Display (); // Pateikite duomenis į ekraną Serial.println ("UV jutiklio bandymo inicijavimas"); display.setFont („ArialMT_Plain_24“); display.drawString (10, 0, „MJRoBot“); display.setFont („ArialMT_Plain_16“); display.drawString (0, 29, „UV jutiklio testas“); display.setFont („ArialMT_Plain_10“); display.drawString (0, 52, "SW Ver.:"); display.drawString (45, 52, SW_VERSION); display.display (); vėlavimas (3000); } / * Skaityti UV jutiklį mV ir iškviesti UV indekso apskaičiavimą * / void readSensorUV () {baitas numOfReadings = 5; dataSensorUV = 0; for (int i = 0; i <numOfReadings; i ++) {dataSensorUV+= analogRead (sensorUVPin); vėlavimas (200); } dataSensorUV /= numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023,0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); } / * UV indekso apskaičiavimas * / 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; kitaip indeksasUV = 11; } /* Rodyti UV reikšmes vietiniame OLED* / void displayUV () {display.clear (); display.setFont („ArialMT_Plain_16“); display.drawString (20, 0, „UV jutiklis“); display.drawString (0, 23, "UV (mV):"); display.drawString (80, 23, eilutė (dataSensorUV)); display.drawString (0, 48, "UV indeksas:"); display.setFont („ArialMT_Plain_24“); display.drawString (82, 42, eilutė (indexUV)); display.display (); }
Pirmiau pateiktą kodą galima atsisiųsti iš „GitHun“: NodeMCU_UV_Sensor_OLED.ino
5 žingsnis: DHT22 įrengimas oro temperatūrai ir drėgmei matuoti
Vienas iš dažniausiai naudojamų jutiklių orų duomenims fiksuoti yra skaitmeninis santykinės drėgmės ir temperatūros jutiklis DHT22 (arba jo brolis DHT11). Jis naudoja talpinį drėgmės jutiklį ir termistorių, kad išmatuotų aplinkinį orą, ir išspjauna skaitmeninį signalą ant duomenų kaiščio (nereikia analoginių įvesties kaiščių).
Jutiklis turi būti maitinamas nuo 3,3 V iki 5 V, jis veiks nuo -40 oC iki +80 oC, o tikslumas-+/- 0,5 oC esant temperatūrai ir +/- 2% santykiniam drėgnumui. Taip pat svarbu nepamiršti, kad jo jutimo laikotarpis yra vidutiniškai 2 sekundės (minimalus laikas tarp rodmenų). „Adafruit“svetainėje pateikiama daug informacijos apie DHT22 ir jos brolį DHT11. Norėdami gauti daugiau informacijos, apsilankykite DHT22/11 mokymo programos puslapyje.
DHT22 turi 4 kaiščius (nukreipti į jutiklį, 1 kaištis yra labiausiai paliktas):
- VCC (prisijungsime prie 3.3V iš „NodeMCU“);
- Duomenys išvesti;
- Neprisijungęs ir
- Gruntas.
Paprastai jutiklį naudosite mažesniais nei 20 m atstumais, tarp duomenų ir VCC kaiščių reikia prijungti 10K rezistorių. Išvesties kaištis bus prijungtas prie „NodeMCU“kaiščio D3 (žr. Aukščiau pateiktą schemą). Kai jutiklis bus įdiegtas mūsų modulyje, atsisiųskite DHT biblioteką iš „Adafruit GitHub“saugyklos ir įdiekite ją į „Arduino“bibliotekos failą. Kai iš naujo įkeliate „Arduino IDE“, reikia įdiegti „DHT jutiklių biblioteką“.
Kodo pradžioje turime įtraukti šias eilutes:
/* DHT22*/
#įtraukti „DHT.h“#define DHTPIN D2 #define DHTTYPE DHT22 DHT dht (DHTPIN, DHTTYPE); plūduriuoti hum = 0; plūdės temperatūra = 0;
Bus sukurta nauja jutiklio nuskaitymo funkcija:
/ * Gaukite DHT duomenis */
void getDhtData (void) {float tempIni = temp; plūdė humIni = hum; temp = dht.readTemperature (); hum = dht.readHumidity (); if (isnan (hum) || isnan (temp)) // Patikrinkite, ar nepavyko nuskaityti, ir išjunkite anksti (bandyti dar kartą). {Serial.println ("Nepavyko nuskaityti iš DHT jutiklio!"); temp = tempIni; hum = humIni; grįžti; }}
Visą kodą, įskaitant UV ir DHT jutiklius, galite atsisiųsti iš „GitHub“: NodeMCU_UV_DHT_Sensor_OLED
6 veiksmas: duomenų siuntimas į „ThingSpeak.com“
Iki šiol „NodeMCU ESP12-E“naudojome tik kaip įprastą ir paprastą „Arduino“plokštę. Žinoma, mes tik „subraižėme“tikrąjį šio įspūdingo mažo lusto potencialą ir dabar laikas pakilti į dangų! Arba geriau į žvaigždes! Eh … į debesį!;-)
Pradėkime!
- Pirma, jūs turite turėti paskyrą „ThinkSpeak.com“
- Vykdykite instrukcijas, kad sukurtumėte kanalą, ir atkreipkite dėmesį į kanalo ID ir „Write API Key“
- Atnaujinkite žemiau esantį kodą naudodami „WiFi“tinklą ir „Thinkspeak“prisijungimo duomenis
- Paleiskite programą IDE
Pakomentuokime svarbiausias kodo dalis:
Pirmiausia paskambinkime ESP8266 bibliotekai, apibrėžkime „WiFi“klientą ir apibrėžkime savo vietinio maršrutizatoriaus ir „Thinkspeak“kredencialus:
/* ESP12-E ir „Thinkspeak“*/
#įtraukti „WiFiClient“klientą; const char* MY_SSID = "JŪSŲ SSD ID ČIA"; const char* MY_PWD = "JŪSŲ Slaptažodis ČIA"; const char* TS_SERVER = "api.thingspeak.com"; Styga TS_API_KEY = "JŪSŲ KANALO RAŠYMO API RAKTAS";
Antra, įtraukime labai svarbią biblioteką, skirtą daiktų interneto projektams: SimpleTimer.h:
/ * LAIKMATAS */
#įtraukti „SimpleTimer“laikmatį;
Trečia, sąrankos metu () inicijuosime nuoseklųjį ryšį, iškviesime funkciją connectWiFi () ir nustatysime laikmačius. Atkreipkite dėmesį, kad kodo eilutė: timer.setInterval (60000L, sendDataTS); iškvies funkciją sendDataTS () kas 60 sekundžių, kad įkelti duomenis į „ThinkSpeak“kanalą.
negaliojanti sąranka ()
{… Serial.begin (115200); vėlavimas (10); … ConnectWifi (); timer.setInterval (60000L, sendDataTS); …}
Galiausiai, bet ne mažiau svarbu, kad ciklo () metu vienintelė reikalinga komanda būtų paleisti laikmatį ir viskas!
tuštumos kilpa ()
{… Timer.run (); // Inicijuoja „SimpleTimer“}
Žemiau galite pamatyti dvi svarbias funkcijas, naudojamas „Thinkspeak“ryšiui tvarkyti:
ESP12-E ryšys su „WiFi“tinklu:
/***************************************************
*„WiFi“prijungimas *********************************************** ***/ void connectWifi () {Serial.print ("Prisijungimas prie"+*MY_SSID); „WiFi.begin“(MY_SSID, MY_PWD); while (WiFi.status ()! = WL_CONNECTED) {delay (1000); Serijinis atspaudas ("."); } Serial.println (""); Serial.println („WiFi prijungtas“); Serial.println (""); }
ESP12-E siunčia duomenis į „ThinkSpeak“:
/***************************************************
*Duomenų siuntimas į „Thinkspeak“kanalą ******************************************* ******/ void sendDataTS (void) {if (client.connect (TS_SERVER, 80)) {String postStr = TS_API_KEY; postStr += "& field1 ="; postStr += Styga (dataSensorUV); postStr += "& field2 ="; postStr += Styga (indexUV); postStr += "& field3 ="; postStr += Styga (temp); postStr += "& field4 ="; postStr += Styga (hum); postStr += "\ r / n / r / n"; client.print ("POST /atnaujinti HTTP /1.1 / n"); client.print ("Priegloba: api.thingspeak.com / n"); client.print ("Ryšys: uždaryti / n"); client.print ("X-THINGSPEAKAPIKEY:" + TS_API_KEY + "\ n"); client.print ("Turinio tipas: application/x-www-form-urlencoded / n"); client.print ("Turinio ilgis:"); client.print (postStr.length ()); client.print ("\ n / n"); client.print (postStr); vėlavimas (1000); } išsiųstas ++; client.stop (); }
Visą kodą galite rasti mano „GitHub“: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT
Kai įkeliate kodą į „NodeMCU“. Prijunkime išorinę bateriją ir atlikime matavimus po saule. Padedu nuotolinę stotį ant stogo ir pradedu fiksuoti duomenis ThingSpeak.com, kaip parodyta aukščiau esančiose nuotraukose.
7 žingsnis: Išvada
Kaip visada, tikiuosi, kad šis projektas gali padėti kitiems rasti kelią į jaudinantį elektronikos pasaulį!
Norėdami gauti daugiau informacijos ir galutinį kodą, apsilankykite mano „GitHub“saugykloje: RPi-NodeMCU-Weather-Station
Norėdami gauti daugiau projektų, apsilankykite mano tinklaraštyje: MJRoBot.org
Sekite naujienas! Kita pamoka atsiųsime duomenis iš nuotolinės oro stoties į centrinę, pagrįstą „Raspberry Pi“žiniatinklio serveriu:
Saludos iš pasaulio pietų!
Iki pasimatymo mano kitoje pamokoje!
Ačiū, Marcelo
Rekomenduojamas:
Kaip padaryti drėgmės ir temperatūros realaus laiko duomenų įrašymo įrenginį naudojant „Arduino UNO“ir SD kortelę - DHT11 duomenų kaupiklio modeliavimas „Proteus“: 5 žingsniai
Kaip padaryti drėgmės ir temperatūros realaus laiko duomenų įrašymo įrenginį naudojant „Arduino UNO“ir SD kortelę | DHT11 duomenų kaupiklio modeliavimas „Proteus“: Įvadas: Sveiki, tai „Liono Maker“, čia yra „YouTube“nuoroda. Mes kuriame kūrybinį projektą su „Arduino“ir dirbame prie įterptųjų sistemų
Šiltnamio automatizavimas naudojant „LoRa“! (1 dalis) -- Jutikliai (temperatūra, drėgmė, dirvožemio drėgmė): 5 žingsniai
Šiltnamio automatizavimas naudojant „LoRa“! (1 dalis) || Jutikliai (temperatūra, drėgmė, dirvožemio drėgmė): Šiame projekte aš jums parodysiu, kaip automatizavau šiltnamį. Tai reiškia, kad aš jums parodysiu, kaip aš pastatiau šiltnamį ir kaip prijungiau maitinimo ir automatikos elektroniką. Taip pat parodysiu, kaip užprogramuoti „Arduino“lentą, kurioje naudojama L
„Arduino“orų stotis naudojant BMP280 -DHT11 - temperatūra, drėgmė ir slėgis: 8 žingsniai
„Arduino“orų stotis naudojant BMP280 -DHT11 - Temperatūra, drėgmė ir slėgis: Šioje pamokoje sužinosime, kaip sukurti orų stotį, kuri TFT 7735 LCD ekrane rodys TEMPERATŪRĄ, DRĖGMĘ IR SLĖGĮ Žiūrėkite demonstracinį vaizdo įrašą
Duomenų rinkimo ir duomenų vizualizavimo sistema „MotoStudent“lenktyniniam dviračiui: 23 žingsniai
„MotoStudent“elektrinio lenktyninio dviračio duomenų rinkimo ir duomenų vizualizavimo sistema: Duomenų surinkimo sistema yra techninės ir programinės įrangos, veikiančios kartu, rinkinys, siekiant surinkti duomenis iš išorinių jutiklių, po to juos saugoti ir apdoroti, kad būtų galima vizualizuoti grafiškai ir analizuoti, leidžia inžinieriams padaryti
Orų stotis su belaidžiu duomenų perdavimu: 8 žingsniai
Meteorologinė stotis su belaidžiu duomenų perdavimu: tai yra mano ankstesnio projekto - orų stoties su duomenų registravimu - atnaujinimas. Ankstesnį projektą galite pamatyti čia - Meteorologinė stotis su duomenų registravimu Jei turite klausimų ar problemų, galite susisiekti su manimi el. Paštu: iwx.production@gmai