Mündəricat:

IoT Asanlaşdırıldı: Uzaq Hava Məlumatlarının Tutulması: UV və Hava İstiliyi və Rütubət: 7 Addım
IoT Asanlaşdırıldı: Uzaq Hava Məlumatlarının Tutulması: UV və Hava İstiliyi və Rütubət: 7 Addım

Video: IoT Asanlaşdırıldı: Uzaq Hava Məlumatlarının Tutulması: UV və Hava İstiliyi və Rütubət: 7 Addım

Video: IoT Asanlaşdırıldı: Uzaq Hava Məlumatlarının Tutulması: UV və Hava İstiliyi və Rütubət: 7 Addım
Video: Комендантский час. Горожане Средневековья. 2024, Iyul
Anonim
IoT Asanlaşdırıldı: Uzaq Hava Məlumatlarının Tutulması: UV və Hava İstiliyi və Rütubət
IoT Asanlaşdırıldı: Uzaq Hava Məlumatlarının Tutulması: UV və Hava İstiliyi və Rütubət

Bu təlimatda, UV (Ultra-Bənövşəyi radiasiya), hava istiliyi və rütubət kimi uzaq məlumatları tutacağıq. Bu məlumatlar çox vacib olacaq və gələcəkdə tam bir Hava İstasyonunda istifadə ediləcək.

Blok Diyagramı, sonunda nə əldə edəcəyimizi göstərir.

Şəkil
Şəkil

Addım 1: BoM - Material Bill

NodeMCU (ESP8266-12E) - USD 9.00

Rütubət və Temperatur Sensoru (DHT22) - USD10.00

UV Sensor - 4.00 USD

OLED USD 12.00

Çörək lövhəsi - USD1.00

Addım 2: Analog UV Sensor

Analog UV Sensor
Analog UV Sensor
Analog UV Sensor
Analog UV Sensor
Analog UV Sensor
Analog UV Sensor

Bu UV sensoru, işıq algılayıcı spektrdə tapılan Ultra-Bənövşəyi radiasiyaya mütənasib olaraq analoq bir çıxış yaradır. 240-370nm işıq diapazonunu (UVB və UVA spektrinin çox hissəsini əhatə edən) müəyyən edə bilən UV fotodiodundan (Gallium Nitride əsaslanaraq) istifadə edir. Fotodioddan gələn siqnal səviyyəsi nano-amper səviyyəsində çox kiçikdir, buna görə modul siqnalın daha oxunaqlı bir volt səviyyəsinə (0-dan 1V-a) qədər gücləndirilməsi üçün əməliyyat gücləndiricisi quraşdırmışdır.

Sensor və op-amp, VCC-ni 3.3VDC-yə (və ya 5VDC) və GND-ni elektrik torpağına bağlayaraq işləyə bilər. Analog siqnal OUT pinindən əldə edilə bilər.

Çıxışı millivoltda olacaq və NodeMCU -nun Analog Girişində oxunacaq. Oxunduqdan sonra dəyərlərin kodla daha yaxşı işlənməsi üçün onu "çevirməliyik" (və ya "xəritə") etməliyik. ReadSensorUV () funksiyası ilə edə bilərik:

/ * UV Sensorunu mV -də oxuyun və UV indeksi hesablamasına zəng edin */

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

UV məlumatlarına sahib olduqdan sonra yuxarıdakı cədvəldə göstərildiyi kimi UV indeksini asanlıqla hesablaya bilərik. İndexCalculate () funksiyası bunu bizim üçün edəcək:

/ * UV indeksinin hesablanması */

void indexCalculate () {if (dataSensorUV <227) indexUV = 0; başqa halda (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; başqa halda (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; başqa əgər (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; başqa halda (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; başqa halda (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; başqa halda (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; başqa halda (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; başqa halda (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; başqa halda (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; başqa halda (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; başqa indexUV = 11; }

Addım 3: Ekranın quraşdırılması: OLED

Ekranın quraşdırılması: OLED
Ekranın quraşdırılması: OLED
Ekranın quraşdırılması: OLED
Ekranın quraşdırılması: OLED

Test məqsədləri üçün UV sayğacımıza OLED daxil edəcəyik (Bu addım tamamilə isteğe bağlıdır).

Testlər zamanı Serial Monitordan istifadə etmək yaxşıdır, ancaq prototiplərinizi PC-dən uzaq bir rejimdə istifadə edərkən nə baş verir? Bunun üçün əsas xüsusiyyətləri olan SSD1306 OLED ekranı quraşdıraq:

  • Ekran ölçüsü: 0.96"
  • I2C IIC SPI seriyası
  • 128X64
  • Ağ OLED LCD LED

Elektrik sxemini izləyin və OLED -in 4 pinini bağlayın:

  • VCC 3.3V -ə qədər gedir
  • GND yerə gedir
  • SCL NodeMCU (GPIO 2) ==> D4 -ə gedir
  • SDA NodeMCU (GPIO 0) ==> D3 -ə gedir

Ekranı bağladıqdan sonra kitabxanasını Arduino IDE -yə yükləyək və quraşdıraq: Daniel Eichhorn tərəfindən hazırlanmış "SSD1306 ekranı üçün ESP8266 OLED Sürücü" (Version 3.0.0 və ya daha böyük istifadə etdiyinizə əmin olun!).

Kitabxananı SSD1306Wire.h -də tapa biləcəyiniz Arduino IDE -yə quraşdırın

IDE -ni yenidən başladıqdan sonra kitabxana artıq quraşdırılmalıdır.

Kitabxana, quraşdırılmış Wire.h kitabxanasından istifadə edərək OLED ekrana daxil olmaq üçün I2C protokolunu dəstəkləyir:

/ * OLED */

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

OLED displeyimizdə istifadə ediləcək bəzi vacib API -ləri sadalayaq. Tam siyahını yuxarıda göstərilən GITHub -da tapa bilərsiniz.

A. Ekran Nəzarəti:

void init (); // Ekranı işə salın

void displayOn (boş); // Ekranı void displayOff -a çevirin (void); // Ekranı söndürün boşluğu silin (boş); // Yerli piksel tampon boşluğunu sil flipScreenVertically (); // Ekranı tərs çevirin

B. Mətn əməliyyatları:

void drawString (int16_t x, int16_t y, String mətni); // (xpos, ypos, "Mətn")

boşluq setFont (const char* fontData); // Mövcud fontu təyin edir.

Mövcud standart şriftlər:

  • ArialMT_Plain_10,
  • ArialMT_Plain_16,

  • ArialMT_Plain_24

Həm OLED özü, həm də Kitabxanası quraşdırıldıqdan sonra onu sınamaq üçün sadə bir proqram yazaq. IDE -də aşağıdakı kodu daxil edin, nəticə yuxarıdakı fotoşəkildə göstərildiyi kimi bir ekran olmalıdır:

* OLED */

#include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306Wire ekran (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } void loop () {} / * OLED -də quraşdırma məlumatlarını başladın və göstərin * / void displaySetup () {display.init (); // display display.clear (); // Ekran görüntüsünü təmizləyin.flipScreenVertically (); // Ekranı tərs çevirin display.display (); // Məlumatları ekrana qoyun Serial.println ("Ekran Testinin Başlanması"); display.setFont (ArialMT_Plain_24); display.drawString (30, 0, "OLED"); // (xpos, ypos, "Mətn") display.setFont (ArialMT_Plain_16); display.drawString (18, 29, "Test başladıldı"); display.setFont (ArialMT_Plain_10); display.drawString (10, 52, "Serial BaudRate:"); display.drawString (90, 52, String (11500)); display.display (); // Məlumatları ekran gecikməsinə qoyun (3000); }

Yuxarıdakı proqramı GitHub -dan yükləyə bilərsiniz:

NodeMCU_OLED_Test

Addım 4: Yerli UV Ölçən

Yerli UV ölçmə cihazı
Yerli UV ölçmə cihazı
Yerli UV ölçmə cihazı
Yerli UV ölçmə cihazı

İndi, OLED ekranı quraşdırıldıqda, "UV Meter" ini istifadə edərək bir batareyanı bağlaya və uzaqdan sınaqdan keçirə bilərik.

#define SW_VERSION "UV_Sensor_V.1"

/ * UV Sensor */ #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; SSD1306Wire ekran (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } boşluq döngəsi () {readSensorUV (); DisplayUV (); gecikmə (1000); } / * OLED -də quraşdırma məlumatlarını başladın və göstərin * / void displaySetup () {display.init (); // display display.clear (); // Təmiz ekran.flipScreenVertically (); // Ekranı tərs çevirin display.display (); // Məlumatları ekrana qoyun Serial.println ("UV Sensor Testinin Başlanması"); display.setFont (ArialMT_Plain_24); display.drawString (10, 0, "MJRoBot"); display.setFont (ArialMT_Plain_16); display.drawString (0, 29, "UV Sensor Testi"); display.setFont (ArialMT_Plain_10); display.drawString (0, 52, "SW Ver.:"); display.drawString (45, 52, SW_VERSION); display.display (); gecikmə (3000); } / * UV Sensorunu mV -də oxuyun və UV indeksi hesablamasını çağırın * / void readSensorUV () {byte numOfReadings = 5; dataSensorUV = 0; for (int i = 0; i <numOfReadings; i ++) {dataSensorUV+= analogRead (sensorUVPin); gecikmə (200); } dataSensorUV /= numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023.0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); } / * UV indeksinin hesablanması * / void indexCalculate () {if (dataSensorUV <227) indexUV = 0; başqa əgər (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; başqa halda (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; başqa əgər (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; başqa halda (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; başqa halda (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; başqa halda (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; başqa halda (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; başqa halda (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; başqa halda (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; başqa halda (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; başqa indexUV = 11; } /* UV dəyərlərini yerli OLED -də göstərin* / void 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 İndeksi:"); display.setFont (ArialMT_Plain_24); display.drawString (82, 42, String (indexUV)); display.display (); }

Yuxarıdakı kodu GitHun -dan yükləyə bilərsiniz: NodeMCU_UV_Sensor_OLED.ino

Addım 5: Hava İstiliyi və Rütubət Ölçmələri üçün DHT22 Quraşdırılması

Hava İstiliyi və Rütubət Ölçmələri üçün DHT22 quraşdırılması
Hava İstiliyi və Rütubət Ölçmələri üçün DHT22 quraşdırılması
Hava İstiliyi və Rütubət Ölçmələri üçün DHT22 quraşdırılması
Hava İstiliyi və Rütubət Ölçmələri üçün DHT22 quraşdırılması

Hava məlumatlarını çəkmək üçün ən çox istifadə edilən sensorlardan biri rəqəmsal nisbi rütubət və temperatur sensoru olan DHT22 (və ya qardaşı DHT11) -dir. Ətrafdakı havanı ölçmək üçün kapasitiv rütubət sensoru və bir termistor istifadə edir və məlumat pinində rəqəmsal bir siqnal tökür (analoq giriş pinlərinə ehtiyac yoxdur).

Sensor 3.3V və 5V arasında olmalıdır və temperatur üçün +/- 0.5oC, nisbi Nəmlik üçün +/- 2% dəqiqliyi ilə -40oC ilə +80oC arasında işləyəcək. Hiss etmə müddətinin orta hesabla 2 saniyə olduğunu (oxumalar arasındakı minimum vaxt) nəzərə almaq da vacibdir. Adafruit saytı həm DHT22, həm də qardaşı DHT11 haqqında çoxlu məlumat verir. Daha ətraflı məlumat üçün DHT22/11 Tutorial səhifəsinə daxil olun.

DHT22 -də 4 sancaq var (sensora baxan pin 1 ən soldadır):

  1. VCC (NodeMCU -dan 3.3V -ə qoşulacağıq);
  2. Məlumat çıxdı;
  3. Bağlı deyil və
  4. Zəmin.

Sensoru 20 m -dən az məsafələrdə istifadə etdikdən sonra, Data və VCC pinləri arasında 10K rezistor bağlanmalıdır. Çıxış pin NodeMCU pin D3 -ə bağlanacaq (yuxarıdakı diaqrama baxın). Sensor modulumuza quraşdırıldıqdan sonra DHT kitabxanasını Adafruit GitHub deposundan yükləyin və Arduino Kitabxana sənədinizə quraşdırın. Arduino IDE -ni yenidən yüklədikdən sonra "DHT sensor kitabxanası" quraşdırılmalıdır.

Kodun əvvəlində sətirləri daxil etməliyik:

/* DHT22*/

#"DHT.h" daxil edin #DHTPIN D2 təyin edin #DHTTYPE DHT22 DHT dht (DHTPIN, DHTTYPE); float hum = 0; float temp = 0;

Sensoru oxumaq üçün yeni bir funksiya yaradılacaq:

/ * DHT məlumatlarını əldə edin */

void getDhtData (void) {float tempIni = temp; float humIni = zümzümə; temp = dht.readTemperature (); hum = dht.readHumidity (); if (isnan (hum) || isnan (temp)) // Hər hansı bir oxunun uğursuz olub olmadığını yoxlayın və erkən çıxın (yenidən cəhd etmək üçün). {Serial.println ("DHT sensorundan oxunmadı!"); temp = tempIni; hum = humIni; qayıtmaq; }}

UV və DHT sensorlar daxil olmaqla tam kodu GitHub -dan yükləyə bilərsiniz: NodeMCU_UV_DHT_Sensor_OLED

Addım 6: ThingSpeak.com -a məlumat göndərmək

ThingSpeak.com -a məlumat göndərilməsi
ThingSpeak.com -a məlumat göndərilməsi
ThingSpeak.com -a məlumat göndərilməsi
ThingSpeak.com -a məlumat göndərilməsi
ThingSpeak.com saytına məlumat göndərilməsi
ThingSpeak.com saytına məlumat göndərilməsi

İndiyə qədər yalnız NodeMCU ESP12-E-ni adi və adi bir Arduino lövhəsi olaraq istifadə etdik. Əlbəttə ki, bu möhtəşəm çipin real potensialını yalnız "cızmışıq" və indi göyə qalxmağın vaxtıdır! Və ya ulduzlar üçün daha yaxşıdır! Eh … buluda!;-)

Başlayaq!

  1. Əvvəlcə ThinkSpeak.com -da bir hesabınız olmalıdır
  2. Kanal yaratmaq üçün təlimatları izləyin və Kanal ID -ni və API Açarını Yazın
  3. Aşağıdakı kodu WiFi şəbəkəniz və Thinkspeak etimadnamənizlə yeniləyin
  4. Proqramı IDE -də işə salın

Kodun ən vacib hissələrini şərh edək:

Əvvəlcə ESP8266 kitabxanasına zəng edək, WiFi müştərisini təyin edək və yerli Router və Thinkspeak etimadnamənizi təyin edək:

/* ESP12-E & Düşünmək*/

#WiFiClient müştəri daxil edin; const char* MY_SSID = "BURADA SSD ID'niz"; const char* MY_PWD = "ŞİFRİNİZ BURADA"; const char* TS_SERVER = "api.thingspeak.com"; String TS_API_KEY = "KANALINIZA API KEYDİNİ YAZIN";

İkincisi, IoT layihələri üçün çox əhəmiyyətli bir kitabxana daxil edək: SimpleTimer.h:

/ * ZAMANLAYICI */

#SimpleTimer timer daxil edin;

Üçüncüsü, quraşdırma () zamanı serial ünsiyyətə başlayacağıq, connectWiFi () funksiyasını çağıracağıq və taymerləri təyin edəcəyik. Qeyd edək ki, kod xətti: timer.setInterval (60000L, sendDataTS); ThinkSpeak kanalına məlumat yükləmək üçün hər 60 saniyədə sendDataTS () funksiyasını çağıracaq.

boş quraşdırma ()

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

Nəhayət, ən azı, loop () zamanı lazım olan yeganə əmr sayğacı işə salmaqdır və budur!

boşluq döngəsi ()

{… Timer.run (); // SimpleTimer başlatır}

Aşağıda, Thinkspeak ünsiyyətini idarə etmək üçün istifadə olunan iki vacib funksiyanı görə bilərsiniz:

WiFi şəbəkənizlə ESP12-E bağlantısı:

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

*WiFi qoşulması ********************************************* ***/ void connectWifi () {Serial.print ("Bağlanır"+*MY_SSID); WiFi.begin (MY_SSID, MY_PWD); while (WiFi.status ()! = WL_CONNECTED) {gecikmə (1000); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi Bağlandı"); Serial.println (""); }

ThinkSpeak-ə məlumat göndərən ESP12-E:

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

*Thinkspeak Kanalına Məlumat Göndərmək **************************************** ******/ 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 (zümzümə); postStr += "\ r / n / r / n"; client.print ("POST /yeniləmə HTTP /1.1 / n"); client.print ("Host: api.thingspeak.com / n"); client.print ("Bağlantı: yaxın / n"); client.print ("X-THINGSPEAKAPIKEY:" + TS_API_KEY + "\ n"); client.print ("Content-Type: application/x-www-form-urlencoded / n"); client.print ("Məzmun-Uzunluq:"); client.print (postStr.length ()); client.print ("\ n / n"); client.print (postStr); gecikmə (1000); } göndərildi ++; client.stop (); }

Tam kodu GitHub -da tapa bilərsiniz: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT

Kodu NodeMCU -ya yüklədikdən sonra. Xarici bir batareyanı bağlayaq və günəş altında bir ölçü edək. Uzaq stansiyanı damın üstünə qoydum və yuxarıdakı fotoşəkillərdə göstərildiyi kimi ThingSpeak.com saytında məlumat toplamağa başladım.

Addım 7: Nəticə

Nəticə
Nəticə

Həmişə olduğu kimi, ümid edirəm ki, bu layihə başqalarına maraqlı elektronika dünyasına yol tapmağa kömək edə bilər!

Detallar və son kod üçün GitHub depozitimi ziyarət edin: RPi-NodeMCU-Hava İstasyonu

Daha çox layihə üçün blogumu ziyarət edin: MJRoBot.org

İzləmədə qalın! Növbəti dərsdə məlumatları Raspberry Pi veb serverinə əsaslanaraq uzaq bir hava stansiyasından mərkəzi bir stansiyaya göndərəcəyik:

Şəkil
Şəkil

Dünyanın cənubundan salamlar!

Növbəti təlimatımda görüşənədək!

Çox sağ ol, Marcelo

Tövsiyə: