Chƣơng trình nhóm chúng em viết cho mạch giám sát nhiệt độ, độ ẩm và chuyển động gồm các tính năng nhƣ sau:
- Thứ 1: Thiết bị có thể kết nối với mạng wifi bất kì, khi chƣa kết nối đƣợc thì thiết bị chuyển sang chế độ Access point (với tên wifi không trùng lặp) để ngƣời dùng dùng điện thoại kết nối với đèn và truy cập địa chỉ
“192 168 4 1” để thiết lập wifi cho nó, sau khi thiết lập xong đèn sẽ chuyển sang chế độ station để kết nối wifi mà ngƣời đã dùng thiết lập
CHƢƠNG 4 THI CÔNG HỆ THỐNG
-
-
-
Thứ 2: Thiết bị có thể đo nhiệt độ, độ ẩm và kích hoạt cảm biến PIR khi đƣợc yêu cầu, cảnh báo khi vƣợt mức ngƣỡng nhiệt độ đặt trƣớc hoặc phát hiện chuyển động
Thứ 3: Các dữ liệu đƣợc đƣa lên Firebase để điện thoại đọc về và báo lên app ngƣời dùng
Thứ 4: Có thể bật tắt led trên vỏ hộp ( tác dụng nhƣ đèn ngủ) bằng Google assistant
Sau đây nhóm em xin trình bày chƣơng trình của hệ thống:
Thêm thƣ viện để thực hiện đƣợc các tính năng wifi của mạch vi điều khiển ESP8266 ESP-12E NodeMCU
#include <ESP8266WiFi h>
Thêm thƣ viện để thực hiện viêc đọc ghi dữ liệu lên cơ sở dữ liệu thời gian thực FIREBASE
#include <FirebaseArduino h>
Thêm thƣ viện để thực hiện viêc kết nối Adafruit_Mqtt để nhận dữ liệu điều khiển bằng Google asstant
#include "Adafruit_MQTT h"
#include "Adafruit_MQTT_Client h"
Thêm thƣ viện để thực hiện viêc kết nối wifi tự động
#include <WiFiManager h>
Thêm thƣ viện của cảm biến DHT11: #include <DHT h>
Để tạo kết nối với cơ sở dữ liệu thời gian thực cần có địa chỉ và mã cho ngƣời phát triển , 2 thông tin này sẽ đƣợc gán vào 2 biến tƣơng ứng là FIREBASE_HOST, FIREBASE_AUTH thông qua định nghĩa:
#define FIREBASE_HOST "testdatn-12cd4 firebaseio com"
#define FIREBASE_AUTH
"HszRBsnMPCl1Yc05DeHtErXk7IhNoVk8KJ10swB1"
Để kết nối với Adfruit thì cần có các thông số sau: dịa chỉ sever kết nối, port kết nối, tên tài khoản, mật khẩu với định nghĩa:
CHƢƠNG 4 THI CÔNG HỆ THỐNG
#define MQTT_SERV "io adafruit com" #define MQTT_PORT 1883
#define MQTT_NAME "masterpoke"
#define MQTT_PASS "7b5c65d02b14449f945c55acfd4d20fe"
Để thực hiện việc điều khiển ta cần liên kết với các feed đƣợc tạo từ trƣớc trên Adfruit
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, MQTT_SERV, MQTT_PORT, MQTT_NAME, MQTT_PASS);
Adafruit_MQTT_Subscribe goout = Adafruit_MQTT_Subscribe(&mqtt, MQTT_NAME "/f/goout ");
Adafruit_MQTT_Subscribe denngu = Adafruit_MQTT_Subscribe(&mqtt, MQTT_NAME "/f/denngu");
Định nghĩa loại cảm biến và chân giao tiếp với cảm biến:
#define DHTTYPE DHT11 #define DHTPIN D4
Gán các chân giao tiếp và gán val = 0, pirState = LOW
int powerPin = D7; int inputPin = D2; int pirState = LOW; int pinSpeaker = D5;
// chọn chân 3 NGUON // chọn ngõ tín hiệu vào cho PIR
// Bắt đầu với không có báo động //chọn chân cho chuông khi có đột nhập int val = 0;
Gán các tham số vào hàm DHT dht(DHTPIN, DHTTYPE);
• Trong chƣơng trình khởi tạo Khai báo vào ra cho các chân:
CHƢƠNG 4 THI CÔNG HỆ THỐNG
pinMode(pinSpeaker, OUTPUT); pinMode(D0,OUTPUT);
Khởi tạo wifimanager, thực hiện tự động kết nối wifi, khi chƣa kết nối đƣợc wifi thì tự chuyển sang chế Access point với tên wifi “light 1”, sau khi kết nối đƣợc thì in ra “connected”
WiFiManager w;
w autoConnect("light 1");
Serial println("connected ");
Thực hiện đăng kí Mqtt cho các địa chỉ
mqtt subscribe(&goout ); mqtt subscribe(&denngu);
Thực hiện kết nối Firebase
Firebase begin(FIREBASE_HOST,FIREBASE_AUTH);
Khởi tạo chƣơng trình DHT: dht begin();
• Trong vòng lặp chƣơng trình:
Gọi hàm MQTT_connect (); để kết nối với MQTT của Adafruit
Adafruit_MQTT_Subscribe * subscription;
while ((subscription = mqtt readSubscription(1000))) {
if (subscription == &goout) {
Serial print("bat pir: ");
Serial println((char*) goout lastread); if (!strcmp((char*) goout lastread, "0"))
CHƢƠNG 4 THI CÔNG HỆ THỐNG digitalWrite(powerPin, LOW); else { digitalWrite(powerPin, HIGH); Firebase setInt("/den1", 1); Firebase setInt("/den2", 1); Firebase setInt("/denngu", 1); } } if (subscription == &denngu) {
Serial print("den ngu: ");
Serial println((char*) denngu lastread); if (!strcmp((char*) denngu lastread, "0")) { digitalWrite(D0, LOW);
Firebase setInt("/denngu", 1); }
else { digitalWrite(D0, HIGH);
Firebase setInt("/denngu", 0); } } }
Tạo 1 con trỏ *subscription cho Adafruit với câu lệnh:
Adafruit_MQTT_Subscribe * subscription;
Trong vòng lặp while ((subscription = mqtt readSubscription(1000))) thì
CHƢƠNG 4 THI CÔNG HỆ THỐNG
•
•
Nếu bằng goout, dữ liệu đọc đƣợc là „0‟ thì tắt cảm biến PIR bằng câu lệnh
digitalWrite(powerPin, LOW); còn dữ liệu đọc đƣợc là „1‟ thì bật cảm biến PIR và gửi biến các giá trị 1 lên Firebase theo các đƣờng dẫn tƣơng ứng bằng các câu lệnh :
Firebase setInt("/den1", 1); Firebase setInt("/den2", 1); Firebase setInt("/denngu", 1);
Nếu bằng denngu, dữ liệu đọc về là „0‟ thì tắt đèn ngủ bằng câu lệnh
digitalWrite(D0, LOW); và gửi giá trị 1 lên Firebase theo lệnh Firebase setInt("/denngu", 1); , ngƣợc lại bật đèn ngủ và gửi giá trị 0 lên
Firebase theo lệnh digitalWrite(D0, HIGH); Firebase setInt("/denngu", 0);
Tiếp theo là chƣơng trình đọc cảm biến DHT11 và cảm biến PIR
• Trong chƣơng trình đọc cảm biến DHT11
float h = dht readHumidity(); //Đọc độ ẩm float t = dht readTemperature(); //Đọc nhiệt độ if (isnan(h) || isnan(t)) {
Serial println(F("loi doc cam bien!")); return;
}
Serial println("nhiet do:"); Serial println(t);
Serial println("do am:"); Serial println(h);
CHƢƠNG 4 THI CÔNG HỆ THỐNG
Firebase setFloat ("/Humidity", h); if (t>=40)
{ digitalWrite(pinSpeaker, HIGH); Firebase setInt ("/bao chay", 1); }
else
{ digitalWrite(pinSpeaker, LOW); Firebase setInt ("/bao chay", 0); }
Đầu tiên đọc nhiệt độ, độ ẩm, nếu đọc không đƣợc thì in ra màn hình “loi doc cam bien”, nêú đọc đƣợc thì in ra màn hình nhiệt độ, độ ẩm và gửi 2 giá trị đó lên
Firebase bằng câu lệnh Firebase setFloat ("/Temp", t); Firebase setFloat ("/Humidity", h); sau đó đem giá trị nhiệt độ so sánh với giá trị đặt trƣớc nếu lớn
hơn hoặc bằng thì bật buzzer và gửi lên Firebase giá trị 1 theo lệnh Firebase setInt ("/bao chay", 1); ngƣợc lại tắt buzzer và gửi giá trị 0
• Trong chƣơng trình đọc cảm biến PIR
val = digitalRead(inputPin); // đọc giá trị đầu vào if (val == HIGH) // nếu giá trị ở mức cao (1) { digitalWrite(pinSpeaker, HIGH);
if (pirState == LOW)
{ Serial println("phat hien chuyen dong!"); Firebase setInt ("/bao trom", 1);
pirState = HIGH; } }
CHƢƠNG 4 THI CÔNG HỆ THỐNG
if (pirState == HIGH) {
Serial println("ket thuc chuyen dong"); Firebase setInt ("/bao trom", 0);
pirState = LOW; }
}
Nếu val = HIGH thì bật Buzzer và pirState = LOW thì gửi lên Firebase giá trị 1theo lệnh Firebase setInt ("/bao trom", 1); và gán pirState =HIGH
Ngƣợc lại val = LOW thì tắt Buzzer và pirState = HIGH thì gửi lên Firebase giá trị 0 theo lệnh Firebase setInt ("/bao trom", 0); và gán pirState =LOW