Hệ thống điều khiển thiết bị nhà thông minh sử dụng NodeMCU ESP8266 và App Blynk
Nội dung bài viết hôm nay mình sẽ hướng dẫn cho các bạn một dự án Làm hệ thống nhà thông minh sử dụng Blynk và NodeMCU ESP8266 để điều khiển các thiết bị trong ngôi nhà của mình.
Để hiểu hơn về cấu tạo và cách hoạt động của tất cả Cảm biến có trong dự án. Các bạn có thể tìm đọc bài viết về Khóa học Arduino miễn phí dành cho người mới nhập môn.
Nếu bạn chưa biết cách cài đặt NodeMCU ESP8266 trên Arduino IDE thì các bạn xem bài viết bên dưới nhé.
Cảm biến nhiệt độ độ ẩm DHT11
Cảm biến nhiệt độ độ ẩm DHT11 là một loại cảm biến kỹ thuật số được sử dụng để đo độ ẩm và nhiệt độ trong không khí. Nó được phát triển bởi công ty Aosong Electronics và sử dụng một cảm biến đo nhiệt độ và một cảm biến đo độ ẩm để cung cấp các giá trị đo chính xác. DHT11 có thiết kế nhỏ gọn, dễ sử dụng và chi phí thấp, nên nó được sử dụng phổ biến trong các ứng dụng điện tử như đo nhiệt độ và độ ẩm trong các thiết bị gia dụng, các hệ thống tự động hóa, các thiết bị đo lường và nhiều ứng dụng khác.
Xem thêm:Giám sát nhiệt độ, độ ẩm bằng App Blynk sử dụng NodeMCU ESP8266
Sơ đồ chân DH11
- VCC (cấp nguồn): Chân này được kết nối với nguồn 5V của Arduino.
- GND (chân đất): Chân này được kết nối với đất của Arduino.
- Data: Chân này được sử dụng để truyền dữ liệu từ cảm biến đến Arduino. Nó được kết nối với một chân trên Arduino để truyền dữ liệu kỹ thuật số.
Nguyên lý hoạt động cảm biến nhiệt độ DHT11
Cảm biến nhiệt độ và độ ẩm DHT11 Arduino là một cảm biến kỹ thuật số sử dụng để đo độ ẩm và nhiệt độ trong môi trường. Nguyên lý hoạt động của DHT11 Arduino dựa trên việc sử dụng một cặp điện cực nhạy cảm để đo độ ẩm trong không khí. Điện cực này thay đổi điện trở theo độ ẩm, và sau đó được đọc bởi một vi mạch điện tử để tính toán độ ẩm.
Cảm biến cũng sử dụng một cặp điện cực khác để đo nhiệt độ. Khi nhiệt độ thay đổi, điện trở của điện cực cũng thay đổi, cho phép vi mạch tính toán nhiệt độ của môi trường.
Dữ liệu được truyền từ cảm biến DHT11 sang vi điều khiển thông qua giao tiếp 1-write, bao gồm một tín hiệu số và một chuỗi bit dữ liệu. Vi điều khiển sử dụng giao thức này để giải mã dữ liệu độ ẩm và nhiệt độ và sử dụng nó cho các ứng dụng đo nhiệt độ và độ ẩm trong môi trường.
Cảm biến chuyển động Pir HC-SR501
Cảm biến chuyển động PIR HC-SR501 là một loại cảm biến phát hiện chuyển động dựa trên nguyên lý cảm ứng hồng ngoại pasive infrared (PIR). Nó được sử dụng phổ biến trong các ứng dụng như hệ thống bảo mật, tự động hóa nhà thông minh, chiếu sáng tự động, và các ứng dụng liên quan đến theo dõi và phát hiện chuyển động. Module cảm biến PIR HC-SR501 Arduino có kích thước nhỏ gọn, dễ sử dụng và giá cả phải chăng.
Sơ đồ chân cảm biến Pir
Cảm biến chuyển động hồng ngoại PIR HC-SR501 có 3 chân như sau:
- Chân GND (Ground): Đây là chân âm, kết nối với mát của nguồn cấp hoặc kết nối đất trong mạch điện.
- Chân VCC (Power Supply): Đây là chân dương, kết nối với nguồn cấp DC từ 4,5V đến 20V.
- Chân Out (Signal Output): Đây là chân đầu ra, sẽ tạo ra xung tín hiệu điện tương ứng với sự phát hiện chuyển động của đối tượng. Chân này có thể được kết nối trực tiếp với chân đầu vào của mạch điều khiển hoặc các linh kiện điện tử khác.
Lưu ý: Chân đầu ra (Out) của PIR HC-SR501 có mức điện thế cao hoặc thấp tùy thuộc vào sự phát hiện chuyển động. Mức điện thế cao tương ứng với sự phát hiện chuyển động, và mức điện thế thấp tương ứng với không phát hiện chuyển động.
Xem thêm:Cảnh báo trộm bằng cảm biến PIR (HC-SR501) thông qua App Blynk sử dụng ESP8266
Nguyên lý hoạt động của cảm biến chuyển động Pir HC-SR501 Arduino
Cảm biến chuyển động PIR HC-SR501 hoạt động dựa trên nguyên lý của cảm biến hồng ngoại bán dẫn (Passive Infrared Sensor – PIR), trong đó PIR là một loại cảm biến di chuyển, sử dụng khả năng phát hiện sự khác biệt giữa nhiệt độ của vật thể và nhiệt độ xung quanh để phát hiện chuyển động.
Cảm biến PIR bao gồm một tấm lọc quang học có khả năng chặn tín hiệu khác ngoài tín hiệu hồng ngoại phát ra từ con người và động vật, và một cặp cảm biến hồng ngoại bán dẫn đặt ở hai bên của tấm lọc. Khi một vật di chuyển qua khu vực phát hiện, nhiệt độ của vật sẽ khác so với nhiệt độ xung quanh và phát ra tín hiệu hồng ngoại, tín hiệu này sẽ được cảm biến bán dẫn nhận dạng và chuyển thành tín hiệu điện. Sau đó, mạch điện tử sẽ phân tích tín hiệu để xác định xem có sự chuyển động nào xảy ra hay không và kích hoạt một tín hiệu ra để điều khiển các thiết bị khác.
Cảm biến chuyển động PIR HC-SR501 sử dụng mạch khuếch đại và lọc tín hiệu để phân tích tín hiệu điện từ cảm biến hồng ngoại bán dẫn và đưa ra một tín hiệu đầu ra kích hoạt khi phát hiện sự chuyển động trong phạm vi hoạt động của nó.
Sơ đồ đấu nối
Các linh kiện cần thiết cho dự án
Tên linh kiện | Số lượng | Shopee |
NodeMCU ESP8266 | 1 | Mua ngay |
Cảm biến nhiệt độ, độ ẩm DHT11 | 1 | Mua ngay |
Cảm biến chuyển động PIR HC-SR501 | 1 | Mua ngay |
Relay 5V/4 kênh | 1 | Mua ngay |
Led RGB | 1 | Mua ngay |
Bread Board (Bo Test) | 1 | Mua ngay |
Dây cắm (Đực – Cái) | 1 | Mua ngay |
Dây cắm (Đực – Đực) | 1 | Mua ngay |
Code
#define BLYNK_PRINT Serial // Comment this out to disable prints and save space #include <SPI.h> #include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> #include <SimpleTimer.h> #include <DHT.h> // You should get Auth Token in the Blynk App. // Go to the Project Settings (nut icon). char auth[] = " 1efa4c5b87034f3688f8383ae1a56132 "; // Your WiFi credentials. // Set password to "" for open networks. char ssid[] = "Phamson"; char pass[] = "phamtheson"; #define DHTPIN 16 // What digital pin we're connected to // Uncomment whatever type you're using! #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22, AM2302, AM2321 //#define DHTTYPE DHT21 // DHT 21, AM2301 DHT dht(DHTPIN, DHTTYPE); SimpleTimer timer; // This function sends Arduino's up time every second to Virtual Pin (5). // In the app, Widget's reading frequency should be set to PUSH. This means // that you define how often to send data to Blynk App. void sendSensor() { float h = dht.readHumidity(); float t = dht.readTemperature(); // or dht.readTemperature(true) for Fahrenheit if (isnan(h) || isnan(t)) { Serial.println("Failed to read from DHT sensor!"); return; } int p=digitalRead(15);//th cb chuyen dong // You can send any value at any time. // Please don't send more that 10 values per second. Blynk.virtualWrite(V5, h); Blynk.virtualWrite(V6, t); if(p==HIGH) Blynk.virtualWrite(V4,"++co nguoi++"); else Blynk.virtualWrite(V4," --khong co--"); } void setup() { pinMode(15,INPUT); Serial.begin(9600); // See the connection status in Serial Monitor Blynk.begin(auth, ssid, pass); dht.begin(); // Setup a function to be called every second timer.setInterval(1000L, sendSensor); } void loop() { Blynk.run(); // Initiates Blynk timer.run(); // Initiates SimpleTimer }
Giải thích Code
Đây là mã nguồn của một chương trình sử dụng cảm biến DHT11 và PIR HC-SR501 kết hợp với Blynk để đo và hiển thị nhiệt độ, độ ẩm và trạng thái chuyển động trên ứng dụng điện thoại thông qua kết nối WiFi.
#define BLYNK_PRINT Serial // Comment this out to disable prints and save space
Định nghĩa #define BLYNK_PRINT Serial
, giúp cho việc gửi và nhận dữ liệu qua Blynk được hiển thị trên Serial Monitor khi chương trình chạy.
#include <SPI.h> #include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> #include <SimpleTimer.h> #include <DHT.h>
Tiếp theo là khai báo thư viện cần sử dụng: SPI, ESP8266WiFi, BlynkSimpleEsp8266, SimpleTimer và DHT.
// You should get Auth Token in the Blynk App. // Go to the Project Settings (nut icon). char auth[] = " 1efa4c5b87034f3688f8383ae1a56132 "; // Your WiFi credentials. // Set password to "" for open networks. char ssid[] = "Phamson"; char pass[] = "phamtheson";
Khai báo các biến: auth là mã token được tạo trên ứng dụng Blynk, ssid và pass là tên và mật khẩu của mạng WiFi.
void sendSensor() { float h = dht.readHumidity(); float t = dht.readTemperature(); // or dht.readTemperature(true) for Fahrenheit if (isnan(h) || isnan(t)) { Serial.println("Failed to read from DHT sensor!"); return; } int p=digitalRead(15);//th cb chuyen dong // You can send any value at any time. // Please don't send more that 10 values per second. Blynk.virtualWrite(V5, h); Blynk.virtualWrite(V6, t); if(p==HIGH) Blynk.virtualWrite(V4,"++co nguoi++"); else Blynk.virtualWrite(V4," --khong co--"); }
Trong hàm sendSensor(), chương trình sẽ đọc dữ liệu nhiệt độ và độ ẩm từ cảm biến DHT11 bằng phương thức dht.readHumidity() và dht.readTemperature(). Nếu không đọc được dữ liệu từ cảm biến, chương trình sẽ hiển thị thông báo lỗi. Đồng thời, trạng thái của cảm biến chuyển động PIR HC-SR501 sẽ được đọc thông qua hàm digitalRead(15) và hiển thị trên ứng dụng thông qua Blynk.virtualWrite().
void setup() { pinMode(15,INPUT); Serial.begin(9600); // See the connection status in Serial Monitor Blynk.begin(auth, ssid, pass); dht.begin(); // Setup a function to be called every second timer.setInterval(1000L, sendSensor); }
Trong hàm setup(), chương trình khởi tạo chân 15 của board Arduino là INPUT để đọc dữ liệu từ cảm biến chuyển động PIR HC-SR501. Hàm Serial.begin(9600) được sử dụng để hiển thị trạng thái kết nối trên Serial Monitor. Sau đó, Blynk.begin() được sử dụng để kết nối tới ứng dụng Blynk thông qua mạng WiFi.
Hàm dht.begin() sử dụng để khởi tạo cảm biến DHT11. Hàm timer.setInterval(1000L, sendSensor) được sử dụng để thực hiện việc đọc dữ liệu từ cảm biến và hiển thị trên ứng dụng Blynk mỗi 1 giây.
void loop() { Blynk.run(); // Initiates Blynk timer.run(); // Initiates SimpleTimer }
Trong hàm loop(), chương trình sử dụng Blynk.run() để duy trì kết nối tới ứng dụng Blynk và timer.run() để thực hiện việc gọi hàm sendSensor() mỗi giây.
Thư viện
Để quá trình nạp không bị báo lỗi chúng ta cần phải cài đặt thư viện cho Arduino IDE. Tại đây
- Download thư viện “DHT.h” : Tải ngay
- Download thư viện “SimpleTimer.h”: Tải ngay
- Download thư viện “BlynkSimpleEsp8266.h”: Tải ngay