Mục lục:

IoT Made Easy: Thu thập dữ liệu thời tiết từ xa: UV và Nhiệt độ & Độ ẩm không khí: 7 bước
IoT Made Easy: Thu thập dữ liệu thời tiết từ xa: UV và Nhiệt độ & Độ ẩm không khí: 7 bước

Video: IoT Made Easy: Thu thập dữ liệu thời tiết từ xa: UV và Nhiệt độ & Độ ẩm không khí: 7 bước

Video: IoT Made Easy: Thu thập dữ liệu thời tiết từ xa: UV và Nhiệt độ & Độ ẩm không khí: 7 bước
Video: Đừng để SÂU RĂNG to, hãy hàn răng sớm #shorts #nhakhoa 2024, Tháng bảy
Anonim
IoT Made Easy: Thu thập dữ liệu thời tiết từ xa: UV và nhiệt độ không khí & độ ẩm
IoT Made Easy: Thu thập dữ liệu thời tiết từ xa: UV và nhiệt độ không khí & độ ẩm

Trong hướng dẫn này, chúng tôi sẽ thu thập dữ liệu từ xa như UV (bức xạ cực tím), nhiệt độ và độ ẩm không khí. Những dữ liệu đó sẽ rất quan trọng và sẽ được sử dụng trong một Trạm Thời tiết hoàn chỉnh trong tương lai.

Sơ đồ khối hiển thị những gì chúng ta sẽ nhận được khi kết thúc.

Hình ảnh
Hình ảnh

Bước 1: Hội đồng quản trị - Hóa đơn nguyên vật liệu

NodeMCU (ESP8266-12E) - 9 USD

Cảm biến độ ẩm và nhiệt độ (DHT22) - USD10,00

Cảm biến UV - 4,00 USD

OLED 12,00 USD

Breadboard - USD1,00

Bước 2: Cảm biến UV Analog

Cảm biến UV Analog
Cảm biến UV Analog
Cảm biến UV Analog
Cảm biến UV Analog
Cảm biến UV Analog
Cảm biến UV Analog

Cảm biến UV này tạo ra một đầu ra tương tự tỷ lệ với bức xạ Cực tím được tìm thấy trên quang phổ cảm nhận ánh sáng. Nó sử dụng một điốt quang UV (dựa trên Gallium Nitride), có thể phát hiện dải ánh sáng 240-370nm (bao phủ UVB và hầu hết phổ UVA). Mức tín hiệu từ điốt quang rất nhỏ, ở mức nano-ampe, vì vậy mô-đun đã nhúng một bộ khuếch đại hoạt động để khuếch đại tín hiệu lên mức vôn dễ đọc hơn (0 đến 1V).

Cảm biến và op-amp có thể được cấp nguồn bằng cách kết nối VCC với 3.3VDC (hoặc 5VDC) và GND với mặt đất. Tín hiệu tương tự có thể được lấy từ chân OUT.

Đầu ra của nó sẽ tính bằng milivôn và sẽ được đọc bởi Đầu vào tương tự của NodeMCU của chúng tôi. Sau khi đọc, chúng ta nên "chuyển đổi" (hoặc "ánh xạ") nó để các giá trị được mã xử lý tốt hơn. Chúng ta có thể làm điều đó với hàm readSensorUV ():

/ * Đọc Cảm biến UV theo mV và gọi tính toán chỉ số UV * /

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

Khi chúng ta có dữ liệu UV, chúng ta có thể dễ dàng tính toán chỉ số UV như được xác định trong bảng trên. Hàm indexCalculate () sẽ làm điều đó cho chúng ta:

/ * Tính toán chỉ số UV * /

void indexCalculate () {if (dataSensorUV <227) indexUV = 0; else if (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; else if (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; else if (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; else if (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; else if (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; else if (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; else if (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; else if (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; else if (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; else if (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; khác chỉ sốUV = 11; }

Bước 3: Cài đặt màn hình: OLED

Cài đặt màn hình: OLED
Cài đặt màn hình: OLED
Cài đặt màn hình: OLED
Cài đặt màn hình: OLED

Đối với mục đích thử nghiệm, chúng tôi sẽ bao gồm một OLED trên máy đo UV của chúng tôi (Bước này là hoàn toàn tùy chọn).

Trong quá trình kiểm tra, sử dụng Serial Monitor là điều hoàn toàn có thể, nhưng điều gì đang xảy ra khi bạn đang sử dụng nguyên mẫu của mình ở xa PC ở chế độ độc lập? Đối với điều đó, hãy lắp đặt một màn hình OLED, SSD1306, có các đặc điểm chính là:

  • Kích thước màn hình: 0,96"
  • I2C IIC SPI Serial
  • 128X64
  • Đèn LED LCD OLED trắng

Làm theo sơ đồ điện và kết nối 4 chân của OLED của chúng tôi:

  • VCC đi tới 3,3V
  • GND đi xuống mặt đất
  • SCL chuyển đến NodeMCU (GPIO 2) ==> D4
  • SDA chuyển đến NodeMCU (GPIO 0) ==> D3

Khi chúng tôi đã kết nối màn hình, hãy tải xuống và cài đặt thư viện của nó trên Arduino IDE của chúng tôi: "Trình điều khiển OLED ESP8266 cho màn hình SSD1306" được phát triển bởi Daniel Eichhorn (Đảm bảo rằng bạn sử dụng Phiên bản 3.0.0 trở lên!).

Cài đặt thư viện trên Arduino IDE của bạn, có thể được tìm thấy trên SSD1306Wire.h

Sau khi bạn khởi động lại IDE, thư viện sẽ được cài đặt.

Thư viện hỗ trợ giao thức I2C để truy cập màn hình OLED bằng thư viện Wire.h tích hợp sẵn:

/ * OLED * /

#include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; Màn hình SSD1306Wire (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN);

Hãy liệt kê một số API quan trọng sẽ được sử dụng với màn hình OLED của chúng tôi. Danh sách đầy đủ có thể được tìm thấy tại GITHub được cung cấp ở trên.

A. Điều khiển màn hình:

void init (); // Khởi tạo màn hình

void displayOn (void); // Bật hiển thị void displayOff (void); // Tắt hiển thị void clear (void); // Xóa bộ đệm pixel cục bộ void flipScreenVerently (); // Lật ngược màn hình

B. Thao tác văn bản:

void drawString (int16_t x, int16_t y, String text); // (xpos, ypos, "Văn bản")

void setFont (const char * fontData); // Đặt phông chữ hiện tại.

Phông chữ mặc định có sẵn:

  • ArialMT_Plain_10,
  • ArialMT_Plain_16,

  • ArialMT_Plain_24

Khi cả bản thân OLED và Thư viện của nó được cài đặt, hãy viết một chương trình đơn giản để kiểm tra nó. Nhập mã dưới đây trên IDE của bạn, kết quả sẽ hiển thị như trong hình trên:

* OLED * /

#include "SSD1306Wire.h" #include "Wire.h" const int I2C_DISPLAY_ADDRESS = 0x3c; const int SDA_PIN = 0; const int SCL_PIN = 2; Màn hình SSD1306Wire (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } void loop () {} / * Khởi tạo và hiển thị dữ liệu thiết lập trên OLED * / void displaySetup () {display.init (); // khởi tạo hiển thị display.clear (); // Xóa hiển thị display.flipScreenVerently (); // Lật ngược màn hình display.display (); // Đưa dữ liệu lên display Serial.println ("Đang tiến hành kiểm tra hiển thị"); display.setFont (ArialMT_Plain_24); display.drawString (30, 0, "OLED"); // (xpos, ypos, "Text") display.setFont (ArialMT_Plain_16); display.drawString (18, 29, "Đã bắt đầu kiểm tra"); display.setFont (ArialMT_Plain_10); display.drawString (10, 52, "Serial BaudRate:"); display.drawString (90, 52, String (11500)); display.display (); // Đưa dữ liệu vào độ trễ hiển thị (3000); }

Chương trình trên có thể được tải xuống từ GitHub của tôi:

NodeMCU_OLED_Test

Bước 4: Máy đo UV cục bộ

Máy đo UV cục bộ
Máy đo UV cục bộ
Máy đo UV cục bộ
Máy đo UV cục bộ

Bây giờ, với màn hình OLED được lắp đặt, chúng tôi có thể kết nối pin và thực hiện một số thử nghiệm từ xa bằng "UV Meter" của chúng tôi

#define SW_VERSION "UV_Sensor_V.1"

/ * Cảm biến UV * / #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; Màn hình SSD1306Wire (I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); void setup () {Serial.begin (115200); displaySetup (); } void loop () {readSensorUV (); displayUV (); chậm trễ (1000); } / * Khởi tạo và hiển thị dữ liệu thiết lập trên OLED * / void displaySetup () {display.init (); // khởi tạo hiển thị display.clear (); // Xóa hiển thị display.flipScreenVerently (); // Lật ngược màn hình display.display (); // Đưa dữ liệu lên màn hình Serial.println ("Đang bắt đầu kiểm tra cảm biến UV"); display.setFont (ArialMT_Plain_24); display.drawString (10, 0, "MJRoBot"); display.setFont (ArialMT_Plain_16); display.drawString (0, 29, "Kiểm tra cảm biến UV"); display.setFont (ArialMT_Plain_10); display.drawString (0, 52, "Phiên bản SW:"); display.drawString (45, 52, SW_VERSION); display.display (); chậm trễ (3000); } / * Đọc UV Sensor trong mV và gọi tính toán chỉ số UV * / void readSensorUV () {byte numOfReadings = 5; dataSensorUV = 0; for (int i = 0; i <numOfReadings; i ++) {dataSensorUV + = analogRead (sensorUVPin); chậm trễ (200); } dataSensorUV / = numOfReadings; dataSensorUV = (dataSensorUV * (3.3 / 1023.0)) * 1000; Serial.println (dataSensorUV); indexCalculate (); } / * Tính toán chỉ số UV * / void indexCalculate () {if (dataSensorUV <227) indexUV = 0; else if (227 <= dataSensorUV && dataSensorUV <318) indexUV = 1; else if (318 <= dataSensorUV && dataSensorUV <408) indexUV = 2; else if (408 <= dataSensorUV && dataSensorUV <503) indexUV = 3; else if (503 <= dataSensorUV && dataSensorUV <606) indexUV = 4; else if (606 <= dataSensorUV && dataSensorUV <696) indexUV = 5; else if (696 <= dataSensorUV && dataSensorUV <795) indexUV = 6; else if (795 <= dataSensorUV && dataSensorUV <881) indexUV = 7; else if (881 <= dataSensorUV && dataSensorUV <976) indexUV = 8; else if (976 <= dataSensorUV && dataSensorUV <1079) indexUV = 9; else if (1079 <= dataSensorUV && dataSensorUV <1170) indexUV = 10; khác chỉ sốUV = 11; } / * Hiển thị Giá trị UV trên OLED cục bộ * / void displayUV () {display.clear (); display.setFont (ArialMT_Plain_16); display.drawString (20, 0, "Cảm biến UV"); display.drawString (0, 23, "UV (mV):"); display.drawString (80, 23, String (dataSensorUV)); display.drawString (0, 48, "Chỉ số UV:"); display.setFont (ArialMT_Plain_24); display.drawString (82, 42, String (indexUV)); display.display (); }

Mã trên có thể được tải xuống từ GitHun của tôi: NodeMCU_UV_Sensor_OLED.ino

Bước 5: Cài đặt DHT22 cho các phép đo nhiệt độ và độ ẩm không khí

Cài đặt DHT22 cho các phép đo nhiệt độ và độ ẩm không khí
Cài đặt DHT22 cho các phép đo nhiệt độ và độ ẩm không khí
Cài đặt DHT22 cho các phép đo nhiệt độ và độ ẩm không khí
Cài đặt DHT22 cho các phép đo nhiệt độ và độ ẩm không khí

Một trong những cảm biến được sử dụng nhiều nhất để thu dữ liệu thời tiết là DHT22 (hay còn gọi là anh em DHT11), một cảm biến nhiệt độ và độ ẩm tương đối kỹ thuật số. Nó sử dụng cảm biến độ ẩm điện dung và một điện trở nhiệt để đo không khí xung quanh và phát ra tín hiệu kỹ thuật số trên chân dữ liệu (không cần chân đầu vào tương tự).

Cảm biến phải được cấp nguồn từ 3,3V đến 5V và sẽ hoạt động từ -40oC đến + 80oC với độ chính xác là +/- 0,5oC đối với nhiệt độ và +/- 2% đối với độ ẩm tương đối. Điều quan trọng cần lưu ý là thời gian cảm nhận của nó là trung bình 2 giây (thời gian tối thiểu giữa các lần đọc). Trang Adafruit cung cấp rất nhiều thông tin về cả hai, DHT22 và người anh em DHT11. Để biết thêm chi tiết, vui lòng truy cập trang Hướng dẫn DHT22 / 11.

DHT22 có 4 chân (đối diện với cảm biến, chân 1 ở bên trái nhất):

  1. VCC (chúng tôi sẽ kết nối với 3.3V từ NodeMCU);
  2. Dữ liệu ra;
  3. Không được kết nối và
  4. Đất.

Thông thường, bạn sẽ sử dụng cảm biến trên khoảng cách nhỏ hơn 20m, một điện trở 10K nên được kết nối giữa các chân Data và VCC. Chân Output sẽ được kết nối với chân D3 của NodeMCU (xem sơ đồ trên). Khi cảm biến được cài đặt tại mô-đun của chúng tôi, hãy tải xuống thư viện DHT từ kho lưu trữ Adafruit GitHub và cài đặt nó trong tệp Thư viện Arduino của bạn. Sau khi bạn tải lại Arduino IDE của mình, "thư viện cảm biến DHT" sẽ được cài đặt.

Ở đầu đoạn mã, chúng ta phải bao gồm các dòng:

/ * DHT22 * /

#include "DHT.h" #define DHTPIN D2 #define DHTTYPE DHT22 DHT dht (DHTPIN, DHTTYPE); float hum = 0; float temp = 0;

Một chức năng mới sẽ được tạo để đọc cảm biến:

/ * Nhận dữ liệu DHT * /

void getDhtData (void) {float tempIni = temp; float humIni = hum; temp = dht.readTempe Heat (); hum = dht.readHumidity (); if (isnan (hum) || isnan (temp)) // Kiểm tra xem có lần đọc nào không và thoát sớm (để thử lại). {Serial.println ("Không đọc được từ cảm biến DHT!"); temp = tempIni; hum = humIni; trở lại; }}

Có thể tải xuống mã hoàn chỉnh bao gồm cảm biến UV và DHT từ GitHub của tôi: NodeMCU_UV_DHT_Sensor_OLED

Bước 6: Gửi dữ liệu đến ThingSpeak.com

Gửi dữ liệu đến ThingSpeak.com
Gửi dữ liệu đến ThingSpeak.com
Gửi dữ liệu đến ThingSpeak.com
Gửi dữ liệu đến ThingSpeak.com
Gửi dữ liệu đến ThingSpeak.com
Gửi dữ liệu đến ThingSpeak.com

Cho đến nay, chúng tôi chỉ sử dụng NodeMCU ESP12-E như một bảng Arduino thông thường và thông thường. Tất nhiên, chúng ta mới chỉ "sơ lược" về tiềm năng thực sự của con chip nhỏ ngoạn mục này và giờ là lúc chúng ta cất cánh lên thiên đường! Hoặc tốt hơn cho các vì sao! Ehr… lên mây!;-)

Hãy bắt đầu nào!

  1. Đầu tiên, bạn phải có một tài khoản tại ThinkSpeak.com
  2. Làm theo hướng dẫn để tạo Kênh và ghi lại ID kênh của bạn và Viết khóa API
  3. Cập nhật mã bên dưới với mạng WiFi của bạn và thông tin đăng nhập Thinkspeak
  4. Chạy chương trình trên IDE

Hãy bình luận đoạn mã quan trọng nhất:

Đầu tiên, hãy gọi thư viện ESP8266, xác định máy khách WiFi và xác định thông tin đăng nhập Bộ định tuyến và Thinkspeak cục bộ của bạn:

/ * ESP12-E & Thinkspeak * /

# bao gồm ứng dụng khách WiFiClient; const char * MY_SSID = "ID SSD CỦA BẠN Ở ĐÂY"; const char * MY_PWD = "MẬT KHẨU CỦA BẠN Ở ĐÂY"; const char * TS_SERVER = "api.thingspeak.com"; String TS_API_KEY = "KHÓA API VIẾT KÊNH CỦA BẠN";

Thứ hai, hãy bao gồm một thư viện rất quan trọng cho các dự án IoT: SimpleTimer.h:

/ * HẸN GIỜ * /

# bao gồm bộ hẹn giờ SimpleTimer;

Thứ ba, trong quá trình setup (), chúng ta sẽ bắt đầu giao tiếp nối tiếp, gọi hàm connectWiFi () và xác định bộ định thời. Lưu ý rằng dòng mã: timer.setInterval (60000L, sendDataTS); sẽ gọi hàm sendDataTS () sau mỗi 60 giây, để tải dữ liệu lên kênh ThinkSpeak.

void setup ()

{… Serial.begin (115200); chậm trễ (10); … ConnectWifi (); timer.setInterval (60000L, sendDataTS); …}

Cuối cùng nhưng không kém phần quan trọng, trong vòng lặp (), lệnh duy nhất cần thiết là khởi chạy bộ đếm thời gian và thế là xong!

void loop ()

{… Timer.run (); // Khởi tạo SimpleTimer}

Dưới đây, bạn có thể thấy hai chức năng quan trọng được sử dụng để xử lý giao tiếp Thinkspeak:

Kết nối ESP12-E với mạng WiFi của bạn:

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

* Kết nối WiFi *********************************************** *** / void connectWifi () {Serial.print ("Đang kết nối với" + * MY_SSID); WiFi.begin (MY_SSID, MY_PWD); while (WiFi.status ()! = WL_CONNECTED) {delay (1000); Serial.print ("."); } Serial.println (""); Serial.println ("Đã kết nối WiFi"); Serial.println (""); }

ESP12-E gửi dữ liệu đến ThinkSpeak:

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

* Gửi dữ liệu đến kênh Thinkspeak ******************************************** ****** / 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 (tạm thời); postStr + = "& field4 ="; postStr + = String (hum); postStr + = "\ r / n / r / n"; client.print ("ĐĂNG / cập nhật HTTP / 1.1 / n"); client.print ("Máy chủ: api.thingspeak.com / n"); client.print ("Kết nối: close / n"); client.print ("X-THINGSPEAKAPIKEY:" + TS_API_KEY + "\ n"); client.print ("Loại-Nội dung: application / x-www-form-urlencoded / n"); client.print ("Nội dung-Độ dài:"); client.print (postStr.length ()); client.print ("\ n / n"); client.print (postStr); chậm trễ (1000); } đã gửi ++; client.stop (); }

Có thể tìm thấy mã hoàn chỉnh trên GitHub của tôi: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT

Khi bạn đã tải mã lên NodeMCU của mình. Hãy kết nối pin bên ngoài và thực hiện một số phép đo dưới ánh nắng mặt trời. Tôi đặt Trạm điều khiển từ xa trên mái nhà và bắt đầu thu thập dữ liệu trên ThingSpeak.com như trong các bức ảnh trên.

Bước 7: Kết luận

Phần kết luận
Phần kết luận

Như mọi khi, tôi hy vọng dự án này có thể giúp những người khác tìm đường vào thế giới điện tử đầy thú vị!

Để biết chi tiết và mã cuối cùng, vui lòng truy cập kho lưu ký GitHub của tôi: RPi-NodeMCU-Weather-Station

Để biết thêm các dự án khác, vui lòng truy cập blog của tôi: MJRoBot.org

Giữ nguyên! Hướng dẫn tiếp theo, chúng tôi sẽ gửi dữ liệu từ một trạm thời tiết từ xa đến một trạm trung tâm, dựa trên máy chủ Web Raspberry Pi:

Hình ảnh
Hình ảnh

Saludos từ phía nam của thế giới!

Hẹn gặp bạn trong hướng dẫn tiếp theo của tôi!

Cảm ơn bạn, Marcelo

Đề xuất: