Orodha ya maudhui:

IoT Imefanywa Rahisi: Kukamata Takwimu za hali ya hewa ya mbali: Joto la UV na Hewa na Unyevu: Hatua 7
IoT Imefanywa Rahisi: Kukamata Takwimu za hali ya hewa ya mbali: Joto la UV na Hewa na Unyevu: Hatua 7

Video: IoT Imefanywa Rahisi: Kukamata Takwimu za hali ya hewa ya mbali: Joto la UV na Hewa na Unyevu: Hatua 7

Video: IoT Imefanywa Rahisi: Kukamata Takwimu za hali ya hewa ya mbali: Joto la UV na Hewa na Unyevu: Hatua 7
Video: FAHAMU KUHUSU WATU AMBAO HAWAWEZI KUAMBUKIZWA UKIMWI 2024, Julai
Anonim
IoT Imefanywa Rahisi: Kukamata Takwimu za hali ya hewa ya mbali: Joto la UV na Hewa na Unyevu
IoT Imefanywa Rahisi: Kukamata Takwimu za hali ya hewa ya mbali: Joto la UV na Hewa na Unyevu

Kwenye mafunzo haya, tutakamata data ya mbali kama UV (Mionzi ya Ultra-Violet), joto la hewa na unyevu. Takwimu hizo zitakuwa muhimu sana na zitatumika katika Kituo cha hali ya hewa kamili kamili.

Mchoro wa block unaonyesha kile tutapata mwisho.

Picha
Picha

Hatua ya 1: BoM - Muswada wa Nyenzo

NodeMCU (ESP8266-12E) - USD 9.00

Sensorer ya Unyevu na Joto (DHT22) - USD10.00

Sensorer ya UV - USD 4.00

OLED USD 12.00

Bodi ya mkate - USD1.00

Hatua ya 2: Sensorer ya UV ya Analog

Sensorer ya UV ya Analog
Sensorer ya UV ya Analog
Sensorer ya UV ya Analog
Sensorer ya UV ya Analog
Sensorer ya UV ya Analog
Sensorer ya UV ya Analog

Sensorer hii ya UV hutoa pato la analog sawia na mionzi ya Ultra-Violet inayopatikana kwenye wigo wa kuhisi mwanga. Inatumia picha ya UV (kulingana na Gallium Nitride), ambayo inaweza kugundua taa ya 240-370nm (ambayo inashughulikia UVB na wigo mwingi wa UVA). Kiwango cha ishara kutoka kwa photodiode ni ndogo sana, katika kiwango cha nano-ampere, kwa hivyo moduli imeingiza kipaza sauti cha kufanya kazi ili kukuza ishara kwa kiwango cha volt kinachosomeka zaidi (0 hadi 1V).

Sensor na op-amp zinaweza kuwezeshwa, kwa kuunganisha VCC hadi 3.3VDC (au 5VDC) na GND kwenye uwanja wa umeme. Ishara ya analog inaweza kupatikana kutoka kwa pini ya OUT.

Pato lake litakuwa katika millivolts na litasomwa na Ingizo la Analog ya NodeMCU yetu. Mara tu ikisomwa, tunapaswa "kuibadilisha" (au "ramani") ili maadili yashughulikiwe vizuri na nambari. Tunaweza kuifanya na kazi kusomaSensorUV ():

/ * Soma Sensorer ya UV katika mV na piga hesabu ya faharisi ya UV * /

kusoma utupuSensorUV () {byte numOfReadings = 5; dataSensorUV = 0; kwa (int i = 0; i <numOfReadings; i ++) {dataSensorUV + = analogRead (sensorUVPin); kuchelewesha (200); } dataSensorUV / = numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023.0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); }

Mara tu tunapokuwa na data ya UV tunaweza kuhesabu kwa urahisi faharisi ya UV kama ilivyoainishwa kwenye jedwali hapo juu. Faharisi ya kaziCalculate () itatufanyia:

/ * Hesabu ya UV Index * /

index batiliCalculate () {if (dataSensorUV <227) indexUV = 0; vinginevyo ikiwa (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; vinginevyo ikiwa (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; vinginevyo ikiwa (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; vinginevyo ikiwa (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; vinginevyo ikiwa (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; vinginevyo ikiwa (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; vinginevyo ikiwa (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; vinginevyo ikiwa (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; vinginevyo ikiwa (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; vinginevyo ikiwa (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; mwingine indexUV = 11; }

Hatua ya 3: Kusanidi Onyesho: OLED

Kufunga Onyesho: OLED
Kufunga Onyesho: OLED
Kufunga Onyesho: OLED
Kufunga Onyesho: OLED

Kwa madhumuni ya kujaribu, tutajumuisha OLED kwenye mita yetu ya UV (Hatua hii ni ya hiari kabisa).

Ni sawa wakati wa majaribio, kutumia Monitor Serial, lakini ni nini kinachotokea wakati unatumia prototypes zako mbali na PC yako katika hali ya kusimama pekee? Kwa hilo, wacha tuweke onyesho la OLED, SSD1306, ambayo sifa kuu ni:

  • Ukubwa wa onyesho: 0.96"
  • I2C IIC SPI Serial
  • 128X64
  • Nyeupe OLED LCD LED

Fuata mchoro wa umeme na unganisha pini 4 za OLED yetu:

  • VCC huenda kwa 3.3V
  • GND huenda chini
  • SCL inakwenda NodeMCU (GPIO 2) ==> D4
  • SDA inakwenda NodeMCU (GPIO 0) ==> D3

Mara tu tuunganishe onyesho, wacha tupakue na kusanikisha maktaba yake kwenye Arduino IDE yetu: "ESP8266 OLED Dereva ya onyesho la SSD1306" iliyoundwa na Daniel Eichhorn (Hakikisha unatumia Toleo la 3.0.0 au kubwa!).

Sakinisha maktaba kwenye IDE yako ya Arduino, ambayo inaweza kupatikana kwenye SSD1306Wire.h

Mara tu unapoanza tena IDE, maktaba inapaswa kuwa tayari imewekwa.

Maktaba inasaidia itifaki ya I2C kufikia onyesho la OLED kwa kutumia maktaba ya Wire.h iliyojengwa:

/ * OLED * /

# pamoja na "SSD1306Wire.h" # pamoja na "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; Onyesho la SSD1306Wire (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN);

Wacha tuorodhe API muhimu ambayo itatumika na onyesho letu la OLED. Orodha kamili inaweza kupatikana kwenye GITHub iliyotolewa hapo juu.

A. Udhibiti wa Kuonyesha:

utupu init (); // Anzisha onyesho

onyesha batiliOn (batili); // Washa onyesho kwenye onyesho batiliOff (batili); // Badili maonyesho wazi wazi (batili); // Futa bafa ya saizi ya pikseli ya ndani batili flipScreenVertically (); // Pindua onyesho chini

Uendeshaji wa Nakala:

Utupu wa kutekaString (int16_t x, int16_t y, maandishi ya Kamba); // (xpos, ypos, "Nakala")

batili setFont (const char * fontData); // Inaweka font ya sasa.

Fonti chaguo-msingi zinazopatikana:

  • ArialMT_Plain_10,
  • ArialMT_Plain_16,

  • ArialMT_Plain_24

Mara tu OLED yenyewe na Maktaba yake imewekwa, wacha tuandike mpango rahisi wa kuijaribu. Ingiza na nambari iliyokolea kwenye IDE yako, matokeo yanapaswa kuwa onyesho kama inavyoonyeshwa kwenye picha hapo juu:

* OLED * /

# pamoja na "SSD1306Wire.h" # pamoja na "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; Onyesho la SSD1306Wire (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); kuanzisha batili () {Serial.begin (115200); onyeshaSetup (); } kitanzi batili () {} / * Anzisha na uonyeshe data ya usanidi kwenye OLED * / void displaySetup () {display.init (); // anzisha onyesho la kuonyesha. wazi (); // Onyesha onyesho la kuonyesha.flipScreenVertically (); // Pindua onyesho la kichwa chini. Onyesha (); // Weka data kwenye onyesho la Serial.println ("Kuanzisha Mtihani wa Kuonyesha"); onyesha.setFont (ArialMT_Plain_24); onyesha.drawString (30, 0, "OLED"); // (xpos, ypos, "Nakala") onyesha.setFont (ArialMT_Plain_16); onyesha.drawString (18, 29, "Mtihani umeanzishwa"); onyesha.setFont (ArialMT_Plain_10); onyesha.drawString (10, 52, "Serial BaudRate:"); onyesha DrawString (90, 52, String (11500)); onyesha.display (); // Weka data juu ya kucheleweshwa kwa onyesho (3000); }

Programu hapo juu inaweza kupakuliwa kutoka kwa GitHub yangu:

NodeMCU_OLED_Test

Hatua ya 4: Mita ya UV ya Mitaa

Mita ya UV ya Mitaa
Mita ya UV ya Mitaa
Mita ya UV ya Mitaa
Mita ya UV ya Mitaa

Sasa, pamoja na onyesho la OLED limesanikishwa, tunaweza kuunganisha betri na kufanya vipimo kadhaa vya mbali kutumia "Mita ya UV"

#fafanua SW_VERSION "UV_Sensor_V.1"

/ * UV Sensor * / #fafanua sensaUVPin A0 int dataSensorUV = 0; int indexUV = 0; / * OLED * / # pamoja na "SSD1306Wire.h" # pamoja na "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; Onyesho la SSD1306Wire (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); kuanzisha batili () {Serial.begin (115200); onyeshaSetup (); } kitanzi batili () {readSensorUV (); onyeshaUV (); kuchelewesha (1000); } / * Anzisha na onyesha data ya usanidi kwenye OLED * / batili displaySetup () {display.init (); // anzisha onyesho la kuonyesha. wazi (); // Onyesha onyesho la kuonyesha.flipScreenVertically (); // Pindua onyesho la kichwa chini. Onyesha (); // Weka data kwenye onyesho Serial.println ("Kuanzisha Mtihani wa Sensorer ya UV"); onyesha.setFont (ArialMT_Plain_24); onyesha.drawString (10, 0, "MJRoBot"); onyesha.setFont (ArialMT_Plain_16); kuonyesha.drawString (0, 29, "Mtihani wa Sensorer ya UV"); onyesha.setFont (ArialMT_Plain_10); onyesha.drawString (0, 52, "SW Ver.:"); onyesha DrawString (45, 52, SW_VERSION); onyesha.display (); kuchelewesha (3000); } / * Soma Sensorer ya UV katika mV na piga hesabu ya faharisi ya UV * / utupu readSensorUV () {byte numOfReadings = 5; dataSensorUV = 0; kwa (int i = 0; i <numOfReadings; i ++) {dataSensorUV + = analogRead (sensorUVPin); kuchelewesha (200); } dataSensorUV / = numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023.0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); } / * Hesabu ya UV Index * / index batiliCalculate () {if (dataSensorUV <227) indexUV = 0; vinginevyo ikiwa (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; vinginevyo ikiwa (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; vinginevyo ikiwa (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; vinginevyo ikiwa (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; vinginevyo ikiwa (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; vinginevyo ikiwa (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; vinginevyo ikiwa (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; vinginevyo ikiwa (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; vinginevyo ikiwa (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; vinginevyo ikiwa (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; mwingine indexUV = 11; } / * Onyesha Maadili ya UV kwenye OLED ya ndani / onyesho batiliUV () {display.clear (); onyesha.setFont (ArialMT_Plain_16); kuonyesha.drawString (20, 0, "UV Sensor"); onyesha.drawString (0, 23, "UV (mV):"); onyesha.drawString (80, 23, String (dataSensorUV)); kuonyesha.drawString (0, 48, "UV Index:"); onyesha.setFont (ArialMT_Plain_24); onyesha.drawString (82, 42, String (indexUV)); onyesha.display (); }

Nambari iliyo hapo juu inaweza kupakuliwa kutoka kwa GitHun yangu: NodeMCU_UV_Sensor_OLED.ino

Hatua ya 5: Kusanikisha DHT22 kwa Vipimo vya Joto Hewa na Unyevu

Kuweka DHT22 kwa Vipimo vya Joto Hewa na Unyevu
Kuweka DHT22 kwa Vipimo vya Joto Hewa na Unyevu
Kuweka DHT22 kwa Vipimo vya Joto Hewa na Unyevu
Kuweka DHT22 kwa Vipimo vya Joto Hewa na Unyevu

Moja ya sensorer zinazotumiwa sana kwa kunasa data ya hali ya hewa ni DHT22 (au ni ndugu DHT11), unyevu wa dijiti na sensorer ya joto. Inatumia sensorer ya unyevu unyevu na kipima joto kupima hewa inayozunguka na kutema ishara ya dijiti kwenye pini ya data (hakuna pini za pembejeo za analog zinazohitajika).

Sensor inapaswa kuwezeshwa kati ya 3.3V na 5V na itafanya kazi kutoka -40oC hadi + 80oC kwa usahihi wa +/- 0.5oC kwa joto na +/- 2% kwa Unyevu wa jamaa. Pia ni muhimu kuzingatia kwamba kipindi chake cha kuhisi ni wastani wa sekunde 2 (wakati mdogo kati ya usomaji). Tovuti ya Adafruit hutoa habari nyingi juu ya wote, DHT22 na kaka yake DHT11. Kwa maelezo zaidi, tafadhali tembelea ukurasa wa Mafunzo ya DHT22 / 11.

DHT22 ina pini 4 (inakabiliwa na sensorer, pini 1 ndio kushoto zaidi):

  1. VCC (tutaunganisha kwa 3.3V kutoka NodeMCU);
  2. Takwimu nje;
  3. Haijaunganishwa na
  4. Ardhi.

Mara moja kawaida utatumia sensa kwa umbali chini ya 20m, kontena la 10K linapaswa kuunganishwa kati ya pini za Takwimu na VCC. Pini ya Pato itaunganishwa na NodeMCU pin D3 (angalia mchoro hapo juu). Mara tu sensor inaposanikishwa kwenye moduli yetu, pakua maktaba ya DHT kutoka kwa ghala la Adafruit GitHub na uiweke kwenye faili yako ya Maktaba ya Arduino. Mara tu unapopakia tena IDE yako ya Arduino, "maktaba ya sensorer ya DHT" inapaswa kusakinishwa.

Mwanzoni mwa nambari, lazima tujumuishe mistari:

/ * DHT22 * /

# pamoja na "DHT.h" #fafanua DHTPIN D2 #fafanua DHTTYPE DHT22 DHT dht (DHTPIN, DHTTYPE); kuelea hum = 0; kuelea temp = 0;

Kazi mpya itaundwa kusoma sensor:

/ * Pata data ya DHT * /

batili getDhtData (batili) {float tempIni = temp; kuelea humIni = hum; temp = dht. soma Joto (); hum = dht. somo Unyenyekevu (); ikiwa (isnan (hum) || isnan (temp)) // Angalia ikiwa kuna usomaji wowote umeshindwa na utoke mapema (kujaribu tena). {Serial.println ("Imeshindwa kusoma kutoka kwa sensorer ya DHT!"); temp = tempIni; hum = humIni; kurudi; }}

Nambari kamili ikiwa ni pamoja na sensorer za UV na DHT zinaweza kupakuliwa kutoka kwa GitHub yangu: NodeMCU_UV_DHT_Sensor_OLED

Hatua ya 6: Kutuma Takwimu kwa ThingSpeak.com

Kutuma Takwimu kwa ThingSpeak.com
Kutuma Takwimu kwa ThingSpeak.com
Kutuma Takwimu kwa ThingSpeak.com
Kutuma Takwimu kwa ThingSpeak.com
Kutuma Takwimu kwa ThingSpeak.com
Kutuma Takwimu kwa ThingSpeak.com

Kufikia sasa, tumetumia tu NodeMCU ESP12-E kama bodi ya kawaida na ya kawaida ya Arduino. Kwa kweli, "tumekwaruza" tu uwezo halisi wa chipu hiki cha kuvutia na sasa ni wakati wa kuondoka kwenda mbinguni! Au bora kwa nyota! Ehr… kwa wingu!;-)

Wacha tuanze!

  1. Kwanza, lazima uwe na akaunti kwenye ThinkSpeak.com
  2. Fuata maagizo ya kuunda Kituo na uzingatie Kitambulisho chako na Andika Kitufe cha API
  3. Sasisha nambari iliyo hapa chini na mtandao wako wa WiFi na sifa za Thinkspeak
  4. Endesha programu kwenye IDE

Wacha tupe maoni nambari muhimu zaidi ya nambari:

Kwanza, wacha tuite maktaba ya ESP8266, tufafanue mteja wa WiFi na tufafanue sifa zako za Router na Thinkspeak:

/ * ESP12-E & Thinkspeak * /

#jumuisha mteja wa Wateja wa WiFi; const char * MY_SSID = "ID yako ya SSD HAPA"; const char * MY_PWD = "NENO LAKO HAPA"; const char * TS_SERVER = "api.thingspeak.com"; Kamba TS_API_KEY = "CHANNEL YAKO ANDIKA KIWANGO CHA API";

Pili, wacha tujumuishe maktaba muhimu sana kwa miradi ya IoT: SimpleTimer.h:

/ * KIPIMA * /

# pamoja na Timer Timer timer;

Tatu, wakati wa usanidi (), tutaanzisha mawasiliano ya serial, piga kazi connectWiFi () na tufafanue vipima muda. Kumbuka kuwa mstari wa nambari: timer.setInterval (60000L, sendDataTS); itaita kazi sendDataTS () kila sekunde 60, ili kupakia data kwenye kituo cha ThinkSpeak.

kuanzisha batili ()

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

Mwishowe lakini sio uchache, wakati wa kitanzi (), amri pekee inahitajika ni kuanzisha kipima muda na ndivyo ilivyo!

kitanzi batili ()

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

Chini, unaweza kuona kazi mbili muhimu zinazotumika kushughulikia mawasiliano ya Thinkspeak:

Uunganisho wa ESP12-E na mtandao wako wa WiFi:

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

* Kuunganisha WiFi *************************************************** *** / void connectWifi () {Serial.print ("Kuunganisha kwa" + * MY_SSID); WiFi.anza (MY_SSID, MY_PWD); wakati (WiFi.status ()! = WL_CONNECTED) {kuchelewesha (1000); Printa ya serial ("."); } Serial.println (""); Serial.println ("WiFi Imeunganishwa"); Serial.println (""); }

ESP12-E kutuma data kwa ThinkSpeak:

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

* Kutuma Takwimu kwenye Kituo cha Thinkspeak *********************************************** ****** / void sendDataTS (batili) {if (client.connect (TS_SERVER, 80)) {String postStr = TS_API_KEY; postStr + = "& uwanja1 ="; postStr + = Kamba (dataSensorUV); postStr + = "& shamba2 ="; postStr + = Kamba (indexUV); postStr + = "& uwanja3 ="; postStr + = Kamba (temp); postStr + = "& uwanja4 ="; postStr + = Kamba (hum); postStr + = "\ r / n / r / n"; alama ya mteja ("POST / sasisha HTTP / 1.1 / n"); mteja.print ("Mwenyeji: api.thingspeak.com / n"); alama ya mteja ("Uunganisho: funga / n"); alama ya mteja ("X-THINGSPEAKAPIKEY:" + TS_API_KEY + "\ n"); mteja.print ("Aina ya Maudhui: matumizi / x-www-form-urlencoded / n"); alama ya mteja ("Urefu wa Yaliyomo:"); alama ya mteja (postStr.length ()); alama ya mteja ("\ n / n"); alama ya mteja (postStr); kuchelewesha (1000); } imetumwa ++; mteja.acha (); }

Nambari kamili inaweza kupatikana kwenye GitHub yangu: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT

Mara baada ya kuwa na nambari iliyopakiwa kwenye NodeMCU yako. Wacha tuunganishe betri ya nje na tufanye kipimo chini ya jua. Ninaweka Kituo cha Remote juu ya paa na kuanza kunasa data kwenye ThingSpeak.com kama inavyoonekana kwenye picha hapo juu.

Hatua ya 7: Hitimisho

Hitimisho
Hitimisho

Kama kawaida, natumahi mradi huu unaweza kusaidia wengine kupata njia yao katika ulimwengu wa kusisimua wa umeme!

Kwa maelezo na nambari ya mwisho, tafadhali tembelea Hifadhi yangu ya GitHub: RPi-NodeMCU-Kituo cha Hali ya Hewa

Kwa miradi zaidi, tafadhali tembelea blogi yangu: MJRoBot.org

Endelea kufuatilia! Mafunzo yafuatayo tutatuma data kutoka kituo cha hali ya hewa ya mbali hadi katikati, kwa msingi wa seva ya Wavuti ya Raspberry Pi:

Picha
Picha

Saludos kutoka kusini mwa ulimwengu!

Tukutane kwenye mafunzo yangu yafuatayo!

Asante, Marcelo

Ilipendekeza: