LẬP TRÌNH MẠCH ĐIỀU KHIỂN ĐỘ SÁNG ĐÈN BULB

Một phần của tài liệu Điều khiển thiết bị điện thông qua trợ lý ảo google assistant 50 (Trang 45)

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

Một phần của tài liệu Điều khiển thiết bị điện thông qua trợ lý ảo google assistant 50 (Trang 45)