Arduino thì quá quen thuộc với các bạn rồi nếu như bạn đang tìm đọc đến bài này phải không. Arduino được dùng trong khá nhiều các project ở mức độ tìm hiểu, học tập với khả năng “dễ học” của nó. Có khả năng giao tiếp với khá nhiều các module ngoại vi khác và hôm nay mình xin giới thiệu đến các bạn cách dùng Arduino giao tiếp DHT11, module dht11 với khả năng thu thập các giá trị nhiệt độ và độ ẩm môi trường xung quanh khá tốt.
Mục đích bài viết
- Dùng Arduino giao tiếp DHT11 (Đọc được thông số nhiệt độ, độ ẩm)
- Giao tiếp giữa arduino và module NRF24L01 (sử dụng bluetooth)
- Gửi giá trị độ ẩm, nhiệt độ theo thời gian thực đến điện thoại thông qua sóng bluetooth
Thành quả của dự án:
Tìm hiểu các thành phần cần có
1. Phần cứng
- Module Arduino Uno
- Module DHT11
- Module NRF24L01
2. Phần mềm
- Arduino IDE (nếu chưa có các bạn có thể tải về và tiến hành cài đặt nhé!)
- Ứng dụng thu thập dữ liệu từ cảm biến (Nordic BLE Android Application): Cài đặt trên điện thoại Android nhé.
Đối với arduino ở đây mình sử dụng module arduino uno đã khá thân thuộc với anh em dân điện chúng ta, vì vậy mình xin phép không nói nhiều về nó nữa. Mình chỉ xin giới thiệu qua về 2 module còn lại
Module NRF24L01
- Khoảng cách thu phát khoảng 100m (với điều kiện trống trải), khoảng 30-50m (trong nhà). Với một số phiên bản đặc biệt ví dụ như loại NRF24L01+ thì khoảng cách có thể lên tới 1km. Khá thích hợp cho các bộ điều khiển cầm tay.
- Có anten sẵn trên bảng mạch rất tiện và đẹp.
- Có khả năng truyền tín hiệu 2 chiều. Tức là một module vừa có thể là transmitter vừa có thể là receiver. Khác biệt so với loại 433Mhz là phải có 2 module riêng biệt.
Module DHT11
- Điện áp hoạt động: 3V – 5V (DC)
- Dãy độ ẩm hoạt động: 20% – 90% RH, sai số ±5%RH
- Dãy nhiệt độ hoạt động: 0°C ~ 50°C, sai số ±2°C
- Khoảng cách truyền tối đa: 20m
Kết nối các module
Các bạn tiến hành kết nối đúng thứ tự chân như hình trên sau đó hãy cấp nguồn vào board arduino (jack cắm tròn 5V hoặc cổng nạp code từ USB)
Lưu ý: NRF24L01 chỉ cấp nguồn 3v3 nhé!
Nguyên lý giao tiếp giữa các module
Đầu tiên để giao tiếp giữa arduino và module dht11 thì ta chỉ cần kết nối chân tín hiệu của dht11 đến chân digital của arduino (sử dụng chân số 4).
Đối với nrf24l01 ta tiến hành giao tiếp với arduino thông qua giao thức spi
- GND: GND Arduino
- VCC: 3.3v Arduino
- CE: PIN 9 Arduino
- CSN: PIN 10 Arduino
- SCK: PIN 13 Arduino Uno
- MOSI: PIN 11 Arduino Uno
- MISO: PIN 12 Arduino Uno
- IRQ: không dùng
Tiến hành code thôi nào
Code tổng quát dự án:
#include <SPI.h> #include <RF24.h> #include <BTLE.h> #include <DHT.h> // dht11 temperature and humidity sensor library #define DHTPIN 4 // what digital pin we're connected to #define DHTTYPE DHT11 // select dht type as DHT 11 or DHT22 DHT dht(DHTPIN, DHTTYPE); RF24 radio(9, 10); // CE, CSN BTLE btle(&radio); void setup() { Serial.begin(9600); delay(1000); Serial.print("BLE and DHT Starting... "); Serial.println("Send Temperature Data over BTLE"); dht.begin(); // initialise DHT11 sensor btle.begin("CD Temp"); // 8 chars max Serial.println("Successfully Started"); } void loop() { float temp = dht.readTemperature(); //read temperature data if (isnan(h) || isnan(t)) { // Check if any reads failed and exit early (to try again). Serial.println(F("Failed to read from DHT sensor!")); return; } Serial.print(" Temperature: "); Serial.print(t); Serial.println("°C "); nrf_service_data buf; buf.service_uuid = NRF_TEMPERATURE_SERVICE_UUID; buf.value = BTLE::to_nRF_Float(temp); if (!btle.advertise(0x16, &buf, sizeof(buf))) { Serial.println("BTLE advertisement failed..!"); } btle.hopChannel(); delay(2000); }
Giải thích
Đầu tiên chúng ta cần các thư viện
#include <SPI.h> #include <RF24.h> #include <BTLE.h> #include <DHT.h>
Tiếp theo là khai báo sử dụng module DHT11 hoặc DHT22, định nghĩa các chân giao tiếp giữa NRF24L01 và arduino
#define DHTPIN #define DHTTYPE DHT11 DHT22 DHT dht(DHTPIN, DHTTYPE); RF24 radio(9, 10); BTLE btle(&radio);
Cấu hình in dữ liệu ra màn hình để xem
Serial.begin(9600); dht.begin(); btle.begin("CD Temp");
Tiến hành đọc nhiệt độ của DHT11
float temp = dht.readTemperature(); //read temperature data if (isnan(h) || isnan(t)) { Serial.println(F("Failed to read from DHT sensor!")); return; }
Lưu trữ giá trị vào bộ nhớ đệm và sau đó gửi giá trị vừa đọc được đến module NRF24L01 để tiến hành quảng bá dữ liệu đó đến App trên điện thoại
nrf_service_data buf; buf.service_uuid = NRF_TEMPERATURE_SERVICE_UUID; buf.value = BTLE::to_nRF_Float(temp); if (!btle.advertise(0x16, &buf, sizeof(buf))) { Serial.println("BTLE advertisement failed..!"); }
Sau 1 chu kỳ quảng bá dữ liệu đến điện thoại thì sẽ ngừng và chuyển đến kênh khác sau đó lặp lại quá trình đọc cảm biến và gửi
btle.hopChannel();
Chờ khoảng 2 giây để lặp lại quá trình
delay(2000);
Kết quả
Sau khi nạp code thành công vào board arduino uno các bạn có thể tiến hành mở serial và theo dõi các giá trị đọc được từ module dht11.
Mở ứng dụng vừa cài đặt phía trên và tiến hành kết nối đến bluetooth có tên “CD Temp”, các bạn có thể làm theo video hướng dẫn phía trên nhé.
Vậy Espitek đã hướng dẫn chi tiết từng bước để thực hiện dự án thu thập dữ liệu từ module DHT11 để gửi lên điện thoại giúp bạn dễ dàng giám sát rồi. Các bạn hoàn toàn có thể cải tiến dựa trên bài này để ứng dụng cho các dự án khác nhé.
Chúc các bạn thành công!