Mundarija:

IoT osonlashtirildi: Masofadagi ob -havo ma'lumotlarini olish: UV va havo harorati va namligi: 7 qadam
IoT osonlashtirildi: Masofadagi ob -havo ma'lumotlarini olish: UV va havo harorati va namligi: 7 qadam

Video: IoT osonlashtirildi: Masofadagi ob -havo ma'lumotlarini olish: UV va havo harorati va namligi: 7 qadam

Video: IoT osonlashtirildi: Masofadagi ob -havo ma'lumotlarini olish: UV va havo harorati va namligi: 7 qadam
Video: Telefonning 15 ta siz bilmagan maxfiy kodlari/Телефоннинг сиз билмаган 15 та махфий кодлари 2024, Noyabr
Anonim
IoT osonlashtirildi: Uzoq ob -havo ma'lumotlarini olish: UV va havo harorati va namligi
IoT osonlashtirildi: Uzoq ob -havo ma'lumotlarini olish: UV va havo harorati va namligi

Ushbu qo'llanmada biz ultrabinafsha nurlanish (UV), havo harorati va namlik kabi masofaviy ma'lumotlarni olamiz. Bu ma'lumotlar juda muhim bo'ladi va kelajakda to'liq ob -havo stantsiyasida ishlatiladi.

Diagramma bloki oxirida biz nimani olishimizni ko'rsatadi.

Rasm
Rasm

1 -qadam: BoM - Materiallar hisobi

NodeMCU (ESP8266-12E) - 9.00 AQSh dollari

Namlik va harorat sensori (DHT22) - USD10.00

UV sensori - 4,00 AQSh dollari

OLED AQSh dollari 12.00

Non paneli - USD1.00

2 -qadam: Analog UV sensori

Analog UV sensori
Analog UV sensori
Analog UV sensori
Analog UV sensori
Analog UV sensori
Analog UV sensori

Bu UV sensori yorug'lik sezuvchi spektrda joylashgan ultrabinafsha nurlanishiga mutanosib analog chiqish hosil qiladi. U 240-370nm yorug'lik diapazonini (UVB va UVA spektrining ko'p qismini qamrab oladigan) yorug'lik diapazonini aniqlay oladigan UV fotodiodidan (Gallium nitrid asosidagi) foydalanadi. Fotodioddan signal darajasi juda kichik, nano-amper darajasida, shuning uchun modul signalni o'qiladigan volt darajasiga (0 dan 1V gacha) kuchaytirish uchun operatsion kuchaytirgichni o'rnatgan.

Sensor va op-amperni VCC-ni 3.3VDC (yoki 5VDC) ga va GND-ni elektr tokiga ulash orqali quvvatlantirish mumkin. Analog signalni OUT pinidan olish mumkin.

Uning chiqishi millivoltda bo'ladi va bizning NodeMCU analogli kirishi tomonidan o'qiladi. O'qib bo'lgach, qiymatlarni kod bilan yaxshiroq ishlashi uchun uni "aylantirish" (yoki "xarita") qilishimiz kerak. Biz buni readSensorUV () funktsiyasi bilan qila olamiz:

/ * UV sensorini mVda o'qing va UV indeksini hisoblang */

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

UV ma'lumotiga ega bo'lgandan so'ng, biz yuqorida ko'rsatilgan jadvalda ko'rsatilgan UV indeksini osongina hisoblashimiz mumkin. IndexCalculate () funktsiyasi biz uchun shunday qiladi:

/ * UV indeksini hisoblash */

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

3 -qadam: Displeyni o'rnatish: OLED

Displeyni o'rnatish: OLED
Displeyni o'rnatish: OLED
Displeyni o'rnatish: OLED
Displeyni o'rnatish: OLED

Sinov maqsadida biz ultrabinafsha o'lchagichimizga OLED -ni joylashtiramiz (bu qadam ixtiyoriy).

Sinov paytida ketma-ket monitordan foydalanish yaxshi, lekin siz prototiplaringizni shaxsiy kompyuteringizdan uzoqda rejimda ishlatsangiz nima bo'ladi? Buning uchun SSD1306 OLED -displeyini o'rnatamiz, uning asosiy xususiyatlari:

  • Displey hajmi: 0,96 dyuym
  • I2C IIC SPI seriyali
  • 128X64
  • Oq OLED LCD LED

Elektr diagrammasini bajaring va OLED -ning 4 ta pinini ulang:

  • VCC 3,3 V ga etadi
  • GND erga tushadi
  • SCL NodeMCU (GPIO 2) ==> D4 ga o'tadi
  • SDA NodeMCU (GPIO 0) ==> D3 ga o'tadi

Displeyni ulaganimizdan so'ng, kutubxonasini Arduino IDE -ga yuklab olamiz va o'rnatamiz: Daniel Eichhorn tomonidan ishlab chiqilgan "SSD1306 displeyi uchun ESP8266 OLED drayveri" (3.0.0 yoki undan katta versiyasidan foydalanganingizga ishonch hosil qiling!).

Kutubxonani Arduino IDE -ga o'rnating, uni SSD1306Wire.h saytida topishingiz mumkin

IDE -ni qayta ishga tushirgandan so'ng, kutubxona allaqachon o'rnatilgan bo'lishi kerak.

Kutubxona o'rnatilgan Wire.h kutubxonasi yordamida OLED-displeyga kirish uchun I2C protokolini qo'llab-quvvatlaydi:

/ * OLED */

#include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306 simli displey (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN);

Keling, OLED displeyimizda ishlatiladigan ba'zi muhim API -larni sanab o'tamiz. To'liq ro'yxatni yuqorida ko'rsatilgan GITHub -da topish mumkin.

A. Displeyni boshqarish:

void init (); // Displeyni ishga tushiring

void displayOn (bo'sh); // Displeyni void displayOff (void) ga aylantiring; // Displeyni o'chirishni bekor qiling (bo'sh); // Mahalliy piksel buferining bo'sh joyini tozalash flipScreenVertically (); // Displeyni teskari aylantiring

B. Matn operatsiyalari:

void drawString (int16_t x, int16_t y, String matni); // (xpos, ypos, "Matn")

void setFont (const char* fontData); // Joriy shriftni o'rnatadi.

Mavjud standart shriftlar:

  • ArialMT_Plain_10,
  • ArialMT_Plain_16,

  • ArialMT_Plain_24

OLED -ning o'zi ham, kutubxonasi ham o'rnatilgandan so'ng, uni sinab ko'rish uchun oddiy dastur yozamiz. IDE -ga quyidagi kodni kiriting, natija yuqoridagi rasmda ko'rsatilgandek bo'lishi kerak:

* OLED */

#include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306 simli displey (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } void loop () {} / * OLED -da sozlash ma'lumotlarini ishga tushirish va ko'rsatish * / void displaySetup () {display.init (); // displey displeyini ishga tushirish.clear (); // Displeyni tozalash.flipScreenVertically (); // Displeyni teskari aylantiring display.display (); // Ma'lumotlarni ekranga qo'ying Serial.println ("Displey testini boshlash"); display.setFont (ArialMT_Plain_24); display.drawString (30, 0, "OLED"); // (xpos, ypos, "Matn") display.setFont (ArialMT_Plain_16); display.drawString (18, 29, "Sinov boshlandi"); display.setFont (ArialMT_Plain_10); display.drawString (10, 52, "Serial BaudRate:"); display.drawString (90, 52, String (11500)); display.display (); // ma'lumotlarni kechiktirishga qo'ying (3000); }

Yuqoridagi dasturni mening GitHub -dan yuklab olish mumkin:

NodeMCU_OLED_Test

4 -qadam: Mahalliy UV o'lchagich

Mahalliy UV o'lchagich
Mahalliy UV o'lchagich
Mahalliy UV o'lchagich
Mahalliy UV o'lchagich

Endi OLED -displey o'rnatilgan bo'lsa, biz "UV o'lchagich" yordamida batareyani ulashimiz va masofadan turib ba'zi sinovlarni o'tkazishimiz mumkin.

#WW_VERSION "UV_Sensor_V.1" ni aniqlang.

/ * UV sensori */ #define sensorUVPin A0 int dataSensorUV = 0; int indexUV = 0; / * OLED */ #include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306 simli displey (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } void loop () {readSensorUV (); displeyUV (); kechikish (1000); } / * OLED -da sozlash ma'lumotlarini ishga tushirish va ko'rsatish * / void displaySetup () {display.init (); // displey displeyini ishga tushirish.clear (); // Displeyni tozalash.flipScreenVertically (); // Displeyni teskari aylantiring display.display (); // Ma'lumotlarni ekranga qo'ying Serial.println ("UV sensori sinovini boshlash"); display.setFont (ArialMT_Plain_24); display.drawString (10, 0, "MJRoBot"); display.setFont (ArialMT_Plain_16); display.drawString (0, 29, "UV sensori testi"); display.setFont (ArialMT_Plain_10); display.drawString (0, 52, "SW Ver.:"); display.drawString (45, 52, SW_VERSION); display.display (); kechikish (3000); } / * UV sensorini mVda o'qing va UV indeksini hisoblashni chaqiring * / void readSensorUV () {bayt numOfReadings = 5; dataSensorUV = 0; uchun (int i = 0; i <numOfReadings; i ++) {dataSensorUV+= analogRead (sensorUVPin); kechikish (200); } dataSensorUV /= numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023.0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); } / * UV indeksini hisoblash * / void indexCalculate () {if (dataSensorUV <227) indexUV = 0; aks holda (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; aks holda (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; aks holda (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; aks holda (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; aks holda (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; aks holda (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; aks holda (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; aks holda (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; aks holda (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; aks holda (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; boshqa indexUV = 11; } /* UV qiymatlarini mahalliy OLEDda ko'rsatish* / void displayUV () {display.clear (); display.setFont (ArialMT_Plain_16); display.drawString (20, 0, "UV sensori"); display.drawString (0, 23, "UV (mV):"); display.drawString (80, 23, String (dataSensorUV)); display.drawString (0, 48, "UV indeksi:"); display.setFont (ArialMT_Plain_24); display.drawString (82, 42, String (indexUV)); display.display (); }

Yuqoridagi kodni GitHun -dan yuklab olish mumkin: NodeMCU_UV_Sensor_OLED.ino

5 -qadam: Havoning harorati va namligini o'lchash uchun DHT22 ni o'rnatish

Havoning harorati va namligini o'lchash uchun DHT22 o'rnatish
Havoning harorati va namligini o'lchash uchun DHT22 o'rnatish
Havoning harorati va namligini o'lchash uchun DHT22 o'rnatish
Havoning harorati va namligini o'lchash uchun DHT22 o'rnatish

Ob -havo ma'lumotlarini olish uchun eng ko'p ishlatiladigan sensorlardan biri bu DHT22 (yoki uning akasi DHT11), raqamli nisbiy namlik va harorat sensori. Atrofdagi havoni o'lchash uchun namlik sensori va termistor ishlatiladi va ma'lumotlar piniga raqamli signal chiqariladi (analog kirish pinlari kerak emas).

Sensor 3,3 V dan 5 V gacha bo'lishi kerak va -40 ° C dan +80 ° C gacha haroratda +/- 0,5 ° C, nisbiy namlik uchun +/- 2% aniqlikda ishlaydi. Shuni ham yodda tutish kerakki, uning sezish davri o'rtacha 2 soniya (o'qishlar orasidagi minimal vaqt). Adafruit sayti DHT22 va uning akasi DHT11 haqida juda ko'p ma'lumot beradi. Qo'shimcha ma'lumot olish uchun DHT22/11 o'quv qo'llanmasiga tashrif buyuring.

DHT22 -da 4 ta pin bor (sensorga qaragan holda, 1 -pin eng chapda):

  1. VCC (biz NodeMCU -dan 3.3V ga ulanamiz);
  2. Ma'lumotlar chiqishi;
  3. Ulanmagan va
  4. Zamin.

Odatda sensordan 20 m dan kam masofada foydalanilganda, Data va VCC pinlari orasiga 10K qarshilik ulanishi kerak. Chiqish pin NodeMCU pin D3 ga ulanadi (yuqoridagi diagramaga qarang). Sensor bizning modulga o'rnatilgandan so'ng, DHT kutubxonasini Adafruit GitHub omboridan yuklab oling va uni Arduino kutubxonasi fayliga o'rnating. Arduino IDE -ni qayta yuklaganingizdan so'ng, "DHT sensor kutubxonasi" o'rnatilishi kerak.

Kodning boshida biz qatorlarni kiritishimiz kerak:

/* DHT22*/

#"DHT.h" qo'shish #DHTPIN D2 ta'rifi #DHTTYPE DHT22 DHT dht (DHTPIN, DHTTYPE); float hum = 0; suzish harorati = 0;

Sensorni o'qish uchun yangi funksiya yaratiladi:

/ * DHT ma'lumotlarini olish */

void getDhtData (void) {float tempIni = temp; float humIni = xum; temp = dht.readTemperature (); hum = dht.readHumidity (); if (isnan (hum) || isnan (temp)) // Har qanday o'qishning muvaffaqiyatsizligini tekshiring va erta chiqing (qaytadan urinish uchun). {Serial.println ("DHT sensoridan o'qib bo'lmadi!"); temp = tempIni; xum = humIni; qaytish; }}

UV va DHT sensorlarini o'z ichiga olgan to'liq kodni GitHub -dan yuklab olish mumkin: NodeMCU_UV_DHT_Sensor_OLED

6 -qadam: ma'lumotlarni ThingSpeak.com saytiga yuborish

ThingSpeak.com saytiga ma'lumotlarni yuborish
ThingSpeak.com saytiga ma'lumotlarni yuborish
ThingSpeak.com saytiga ma'lumotlarni yuborish
ThingSpeak.com saytiga ma'lumotlarni yuborish
ThingSpeak.com saytiga ma'lumotlarni yuborish
ThingSpeak.com saytiga ma'lumotlarni yuborish

Hozircha biz faqat NodeMCU ESP12-E ni oddiy va oddiy Arduino platasi sifatida ishlatganmiz. Albatta, bizda bu ajoyib chipning haqiqiy salohiyati bor-yo'g'i "chizilgan" va hozir osmonga ko'tarilish vaqti keldi! Yoki yulduzlar uchun yaxshiroq! Eh … bulutga!;-)

Boshlaylik!

  1. Birinchidan, ThinkSpeak.com saytida hisob qaydnomangiz bo'lishi kerak
  2. Kanal yaratish uchun ko'rsatmalarga amal qiling va kanal identifikatoringiz va API yozish kalitini yozib oling
  3. Quyidagi kodni Wi -Fi tarmog'i va Thinkspeak hisob ma'lumotlari bilan yangilang
  4. IDE -da dasturni ishga tushiring

Keling, kodning eng muhim qismlarini sharhlaylik:

Birinchidan, ESP8266 kutubxonasiga qo'ng'iroq qilamiz, WiFi mijozini aniqlaymiz va mahalliy Router va Thinkspeak hisob ma'lumotlarini aniqlaymiz:

/* ESP12-E & Thinkspeak*/

#WiFiClient mijozini qo'shing; const char* MY_SSID = "Bu erda SSD identifikatoringiz"; const char* MY_PWD = "PAROLINGIZ BU YERDA"; const char* TS_SERVER = "api.thingspeak.com"; String TS_API_KEY = "KANALINGIZ API KEYIT YOZING";

Ikkinchidan, keling, IoT loyihalari uchun juda muhim kutubxonani o'z ichiga olaylik: SimpleTimer.h:

/ * TAYMER */

#SimpleTimer taymerini qo'shing;

Uchinchidan, setup () paytida biz ketma -ket muloqotni boshlaymiz, connectWiFi () funktsiyasini chaqiramiz va taymerlarni aniqlaymiz. E'tibor bering, kod qatori: timer.setInterval (60000L, sendDataTS); ThinkSpeak kanaliga ma'lumotlarni yuklash uchun har 60 soniyada sendDataTS () funktsiyasini chaqiradi.

bo'sh o'rnatish ()

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

Nihoyat, lekin hech bo'lmaganda, loop () paytida, taymerni ishga tushirish uchun yagona buyruq kerak va bu hammasi!

bo'sh halqa ()

{… timer.run (); // SimpleTimer -ni ishga tushiradi}

Quyida, Thinkspeak aloqasini boshqarish uchun ishlatiladigan ikkita muhim funktsiyani ko'rishingiz mumkin:

WiFi tarmog'ingiz bilan ESP12-E ulanishi:

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

*Wi -Fi tarmog'iga ulanish ********************************************* ***/ void connectWifi () {Serial.print ("Ulanish"+*MY_SSID); WiFi.begin (MY_SSID, MY_PWD); while (WiFi.status ()! = WL_CONNECTED) {kechikish (1000); Serial.print ("."); } Serial.println (""); Serial.println ("Wi -Fi ulangan"); Serial.println (""); }

ESP12-E ThinkSpeak-ga ma'lumotlarni yuboradi:

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

*Ma'lumotni Thinkspeak kanaliga yuborish **************************************** ******/ void sendDataTS (void) {if (client.connect (TS_SERVER, 80)) {String postStr = TS_API_KEY; postStr += "& maydon1 ="; postStr += String (dataSensorUV); postStr += "& maydon2 ="; postStr += String (indexUV); postStr += "& field3 ="; postStr += String (temp); postStr += "& field4 ="; postStr += String (xum); postStr += "\ r / n / r / n"; client.print ("POST /yangilash HTTP /1.1 / n"); client.print ("Xost: api.thingspeak.com / n"); client.print ("Ulanish: yopish / 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); kechikish (1000); } yuborildi ++; client.stop (); }

To'liq kodni GitHub -da topishingiz mumkin: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT

Kodni NodeMCU -ga yuklaganingizdan so'ng. Keling, tashqi batareyani ulab, quyosh ostida o'lchov o'tkazaylik. Men masofadagi stansiyani tomga qo'ydim va ThingSpeak.com saytidagi ma'lumotlarni yuqoridagi rasmlarda ko'rsatilgandek yozib olishni boshladim.

7 -qadam: Xulosa

Xulosa
Xulosa

Har doimgidek, men umid qilamanki, bu loyiha boshqalarga ajoyib elektronika olamiga yo'l topishga yordam beradi!

Tafsilotlar va yakuniy kod uchun GitHub depozitariyamga tashrif buyuring: RPi-NodeMCU-Weather-Station

Boshqa loyihalar uchun mening blogimga tashrif buyuring: MJRoBot.org

Yangiliklarni kuzatib boring, xabardor bo'lib boring; Biz bilan qoling! Keyingi darsda biz Raspberry Pi veb -serveriga asoslangan masofadagi ob -havo stantsiyasidan ma'lumotlarni markazga yuboramiz:

Rasm
Rasm

Dunyoning janubidan salomlar!

Keyingi ko'rsatuvlarimda ko'rishguncha!

Rahmat, Marselo

Tavsiya: