Mundarija:
- 1 -qadam: BoM - Materiallar hisobi
- 2 -qadam: Analog UV sensori
- 3 -qadam: Displeyni o'rnatish: OLED
- 4 -qadam: Mahalliy UV o'lchagich
- 5 -qadam: Havoning harorati va namligini o'lchash uchun DHT22 ni o'rnatish
- 6 -qadam: ma'lumotlarni ThingSpeak.com saytiga yuborish
- 7 -qadam: Xulosa
Video: IoT osonlashtirildi: Masofadagi ob -havo ma'lumotlarini olish: UV va havo harorati va namligi: 7 qadam
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-02-01 14:43
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.
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
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
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
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
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):
- VCC (biz NodeMCU -dan 3.3V ga ulanamiz);
- Ma'lumotlar chiqishi;
- Ulanmagan va
- 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
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!
- Birinchidan, ThinkSpeak.com saytida hisob qaydnomangiz bo'lishi kerak
- Kanal yaratish uchun ko'rsatmalarga amal qiling va kanal identifikatoringiz va API yozish kalitini yozib oling
- Quyidagi kodni Wi -Fi tarmog'i va Thinkspeak hisob ma'lumotlari bilan yangilang
- 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
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:
Dunyoning janubidan salomlar!
Keyingi ko'rsatuvlarimda ko'rishguncha!
Rahmat, Marselo
Tavsiya:
Oddiy IoT harorati va namligi o'lchagichi: 5 qadam (rasmlar bilan)
Oddiy IoT harorati va namligi o'lchagichi: Oddiy IoT harorati va namligi o'lchagichi sizga harorat, namlik va issiqlik indekslarini yig'ish imkonini beradi. Keyin ularni Adafruit IO ga yuboring
LORA harorati va tuproq namligi sensori: 6 qadam
LORA harorati va tuproq namligi sensori: Men issiqxonani tayyorlashda issiqxona muhitini kuzatish uchun sensornodlar tayyorlayman. Bu sensorni tashqarida ham ishlatishingiz mumkin. Issiqxonaning ichidagi yoki tashqarisidagi haroratni er harorati bilan birgalikda ishlatish
ESP8266 NodeMCU kirish nuqtasi (AP) DT11 harorat sensori va brauzerda bosma harorati va namligi bo'lgan veb -server uchun: 5 qadam
Brauzerda DT11 harorat sensori va bosib chiqarish harorati va namligi bo'lgan veb -server uchun ESP8266 NodeMCU kirish nuqtasi (AP): Salom bolalar, biz ESP8266 -dan foydalanadigan ko'pgina loyihalarda va ESP8266 -ni veb -server sifatida ishlatamiz, shuning uchun ma'lumotlarga kirish mumkin. ESP8266 tomonidan joylashtirilgan veb -serverga kirish orqali Wi -Fi orqali ishlaydigan har qanday qurilma, lekin yagona muammo shundaki, biz uchun ishlaydigan yo'riqnoma kerak
WEMOS D1 harorati/namligi IoT: 6 qadam
WEMOS D1 Temp/Humidity IoT: Bu Wi -Fi tarmog'iga ulanadigan va ma'lumotlaringizni Blynk IoT platformasiga "hisobot beradigan" IoT harorati va namligi sensori yordamida ishga kirish uchun oddiy yig'ilish, ulanish, kompilyatsiya loyihasi. Smartfon orqali kuzatuvni osonlashtirish. Asse yonida
WiFi IoT harorati va namligi sensori. Qism: 8 IoT, uy avtomatizatsiyasi: 9 qadam
WiFi IoT harorati va namligi sensori. Bo'lim: 8 IoT, uy avtomatizatsiyasi: kirish qismi Ushbu maqola avvalgi IoT Wi -Fi qurilmasini "qo'g'irchoqlash" qo'llanmasining amaliy mustahkamligi va oldinga rivojlanishini hujjatlashtiradi. 4 -qism: IoT, uy avtomatizatsiyasi, shu jumladan muvaffaqiyatga erishish uchun zarur bo'lgan barcha dasturiy ta'minot funktsiyalari