Satura rādītājs:
- 1. solis: BoM - materiālu saraksts
- 2. solis: Analogs UV sensors
- 3. darbība: displeja uzstādīšana: OLED
- 4. solis: vietējais UV mērītājs
- 5. solis: DHT22 uzstādīšana gaisa temperatūras un mitruma mērījumiem
- 6. darbība: datu sūtīšana uz vietni ThingSpeak.com
- 7. solis. Secinājums
Video: IoT Made Easy: Attālu laika apstākļu datu uztveršana: UV un gaisa temperatūra un mitrums: 7 soļi
2024 Autors: John Day | [email protected]. Pēdējoreiz modificēts: 2024-02-01 14:41
Šajā apmācībā mēs uztversim attālos datus kā UV (ultravioleto starojumu), gaisa temperatūru un mitrumu. Šie dati būs ļoti svarīgi un tiks izmantoti nākotnē pilnā meteostacijā.
Bloku diagramma parāda, ko mēs iegūsim beigās.
1. solis: BoM - materiālu saraksts
NodeMCU (ESP8266-12E) - USD 9,00
Mitruma un temperatūras sensors (DHT22) - USD 10,00
UV sensors - USD 4,00
OLED USD 12.00
Maizes dēlis - USD 1,00
2. solis: Analogs UV sensors
Šis UV sensors ģenerē analogo izeju, kas ir proporcionāla ultravioletajam starojumam gaismas uztveršanas spektrā. Tas izmanto UV fotodiodi (pamatojoties uz gallija nitrīdu), kas var noteikt 240–370 nm gaismas diapazonu (kas aptver UVB un lielāko daļu UVA spektra). Signāla līmenis no fotodiodes ir ļoti mazs, nano-ampēru līmenī, tāpēc modulis ir iebūvējis operatīvo pastiprinātāju, lai pastiprinātu signālu līdz vieglāk nolasāmam voltam (0 līdz 1 V).
Sensoru un op-amp var darbināt, savienojot VCC ar 3.3VDC (vai 5VDC) un GND pie strāvas. Analogo signālu var iegūt no OUT tapas.
Tās izeja būs milivoltos, un to nolasīs mūsu NodeMCU analogā ievade. Kad tas ir izlasīts, mums tas ir "jāpārveido" (vai "jākartē"), lai vērtības labāk apstrādātu ar kodu. Mēs to varam izdarīt ar funkciju readSensorUV ():
/ * Lasiet UV sensoru mV un izsauciet UV indeksa aprēķinu */
void readSensorUV () {baits numOfReadings = 5; dataSensorUV = 0; for (int i = 0; i <numOfReadings; i ++) {dataSensorUV+= analogRead (sensorUVPin); kavēšanās (200); } dataSensorUV /= numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023,0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); }
Kad mums ir UV dati, mēs varam viegli aprēķināt UV indeksu, kā noteikts iepriekšējā tabulā. Funkcija indexCalculate () to darīs mūsu vietā:
/ * UV indeksa aprēķins */
void indexCalculate () {if (dataSensorUV <227) indexUV = 0; cits if (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; cits if (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; cits if (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; cits if (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; cits if (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; cits if (696 <= dataSensorUV && dataSensorUV <795) indekssUV = 6; cits if (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; cits if (881 <= dataSensorUV && dataSensorUV <976) indekssUV = 8; cits if (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; cits if (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; cits indekssUV = 11; }
3. darbība: displeja uzstādīšana: OLED
Pārbaudes nolūkos mēs savā UV mērītājā iekļausim OLED (šis solis ir pilnīgi neobligāts).
Pārbaužu laikā ir pareizi izmantot seriālo monitoru, bet kas notiek, ja savus prototipus izmantojat tālu no datora atsevišķā režīmā? Lai to izdarītu, instalēsim OLED displeju SSD1306, kura galvenās īpašības ir šādas:
- Displeja izmērs: 0,96 collas
- I2C IIC SPI sērija
- 128x64
- Balta OLED LCD LED
Izpildiet elektrisko shēmu un pievienojiet mūsu OLED 4 tapas:
- VCC iet uz 3.3V
- GND iet uz zemes
- SCL iet uz NodeMCU (GPIO 2) ==> D4
- SDA iet uz NodeMCU (GPIO 0) ==> D3
Kad displejs ir pievienots, lejupielādēsim un instalēsim tā bibliotēku mūsu Arduino IDE: "ESP8266 OLED draiveris SSD1306 displejam", ko izstrādājis Daniels Eihorns (Pārliecinieties, vai izmantojat versiju 3.0.0 vai jaunāku!).
Instalējiet bibliotēku savā Arduino IDE, kas atrodama vietnē SSD1306Wire.h
Kad esat restartējis IDE, bibliotēkai jau jābūt instalētai.
Bibliotēka atbalsta I2C protokolu, lai piekļūtu OLED displejam, izmantojot iebūvēto Wire.h bibliotēku:
/ * OLED */
#include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306Vada displejs (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN);
Uzskaitīsim dažas svarīgas API, kuras tiks izmantotas mūsu OLED displejā. Pilnu sarakstu var atrast iepriekš sniegtajā GITHub.
A. Displeja vadība:
void init (); // Inicializēt displeju
void displayOn (tukšs); // Ieslēgt displeju par void displayOff (void); // Izslēgt displeju void clear (void); // Notīrīt vietējo pikseļu bufera void flipScreenVertically (); // Pagrieziet displeju otrādi
B. Teksta operācijas:
void drawString (int16_t x, int16_t y, virknes teksts); // (xpos, ypos, "Teksts")
void setFont (const char* fontData); // Iestata pašreizējo fontu.
Pieejamie noklusējuma fonti:
- ArialMT_Plain_10,
-
ArialMT_Plain_16,
- ArialMT_Plain_24
Kad ir instalēts gan pats OLED, gan tā bibliotēka, uzrakstīsim vienkāršu programmu, lai to pārbaudītu. Ievadiet IDE zemāk esošo kodu, rezultātam jābūt displejam, kā parādīts iepriekš redzamajā fotoattēlā:
* OLED */
#include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306Vada displejs (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } void loop () {} / * Uzsākt un parādīt iestatīšanas datus OLED * / void displaySetup () {display.init (); // inicializēt displeja displeju.clear (); // Notīrīt displeja displeju.flipScreenVertically (); // Pagrieziet displeju otrādi. Displejs (); // Ievietojiet datus displejā Serial.println ("Displeja testa uzsākšana"); display.setFont (ArialMT_Plain_24); display.drawString (30, 0, "OLED"); // (xpos, ypos, "Teksts") display.setFont (ArialMT_Plain_16); display.drawString (18, 29, "Tests uzsākts"); display.setFont (ArialMT_Plain_10); display.drawString (10, 52, "Serial BaudRate:"); display.drawString (90, 52, virkne (11500)); display.display (); // Put data on display delay (3000); }
Iepriekš minēto programmu var lejupielādēt no mana GitHub:
MezglsMCU_OLED_Test
4. solis: vietējais UV mērītājs
Tagad, kad ir uzstādīts OLED displejs, mēs varam pievienot akumulatoru un veikt dažus tālvadības testus, izmantojot mūsu "UV mērītāju"
#define SW_VERSION "UV_Sensor_V.1"
/ * UV sensors */ #define sensorsUVPin A0 int dataSensorUV = 0; int indekssUV = 0; / * OLED */ #include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306Vada displejs (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } void loop () {readSensorUV (); displayUV (); kavēšanās (1000); } / * Uzsākt un parādīt iestatīšanas datus OLED * / void displaySetup () {display.init (); // inicializēt displeja displeju.clear (); // Notīrīt displeja displeju.flipScreenVertically (); // Pagrieziet displeju otrādi. Displejs (); // Ievietojiet datus displejā Serial.println ("UV sensora testa uzsākšana"); display.setFont (ArialMT_Plain_24); display.drawString (10, 0, "MJRoBot"); display.setFont (ArialMT_Plain_16); display.drawString (0, 29, "UV sensora tests"); display.setFont (ArialMT_Plain_10); display.drawString (0, 52, "SW Ver.:"); display.drawString (45, 52, SW_VERSION); display.display (); kavēšanās (3000); } / * Lasīt UV sensoru mV un izsaukt UV indeksa aprēķinu * / void readSensorUV () {baits numOfReadings = 5; dataSensorUV = 0; for (int i = 0; i <numOfReadings; i ++) {dataSensorUV+= analogRead (sensorUVPin); kavēšanās (200); } dataSensorUV /= numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023.0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); } / * UV indeksa aprēķins * / void indexCalculate () {if (dataSensorUV <227) indexUV = 0; cits if (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; cits if (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; cits if (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; cits if (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; cits if (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; cits if (696 <= dataSensorUV && dataSensorUV <795) indekssUV = 6; cits if (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; cits if (881 <= dataSensorUV && dataSensorUV <976) indekssUV = 8; cits if (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; cits if (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; cits indekssUV = 11; } /* Parādīt UV vērtības vietējā OLED* / void displayUV () {display.clear (); display.setFont (ArialMT_Plain_16); display.drawString (20, 0, "UV sensors"); display.drawString (0, 23, "UV (mV):"); display.drawString (80, 23, virkne (dataSensorUV)); display.drawString (0, 48, "UV indekss:"); display.setFont (ArialMT_Plain_24); display.drawString (82, 42, String (indexUV)); display.display (); }
Iepriekš minēto kodu var lejupielādēt no manas GitHun: NodeMCU_UV_Sensor_OLED.ino
5. solis: DHT22 uzstādīšana gaisa temperatūras un mitruma mērījumiem
Viens no visbiežāk izmantotajiem sensoriem laika apstākļu datu uztveršanai ir DHT22 (vai tas ir brālis DHT11), digitālais relatīvā mitruma un temperatūras sensors. Tas izmanto kapacitatīvu mitruma sensoru un termistoru, lai izmērītu apkārtējo gaisu, un izspiež digitālo signālu uz datu tapas (nav vajadzīgas analogās ievades tapas).
Sensoram jābūt barotam starp 3.3V un 5V, un tas darbosies no -40oC līdz +80oC ar precizitāti +/- 0.5oC temperatūrai un +/- 2% relatīvajam mitrumam. Ir arī svarīgi paturēt prātā, ka tā uztveršanas periods ir vidēji 2 sekundes (minimālais laiks starp rādījumiem). Adafruit vietne sniedz daudz informācijas par abiem, gan DHT22, gan tā brāli DHT11. Lai iegūtu sīkāku informāciju, lūdzu, apmeklējiet DHT22/11 apmācības lapu.
DHT22 ir 4 tapas (vērstas pret sensoru, 1. tapa ir visvairāk atstāta):
- VCC (mēs izveidosim savienojumu ar 3.3V no NodeMCU);
- Dati ārā;
- Nav savienots un
- Zeme.
Kad jūs parasti izmantojat sensoru attālumos, kas ir mazāki par 20 m, starp datu un VCC tapām jāpievieno 10K rezistors. Izejas tapa tiks savienota ar NodeMCU tapu D3 (skatiet iepriekš redzamo diagrammu). Kad sensors ir instalēts mūsu modulī, lejupielādējiet DHT bibliotēku no Adafruit GitHub krātuves un instalējiet to savā Arduino bibliotēkas failā. Kad esat atkārtoti ielādējis Arduino IDE, ir jāinstalē "DHT sensoru bibliotēka".
Koda sākumā mums jāiekļauj šādas rindas:
/* DHT22*/
#iekļaut "DHT.h" #define DHTPIN D2 #define DHTTYPE DHT22 DHT dht (DHTPIN, DHTTYPE); pludiņš hum = 0; pludiņa temperatūra = 0;
Tiks izveidota jauna funkcija sensora nolasīšanai:
/ * Iegūstiet DHT datus */
void getDhtData (void) {float tempIni = temp; pludiņš humIni = hum; temp = dht.readTemperature (); hum = dht.readHumidity (); if (isnan (hum) || isnan (temp)) // Pārbaudiet, vai kāda nolasīšana neizdevās, un izejiet agri (lai mēģinātu vēlreiz). {Serial.println ("Neizdevās nolasīt no DHT sensora!"); temp = tempIni; hum = humIni; atgriešanās; }}
Pilnu kodu, ieskaitot UV un DHT sensorus, var lejupielādēt no mana GitHub: NodeMCU_UV_DHT_Sensor_OLED
6. darbība: datu sūtīšana uz vietni ThingSpeak.com
Līdz šim mēs esam izmantojuši tikai NodeMCU ESP12-E kā parastu un parastu Arduino plati. Protams, mēs esam tikai "saskrāpējuši" šīs iespaidīgās mazās mikroshēmas patieso potenciālu un tagad ir laiks pacelties debesīs! Vai labāk zvaigznēm! Eh … uz mākoni!;-)
Sāksim!
- Pirmkārt, jums ir jābūt kontam vietnē ThinkSpeak.com
- Izpildiet norādījumus, lai izveidotu kanālu, un ņemiet vērā jūsu kanāla ID un rakstīšanas API atslēgu
- Atjauniniet zemāk esošo kodu, izmantojot savu WiFi tīklu un Thinkspeak akreditācijas datus
- Palaidiet programmu IDE
Komentēsim koda svarīgākās daļas:
Vispirms piezvanīsim uz bibliotēku ESP8266, definēsim WiFi klientu un definēsim vietējā maršrutētāja un Thinkspeak akreditācijas datus:
/* ESP12-E un Thinkspeak*/
#iekļaut WiFiClient klientu; const char* MY_SSID = "JŪSU SSD ID ŠEIT"; const char* MY_PWD = "JŪSU PAROLE ŠEIT"; const char* TS_SERVER = "api.thingspeak.com"; String TS_API_KEY = "YOUR CHANNEL WRITE API KEY";
Otrkārt, iekļausim ļoti svarīgu bibliotēku IoT projektiem: SimpleTimer.h:
/ * TIMER */
#iekļaut SimpleTimer taimeri;
Treškārt, iestatīšanas () laikā mēs uzsāksim seriālo komunikāciju, izsauksim funkciju connectWiFi () un definēsim taimerus. Ņemiet vērā, ka koda rinda: timer.setInterval (60000L, sendDataTS); izsauks funkciju sendDataTS () ik pēc 60 sekundēm, lai augšupielādētu datus ThinkSpeak kanālā.
anulēts iestatījums ()
{… Serial.begin (115200); kavēšanās (10); … ConnectWifi (); timer.setInterval (60000L, sendDataTS); …}
Visbeidzot, bet ne mazāk svarīgi, cikla () laikā vienīgā nepieciešamā komanda ir palaist taimeri un viss!
tukša cilpa ()
{… Timer.run (); // Uzsāk SimpleTimer}
Zemāk varat redzēt divas svarīgas funkcijas, kas tiek izmantotas, lai apstrādātu Thinkspeak komunikāciju:
ESP12-E savienojums ar jūsu WiFi tīklu:
/***************************************************
*WiFi savienojums *********************************************** ***/ void connectWifi () {Serial.print ("Savienojuma izveide ar"+*MY_SSID); WiFi.begin (MY_SSID, MY_PWD); while (WiFi.status ()! = WL_CONNECTED) {kavēšanās (1000); Sērijas nospiedums ("."); } Serial.println (""); Serial.println ("Savienots ar WiFi"); Serial.println (""); }
ESP12-E sūta datus uz ThinkSpeak:
/***************************************************
*Datu sūtīšana uz Thinkspeak kanālu ******************************************* ******/ void sendDataTS (void) {if (client.connect (TS_SERVER, 80)) {String postStr = TS_API_KEY; postStr += "& lauks1 ="; postStr += String (dataSensorUV); postStr += "& lauks2 ="; postStr += String (indexUV); postStr += "& lauks3 ="; postStr += String (temp); postStr += "& field4 ="; postStr += String (hum); postStr += "\ r / n / r / n"; client.print ("POST /atjaunināt HTTP /1.1 / n"); client.print ("Saimnieks: api.thingspeak.com / n"); client.print ("Savienojums: aizvērt / 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); kavēšanās (1000); } nosūtīts ++; client.stop (); }
Pilnu kodu var atrast manā GitHub: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT
Kad kods ir augšupielādēts NodeMCU. Pievienosim ārēju akumulatoru un veiksim dažus mērījumus zem saules. Es uzlieku Remote Station uz jumta un sāku tvert datus vietnē ThingSpeak.com, kā parādīts iepriekš redzamajos fotoattēlos.
7. solis. Secinājums
Kā vienmēr, es ceru, ka šis projekts var palīdzēt citiem atrast ceļu aizraujošajā elektronikas pasaulē!
Lai iegūtu sīkāku informāciju un galīgo kodu, lūdzu, apmeklējiet manu GitHub depozitāriju: RPi-NodeMCU-Weather-Station
Lai iegūtu vairāk projektu, lūdzu, apmeklējiet manu emuāru: MJRoBot.org
Sekojiet līdzi! Nākamajā apmācībā mēs nosūtīsim datus no attālās laika stacijas uz centrālo, pamatojoties uz Raspberry Pi tīmekļa serveri:
Sveicieni no pasaules dienvidiem!
Uz tikšanos manā nākamajā pamācībā!
Paldies, Marselo
Ieteicams:
(IOT projekts) Iegūstiet laika apstākļu datus, izmantojot ESP8266 un Openweather API: 5 soļi
(IOT projekts) Iegūstiet laika apstākļu datus, izmantojot ESP8266 un Openweather API: Šajā pamācībā mēs izveidosim vienkāršu IOT projektu, kurā mēs iegūstam mūsu pilsētas laika apstākļu datus no vietnes openweather.com/api un parādām tos, izmantojot apstrādes programmatūru
Vieda izplatīta IoT laika apstākļu novērošanas sistēma, izmantojot NodeMCU: 11 soļi
Vieda izplatīta IoT laika apstākļu novērošanas sistēma, izmantojot NodeMCU: Jūs visi varētu zināt tradicionālo laika staciju; bet vai esat kādreiz domājuši, kā tas patiesībā darbojas? Tā kā tradicionālā meteoroloģiskā stacija ir dārga un apjomīga, šo staciju blīvums uz platības vienību ir ļoti zems, kas veicina
Kā izveidot mitruma un temperatūras reālā laika datu ierakstītāju, izmantojot Arduino UNO un SD karti - DHT11 datu reģistrētāja simulācija Proteus: 5 soļi
Kā izveidot mitruma un temperatūras reālā laika datu ierakstītāju, izmantojot Arduino UNO un SD karti | DHT11 datu reģistrētāja simulācija Proteus: Ievads: čau, tas ir Liono Maker, šeit ir YouTube saite. Mēs veidojam radošu projektu ar Arduino un strādājam pie iegultām sistēmām. Datu reģistrētājs: Datu reģistrētājs (arī datu reģistrētājs vai datu ierakstītājs) ir elektroniska ierīce, kas laika gaitā reģistrē datus
Siltumnīcas automatizācija ar LoRa! (1. daļa) -- Sensori (temperatūra, mitrums, augsnes mitrums): 5 soļi
Siltumnīcas automatizācija ar LoRa! (1. daļa) || Sensori (temperatūra, mitrums, augsnes mitrums): Šajā projektā es jums parādīšu, kā es automatizēju siltumnīcu. Tas nozīmē, ka es jums parādīšu, kā es uzbūvēju siltumnīcu un kā savienoju strāvas un automatizācijas elektroniku. Es arī parādīšu, kā programmēt Arduino dēli, kas izmanto L
Galīgais laika apstākļu gaisa balonu datu reģistrētājs: 9 soļi (ar attēliem)
Augstākā laika apstākļu gaisa balonu datu reģistrētājs: ierakstiet laika apstākļu gaisa balonu datus ar galīgo laika apstākļu gaisa balonu datu reģistrētāju. Laika balons augstā augstumā, pazīstams arī kā augstkalnu balons vai HAB, ir milzīgs balons, kas piepildīts ar hēliju. Šie baloni ir platforma