[ESP32 ZigBee Gateway] Bài 3 - Gửi Dữ Liệu Bộ Đếm Đến Firebase và Google Sheets

Bài viết này tiếp tục chuỗi series bài viết về [ESP32 ZigBee Gateway] Bài 2. Các bạn hãy xem lại bài viết trước để hiểu rõ hơn nhé!

♥️Chào các bạn!♥️

Bài viết kì trước: [ESP32 ZigBee Gateway] Tự Tay Làm Hệ Thống Đếm Sản Phẩm Không Dây, mình đã hướng dẫn bạn tự làm một hệ thống đếm sản phẩm tự động không dây với ZigBee. Hệ thống bao gồm 1 Gateway ESP32 ZigBee, 1 node Router.

Bài viết này sẽ giúp các bạn kết nối hệ thống đến 2 Database là Google Sheets (Google Drive) và Google Firebase với giao thức HTTP Client. Cùng bắt đầu nào.

I. KẾT NỐI THIẾT BỊ

Phần kết nối thiết bị mình sẽ không nói lại chi tiết, các bạn có thể xem lại tại bài viết trước để kết nối.

Các thiết bị cần thiết:

- ESP32-DevKitC WROOM

- Mạch ra chân cho Zigbee Module E18-MS1PA1-IPX (ZigBee module)

Arduino LCD TFT cảm ứng màu 2.8 inch ILI9341

- Cảm Biến Vật Cản Hồng Ngoại E18-D80NK NPN

- Dây cắm breadboard các loại, nút nhấn (reset)

- Breadboard, các loại phụ kiện: dây dẫn, chì hàn, vvv

II. CÀI ĐẶT GOOGLE SHEET

- Các bạn truy cập vào Google Sheet, đăng nhập tài khoản (Google) và click chọn tạo trang trống (Blank)

- Tạo tên mới cho Google Sheet tùy ý, như mình tạo tên ESP32 ZigBee Gateway: Counting Center

- Chọn Công cụ -> Trình chỉnh sửa tập lệnh (Tool -> Script Editor), copy mã script


var timeZone = "ICT"; //Set time zone, ở VN mình là UTC+7
var dateTimeFormat = "dd/MM/yyyy HH:mm";

// Enable Email cảnh báo
var enableSendingEmails = true;
var emailAddress = ""; // comma separate for several emails

function doGet(e) {
var result = 'Ok'; // default result
if (e.parameter == 'undefined') {
result = 'No Parameters';
} else {

var alarm= e.parameter.alarm;
if (typeof alarm != 'undefined') {

sendEmail("alarm text:" + stripQuotes(alarm));
return ContentService.createTextOutput(result);
}

var sheet = getSpreadSheet();
var lastRow = sheet.getLastRow();
var newRow = 1;
if (lastRow > 0) {
var lastVal = sheet.getRange(lastRow, 1).getValue();
if (lastVal == 'dead')
newRow = lastRow; //to overwrite "dead" value
else
newRow = lastRow + 1;

}

var rowData = [];
var namesOfParams=[];
for (var param in parseQuery(e.queryString))
namesOfParams.push(param);

if (newRow == 1) {
rowData[0] = "Date";
var i = 1;
for (var i=0; i<namesOfParams.length;i++ ) {
rowData[i+1] = namesOfParams[i];

}
var newRange = sheet.getRange(newRow, 1, 1, rowData.length);
newRange.setValues([rowData]);
rowData = [];
newRow++;
}

rowData[0] = Utilities.formatDate(new Date(), timeZone, dateTimeFormat);

for (var i=0; i<namesOfParams.length;i++ ) {

var value = stripQuotes(e.parameter[namesOfParams[i]]);

rowData[i+1] = value;

}
var newRange = sheet.getRange(newRow, 1, 1, rowData.length);
newRange.setValues([rowData]);
}
// Return result of operation
return ContentService.createTextOutput(result);
}

function stripQuotes(value) {
return value.replace(/^["']|['"]$/g, "");
}

function parseQuery(queryString) {
var query = {};
var pairs = (queryString[0] === '?' ? queryString.substr(1) : queryString).split('&');
for (var i = 0; i < pairs.length; i++) {
var pair = pairs[i].split('=');
query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || '');
}
return query;
}

function sendEmail(message) {
if (!enableSendingEmails)
return;
var subject = 'Something wrong with your esp';
MailApp.sendEmail(emailAddress, subject, message);
}

function getSpreadSheet() {
return SpreadsheetApp.getActiveSheet();
}

- Sau đó các bạn nhấn Ctrl + S hoặc chọn vào nút Save để lưu lại

- Nhập tên

- Chọn Publish -> Deloy as web APP, bạn chọn như sau:

+ "Who has access to the APP", chọn "Anyone, even anonymous"

+ Đồng ý cấp quyền tài khoản Google

+ Copy mã Current Web APP URL:

Vậy là chúng ta đã setup xong Google Sheet.

III. CÀI ĐẶT FIREBASE REALTIME DATABASE

Các bạn xem lại bài viết Tạo Tài Khoản Firebase Realtime Database (Google) để biết rõ cách thức tạo tài khoản và Project.

Sau khi đã tạo được tài khoản và Project, bạn tiến hành lấy FIREBASE_HOST và FIREBASE_AUTH

- Lấy FIREBASE_HOST:

Chọn Database -> Click chuyển Realtime Database, copy mã liên kết: https://....

Ví dụ: Liên kết của mình là "https://fir-demo-1719d.firebaseio.com/" thì các bạn copy bỏ vào FIREBASE_HOST trong source code.

Lưu ý: Khi bạn tạo project Firebase sẽ có Firebase Host khác dành riêng cho bạn.

- Lấy FIREBASE_AUTH:

Tại Project Overview, click hình dấu ⚙ rồi chọn Users and Permissions -> Service accounts -> Database secrets, sau đó copy mã Secret để gán vào FIREBASE_AUTH trong source code.

Sau khi Setup thành công Firebase Database thì bạn chuyển qua bước tiếp theo

IV. BUILD SOURCE CODE

- BÀi viết của mình hoàn toàn phát triển dựa trên cơ sở xây dựng phần cứng cũng nhưng phần mềm của bài viết số 2, do đó để nhanh chóng và thuận tiện hơn thì mình sẽ không nhắc lại chi tiết, các bạn hãy xem lại để phát triển nhanh hơn nhé.

- Tải về source code của mình tại đây: ESP32ZigBeeGateway sau đó tiến hành nạp code cho ESP32 Gateway và Router.

- Các bạn lưu ý nhập các thông tin sau để build code thành công:

#define FIREBASE_HOST " ...."
#define FIREBASE_AUTH ".... "

//Nhập Firebase Host và Firebase Auth đã lấy ở phần setup Firebase

const char * ssid = "..."; // Nhập tên WiFi của bạn
const char * password = "..."; // Nhập mật khẩu WiFi

String GOOGLE_SCRIPT_ID = "..."; // Nhập Google Script ID setup Google Sheet.

- Các bạn cũng tiến hành Join Router vào ESP32 ZigBee Gateway, bộ đếm sẽ gửi dữ liệu từ Router đến Gateway

Sau khi hệ thống kết nối đến Google Sheet và Firebase, các bạn tiến hành mở Google Sheet và Firebase lên để quan sát dữ liệu:



Bằng cách gửi dữ liệu lên 2 database này, các bạn đã có nhiều sự lựa chọn hơn cho việc phát triển Back-end. Sau khi mở rộng hệ thống và nâng cấp các database, bạn có thể phát triển tùy thích các sản phẩm như App Mobile, Web App,.. khá tiện lợi.

Hy vọng bài viết này sẽ giúp ích cho các bạn. Nếu các bạn có những thắc mắc cần giải đáp, hãy nhắn tin cho mình qua Fanpage: EPCB hoặc qua Email: epcbtech@gmail.com. Cảm ơn các bạn đã theo dõi!

Chúc các bạn thành công!