Xây dựng trạm thời tiết ứng dụng IoT với ESP32 Leave a comment

Hôm nay chúng ta sẽ xây dựng một trạm thời tiết không dây có chức năng đo nhiệt độ, độ ẩm, áp suất khí quyển, ánh sáng và tốc độ gió. Sau đó, dữ liệu được truy cập thông tin qua Thingspeak trên máy tính, máy tính bảng hoặc điện thoại di động có kết nối internet.

Giao diện web Thingspeak

Tôi sẽ sử dụng module LOLIN32 ESP32 Module Thu Phát Wifi Bluetooth. Tôi đã chọn bo mạch cụ thể này vì nó vốn được thiết kế cho các ứng dụng tiêu thụ điện năng thấp và có thể được cấp nguồn trực tiếp bằng pin lithium-ion 3.7V. Nó có một phích cắm pin tích hợp và hỗ trợ sạc qua cổng USB.

Đối với cảm biến, tôi sẽ sử dụng các module cảm biến tích hợp được bán trên thị trường bạn có thể mua chúng tại fuvitech.vn. Chúng tôi cung cấp các thành phần hỗ trợ cần thiết cho cảm biến, vì vậy bạn chỉ cần kết nối cảm biến và bộ vi điều khiển của mình. 

sản phầm hoàn thiện

Các linh kiện cần thiết

Bắt đầu thôi nào!!!!!!

Bước 1: Kết nối các thành phần lại với nhau

Kết nối chúng bằng breadboard

Đối với bất kỳ dự án điện tử nào, bạn nên thử lắp ráp các thành phần trên một breadboard trước tiên để kiểm tra các kết nối và Code.

Tôi đã kết nối cảm biến áp suất với giao thức I2C, cảm biến DHT11 vào chân GPIO 14 theo giao tiếp Onewire, cảm biến ánh sáng vào chân 36 và công tắc từ trường vào chân 0.

Các kết nối khác chỉ là 5V và GND.

Cảm biến áp suất với giao thức I2C

  • VCC – 5V
  • GND – GND
  • SCL – SCL
  • SDA – SDA


Cảm biến DHT11

  • VCC – 5V
  • GND – GND
  • Sig – Pin 14

Cảm biến ánh sáng Analog

  • VCC – 5V
  • GND – GND
  • Sig – Pin 36

Công tắt từ trường

  • VCC – 5V
  • GND – GND
  • Sig – Pin 36

Bước 2: Lập trình code cho ESP32

Giờ đây, các cảm biến đã được kết nối với ESP32, chúng tôi có thể viết Code để lấy kết quả đọc từ các cảm biến và gửi dữ liệu lên Thingspeak. Giữa các lần đọc, chúng tôi sẽ đặt ESP32 vào chế độ ngủ sâu để tiết kiệm điện năng. Thao tác này sẽ tắt các mô-đun giao tiếp WiFi và Bluetooth cũng như CPU.

Code có thể được lập trình trong Arduino IDE. Và dưới đây là chương trình.

Bạn cần tải các thư viện về và giải nén chúng vào Documents > Arduino >Libraries trước khi biên dịch code này:

Bạn cần tải thêm bảng mở rộn Board ESP về theo hướng dẫn này.

Tải xuống Code tại đây

//Weather Station
//The DIY Life by Michael Klements
//11 August 2021

#include <Wire.h>                                                   //Import the required libraries
#include "DHT.h"
#include "Seeed_BMP280.h"
#include <WiFi.h>
#include "ThingSpeak.h"

#define lightSen 36                                                 //Define pin numbers
#define windSen 0
#define uS_TO_S_FACTOR 1000000ULL                                   //Conversion factor for micro seconds to seconds
#define TIME_TO_SLEEP  570                                          //Time ESP32 will go to sleep (in seconds) - 9.5 minutes

DHT dht(14,DHT11);                                                  //DHT and bMP sensor parameters
BMP280 bmp280;

WiFiClient client;                                                  //WiFi connection details
char ssid[] = "WIFI SSID";                                          //WiFi Name
char pass[] = "WIFI PASSWORD";                                      //WiFi Password

unsigned long myChannelNumber = YOUR CHANNEL ID;                    //Thingspeak channel number
const char * myWriteAPIKey = "YOUR WRITE API KEY";                  //Thingspeak API write key

int light = 0;                                                      //Variables to store sensor readings
int temp = 0;
int humid = 0;
int pressure = 0;
int wind = 0;

unsigned long firstMillis = 0;                                       //Timers for the wind speed calculation
unsigned long lastMillis = 0;
unsigned long lastIntTime = 0;
int counter = 0;                                                     //Counter to keep track of the number of wind speed revolutions 

void IRAM_ATTR isr ()                                                //Interrupt routine, run with each reed switch interrupt
{
  unsigned long intTime = millis();
  if(intTime - lastIntTime > 150)                                    //Debounce the reed switch input
  {
    if (counter == 0)
      firstMillis = millis();
    counter++;                                                       //Count each revolution
    lastMillis = millis();
    Serial.println(counter);
  }
  lastIntTime = intTime;                                             //Capture the first and last revolution time
}

void setup()                                                         //Setup function - only function that is run in deep sleep mode
{
  Serial.begin(9600);
  if(!bmp280.init())                                                 //Connect to pressure sensor
  {
    Serial.println("bmp280 init error!");
  }
  pinMode(lightSen, INPUT);                                          //Define pin functions
  pinMode(windSen, INPUT_PULLUP);
  attachInterrupt(windSen, isr, FALLING);                            //Define interrupt pin
  WiFi.begin(ssid, pass);                                            //Connect to WiFi network
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);     //Initialise deep sleep mode parameters
  ThingSpeak.begin(client);                                          //Initialise ThingSpeak
  delay(10000);                                                      //Wait for wind speed readings to be taken
  recLight ();                                                       //Take readings from other sensors
  recTempHumid ();
  recPress ();
  calcWind ();
  counter = 0;
  Serial.print("Light: ");                                           //Display readings on serial monitor
  Serial.println(light);
  Serial.print("Temp: ");
  Serial.println(temp);
  Serial.print("Humidity: ");
  Serial.println(humid);
  Serial.print("Pressure: ");
  Serial.println(pressure);
  Serial.print("Wind: ");
  Serial.println(wind);
  updateThingSpeak ();                                               //Post the data to Thingspeak
  Serial.println("Going to sleep now");
  Serial.flush(); 
  esp_deep_sleep_start();                                            //Enter sleep mode
}

void loop()                                                          //Loop function - unused
{

}

void recLight ()                                                     //Function to record the light level
{
  light = analogRead(lightSen);
}

void recTempHumid ()                                                 //Function to record the temperature and humidity
{
  temp = dht.readTemperature();
  humid = dht.readHumidity();
}

void recPress ()                                                     //Function to record the pressure
{
  pressure = bmp280.getPressure()/100;
}

void calcWind ()                                                     //Function to calculate the wind speed
{
  int ave = 5000;
  if(counter != 0)
    ave = (lastMillis - firstMillis)/counter;
  Serial.print("Average Tick Time: ");
  Serial.println(ave);
  if (ave < 200)
  {
    ave = 200;
    wind = map (ave,200, 4000, 16, 3);
  }
  else if (ave > 4000)
    wind = 0;
  else
  {
    wind = map (ave,200, 4000, 16, 3);
  }
}

void updateThingSpeak ()                                             //Function to post data to Thingspeak
{
  ThingSpeak.setField(1, light);
  ThingSpeak.setField(2, temp);
  ThingSpeak.setField(3, humid);
  ThingSpeak.setField(4, pressure);
  ThingSpeak.setField(5, wind);
  int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
  if(x == 200)
  {
    Serial.println("Channel update successful.");
  }
  else
  {
    Serial.println("Problem updating channel. HTTP error code " + String(x));
  }
}

Thay đổi thông tin WIFI

//WiFi connection details
char ssid[] = "WIFI SSID";                                          //WiFi Name
char pass[] = "WIFI PASSWORD";                                      //WiFi Password


Bạn cần điền thông tin tên WIFI cần kết nối thay cho “WIFI SSID” và Pass WIFI thay cho “WIFI PASSWORD” để ESP32 có thể kết nối với Internet.

Tạo API WRITE KEY Thingspeak

Tạo tài khoản ThingSpeak và New Channel để lấy channelID writeAPIKey

Tạo channel mới
Mã Write API Key

Bạn coppy mã write API key được sinh ra ở mục API Keys và cho vào đoạn code. Mã Channel ID nằm ở Channel settings


unsigned long myChannelNumber = YOUR CHANNEL ID;                    //Thingspeak channel number
const char * myWriteAPIKey = "Thay thế mã WRITE API KEY";                  //Thingspeak API write key

Bạn sẽ nhận thấy rằng tất cả mã đều nằm trong hàm setup () và hàm loop () để trống. Điều này là do ESP32 chỉ chạy hàm setup () khi hoạt động ở chế độ ngủ sâu, vì vậy chỉ mã trong hàm này được thực thi mỗi khi thức dậy.

Chu kỳ đánh thức mất khoảng 20-30 giây để hoàn thành bao gồm 10 giây mà ESP32 chờ để đo dữ liệu tốc độ gió.

Sau khi thay đổi các thông tin bạn bắt đầu biên dịch chương trình trên Arduino IDE và nạp code xuống board ESP32.

Bước 3: Hàn dây kết nối các linh kiện với nhau

Để làm cho trạm thời tiết linh hoạt hơn một chút, bạn nên kết nối cố định các dây để kết nối các cảm biến với ESP32.

Tôi cắt các đầu của một bên dây cáp và hàn chúng cùng với hai jumper cái cho công tắc.

Sau khi bạn kết nối các dây cần kiểm tra lại. dùng VOM để kiểm tra từng dây trước khi cấp nguồn và chạy thử lại hệ thống.

Bước 4: Chuẩn bị bộ vỏ bên ngoài cảm biến bằng nhựa in 3D

Bạn có thể tự In mẫu nếu có máy in 3D. Tải file tại đây. Hoặc bạn có thể sử dụng dịch vụ in 3D của chúng tôi.

Tôi đã thiết kế vỏ được in 3D bằng nhựa để vỏ cảm biến có lỗ thông hơi không cần phải lắp ráp thành nhiều lớp. Tôi muốn nó càng nhỏ gọn càng tốt, vì vậy tôi muốn tích hợp các cảm biến và máy đo gió vào một bộ phận duy nhất. Thiết kế mà tôi đưa ra là đặt ESP32 và pin trong đế, với các cảm biến trong ngăn trung tâm có lỗ thông hơi và máy đo gió ở trên cùng.

Tôi vẫn chưa chắc các bản in bằng nhựa 3D sẽ giữ được tốt như thế nào dưới ánh nắng mặt trời. Tôi đã thực hiện một chút nghiên cứu về nó và hầu hết đều nói rằng đó là một ý tưởng và nó chỉ mang tính chất thử nghiệm và nghiên cứu, liệt kê các hư hỏng do tia cực tím làm nhựa giòn có thể dẫn đến hỏng hóc, nhưng tôi cũng đã thấy một vài thử nghiệm trong đó mọi người thực sự để lại các bản in bên ngoài và họ dường như không có bất kỳ thiệt hại nào có thể nhìn thấy được. Bạn hãy thử xem nhé.

Bước 5: Lắp ráp linh kiện vào vỏ.

Tôi gắn các cảm biến lên giá đỡ cảm biến, với cảm biến nhiệt độ và độ ẩm ở một bên, sau đó là cảm biến áp suất và ánh sáng ở bên kia.

Gập chân của công tắc từ 90 độ để nó có thể được đặt ở phía trên cùng của vỏ cảm biến với các chân xuyên vào bên trong. Tôi cho một ít nhựa vào các khoảng trống ở mỗi đầu để bịt kín chúng và bảo đảm không thấm nước.

Máy đo gió được giữ cố định bằng một vít M5x20mm thông qua vỏ từ bên trong. Một đai ốc giữ vít ở một vị trí và một đai ốc thứ hai sau đó giữ hai ổ trục trên trục vít. Vặn đai ốc này để giữ các ổ trục ở đúng vị trí, nhưng đừng siết quá chặt để hạn chế chuyển động quay của chúng.

Đẩy một vài nam châm (4-5) vào một trong những khoảng trống trên đế máy đo gió. Những điều này sẽ kích hoạt công tắc từ trên mỗi vòng quay.

Cuối cùng, lắp máy đo gió lên vòng bi sao cho nó nằm phía trên công tắc từ vài mm.

Cắm dây dẫn vào các cảm biến và kết nối dây nối với công tắc từ. Cắm pin vào ESP32, nhớ sạc pin trước, sau đó đóng vỏ bằng một số vít M3x8mm.

Trạm thời tiết bây giờ sẽ được kết nối với mạng WiFi của bạn và gữi dữ liệu lên Thingspeak, vì vậy nó đã sẵn sàng để gắn ngoài trời.

Cố định nó bên ngoài bằng ba vít thông qua các giá đỡ ở dưới cùng của đế.

Bước 6: Kiểm tra Trạm thời tiết

Tôi rời trạm thời tiết trong vài giờ và sau đó mở Thingspeak của mình lên kiểm tra. Tất cả các cảm biến điều hoạt động tốt và đẩy dữ liệu hiển thị trên biểu đồ.

Tôi cũng đã kiểm tra dòng điện từ pin và thấy rằng hệ thống sử dụng khoảng 30-60mA khi chạy, 120mA khi đăng dữ liệu qua WiFi và dòng điện giảm xuống 1,2mA khi ở chế độ ngủ sâu. Vì vậy, trên pin 2500mAh, bạn sẽ có thời gian hoạt động dưới 2 tháng cho một lần sạc. Bạn cũng có thể thêm một bảng điều khiển năng lượng mặt trời nhỏ vào bộ phận lắp ráp để sạc pin trong ngày.

Hãy cho tôi biết suy nghĩ của bạn về trạm thời tiết trong phần nhận xét và hãy cân nhắc bỏ phiếu cho nó trong cuộc thi Backyard nếu bạn thích nó.

Mai Minh Mẫn. Tham khảo từ instructables

Trả lời

SHOPPING CART

close