Daftar Isi:

IoT Menjadi Mudah: Menangkap Data Cuaca Jarak Jauh: UV dan Suhu & Kelembaban Udara: 7 Langkah
IoT Menjadi Mudah: Menangkap Data Cuaca Jarak Jauh: UV dan Suhu & Kelembaban Udara: 7 Langkah

Video: IoT Menjadi Mudah: Menangkap Data Cuaca Jarak Jauh: UV dan Suhu & Kelembaban Udara: 7 Langkah

Video: IoT Menjadi Mudah: Menangkap Data Cuaca Jarak Jauh: UV dan Suhu & Kelembaban Udara: 7 Langkah
Video: 7. Koneksi Sensor; Contoh Peringatan diini banjir, IoT, dan drone 2024, Juli
Anonim
IoT Menjadi Mudah: Menangkap Data Cuaca Jarak Jauh: UV dan Suhu & Kelembaban Udara
IoT Menjadi Mudah: Menangkap Data Cuaca Jarak Jauh: UV dan Suhu & Kelembaban Udara

Pada tutorial ini, kita akan menangkap data jarak jauh seperti UV (Radiasi Ultra-Violet), suhu dan kelembaban udara. Data tersebut akan sangat penting dan akan digunakan di Stasiun Cuaca lengkap di masa mendatang.

Diagram blok menunjukkan apa yang akan kita dapatkan di akhir.

Gambar
Gambar

Langkah 1: BoM - Bill of Material

NodeMCU (ESP8266-12E) - USD 9.00

Sensor Kelembaban dan Suhu (DHT22) - USD10.00

Sensor UV - USD 4,00

OLED USD 12.00

Papan tempat memotong 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 sebanding dengan radiasi Ultra-Violet yang ditemukan pada spektrum penginderaan cahaya. Ini menggunakan fotodioda UV (berdasarkan Gallium Nitrida), yang dapat mendeteksi rentang cahaya 240-370nm (yang mencakup UVB dan sebagian besar spektrum UVA). Level sinyal dari fotodioda sangat kecil, dalam level nano-ampere, sehingga modul telah menyematkan penguat operasional untuk memperkuat sinyal ke level volt yang lebih mudah dibaca (0 hingga 1V).

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

Outputnya akan dalam milivolt dan akan dibaca oleh Input Analog dari NodeMCU kami. Setelah dibaca, kita harus "mengubah" (atau "memetakan") agar nilai dapat ditangani dengan lebih baik oleh kode. Kita bisa melakukannya dengan fungsi readSensorUV():

/* Membaca Sensor UV dalam mV dan memanggil penghitungan indeks UV */

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

Setelah kita memiliki data UV, kita dapat dengan mudah menghitung indeks UV seperti yang didefinisikan pada tabel di atas. Fungsi indexCalculate() akan melakukannya untuk kita:

/* Perhitungan Indeks UV */

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

Langkah 3: Memasang Layar: OLED

Memasang Layar: OLED
Memasang Layar: OLED
Memasang Layar: OLED
Memasang Layar: OLED

Untuk tujuan pengujian, kami akan menyertakan OLED pada pengukur UV kami (Langkah ini sepenuhnya opsional).

Tidak apa-apa selama pengujian, untuk menggunakan Serial Monitor, tetapi apa yang terjadi ketika Anda menggunakan prototipe jauh dari PC Anda dalam mode yang berdiri sendiri? Untuk itu, mari kita pasang layar OLED, SSD1306, yang karakteristik utamanya adalah:

  • Ukuran layar: 0.96"
  • Serial I2C IIC SPI
  • 128X64
  • LED LCD OLED Putih

Ikuti diagram kelistrikan dan sambungkan 4 pin OLED kami:

  • VCC pergi ke 3.3V
  • GND turun ke darat
  • SCL masuk ke NodeMCU (GPIO 2) ==>D4
  • SDA masuk ke NodeMCU (GPIO 0) ==>D3

Setelah kita menghubungkan layar, mari unduh dan instal perpustakaannya di Arduino IDE kita: "ESP8266 OLED Driver for SSD1306 display" yang dikembangkan oleh Daniel Eichhorn (Pastikan Anda menggunakan Versi 3.0.0 atau lebih besar!).

Instal perpustakaan di Arduino IDE Anda, yang dapat ditemukan di SSD1306Wire.h

Setelah Anda me-restart IDE, perpustakaan harus sudah diinstal.

Pustaka mendukung protokol I2C untuk mengakses tampilan OLED menggunakan pustaka Wire.h bawaan:

/* OLED */

#sertakan "SSD1306Wire.h" #sertakan "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306Tampilan kabel (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN);

Mari daftar beberapa API penting yang akan digunakan dengan tampilan OLED kita. Daftar lengkapnya dapat ditemukan di GITHub yang disediakan di atas.

A. Kontrol Tampilan:

batal init(); // Inisialisasi tampilan

void displayOn(void); // Hidupkan tampilan pada void displayOff(void); // Matikan tampilan void clear(void); // Hapus buffer piksel lokal void flipScreenVertically(); // Putar layar terbalik

B. Operasi Teks:

void drawString(int16_t x, int16_t y, String teks); // (xpos, ypos, "Teks")

void setFont(const char* fontData); // Mengatur font saat ini.

Font default yang tersedia:

  • ArialMT_Plain_10,
  • ArialMT_Plain_16,

  • ArialMT_Plain_24

Setelah OLED itu sendiri dan Pustakanya terinstal, mari kita tulis program sederhana untuk mengujinya. Masukkan dengan kode di bawah pada IDE Anda, hasilnya akan menjadi tampilan seperti yang ditunjukkan pada foto di atas:

* OLED */

#sertakan "SSD1306Wire.h" #sertakan "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306Tampilan kabel (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () { Serial.begin(115200); pengaturan tampilan(); } void loop() { } /* Memulai dan menampilkan data setup pada OLED */ void displaySetup() { display.init(); // inisialisasi tampilan display.clear(); // Hapus tampilan display.flipScreenVertically(); // Balikkan tampilan display.display(); // Meletakkan data pada tampilan Serial.println("Memulai Tes Tampilan"); display.setFont(ArialMT_Plain_24); display.drawString(30, 0, "OLED"); // (xpos, ypos, "Teks") display.setFont(ArialMT_Plain_16); display.drawString(18, 29, "Tes dimulai"); display.setFont(ArialMT_Plain_10); display.drawString(10, 52, "Serial BaudRate:"); display.drawString(90, 52, String(11500)); tampilan.tampilan(); // Menempatkan data pada penundaan tampilan (3000); }

Program di atas dapat diunduh dari GitHub saya:

NodeMCU_OLED_Test

Langkah 4: Pengukur UV Lokal

Pengukur UV Lokal
Pengukur UV Lokal
Pengukur UV Lokal
Pengukur UV Lokal

Sekarang, dengan layar OLED terpasang, kami dapat menghubungkan baterai dan melakukan beberapa pengujian jarak jauh menggunakan "Pengukur UV" kami

#define SW_VERSION "UV_Sensor_V.1"

/* Sensor UV */ #define sensorUVPin A0 int dataSensorUV = 0; int indeksUV = 0; /* OLED */ #include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; SSD1306Tampilan kabel (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup() { Serial.begin(115200); pengaturan tampilan(); } void loop() { readSensorUV(); tampilanUV(); penundaan (1000); } /* Memulai dan menampilkan data pengaturan pada OLED */ void displaySetup() { display.init(); // inisialisasi tampilan display.clear(); // Hapus tampilan display.flipScreenVertically(); // Balikkan tampilan display.display(); // Meletakkan data di layar Serial.println("Memulai Uji Sensor UV"); display.setFont(ArialMT_Plain_24); display.drawString(10, 0, "MJRoBot"); display.setFont(ArialMT_Plain_16); display.drawString(0, 29, "Uji Sensor UV"); display.setFont(ArialMT_Plain_10); display.drawString(0, 52, "SW Ver.:"); display.drawString(45, 52, SW_VERSION); tampilan.tampilan(); penundaan (3000); } /* Membaca Sensor UV dalam mV dan memanggil penghitungan indeks UV */ void readSensorUV() { byte numOfReadings = 5; dataSensorUV = 0; for (int i=0; i< numOfReadings; i++) { dataSensorUV += analogRead(sensorUVPin); penundaan (200); } dataSensorUV /= numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023.0))*1000; Serial.println(dataSensorUV); indexCalculate(); } /* Perhitungan Indeks UV */ void indexCalculate() { if (dataSensorUV < 227) indexUV = 0; lain jika (227 <= dataSensorUV && dataSensorUV < 318) indexUV = 1; lain jika (318 <= dataSensorUV && dataSensorUV < 408) indexUV = 2; lain jika (408 <= dataSensorUV && dataSensorUV < 503) indexUV = 3; lain jika (503 <= dataSensorUV && dataSensorUV < 606) indexUV = 4; lain jika (606 <= dataSensorUV && dataSensorUV < 696) indexUV = 5; lain jika (696 <= dataSensorUV && dataSensorUV < 795) indeksUV = 6; lain jika (795 <= dataSensorUV && dataSensorUV < 881) indexUV = 7; lain jika (881 <= dataSensorUV && dataSensorUV < 976) indexUV = 8; else if (976 <= dataSensorUV && dataSensorUV < 1079) indexUV = 9; lain jika (1079 <= dataSensorUV && dataSensorUV < 1170) indexUV = 10; indeks lainUV = 11; } /* Menampilkan Nilai UV pada OLED lokal*/ void displayUV() { 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)); tampilan.tampilan(); }

Kode di atas dapat diunduh dari GitHun saya: NodeMCU_UV_Sensor_OLED.ino

Langkah 5: Memasang DHT22 untuk Pengukuran Suhu dan Kelembaban Udara

Memasang DHT22 untuk Pengukuran Suhu dan Kelembaban Udara
Memasang DHT22 untuk Pengukuran Suhu dan Kelembaban Udara
Memasang DHT22 untuk Pengukuran Suhu dan Kelembaban Udara
Memasang DHT22 untuk Pengukuran Suhu dan Kelembaban Udara

Salah satu sensor yang paling sering digunakan untuk menangkap data cuaca adalah DHT22 (atau saudaranya DHT11), sebuah sensor suhu dan kelembaban relatif digital. Ini menggunakan sensor kelembaban kapasitif dan termistor untuk mengukur udara di sekitarnya dan mengeluarkan sinyal digital pada pin data (tidak diperlukan pin input analog).

Sensor harus diberi daya antara 3.3V dan 5V dan akan bekerja dari -40oC hingga +80oC dengan akurasi +/- 0,5oC untuk suhu dan +/-2% untuk Kelembaban relatif. Penting juga untuk diingat bahwa periode penginderaannya rata-rata 2 detik (waktu minimum antara pembacaan). Situs Adafruit menyediakan banyak informasi tentang keduanya, DHT22 dan saudaranya DHT11. Untuk lebih jelasnya, silakan kunjungi halaman Tutorial DHT22/11.

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

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

Setelah biasanya Anda akan menggunakan sensor pada jarak kurang dari 20m, resistor 10K harus dihubungkan antara pin Data dan VCC. Pin Output akan dihubungkan ke pin NodeMCU D3 (lihat diagram di atas). Setelah sensor terpasang di modul kami, unduh pustaka DHT dari repositori Adafruit GitHub dan instal di file Perpustakaan Arduino Anda. Setelah Anda memuat ulang Arduino IDE Anda, "perpustakaan sensor DHT" harus diinstal.

Di awal kode, kita harus menyertakan baris:

/* DHT22*/

#sertakan "DHT.h" #define DHTPIN D2 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); dengung mengambang = 0; suhu mengambang = 0;

Fungsi baru akan dibuat untuk membaca sensor:

/* Dapatkan data DHT */

void getDhtData(void) { float tempIni = temp; float humIni = hum; suhu = dht.readSuhu(); hum = dht.readHumidity(); if (isnan(hum) || isnan(temp)) // Periksa apakah ada pembacaan yang gagal dan keluar lebih awal (untuk mencoba lagi). { Serial.println("Gagal membaca dari sensor DHT!"); suhu = suhuIni; hum = humIni; kembali; } }

Kode lengkap termasuk sensor UV dan DHT dapat diunduh dari GitHub saya: NodeMCU_UV_DHT_Sensor_OLED

Langkah 6: Mengirim Data ke ThingSpeak.com

Mengirim Data ke ThingSpeak.com
Mengirim Data ke ThingSpeak.com
Mengirim Data ke ThingSpeak.com
Mengirim Data ke ThingSpeak.com
Mengirim Data ke ThingSpeak.com
Mengirim Data ke ThingSpeak.com

Selama ini kami hanya menggunakan NodeMCU ESP12-E sebagai board Arduino biasa dan biasa. Tentu saja, kita baru saja "menggaruk" potensi sebenarnya dari chip kecil yang spektakuler ini dan sekaranglah saatnya untuk lepas landas ke surga! Atau lebih baik ke bintang! Ehr … ke awan!;-)

Mari kita mulai!

  1. Pertama, Anda harus memiliki akun di ThinkSpeak.com
  2. Ikuti petunjuk untuk membuat Saluran dan catat ID Saluran dan Tulis Kunci API Anda
  3. Perbarui kode di bawah ini dengan jaringan WiFi Anda dan kredensial Thinkspeak
  4. Jalankan program di IDE

Mari beri komentar kode bagian yang paling penting:

Pertama, panggil perpustakaan ESP8266, tentukan klien WiFi dan tentukan kredensial Router dan Thinkspeak lokal Anda:

/* ESP12-E & Thinkspeak*/

#sertakan klien WiFiClient; const char* MY_SSID = "ID SSD ANDA DI SINI"; const char* MY_PWD = "PASSWORD ANDA DI SINI"; const char* TS_SERVER = "api.thingspeak.com"; String TS_API_KEY ="SALURAN ANDA MENULIS KUNCI API";

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

/* WAKTU */

#sertakan pengatur waktu SimpleTimer;

Ketiga, selama setup(), kita akan memulai komunikasi serial, memanggil fungsi connectWiFi() dan menentukan timer. Perhatikan bahwa baris kode: timer.setInterval(60000L, sendDataTS); akan memanggil fungsi sendDataTS() setiap 60 detik, untuk mengunggah data ke saluran ThinkSpeak.

batalkan pengaturan()

{ … Serial.begin(115200); penundaan (10); … hubungkan Wifi(); timer.setInterval(60000L, sendDataTS); … }

Akhirnya, selama loop(), satu-satunya perintah yang diperlukan adalah memulai timer dan hanya itu!

lingkaran kosong()

{ … timer.run(); // Memulai SimpleTimer }

Di bawah ini, Anda dapat melihat dua fungsi penting yang digunakan untuk menangani komunikasi Thinkspeak:

Koneksi ESP12-E dengan jaringan WiFi Anda:

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

* Menghubungkan WiFi *********************************************** ***/ void connectWifi() { Serial.print("Menghubungkan ke "+ *MY_SSID); WiFi.begin(MY_SSID, MY_PWD); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println(""); Serial.println("WiFi Terhubung"); Serial.println(""); }

ESP12-E mengirim data ke ThinkSpeak:

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

* Mengirim Data ke Saluran Thinkspeak ******************************************** ******/ void sendDataTS(void) { if (client.connect(TS_SERVER, 80)) { String postStr = TS_API_KEY; postStr += "&field1="; postStr += String(dataSensorUV); postStr += "&field2="; postStr += String(indeksUV); postStr += "&field3="; postStr += String(temp); postStr += "&field4="; postStr += String(berdengung); postStr += "\r\n\r\n"; client.print("POST /update HTTP/1.1\n"); client.print("Host: api.thingspeak.com\n"); client.print("Koneksi: tutup\n"); client.print("X-THINGSPEAKAPIKEY: " + TS_API_KEY + "\n"); client.print("Jenis Konten: application/x-www-form-urlencoded\n"); client.print("Panjang Konten: "); client.print(postStr.length()); klien.print("\n\n"); klien.print(postStr); penundaan (1000); } dikirim++; klien.berhenti(); }

Kode lengkap dapat ditemukan di GitHub saya: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT

Setelah Anda memiliki kode yang diunggah ke NodeMCU Anda. Mari kita hubungkan baterai eksternal dan lakukan pengukuran di bawah matahari. Saya meletakkan Remote Station di atap dan mulai mengambil data di ThingSpeak.com seperti yang ditunjukkan pada foto di atas.

Langkah 7: Kesimpulan

Kesimpulan
Kesimpulan

Seperti biasa, saya berharap proyek ini dapat membantu orang lain menemukan jalan mereka ke dunia elektronik yang menarik!

Untuk detail dan kode akhir, silakan kunjungi penyimpanan GitHub saya: RPi-NodeMCU-Weather-Station

Untuk proyek lainnya, silakan kunjungi blog saya: MJRoBot.org

Pantau terus! Tutorial selanjutnya kita akan mengirimkan data dari stasiun cuaca jarak jauh ke stasiun pusat, berdasarkan server Web Raspberry Pi:

Gambar
Gambar

Saludos dari selatan dunia!

Sampai jumpa di instruksi saya berikutnya!

Terima kasih, Marcelo

Direkomendasikan: