Talaan ng mga Nilalaman:

Madali ang IoT: Nakukuha ang Data ng Remote na Panahon: UV at Temperatura ng Temperatura at Humidity: 7 Hakbang
Madali ang IoT: Nakukuha ang Data ng Remote na Panahon: UV at Temperatura ng Temperatura at Humidity: 7 Hakbang

Video: Madali ang IoT: Nakukuha ang Data ng Remote na Panahon: UV at Temperatura ng Temperatura at Humidity: 7 Hakbang

Video: Madali ang IoT: Nakukuha ang Data ng Remote na Panahon: UV at Temperatura ng Temperatura at Humidity: 7 Hakbang
Video: The Immortal Hulk: Full Story (The Big Spill) 2024, Hulyo
Anonim
Ginawang Madali ang IoT: Nakukuha ang Data ng Malayong Panahon: UV at Temperatura ng Temperatura at Humidity
Ginawang Madali ang IoT: Nakukuha ang Data ng Malayong Panahon: UV at Temperatura ng Temperatura at Humidity

Sa tutorial na ito, makukuha namin ang remote data bilang UV (Ultra-Violet radiation), temperatura ng hangin at halumigmig. Ang data na iyon ay magiging napakahalaga at gagamitin sa hinaharap na kumpletong Weather Station.

Ipinapakita ng block Diagram kung ano ang makukuha natin sa dulo.

Larawan
Larawan

Hakbang 1: BoM - Bill of Material

NodeMCU (ESP8266-12E) - USD 9.00

Humority and Temperature Sensor (DHT22) - USD10.00

UV Sensor - USD 4.00

OLED USD 12.00

Breadboard - USD1.00

Hakbang 2: Ang Analog UV Sensor

Ang Analog UV Sensor
Ang Analog UV Sensor
Ang Analog UV Sensor
Ang Analog UV Sensor
Ang Analog UV Sensor
Ang Analog UV Sensor

Ang UV sensor na ito ay bumubuo ng isang analog output na proporsyonal sa Ultra-Violet radiation na matatagpuan sa light-sensing spectrum. Gumagamit ito ng isang UV photodiode (batay sa Gallium Nitride), na maaaring makita ang saklaw ng ilaw na 240-370nm (na sumasakop sa UVB at karamihan sa UVA spectrum). Ang antas ng signal mula sa photodiode ay napakaliit, sa antas ng nano-ampere, kaya't ang module ay naka-embed ng isang pagpapatakbo amplifier upang mapalakas ang signal sa isang mas madaling mabasa na antas ng volt (0 hanggang 1V).

Maaaring mapagana ang sensor at op-amp, sa pamamagitan ng pagkonekta sa VCC sa 3.3VDC (o 5VDC) at GND sa power ground. Ang analog signal ay maaaring makuha mula sa OUT pin.

Ang Output nito ay nasa millivolts at babasahin ng Analog Input ng aming NodeMCU. Kapag nabasa na, dapat nating "baguhin" (o "mapa") ito para sa mga halagang mas mahusay na mapangasiwaan ng code. Maaari nating gawin ito sa pagpapaandar na readSensorUV ():

/ * Basahin ang UV Sensor sa mV at tawagan ang pagkalkula ng UV index * /

void readSensorUV () {byte numOfReadings = 5; dataSensorUV = 0; para sa (int i = 0; i <numOfReadings; i ++) {dataSensorUV + = analogRead (sensorUVPin); pagkaantala (200); } dataSensorUV / = numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023.0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); }

Kapag mayroon kaming data ng UV madali nating makalkula ang UV index tulad ng tinukoy sa talahanayan sa itaas. Gawin ito ng function indexCalculate () para sa amin:

/ * Pagkalkula ng UV Index * /

void indexCalculate () {if (dataSensorUV <227) indexUV = 0; kung hindi man kung (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; kung hindi man kung (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; kung hindi man kung (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; kung hindi man kung (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; kung hindi man kung (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; kung hindi man kung (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; kung hindi man kung (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; kung hindi man kung (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; kung hindi man kung (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; kung hindi man kung (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; iba indexUV = 11; }

Hakbang 3: Pag-install ng isang Display: OLED

Pag-install ng isang Display: OLED
Pag-install ng isang Display: OLED
Pag-install ng isang Display: OLED
Pag-install ng isang Display: OLED

Para sa mga layunin sa pagsubok, isasama namin ang isang OLED sa aming UV meter (Ang hakbang na ito ay ganap na opsyonal).

OK lang sa panahon ng mga pagsubok, upang magamit ang Serial Monitor, ngunit ano ang nangyayari kapag ginagamit mo ang iyong mga prototype na malayo sa iyong PC sa isang stand-alone mode? Para doon, mag-install tayo ng isang OLED display, ang SSD1306, kung aling mga pangunahing katangian ang:

  • Laki ng display: 0.96"
  • I2C IIC SPI Serial
  • 128X64
  • White OLED LCD LED

Sundin ang de-koryenteng diagram at ikonekta ang 4 na mga pin ng aming OLED:

  • Ang VCC ay pupunta sa 3.3V
  • Ang GND ay pumupunta sa lupa
  • Ang SCL ay pupunta sa NodeMCU (GPIO 2) ==> D4
  • Ang SDA ay pupunta sa NodeMCU (GPIO 0) ==> D3

Kapag nakakonekta na namin ang display, i-download at i-install ang aklatan nito sa aming Arduino IDE: ang "ESP8266 OLED Driver para sa display na SSD1306" na binuo ni Daniel Eichhorn (Tiyaking gumagamit ka ng Bersyon 3.0.0 o mas malaki!).

I-install ang library sa iyong Arduino IDE, na matatagpuan sa SSD1306Wire.h

Kapag na-restart mo ang IDE, dapat na naka-install na ang library.

Sinusuportahan ng library ang I2C protocol upang ma-access ang OLED display gamit ang built-in na Wire.h library:

/ * OLED * /

# isama ang "SSD1306Wire.h" # isama ang "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; Display ng SSD1306Wire (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN);

Listahan natin ang ilang mahahalagang API na gagamitin sa aming OLED display. Ang kumpletong listahan ay matatagpuan sa GITHub na ibinigay sa itaas.

A. Control ng Display:

walang bisa init (); // Initialise ang display

walang bisa displayOn (walang bisa); // Turn the display on void displayOff (void); // Turn the display off void clear (void); // Clear the local pixel buffer void flipScreenVertically (); // Baligtarin ang display

B. Mga Pagpapatakbo ng Teksto:

walang bisa drawString (int16_t x, int16_t y, String text); // (xpos, ypos, "Text")

walang bisa ang setFont (const char * fontData); // Itinatakda ang kasalukuyang font.

Magagamit na mga default na font:

  • ArialMT_Plain_10,
  • ArialMT_Plain_16,

  • ArialMT_Plain_24

Kapag na-install na ang parehong OLED mismo at ang Library nito, magsulat tayo ng isang simpleng programa upang subukan ito. Ipasok gamit ang bellow code sa iyong IDE, ang resulta ay dapat na isang pagpapakita tulad ng ipinakita sa larawan sa itaas:

* OLED * /

# isama ang "SSD1306Wire.h" # isama ang "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; Display ng SSD1306Wire (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } void loop () {} / * Pasimulan at ipakita ang data ng pag-set up sa OLED * / void displaySetup () {display.init (); // ipasimula ang display display. malinaw (); // Clear display display.flipScreenVertically (); // I-on ang display ng baligtad na display.display (); // Ilagay ang data sa display Serial.println ("Initiating Display Test"); display.setFont (ArialMT_Plain_24); display.drawString (30, 0, "OLED"); // (xpos, ypos, "Text") display.setFont (ArialMT_Plain_16); display.drawString (18, 29, "Pinasimulan ang pagsubok"); display.setFont (ArialMT_Plain_10); display.drawString (10, 52, "Serial BaudRate:"); display.drawString (90, 52, String (11500)); display.display (); // Ilagay ang data sa pagkaantala sa pagpapakita (3000); }

Maaaring ma-download ang program sa itaas mula sa aking GitHub:

NodeMCU_OLED_Test

Hakbang 4: Isang Lokal na UV Meter

Isang Lokal na UV Meter
Isang Lokal na UV Meter
Isang Lokal na UV Meter
Isang Lokal na UV Meter

Ngayon, sa naka-install na OLED display, maaari naming ikonekta ang isang baterya at gumawa ng ilang mga remote na pagsubok gamit ang aming "UV Meter"

# tukuyin ang SW_VERSION "UV_Sensor_V.1"

/ * UV Sensor * / #define sensorUVPin A0 int dataSensorUV = 0; int indexUV = 0; / * OLED * / # isama ang "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; Display ng SSD1306Wire (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } void loop () {readSensorUV (); displayUV (); pagkaantala (1000); } / * Simulan at ipakita ang data ng pag-set up sa OLED * / walang bisa na displaySetup () {display.init (); // ipasimula ang display display. malinaw (); // Clear display display.flipScreenVertically (); // I-on ang display ng baligtad na display.display (); // Put data on display Serial.println ("Initiating UV Sensor Test"); display.setFont (ArialMT_Plain_24); display.drawString (10, 0, "MJRoBot"); display.setFont (ArialMT_Plain_16); display.drawString (0, 29, "UV Sensor Test"); display.setFont (ArialMT_Plain_10); display.drawString (0, 52, "SW Ver.:"); display.drawString (45, 52, SW_VERSION); display.display (); pagkaantala (3000); } / * Basahin ang UV Sensor sa mV at tawagan ang pagkalkula ng index ng UV * / walang bisa ang readSensorUV () {byte numOfReadings = 5; dataSensorUV = 0; para sa (int i = 0; i <numOfReadings; i ++) {dataSensorUV + = analogRead (sensorUVPin); pagkaantala (200); } dataSensorUV / = numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023.0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); } / * Pagkalkula ng UV Index * / void indexCalculate () {if (dataSensorUV <227) indexUV = 0; kung hindi man kung (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; kung hindi man kung (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; kung hindi man kung (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; kung hindi man kung (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; kung hindi man kung (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; kung hindi man kung (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; kung hindi man kung (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; kung hindi man kung (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; kung hindi man kung (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; kung hindi man kung (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; iba indexUV = 11; } / * Ipakita ang Mga Halaga ng UV sa lokal na OLED * / walang bisa na displayUV () {display.clear (); display.setFont (ArialMT_Plain_16); display.drawString (20, 0, "UV Sensor"); display.drawString (0, 23, "UV (mV):"); display.drawString (80, 23, String (dataSensorUV)); display.drawString (0, 48, "UV Index:"); display.setFont (ArialMT_Plain_24); display.drawString (82, 42, String (indexUV)); display.display (); }

Maaaring mai-download ang code sa itaas mula sa aking GitHun: NodeMCU_UV_Sensor_OLED.ino

Hakbang 5: Pag-install ng isang DHT22 para sa Mga Sukat ng Temperatura ng Hangin at Humidity

Pag-install ng isang DHT22 para sa Mga Sukat ng Temperatura ng Hangin at Humidity
Pag-install ng isang DHT22 para sa Mga Sukat ng Temperatura ng Hangin at Humidity
Pag-install ng isang DHT22 para sa Mga Sukat ng Temperatura ng Hangin at Humidity
Pag-install ng isang DHT22 para sa Mga Sukat ng Temperatura ng Hangin at Humidity

Ang isa sa mga pinaka ginagamit na sensor para sa pagkuha ng data ng panahon ay ang DHT22 (o kapatid na DHT11), isang digital na kamag-anak na kahalumigmigan at sensor ng temperatura. Gumagamit ito ng capacitive sensor ng kahalumigmigan at isang thermistor upang masukat ang nakapalibot na hangin at dumura ng isang digital signal sa pin ng data (hindi kinakailangan ng mga analog input pin).

Ang sensor ay dapat na pinalakas sa pagitan ng 3.3V at 5V at gagana mula -40oC hanggang + 80oC na may katumpakan na +/- 0.5oC para sa temperatura at +/- 2% para sa medyo Humidity. Mahalaga rin na isipin na ang panahon ng pagdarama nito ay nasa average na 2 segundo (minimum na oras sa pagitan ng mga pagbasa). Ang site ng Adafruit ay nagbibigay ng maraming impormasyon tungkol sa pareho, DHT22 at sa kapatid nitong DHT11. Para sa karagdagang detalye, mangyaring bisitahin ang pahina ng Tutorial ng DHT22 / 11.

Ang DHT22 ay may 4 na mga pin (nakaharap sa sensor, pin 1 ang pinaka kaliwa):

  1. VCC (kumokonekta kami sa 3.3V mula sa NodeMCU);
  2. Data out;
  3. Hindi konektado at
  4. Lupa

Sa sandaling karaniwang gagamitin mo ang sensor sa mga distansya na mas mababa sa 20m, isang 10K risistor ay dapat na konektado sa pagitan ng mga pin ng Data at VCC. Ang pin ng Output ay konektado sa NodeMCU pin D3 (tingnan ang diagram sa itaas). Kapag na-install na ang sensor sa aming module, i-download ang DHT library mula sa Adafruit GitHub repository at i-install ito sa iyong Arduino's Library file. Kapag na-reload mo ang iyong Arduino IDE, dapat na mai-install ang "DHT sensor library".

Sa simula ng code, dapat naming isama ang mga linya:

/ * DHT22 * /

# isama ang "DHT.h" #define DHTPIN D2 #define DHTTYPE DHT22 DHT dht (DHTPIN, DHTTYPE); float hum = 0; float temp = 0;

Lilikha ng isang bagong pagpapaandar upang mabasa ang sensor:

/ * Kumuha ng data ng DHT * /

void getDhtData (void) {float tempIni = temp; float humIni = hum; temp = dht.readTemperature (); hum = dht.readHumidity (); kung (isnan (hum) || isnan (temp)) // Suriin kung may nabasa na nabigo at lumabas nang maaga (upang subukang muli). {Serial.println ("Nabigong basahin mula sa sensor ng DHT!"); temp = tempIni; hum = humIni; bumalik; }}

Ang kumpletong code kasama ang mga sensor ng UV at DHT ay maaaring ma-download mula sa aking GitHub: NodeMCU_UV_DHT_Sensor_OLED

Hakbang 6: Pagpapadala ng Data sa ThingSpeak.com

Pagpapadala ng Data sa ThingSpeak.com
Pagpapadala ng Data sa ThingSpeak.com
Pagpapadala ng Data sa ThingSpeak.com
Pagpapadala ng Data sa ThingSpeak.com
Pagpapadala ng Data sa ThingSpeak.com
Pagpapadala ng Data sa ThingSpeak.com

Sa ngayon, ginamit lamang namin ang NodeMCU ESP12-E bilang isang regular at ordinaryong Arduino board. Siyempre, "scratched" lamang namin ang tunay na potensyal ng kamangha-manghang maliit na maliit na tilad na at ngayon ang oras upang mag-take-off sa langit! O mas mahusay sa mga bituin! Ehr … sa ulap!;-)

Magsimula na tayo!

  1. Una, dapat mayroon kang isang account sa ThinkSpeak.com
  2. Sundin ang mga tagubilin upang lumikha ng isang Channel at tandaan ang iyong Channel ID at Sumulat ng API Key
  3. I-update ang code sa ibaba sa iyong WiFi network at mga kredensyal ng Thinkspeak
  4. Patakbuhin ang programa sa IDE

Komento natin ang code na pinakamahalagang bahagi:

Una, tawagan natin ang library ng ESP8266, tukuyin ang client ng WiFi at tukuyin ang iyong lokal na mga kredensyal ng Router at Thinkspeak:

/ * ESP12-E & Thinkspeak * /

# isama ang client ng WiFiClient; const char * MY_SSID = "IYONG SSD ID DITO"; const char * MY_PWD = "IYONG PASSWORD DITO"; const char * TS_SERVER = "api.thingspeak.com"; String TS_API_KEY = "IYONG CHANNEL WRITE API KEY";

Pangalawa, isama natin ang isang napakahalagang library para sa mga proyekto ng IoT: SimpleTimer.h:

/ * TIMER * /

# isama ang SimpleTimer timer;

Pangatlo, sa panahon ng pag-setup (), sisimulan namin ang serial komunikasyon, tawagan ang function na connectWiFi () at tukuyin ang mga timer. Tandaan na ang linya ng code: timer.setInterval (60000L, sendDataTS); tatawag sa pagpapaandar na sendDataTS () tuwing 60 segundo, upang makapag-upload ng data sa ThinkSpeak channel.

walang bisa ang pag-setup ()

{… Serial.begin (115200); antala (10); … ConnectWifi (); timer.setInterval (60000L, sendDataTS); …}

Sa wakas ngunit hindi pa huli, sa panahon ng loop (), ang tanging utos na kinakailangan ay upang simulan ang timer at iyon na!

walang bisa loop ()

{… Timer.run (); // Initiates SimpleTimer}

Sa ibaba, makikita mo ang dalawang mahahalagang pagpapaandar na ginamit upang hawakan ang komunikasyon sa Thinkspeak:

Koneksyon sa ESP12-E sa iyong WiFi network:

/***************************************************

* Kumokonekta sa WiFi ***** ***** ***** ***** ***** ***** *** / void connectWifi () {Serial.print ("Kumokonekta sa" + * MY_SSID); WiFi.begin (MY_SSID, MY_PWD); habang (WiFi.status ()! = WL_CONNected) {pagkaantala (1000); Serial.print ("."); } Serial.println (""); Serial.println ("Konektado sa WiFi"); Serial.println (""); }

Ang data ng pagpapadala ng ESP12-E sa ThinkSpeak:

/***************************************************

* Pagpapadala ng Data sa Thinkspeak Channel ******************************************** ****** / void sendDataTS (void) {if (client.connect (TS_SERVER, 80)) {String postStr = TS_API_KEY; postStr + = "& field1 ="; postStr + = String (dataSensorUV); postStr + = "& field2 ="; postStr + = String (indexUV); postStr + = "& field3 ="; postStr + = String (temp); postStr + = "& field4 ="; postStr + = String (hum); postStr + = "\ r / n / r / n"; client.print ("POST / update HTTP / 1.1 / n"); client.print ("Host: api.thingspeak.com / n"); client.print ("Koneksyon: isara / n"); client.print ("X-THINGSPEAKAPIKEY:" + TS_API_KEY + "\ n"); client.print ("Uri ng Nilalaman: application / x-www-form-urlencoded / n"); client.print ("Haba ng Nilalaman:"); client.print (postStr.length ()); client.print ("\ n / n"); client.print (postStr); pagkaantala (1000); } nagpadala ++; client.stop (); }

Ang kumpletong code ay matatagpuan sa aking GitHub: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT

Kapag na-upload mo na ang code sa iyong NodeMCU. Ikonekta natin ang isang panlabas na baterya at gumawa ng ilang pagsukat sa ilalim ng araw. Inilagay ko ang Remote Station sa bubong at sinimulang makuha ang data sa ThingSpeak.com tulad ng ipinakita sa mga larawan sa itaas.

Hakbang 7: Konklusyon

Konklusyon
Konklusyon

Tulad ng nakasanayan, inaasahan kong ang proyekto na ito ay maaaring makatulong sa iba na mahanap ang kanilang mga paraan sa kapanapanabik na mundo ng electronics!

Para sa mga detalye at pangwakas na code, mangyaring bisitahin ang aking deposito sa GitHub: RPi-NodeMCU-Weather-Station

Para sa higit pang mga proyekto, mangyaring bisitahin ang aking blog: MJRoBot.org

Manatiling nakatutok! Susunod na tutorial ay magpapadala kami ng data mula sa isang malayuang istasyon ng panahon hanggang sa isang gitnang, batay sa isang Raspberry Pi Web server:

Larawan
Larawan

Saludos mula sa timog ng mundo!

Kita tayo sa susunod kong turo!

Salamat, Marcelo

Inirerekumendang: