Isi kandungan:

IoT Diperlukan: Menangkap Data Cuaca Jauh: Suhu & Kelembapan UV dan Udara: 7 Langkah
IoT Diperlukan: Menangkap Data Cuaca Jauh: Suhu & Kelembapan UV dan Udara: 7 Langkah

Video: IoT Diperlukan: Menangkap Data Cuaca Jauh: Suhu & Kelembapan UV dan Udara: 7 Langkah

Video: IoT Diperlukan: Menangkap Data Cuaca Jauh: Suhu & Kelembapan UV dan Udara: 7 Langkah
Video: #9 DCOM TB1: Implementasi Sistem Monitoring Suhu Ruang Server Berbasis IOT)Menggunakan MQTT 2024, November
Anonim
IoT Dimudahkan: Menangkap Data Cuaca Jauh: Suhu & Kelembapan UV dan Udara
IoT Dimudahkan: Menangkap Data Cuaca Jauh: Suhu & Kelembapan UV dan Udara

Pada tutorial ini, kami akan menangkap data jarak jauh sebagai UV (sinaran Ultra-Violet), suhu dan kelembapan udara. Data tersebut akan sangat penting dan akan digunakan di Stesen Cuaca yang lengkap di masa hadapan.

Diagram blok menunjukkan apa yang akan kita perolehi pada akhirnya.

Imej
Imej

Langkah 1: BoM - Bil Bahan

NodeMCU (ESP8266-12E) - USD 9.00

Sensor Kelembapan dan Suhu (DHT22) - USD10.00

Sensor UV - USD 4.00

OLED USD 12.00

Papan Roti - USD1.00

Langkah 2: Sensor UV Analog

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

Sensor UV ini menghasilkan output analog yang berkadaran dengan sinaran Ultra-Violet yang terdapat pada spektrum penderiaan cahaya. Ia menggunakan fotodiod UV (berdasarkan Gallium Nitride), yang dapat mengesan jarak cahaya 240-370nm (yang merangkumi UVB dan sebahagian besar spektrum UVA). Tahap isyarat dari photodiode sangat kecil, pada tahap nano-ampere, jadi modul telah menyertakan penguat operasi untuk memperkuat isyarat ke tahap volt yang lebih mudah dibaca (0 hingga 1V).

Sensor dan op-amp dapat dihidupkan, dengan menghubungkan VCC ke 3.3VDC (atau 5VDC) dan GND ke ground power. Isyarat analog dapat diperoleh dari pin OUT.

Keluarannya akan dalam milivolt dan akan dibaca oleh Input Analog NodeMCU kami. Setelah dibaca, kita harus "menukar" (atau "peta") agar nilai dapat dikendalikan dengan lebih baik oleh kod. Kita boleh melakukannya dengan fungsi readSensorUV ():

/ * Baca Sensor UV dalam mV dan panggil pengiraan indeks UV * /

batal readSensorUV () {byte numOfReadings = 5; dataSensorUV = 0; untuk (int i = 0; i <numOfReadings; i ++) {dataSensorUV + = analogRead (sensorUVPin); kelewatan (200); } dataSensorUV / = numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023.0)) * 1000; Serial.println (dataSensorUV); indeksKira (); }

Setelah kita mempunyai data UV, kita dapat mengira indeks UV dengan mudah seperti yang ditentukan dalam jadual di atas. Indeks fungsiCalculate () akan melakukannya untuk kita:

/ * Pengiraan Indeks UV * /

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

Langkah 3: Memasang Paparan: OLED

Memasang Paparan: OLED
Memasang Paparan: OLED
Memasang Paparan: OLED
Memasang Paparan: OLED

Untuk tujuan ujian, kami akan memasukkan OLED pada meter UV kami (Langkah ini adalah pilihan sepenuhnya).

Tidak wajar semasa ujian dijalankan untuk menggunakan Serial Monitor, tetapi apa yang berlaku semasa anda menggunakan prototaip yang jauh dari PC anda dalam mod yang berdiri sendiri? Untuk itu, mari kita pasangkan paparan OLED, SSD1306, yang mempunyai ciri utama:

  • Saiz paparan: 0.96"
  • Bersiri I2C IIC SPI
  • 128X64
  • LED LCD OLED putih

Ikuti rajah elektrik dan sambungkan 4 pin OLED kami:

  • VCC menuju ke 3.3V
  • GND menuju ke tanah
  • SCL pergi ke NodeMCU (GPIO 2) ==> D4
  • SDA pergi ke NodeMCU (GPIO 0) ==> D3

Setelah kami menyambungkan paparan, mari memuat turun dan memasang perpustakaannya di Arduino IDE kami: "Pemacu OLED ESP8266 untuk paparan SSD1306" yang dikembangkan oleh Daniel Eichhorn (Pastikan bahawa anda menggunakan Versi 3.0.0 atau lebih besar!).

Pasang perpustakaan di Arduino IDE anda, yang boleh didapati di SSD1306Wire.h

Sebaik sahaja anda memulakan semula IDE, perpustakaan harus sudah dipasang.

Perpustakaan menyokong protokol I2C untuk mengakses paparan OLED menggunakan perpustakaan Wire.h terbina dalam:

/ * OLED * /

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

Mari senaraikan beberapa API penting yang akan digunakan dengan paparan OLED kami. Senarai lengkap boleh didapati di GITHub yang disediakan di atas.

A. Kawalan Paparan:

kekosongan init (); // Permulaan paparan

paparan kekosongan On (void); // Hidupkan paparan pada paparan kosong (Mati); // Matikan paparan, kosongkan kekosongan (kekosongan); // Kosongkan penampan piksel kosongkan flipScreenVertically (); // Putar paparan terbalik

B. Operasi Teks:

kekosongan drawString (int16_t x, int16_t y, Teks rentetan); // (xpos, ypos, "Teks")

void setFont (const char * fontData); // Menetapkan fon semasa.

Fon lalai yang ada:

  • ArialMT_Plain_10,
  • ArialMT_Plain_16,

  • ArialMT_Plain_24

Setelah kedua-dua OLED itu sendiri dan Perpustakaannya dipasang, mari tulis satu program mudah untuk mengujinya. Masukkan dengan kod di bawah di IDE anda, hasilnya adalah paparan seperti yang ditunjukkan pada foto di atas:

* OLED * /

#include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; Paparan Kawat SSD1306 (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); persediaan tidak sah () {Serial.begin (115200); displaySetup (); } gelung void () {} / * Memulakan dan memaparkan data persediaan pada OLED * / void displaySetup () {display.init (); // memulakan paparan paparan.clear (); // Paparkan paparan yang jelas.flipScreenVertically (); // Putar paparan terbalik.display (); // Letakkan data pada paparan Serial.println ("Memulakan Uji Paparan"); display.setFont (ArialMT_Plain_24); display.drawString (30, 0, "OLED"); // (xpos, ypos, "Text") display.setFont (ArialMT_Plain_16); display.drawString (18, 29, "Ujian dimulakan"); display.setFont (ArialMT_Plain_10); display.drawString (10, 52, "Serial BaudRate:"); display.drawString (90, 52, String (11500)); paparan.display (); // Letakkan data pada kelewatan paparan (3000); }

Program di atas boleh dimuat turun dari GitHub saya:

NodeMCU_OLED_Test

Langkah 4: Meter UV Setempat

Meter UV Setempat
Meter UV Setempat
Meter UV Setempat
Meter UV Setempat

Sekarang, dengan paparan OLED dipasang, kita dapat menyambungkan bateri dan melakukan beberapa ujian jarak jauh menggunakan "UV Meter" kami

#tentukan SW_VERSION "UV_Sensor_V.1"

/ * Sensor UV * / #tentukan 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; Paparan Kawat SSD1306 (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); persediaan tidak sah () {Serial.begin (115200); displaySetup (); } gelung kosong () {readSensorUV (); displayUV (); kelewatan (1000); } / * Memulakan dan memaparkan data persediaan pada OLED * / batal displaySetup () {display.init (); // memulakan paparan paparan.clear (); // Clear display display.flipScreenVertically (); // Putar paparan terbalik.display (); // Letakkan data pada paparan Serial.println ("Memulakan Uji Sensor UV"); display.setFont (ArialMT_Plain_24); display.drawString (10, 0, "MJRoBot"); display.setFont (ArialMT_Plain_16); display.drawString (0, 29, "Ujian Sensor UV"); display.setFont (ArialMT_Plain_10); display.drawString (0, 52, "SW Ver.:"); display.drawString (45, 52, SW_VERSION); paparan.display (); kelewatan (3000); } / * Baca Sensor UV dalam mV dan panggil pengiraan indeks UV * / batal readSensorUV () {byte numOfReadings = 5; dataSensorUV = 0; untuk (int i = 0; i <numOfReadings; i ++) {dataSensorUV + = analogRead (sensorUVPin); kelewatan (200); } dataSensorUV / = numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023.0)) * 1000; Serial.println (dataSensorUV); indeksKira (); } / * Pengiraan Indeks UV * / indeks batalKira () {if (dataSensorUV <227) indexUV = 0; lain jika (227 <= dataSensorUV && dataSensorUV <318) indeksUV = 1; lain jika (318 <= dataSensorUV && dataSensorUV <408) indeksUV = 2; lain jika (408 <= dataSensorUV && dataSensorUV <503) indeksUV = 3; lain jika (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; lain jika (606 <= dataSensorUV && dataSensorUV <696) indeksUV = 5; lain jika (696 <= dataSensorUV && dataSensorUV <795) indeksUV = 6; lain jika (795 <= dataSensorUV && dataSensorUV <881) indeksUV = 7; jika tidak (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; lain jika (976 <= dataSensorUV && dataSensorUV <1079) indeksUV = 9; lain jika (1079 <= dataSensorUV && dataSensorUV <1170) indeksUV = 10; indeks lainUV = 11; } / * Paparkan Nilai UV pada OLED tempatan / paparan batalUV () {display.clear (); display.setFont (ArialMT_Plain_16); display.drawString (20, 0, "Sensor UV"); display.drawString (0, 23, "UV (mV):"); display.drawString (80, 23, String (dataSensorUV)); display.drawString (0, 48, "Indeks UV:"); display.setFont (ArialMT_Plain_24); display.drawString (82, 42, String (indexUV)); paparan.display (); }

Kod di atas boleh dimuat turun dari GitHun saya: NodeMCU_UV_Sensor_OLED.ino

Langkah 5: Memasang DHT22 untuk Pengukuran Suhu dan Kelembapan Udara

Memasang DHT22 untuk Pengukuran Suhu dan Kelembapan Udara
Memasang DHT22 untuk Pengukuran Suhu dan Kelembapan Udara
Memasang DHT22 untuk Pengukuran Suhu dan Kelembapan Udara
Memasang DHT22 untuk Pengukuran Suhu dan Kelembapan Udara

Salah satu sensor yang paling banyak digunakan untuk menangkap data cuaca ialah DHT22 (atau saudara DHT11), sensor kelembapan dan suhu relatif digital. Ia menggunakan sensor kelembapan kapasitif dan termistor untuk mengukur udara di sekitarnya dan mengeluarkan isyarat digital pada pin data (tidak diperlukan pin input analog).

Sensor harus dihidupkan antara 3.3V dan 5V dan akan berfungsi dari -40oC hingga + 80oC dengan ketepatan +/- 0.5oC untuk suhu dan +/- 2% untuk Kelembapan relatif. Penting juga untuk diingat bahawa tempoh penginderaannya adalah rata-rata 2 saat (waktu minimum antara bacaan). Laman web Adafruit memberikan banyak maklumat mengenai keduanya, DHT22 dan DHT11 saudaranya. Untuk maklumat lebih lanjut, sila lawati halaman Tutorial DHT22 / 11.

DHT22 mempunyai 4 pin (menghadap sensor, pin 1 paling kiri):

  1. VCC (kami akan menyambung ke 3.3V dari NodeMCU);
  2. Data keluar;
  3. Tidak bersambung dan
  4. Tanah.

Setelah biasanya anda akan menggunakan sensor pada jarak kurang dari 20m, perintang 10K harus dihubungkan antara pin Data dan VCC. Output pin akan disambungkan ke NodeMCU pin D3 (lihat rajah di atas). Setelah sensor dipasang di modul kami, muat turun perpustakaan DHT dari repositori Adafruit GitHub dan pasangkannya di fail Perpustakaan Arduino anda. Setelah memuatkan semula Arduino IDE anda, "perpustakaan sensor DHT" harus dipasang.

Pada awal kod, kita mesti memasukkan baris:

/ * DHT22 * /

#termasuk "DHT.h" #tentukan DHTPIN D2 #tentukan DHTTYPE DHT22 DHT dht (DHTPIN, DHTTYPE); float hum = 0; suhu apungan = 0;

Fungsi baru akan dibuat untuk membaca sensor:

/ * Dapatkan data DHT * /

void getDhtData (void) {float tempIni = temp; terapung humIni = hum; temp = dht.readTemperature (); hum = dht.readHumidity (); if (isnan (hum) || isnan (temp)) // Periksa sama ada bacaan gagal dan keluar lebih awal (untuk mencuba lagi). {Serial.println ("Gagal membaca dari sensor DHT!"); temp = tempIni; hum = humIni; kembali; }}

Kod lengkap termasuk sensor UV dan DHT boleh dimuat turun dari GitHub saya: NodeMCU_UV_DHT_Sensor_OLED

Langkah 6: Menghantar Data ke ThingSpeak.com

Menghantar Data ke ThingSpeak.com
Menghantar Data ke ThingSpeak.com
Menghantar Data ke ThingSpeak.com
Menghantar Data ke ThingSpeak.com
Menghantar Data ke ThingSpeak.com
Menghantar Data ke ThingSpeak.com

Setakat ini, kami hanya menggunakan NodeMCU ESP12-E sebagai papan Arduino biasa dan biasa. Sudah tentu, kita hanya "mencakar" potensi sebenar cip kecil yang menakjubkan ini dan sekarang adalah masa untuk berangkat ke syurga! Atau lebih baik kepada bintang! Ehr … ke awan!;-)

Mari kita mulakan!

  1. Pertama, anda mesti mempunyai akaun di ThinkSpeak.com
  2. Ikuti arahan untuk membuat Saluran dan perhatikan ID Saluran anda dan Tulis Kunci API
  3. Kemas kini kod di bawah dengan rangkaian WiFi dan kelayakan Thinkspeak anda
  4. Jalankan program di IDE

Mari komen bahagian paling penting kod:

Pertama, mari panggil perpustakaan ESP8266, tentukan klien WiFi dan tentukan kelayakan Router dan Thinkspeak tempatan anda:

/ * ESP12-E & Thinkspeak * /

#masuk pelanggan WiFiClient; const char * MY_SSID = "ID SSD ANDA DI SINI"; const char * MY_PWD = "KATA LALUAN ANDA DI SINI"; const char * TS_SERVER = "api.thingspeak.com"; Rentetan TS_API_KEY = "KUNCI API MENULIS SALURAN ANDA";

Kedua, mari sertakan perpustakaan yang sangat penting untuk projek IoT: SimpleTimer.h:

/ * PEMASA * /

#masuk pemasa SimpleTimer;

Ketiga, selama penyiapan (), kita akan memulai komunikasi bersiri, memanggil fungsi connectWiFi () dan menentukan pemasa. Perhatikan bahawa garis kod: timer.setInterval (60000L, sendDataTS); akan memanggil fungsi sendDataTS () setiap 60 saat, untuk memuat naik data ke saluran ThinkSpeak.

persediaan tidak sah ()

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

Akhirnya tetapi paling tidak, semasa gelung (), satu-satunya arahan yang diperlukan adalah memulakan pemasa dan hanya itu!

gelung kosong ()

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

Di bawah ini, anda dapat melihat dua fungsi penting yang digunakan untuk mengendalikan komunikasi Thinkspeak:

Sambungan ESP12-E dengan rangkaian WiFi anda:

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

* Menyambungkan WiFi *********************************************** *** / batal connectWifi () {Serial.print ("Menyambung ke" + * MY_SSID); WiFi.begin (MY_SSID, MY_PWD); sementara (WiFi.status ()! = WL_CONNECTED) {kelewatan (1000); Cetakan bersiri ("."); } Serial.println (""); Serial.println ("WiFi Disambungkan"); Serial.println (""); }

ESP12-E menghantar data ke ThinkSpeak:

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

* Menghantar Data ke Saluran Thinkspeak ******************************************** ****** / batal sendDataTS (void) {if (client.connect (TS_SERVER, 80)) {String postStr = TS_API_KEY; postStr + = "& bidang1 ="; postStr + = Rentetan (dataSensorUV); postStr + = "& bidang2 ="; postStr + = Rentetan (indexUV); postStr + = "& bidang3 ="; postStr + = Rentetan (temp); postStr + = "& bidang4 ="; postStr + = Rentetan (hum); postStr + = "\ r / n / r / n"; client.print ("POST / kemas kini HTTP / 1.1 / n"); client.print ("Host: api.thingspeak.com / n"); client.print ("Sambungan: tutup / n"); client.print ("X-THINGSPEAKAPIKEY:" + TS_API_KEY + "\ n"); client.print ("Content-Type: application / x-www-form-urlencoded / n"); client.print ("Panjang Kandungan:"); client.print (postStr.length ()); client.print ("\ n / n"); client.print (postStr); kelewatan (1000); } dihantar ++; pelanggan.stop (); }

Kod lengkap boleh didapati di GitHub saya: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT

Setelah kod dimuat naik ke NodeMCU anda. Mari sambungkan bateri luaran dan lakukan pengukuran di bawah cahaya matahari. Saya meletakkan Stesen Jauh di atas bumbung dan mula menangkap data di ThingSpeak.com seperti yang ditunjukkan dalam gambar di atas.

Langkah 7: Kesimpulannya

Kesimpulannya
Kesimpulannya

Seperti biasa, saya harap projek ini dapat membantu orang lain memasuki dunia elektronik yang menarik!

Untuk keterangan dan kod akhir, sila kunjungi simpanan GitHub saya: RPi-NodeMCU-Weather-Station

Untuk lebih banyak projek, sila lawati blog saya: MJRoBot.org

Nantikan! Tutorial seterusnya kami akan menghantar data dari stesen cuaca jauh ke pusat, berdasarkan pelayan Raspberry Pi Web:

Imej
Imej

Saludos dari selatan dunia!

Jumpa anda dalam arahan saya seterusnya!

Terima kasih, Marcelo

Disyorkan: