Satura rādītājs:

IoT Made Easy: Attālu laika apstākļu datu uztveršana: UV un gaisa temperatūra un mitrums: 7 soļi
IoT Made Easy: Attālu laika apstākļu datu uztveršana: UV un gaisa temperatūra un mitrums: 7 soļi

Video: IoT Made Easy: Attālu laika apstākļu datu uztveršana: UV un gaisa temperatūra un mitrums: 7 soļi

Video: IoT Made Easy: Attālu laika apstākļu datu uztveršana: UV un gaisa temperatūra un mitrums: 7 soļi
Video: Part 5 - Sense and Sensibility Audiobook by Jane Austen (Chs 43-50) 2024, Jūlijs
Anonim
IoT Made Easy: attālo laika apstākļu datu uztveršana: UV un gaisa temperatūra un mitrums
IoT Made Easy: attālo laika apstākļu datu uztveršana: UV un gaisa temperatūra un mitrums

Š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.

Attēls
Attēls

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

Analogs UV sensors
Analogs UV sensors
Analogs UV sensors
Analogs UV sensors
Analogs UV sensors
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

Displeja uzstādīšana: OLED
Displeja uzstādīšana: OLED
Displeja uzstādīšana: OLED
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

Vietējais UV mērītājs
Vietējais UV mērītājs
Vietējais UV mērītājs
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

DHT22 uzstādīšana gaisa temperatūras un mitruma mērījumiem
DHT22 uzstādīšana gaisa temperatūras un mitruma mērījumiem
DHT22 uzstādīšana gaisa temperatūras un mitruma mērījumiem
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):

  1. VCC (mēs izveidosim savienojumu ar 3.3V no NodeMCU);
  2. Dati ārā;
  3. Nav savienots un
  4. 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

Datu sūtīšana uz ThingSpeak.com
Datu sūtīšana uz ThingSpeak.com
Datu sūtīšana uz ThingSpeak.com
Datu sūtīšana uz ThingSpeak.com
Datu sūtīšana uz ThingSpeak.com
Datu sūtīšana uz 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!

  1. Pirmkārt, jums ir jābūt kontam vietnē ThinkSpeak.com
  2. Izpildiet norādījumus, lai izveidotu kanālu, un ņemiet vērā jūsu kanāla ID un rakstīšanas API atslēgu
  3. Atjauniniet zemāk esošo kodu, izmantojot savu WiFi tīklu un Thinkspeak akreditācijas datus
  4. 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

Secinājums
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:

Attēls
Attēls

Sveicieni no pasaules dienvidiem!

Uz tikšanos manā nākamajā pamācībā!

Paldies, Marselo

Ieteicams: