Bắt đầu
Khởi tạo Serial, khởi tạo Wifi Manager
Tiến hành kết nối với mạng Wifi Mạng wifi đã S được kết nối ? Chuyển sang chế độ Access point S Đ Mạng wifi đã được kết nối ? Đ
Đăng kí MQTT,khởi tạo kết nối với cơ sở dữ liệu thời gian thực Firebase
Kết nối với MQTT
Đọc dữ liệu từ Adafruit_MQTT, xử lí bật tắt đèn hoặc tăng giảm biến độ
sáng, gửi giá trị độ sáng lên Firebase
Kết nối S Firebase lỗi ?
Đ
Giữ nguyên giá trị pwm hiện tại
Đọc giá trị độ sáng từ Firebase, so sánh với các giá trị từ 1 đến 10 để
xuát pwm tương ứng
Kết thúc
CHƢƠNG 4 THI CÔNG HỆ THỐNG
Khi có nguồn cung cấp cho mạch vi điều khiển ESP8266 ESP-12E NodeMCU sẽ hoạt động khởi tạo Serial, Wifi Manager Tiếp theo nó sẽ tiến hành kết nối với Wifi, nếu kết nối đƣợc thì tiến hành đăng kí MQTT và khởi tạo kết nối Firebase, trƣờng hợp không kết nối đƣợc thì nó sẽ chuyển sang chế độ Access point ( điểm truy cập) và đợi ngƣời dùng kết nối với Wifi do nó phát ra và thiết lập Wifi cho nó tại địa chỉ 192 168 4 1 Sau khi ngƣời dùng thiết lập xong ESP sẽ chuyển sang chế độ Station ( thu Wifi ) và kết nối Wifi, nếu vẫn chƣa kết nối đƣợc thì nó vẫn ở chế độ Access point
Trong vòng lặp tuần hoàn:
Thực hiện chƣơng trình kết nối MQTT, sau đó đọc dữ liệu từ Adafruit_MQTT và so sánh với các địa chỉ đăng kí MQTT, nếu đúng địa chỉ thì sẽ xử lí dữ liệu nhận đƣợc để bật tắt thiết bị đèn, hoặc tăng giảm biến độ sáng và gửi lại giá trị độ sáng lên Firebase
Nếu kết nối với Firebase bị lỗi sẽ giữ nguyên giá trị PWM hiện tại Sau đó đọc giá trị độ sáng trên Firebase và so sánh với các giá trị từ 1 đến 10 để xuất ra PWM tƣơng ứng
Chƣơng trình cứ thế lặp lại
4 4 2 Chƣơng trình cho mạch điều khiển độ sáng đèn bulb
Chƣơng trình nhóm chúng em viết cho mạch điều khiển độ sáng đèn bulb gồm các tính năng nhƣ sau:
-
-
Thứ 1: Các thiết bị đèn hoạt động độc lập với nhau, ngƣời dùng có thể tùy chỉnh riêng biệt từng đèn trên app hoặc thông qua Google assistant
Thứ 2: Các thiết bị đèn 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ị đèn 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
giữ nguyên ( sáng hoặc không sáng), thiết bị đèn sẽ chờ kết nối,khi kết nối đƣợc sẽ hoạt động lại bình thƣờng
- Thứ 4: Các trạng thái của đèn ( sáng hoặc không sáng) sẽ đƣợc cập nhật lên cơ sở dữ liệu và phần mềm điện thoại sẽ cập nhật đƣợc trạng thái thực tế để giúp ngƣời dùng nhận biết
- Thứ 5: Khi đèn hoạt động thì dữ liệu sẽ đƣợc cập nhật lên cơ sở dữ liệu và khi không hoạt động thì sẽ không cập nhật dữ liệu lên cơ sở dữ liệu nhờ dữ liệu này mà ứng dụng trên điện thoại sẽ phân tích và báo cho ngƣời dùng biết thiết bị thực tế có đang hoạt động hay không
-
-
Thứ 6: Độ sáng đèn có thể thay đổi đƣợc dựa trên sự điều khiển của ngƣời dùng thao tác trên phần mềm điều khiển trên điện thoại thông minh Độ sáng sẽ thay đổi tăng độ sáng tuyến tính hoặc giảm độ sáng tuyến tính để mắt ngƣời sử dụng dễ thích nghi
Thứ 7: Đèn có thể bật tắt và thay đổi độ sáng bằng giọng nói thông qua trợ lý ảo Google assistant mà không cần bật ứng dụng
Do phần chƣơng trình bao gồm một số tính năng nên chƣơng trình nhiều dòng lệnh và nhóm chúng em sẽ giải thích chƣơng trình chính của chƣơng trình lập trình cho vi điều khiển ESP8266 ESP-12E NodeMCU trong mạch điều khiển độ sáng đèn bulb
Để tiến hành lập trình thì cần thêm các bộ thƣ viện để sử dụng các tính nă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"
CHƢƠNG 4 THI CÔNG HỆ THỐNG
Thêm thƣ viện để thực hiện viêc kết nối wifi tự động
#include <WiFiManager 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:
#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 ds1 = Adafruit_MQTT_Subscribe(&mqtt, MQTT_NAME "/f/dosang1"); Adafruit_MQTT_Subscribe MQTT_NAME "/f/max"); dsmax = Adafruit_MQTT_Subscribe(&mqtt,
Adafruit_MQTT_Subscribe light = Adafruit_MQTT_Subscribe(&mqtt, MQTT_NAME "/f/light1");
CHƢƠNG 4 THI CÔNG HỆ THỐNG
uint16_t a=0; int8_t dosang1;
• Trong chƣơng trình khởi tạo:
WiFiManager w;
w autoConnect("light 1"); Serial println("connected ");
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”
Với các câu lệnh:
mqtt subscribe(&ds1);
mqtt subscribe(&dsmax); mqtt subscribe(&light);
Thực hiện đăng kí Mqtt cho các địa chỉ trên
Thực hiện kết nối Firebase và gửi giá trị „1‟ theo đƣờng dẫn “/den1” qua 2 dòng lệnh:
Firebase begin(FIREBASE_HOST,FIREBASE_AUTH); Firebase setInt("/den1", 1);
• 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
dosang1= Firebase getInt("/light 1"); biến dosang1 đọc dữ liệu từ Firebase và lƣu vào
Adafruit_MQTT_Subscribe * subscription;
while ((subscription = mqtt readSubscription(1000))) {
CHƢƠNG 4 THI CÔNG HỆ THỐNG
if (subscription == &ds1) {
Serial print("den 1 muc: ");
Serial println((char*) ds1 lastread); if (!strcmp((char*) ds1 lastread, "0"))
{ dosang1--;
if( dosang1 < 1) dosang1=1;
Firebase setInt("/light 1",dosang1); }
else
{ dosang1++;
if( dosang1 > 10) dosang1=10; Firebase setInt("/light 1",dosang1); }
}
if (subscription == &dsmax)
{ Serial print("do sang max: "); Serial println((char*) dsmax lastread); if (!strcmp((char*) dsmax lastread, "1")) {
dosang1=10;
CHƢƠNG 4 THI CÔNG HỆ THỐNG
}
Serial print("muc sang den 1: "); Serial println(dosang1);
if (subscription == &light) { Serial print("do sang: ");
Serial println((char*) light lastread); if (!strcmp((char*) light lastread, "0"))
Firebase setInt("/den1", 1); else
Firebase setInt("/den1", 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ì
subscription đọc dữ liệu từ Adafruit và lƣu kết quả vào sau đó đôi chiếu với các địa chỉ ds1,dsmax,light
•
•
•
Nếu bằng ds1, dữ liệu đọc đƣợc là „0‟ thì giảm biến dosang1 còn dữ liệu đọc đƣợc thì tăng biến dosang1 và gửi biến dosang1 lên Firebase bằng câu lệnh :
Firebase setInt("/light 1",dosang1);
Nếu bằng dsmax, dữ liệu đọc về là „1‟ thì gán dosang1 = 10 và gửi giá trị dosang1 lên Firebase
Nếu bằng light , dữ liệu đọc về là „0‟ thì gửi dữ liệu lên Firebase với câu lệnh:
Firebase setInt("/den1", 1); , còn trƣờng hợp khác gửi Firebase setInt("/den1", 0);
CHƢƠNG 4 THI CÔNG HỆ THỐNG
if (Firebase failed()) {
analogWrite(LEDpin, a); }
Trƣờng hợp mất kết nối Firebase thì vẫn giữ nguyên độ sáng
if (Firebase getInt("/den1")==0) {
int b = Firebase getInt("/light 1"); switch (b){
case 1: a=102; break; case 2: a=204; break; case 3: a=307; break; case 4: a=410; break; case 5: a=512; break; case 6: a=614; break; case 7: a=716; break; case 8: a=818; break; case 9: a=921; break; case 10 : a=1023;break; } analogWrite(LEDpin, a); } else { a=0; analogWrite(LEDpin, 0); }
Nếu dữ liệu đọc tại đƣờng dẫn “/den1” bằng 1 thì tiếp tục đọc giá trị tại đƣờng dẫn “/light1” gán cho b và đem b đi đối chiếu các giá trị từ 1 đến 10 và gán giá trị tƣơng ứng cho a, và xuất PWM giá trị tƣơng ứng, trƣờng hợp khác xuất PWM là 0
CHƢƠNG 4 THI CÔNG HỆ THỐNG
4 5 LẬP TRÌNH CHO MẠCH GIÁM SÁT NHIỆT ĐỘ, ĐỘ ẨM VÀ CHUYỂN ĐỘNG4 5 1 Lƣu đồ giải thuật 4 5 1 Lƣu đồ giải thuật
Bắt đầu
Khởi tạo các cổng vào ra, Serial, khởi tạo Wifi Manager
Tiến hành kết nối với mạng Wifi Mạng wifi đã S được kết nối ? Chuyển sang chế độ Access point S Đ Mạng wifi đã được kết nối ? Đ
Đăng kí MQTT,khởi tạo kết nối với cơ sở dữ liệu thời gian thực Firebase
Khởi tạo DHT
Kết nối với MQTT
Đọc dữ liệu từ Adafruit_MQTT, xử lí bật tắt led, bật tắt cảm biến PIR
Đọc tín hiệu cảm biến PIR tại chân D2
Đọc nhiệt độ, độ ẩm từ cảm biến và gửi lên Firebase
Nhiệt độ >= 40 ?
Đ Bật báo động, gửi số 1 lên Firebase tại đường
dẫn “/bao chay”
S
Tắt báo động, gửi số 0 lên Firebase tại đường
dẫn “/bao chay”
Tín hiệu mức cao ?
Đ
Bật báo động, gửi số 1 lên Firebase tại đường
dẫn “/bao trom”
S
Tắt báo động, gửi số 0 lên Firebase tại đường
dẫn “/bao trom”
Kết thúc
CHƢƠNG 4 THI CÔNG HỆ THỐNG
Khi có nguồn cung cấp cho mạch vi điều khiển ESP8266 ESP-12E NodeMCU sẽ hoạt động khởi tạo Serial, Wifi Manager, các cổng vào ra Tiếp theo nó sẽ tiến hành kết nối với Wifi, nếu kết nối đƣợc thì tiến hành đăng kí MQTT và khởi tạo kết nối Firebase, trƣờng hợp không kết nối đƣợc thì nó sẽ chuyển sang chế độ Access point ( điểm truy cập) và đợi ngƣời dùng kết nối với Wifi do nó phát ra và thiết lập Wifi cho nó tại địa chỉ 192 168 4 1 Sau khi ngƣời dùng thiết lập xong ESP sẽ chuyển sang chế độ Station ( thu Wifi ) và kết nối Wifi, nếu vẫn chƣa kết nối đƣợc thì nó vẫn ở chế độ Access point Tiếp theo ESP khởi tạo DHT
Trong vòng lặp tuần hoàn:
Thực hiện chƣơng trình kết nối MQTT, sau đó đọc dữ liệu từ Adafruit_MQTT và so sánh với các địa chỉ đăng kí MQTT, nếu đúng địa chỉ thì sẽ xử lí dữ liệu nhận đƣợc để bật tắt cảm biến PIR hoặc led
Sau đó đọc giá trị nhiệt độ, độ ẩm từ cảm biến và gửi các giá trị đó lên Firebase Nếu nhiệt độ lớn hơn hoặc bằng 40 thì bật Buzzer báo động và gửi số 1 lên Firebase tại đƣờng dẫn “/bao chay”, ngƣợc lại tắt Buzer và gửi số 0 lên
Tiếp theo đọc tín hiệu PIR tại chân D2, nếu tín hiệu mức cao thì bật Buzzer báo động và gửi số 1 lên Firebase tại đƣờng dẫn “/bao trom”, ngƣợc lại tắt Buzzer báo động và gửi số 0
Chƣơng trình cứ thế lặp lại
4 5 2 Chƣơng trình cho mạch giám sát nhiệt độ, độ ẩm và chuyển động
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