LẬP TRÌNH CHO MẠCH GIÁM SÁT NHIỆT ĐỘ,ĐỘ ẨM VÀ CHUYỂ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 53)

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

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

4 6 LẬP TRÌNH ỨNG DỤNG ANDROID a Cách kết nối giữa project và firebase a Cách kết nối giữa project và firebase

Để project của Android Studio truyền nhận đƣợc dữ liệu với firebase ta thực hiện các bƣớc nhƣ sau:

Đầu tiên ta tiến hành tạo một project mới ta đƣợc giao diện nhƣ sau:

Hình 4 18 Giao diện ứng dụng android studio

Tiếp theo ta vào giao diện android vào file → Settings → Geneal → Auto Import chọn vào hai ô Add unambiguous import on the fly và Optimize import on the fly → Apply → OK Sau đó truy cập firebase google com để tạo một vùng cơ sở dữ liệu mới ( cách tạo đã đƣợc trình bày ở mục 4 5/b) ta đƣợc giao diện nhƣ sau:

CHƢƠNG 4 THI CÔNG HỆ THỐNG

Hình 4 19 Giao diện cơ sở dữ liệu sau khi tạo

Tiếp đến ta chọn vào testdatn ta đƣợc giao diện nhƣ hình:

Hình 4 20 Chọn hệ điều hành lập trình

Ta chọn vào biểu tƣợng mũi tên nhƣ trên hình và đƣợc giao diện mới [Hình 4 21], tại giao diện ta sẽ điền vào tên của Android Package sau đó chọn vào “ Lƣu ứng dụng” Tiếp đến ta sẽ tiến hành tải file “ google- services json” [ Hình 4 23] chọn tiếp theo

Ta copy file vừa tải, vào ứng dụng android [Hình 4 24] nhấn chuột phải vào app chọn Show in Explorer, xuất hiện giao diện [Hình 4 25] ta sẽ lƣu file google-services json vào đó Sau đó ta sẽ thêm SDK Firebase nhƣ hình [4 26] chọn tiếp theo

Bƣớc cuối cùng trên giao diện ta chọn tool → Firebase → Realtime Database → Connect your app to firebase → Add the realtime database to your app nếu hiển thị nhƣ hình 4 27 là ta đã kết nối thành công

CHƢƠNG 4 THI CÔNG HỆ THỐNG

Hình 4 21 Giao diện điền tên Android Package

CHƢƠNG 4 THI CÔNG HỆ THỐNG

Hình 4 23 Chọn vị trí lưu google- services json

CHƢƠNG 4 THI CÔNG HỆ THỐNG

Hình 4 25 Thêm SDK Firebase

Hình 4 26 Giao diện sau khi kết nối thành công app android và firebase

b Viết chƣơng trình hệ thống

Phần mềm sẽ liên tục cập nhật các giá trị nhận đƣợc từ firebase và cho ra kết quả hiển thị lên giao diện phần mềm một cách trực quan giúp ngƣời sử dụng quản lý các thiết bị trong nhà cũng nhƣ tình trạng của ngôi nhà một cách dễ dàng nhất Ngoài ra

CHƢƠNG 4 THI CÔNG HỆ THỐNG

phần mềm cũng có thể điều khiển đƣợc việc bật/tắt thiết bị cũng nhƣ điều khiển đƣợc độ sáng của các đèn một cách dễ dàng

Do chƣơng trình thiết kế bao gồm nhiều tính năng nên chƣơng trình viết lập trình sẽ dài nên nhóm chúng em xin phép sẽ trình bày một số phần chính trong chƣơng trình

 Giao diện điều khiển và hiển thị

Giao diện hiển thị bao gồm việc hiển thị trạng thái bật/tắt của hai đèn, trạng thái của hai switch, hai thanh seekBar (Hình 4 28) ngoài ra còn hiển thị nhiệt độ, độ ẩm, cảnh báo cháy, cảnh báo trộm (Hình 4 29)

Giao diện điều khiển gồm việc điều khiển bật tắt đèn bằng các switch, điều khiển độ sáng đèn bằng hai thanh seekBar (Hình 4 28) Ngoài ra còn tính năng điều khiển bật tắt đèn thông qua việc hẹn giờ (Hình 4 30)

CHƢƠNG 4 THI CÔNG HỆ THỐNG

Hình 4 28 Giao diện hiển thị nhiệt Hình 4 29 Giao diện hẹn giờ tắt/bật đèn độ, độ ẩm, cảnh báo cháy, trộm

Hình 4 30 Cơ sở dữ liệu Realtime Database

Khi mở ứng dụng phần mềm, điện thoại cho phép truy cập wifi hoặc 3g phần mềm sẽ đọc dữ liệu từ cơ sở dữ liệu thời gian thực FIREBASE và sẽ cập nhật toàn bộ trạng thái của các đèn, kèm theo đó là độ sáng hiện tại, nhiệt độ, độ ẩm, cảnh báo cháy, trộm Khi ngƣời dùng thao tác điều khiển thì dữ liệu sẽ đƣợc ghi lên cơ sở dữ liệu thời gian thực FIREBASE, từ đây thiết bị đèn sẽ đọc dữ liệu này về và xử lý

CHƢƠNG 4 THI CÔNG HỆ THỐNG

Ví dụ ta muốn đọc nhiệt độ trên cơ sở dữ liệu firebase[ Hình 4 31] đầu tiên ta phải chỉ dẫn tới đúng vùng dữ liệu cần thao tác

FirebaseDatabase database = FirebaseDatabase getInstance(); DatabaseReference myRef = database getReference("Nhiệt độ");

Sau khi đã chỉ dẫn tới đúng vùng dữ liệu cần thao tác ta tiến hành cập nhật giá trị nhiệt độ bằng cách sử dụng lệnh sau

myRef addValueEventListener(new ValueEventListener() {

public void onDataChange(@NonNull DataSnapshot dataSnapshot) { nhietdo = dataSnapshot getValue(float class);

}

public void onCancelled(@NonNull DatabaseError databaseError) {

} });

Muốn hiển thị nhiệt độ lên app android bằng cách: textViewnd setText(nhietdo + "°C");

Đối với các giá trị còn lại trên cơ sở dữ liệu firebase ta muốn lấy dữ liệu về và hiển thị thì ta làm tƣơng tự nhƣ nhiệt độ

Ví dụ để điều khiển độ sáng của đèn 1 “ ánh sáng 1” [Hình 4 28] thông qua ứng dụng thì ta cần điều khiển các giá trị của “ ánh sáng 1” thông qua việc thay đổi cơ sở dữ liệu của nó bằng cách:

DatabaseReference mData = FirebaseDatabase getInstance() getReference(); seekBar setOnSeekBarChangeListener(new

SeekBar OnSeekBarChangeListener() {

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

if(progress < 10){

mData child("ánh sáng 1") setValue(0); dosang = 0;

CHƢƠNG 4 THI CÔNG HỆ THỐNG

}

else if ( 10 <= progress && progress < 20){ mData child("ánh sáng 1") setValue(1); dosang = 10;

textView_dosang1 setText("ĐỘ SÁNG ĐÈN 1 LÀ :" + dosang + "%");

}

else if ( 20 <= progress && progress < 30){ mData child("ánh sáng 1") setValue(2); dosang = 20;

textView_dosang1 setText("ĐỘ SÁNG ĐÈN 1 LÀ :" + dosang + "%");

}

else if ( 30 <= progress && progress < 40){ mData child("ánh sáng 1") setValue(3); dosang = 30;

textView_dosang1 setText("ĐỘ SÁNG ĐÈN 1 LÀ :" + dosang + "%");

}

else if ( 40 <= progress && progress < 50){ mData child("ánh sáng 1") setValue(4); dosang = 40;

textView_dosang1 setText("ĐỘ SÁNG ĐÈN 1 LÀ :" + dosang + "%");

}

else if ( 50 <= progress && progress < 60){ mData child("ánh sáng 1") setValue(5); dosang = 50;

textView_dosang1 setText("ĐỘ SÁNG ĐÈN 1 LÀ :" + dosang + "%");

}

else if ( 60 <= progress && progress < 70){ mData child("ánh sáng 1") setValue(6); dosang = 60;

textView_dosang1 setText("ĐỘ SÁNG ĐÈN 1 LÀ :" + dosang + "%");

}

else if ( 70 <= progress && progress < 80){ mData child("ánh sáng 1") setValue(7); dosang = 70;

textView_dosang1 setText("ĐỘ SÁNG ĐÈN 1 LÀ :" + dosang + "%");

}

CHƢƠNG 4 THI CÔNG HỆ THỐNG

mData child("ánh sáng 1") setValue(8); dosang = 80;

textView_dosang1 setText("ĐỘ SÁNG ĐÈN 1 LÀ :" + dosang + "%");

}

else if ( 90 <= progress && progress < 100){ mData child("ánh sáng 1") setValue(9); dosang = 90;

textView_dosang1 setText("ĐỘ SÁNG ĐÈN 1 LÀ :" + dosang + "%");

}

else if(progress == 100) {

mData child("ánh sáng 1") setValue(10); dosang = 100;

textView_dosang1 setText("ĐỘ SÁNG ĐÈN 1 LÀ :" + dosang + "%");

} }

public void onStartTrackingTouch(SeekBar seekBar) { }

public void onStopTrackingTouch(SeekBar seekBar) { }

});

Đối với việc điều khiển độ sáng của thiết bị đèn muốn hiển thị độ sáng hiện tại là bao nhiêu ra giao diện phần mềm thì ta sử dụng lệnh:

seekBar setProgress(seekBar getProgress()*0 + ds_den1*10); Muốn hiển thị trạng thái sáng/ tắt của thiết bị đèn bằng cách: den1 setImageResource(R drawable den1_sang); // đèn sáng den1 setImageResource(R drawable den1_tat); đèn tắt Để hẹn giờ bật tắt thiết bị điện ta làm nhƣ sau:

Timer timer;

MyTimeTask myTimeTask; if(timer != null) timer cancel();

timer = new Timer();

myTimeTask = new MyTimeTask(); if(optSingleshot isChecked()){

timer schedule(myTimeTask, 1000); }

CHƢƠNG 4 THI CÔNG HỆ THỐNG

}

class MyTimeTask extends TimerTask { public void run() {

Calendar calendar = Calendar getInstance(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");

SimpleDateFormat simpleDateFormat5 = new SimpleDateFormat("HH:mm:ss");

final String strData1 = simpleDateFormat5 format(calendar getTime()); final String strData = simpleDateFormat format(calendar getTime()); final String laychuoi = strData;

final String s1 = edt_hengio getText() toString(); final String s2 = edt_tatden getText() toString();

final String s3 = editText_moden2 getText() toString(); final String s4 = editText_tatden2 getText() toString(); runOnUiThread(new Runnable() {

public void run() {

hhmmss setText("THỜI GIAN: " + strData1); if(s1 equals(laychuoi)){

mData child("den1") setValue(1); }

if (s2 equals(laychuoi)){

mData child("den1") setValue(0); }

if(s3 equals(laychuoi)){

mData child("den2") setValue(1); }

if(s4 equals(laychuoi)){

mData child("den2") setValue(0); }

} }); } }

4 7 VIẾT TÀI LIỆU HƢỚNG DẪN SỬ DỤNG

Bƣớc 1: Cấp nguồn cho thiết bị đèn, thiết bị đèn sử dụng nguồn 220V AC, thiết

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 53)