You are currently viewing Điều khiển LED qua IoT bằng Google Firebase và ESP8266

Điều khiển LED qua IoT bằng Google Firebase và ESP8266

Bài viết này giới thiệu về cách thiết lập một hệ thống IoT đơn giản để điều khiển LED bằng Google Firebase và mô-đun wifi ESP8266.

> Hướng dẫn lập trình cho ESP8266 bằng Arduino IDE

> Bộ thu/phát WiFi ESP8266

> Hướng dẫn phát triển sản phẩm IoT từ phòng Lab đến thương mại

1. Tổng quan

Bằng cách sử dụng nền tảng đám mây và phần cứng IoT, chúng ta có thể điều khiển các thiết bị IoT chẳng hạn như đèn LED từ bất kỳ nơi nào trên thế giới. Dự án IoT này đề cập đến điều khiển đèn LED bằng bảng điều khiển Google Firebase (Google Firebase Console) và mô-đun wifi NodeMCU ESP8266. Có nhiều phương pháp điều khiển đèn LED khác nhau, chẳng hạn như sử dụng máy chủ Web hoặc trang web, ứng dụng Blynk và sử dụng các dịch vụ dựa trên API khác. Nhưng trong thực nghiệm này chúng ta sẽ chỉ tập trung vào Google Firebase Console.

Google Firebase là môi trường phát triển ứng dụng do Google hỗ trợ, được sử dụng để tạo, quản lý và sửa đổi dữ liệu được tạo từ bất kỳ ứng dụng Android/iOS, dịch vụ web, cảm biến IoT và phần cứng nào. Để tìm hiểu thêm về Google Firebase Console, bạn có thể đọc tài liệu Google Firebase Documents chính thức từ Google Firebase.

Google Firebase

2. Danh sách linh kiện

Sau đây là các thành phần cần thiết để thực hiện dự án này. Tất cả các thành phần có thể dễ dàng mua từ các trang thương mại điện tử như Lazada hoặc Shopee. Liên kết đến nơi mua các thành phần cũng được đưa ra dưới đây.

STT Tên linh kiện Miêu tả Số lượng Nơi mua
1 NodeMCU Bo mạch ESP8266-12E 1 https://shorten.asia/ne7Eusks
2 LED 5mm LED có màu bất kỳ 1 https://shorten.asia/YCzengGm
3 Điện trở 220 ohm 1 https://shorten.asia/NGhZfEG4
4 Nguồn nuôi Bộ đổi nguồn (Adapter) 5V, 1A 1 https://shorten.asia/j9nWVpf9
5 Breadboard 1 https://shorten.asia/MZvpqSHk

3. Thiết lập phần cứng

Dưới đây là sơ đồ mạch để kết nối LED với bo mạch NodeMCU ESP8266. Kết nối cực dương của đèn LED với chân GPIO5 của mô-đun ESP8266, tức là đầu nối có nhãn D1 trên bo mạch NodeMCU ESP8266 qua điện trở 220ohm như trong hình bên dưới.

LED trên ESP8266 NodeMCU

4. Cài đặt Thư viện Firebase và JSON

Firebase ESP Client Library là một thư viện để đơn giản hóa việc kết nối với cơ sở dữ liệu Firebase từ các máy khách Arduino. Đó là bản tóm tắt đầy đủ API REST của Firebase được thể hiện thông qua các lệnh gọi C++. Tất cả phân tích cú pháp JSON được thư viện này xử lý.

Thư viện không thể hoạt động độc lập. Vì vậy, bạn cũng cần thêm thư viện ArduinoJSON.

(1)  Thư viện ArduinoJSON

Trước tiên hãy vào trình quản lý thư viện và tìm kiếm “JSON” và cài đặt thư viện như trong hình bên dưới.

ArduinoJson

 

Lưu ý: Thư viện JSON mới nhất có thể không hoạt động với mã được cung cấp trong phần này. Vì vậy, bạn có thể cần hạ cấp thư viện xuống phiên bản v5.13.5.

(2)  Cài đặt Firebase ESP Client Library cho Arduino IDE

Thư viện “Firebase ESP Client Library” cung cấp nhiều ví dụ về cách kết nối ESP8266 với các dịch vụ Firebase. Kiểm tra trang Github của thư viện tại đây và xem xét hỗ trợ tác giả nếu thư viện hữu ích cho các dự án của bạn.

Để cài đặt thư viện, bạn vào Sketch > Include Library > Manage Libraries, tìm kiếm “Firebase ESP Client”. Chọn cài đặt “Firebase Client ESP8266 by Mobizt”.

Firebase arduino Client Library for ESP8266 and ESP32

Bây giờ, bạn đã sẵn sàng để bắt đầu lập trình các bo mạch ESP8266 để tương tác với cơ sở dữ liệu.

5. Thiết lập Google Firebase

Để điều khiển đèn LED bằng Google Firebase & Nodemcu ESP8266, trước tiên bạn cần thiết lập Google Firebase. Bước này hơi dài nhưng đừng quá lo lắng, vì tôi sẽ giải thích chi tiết các bước bên dưới.

Bước 1: Nếu bạn có Gmail thì bạn đã đăng ký firebase rồi. Nhưng nếu bạn không có Gmail thì trước tiên hãy đăng ký Gmail: https://gmail.com/

Bước 2: Bây giờ hãy truy cập https://firebase.google.com/ và nhấp vào Go to Console ở góc trên cùng bên phải.

Firebase Go to Console

Bước 3: Nhấp vào “Create a Project”

Firebase Create a project

Bước 4: Đặt tên cho Project (dưới nhãn “Project Name”), sau đó đánh dấu vào “I Accept the Firebase Terms”“I confirm that I will use Firebase exclusively for purposes relating to my trade, business, craft, or profession”, cuối cùng nhấp vào “Continue”.

Firebase Project name

Bước 5: Một cửa sổ mới sẽ xuất hiện. Nhấp vào “Continue” để tiếp tục.

Firebase

Bước 6: Chọn “google Analytics Account” được tạo bằng Gmail. Và sau đó nhấp vào “Create Project”.

Firebase

Bước 7: Dự án của bạn đã sẵn sàng. Vì vậy, bạn sẽ nhận được cửa sổ sau. Nhấp vào “Continue”.

Firebase

Bước 8: Khởi tạo và cài đặt Firebase Realtime Database

Ở đây ta sẽ sử dụng Realtime Database của Firebase với mục đích làm cơ sở dữ liệu trung gian để các client có thể tương tác qua lại.

Đầu tiên chọn “Realtime Database” sau đó chọn “Create Database”

Create realtiem databse firebase

 

Một cửa sổ sẽ hiện ra yêu cầu chọn vị trí nơi đặt Database, chúng ta sẽ chọn nơi đặt gần vị trí của chúng ta nhất. Cụ thể, chúng ta sẽ chọn Sigapore như hình dưới, sau đó bấm Next.

Firebase set up database

Bước 9: Một cửa sổ mới sẽ hiện ra với 2 lựa chọn:

  • Test mode: phù hợp nếu chúng ta đang phát triển dự án với mục đích để test các chức năng, nhưng database của chúng ta sẽ ở trạng thái open trong 30 ngày đầu tiên
  • Locked mode: phù hợp khi ta cần một database để phục vụ cho mobile app hoặc các ứng dụng web chính thức, database của chúng ta sẽ ở chế độ private và dưới các quy tắc (rules) mà chúng ta thiết lập.

 Ở đây chúng ta chọn “Locked mode” và bấm Enable.

Firebase set up database

Màn hình mới sẽ trông như bên dưới.

Firebase Realtime database

Bước 10: Khởi tạo cấu trúc dữ liệu cho Realtime database

Chúng ta sẽ tạo ra trường dữ liệu và gán dữ liệu theo cách thủ công bằng cách nhấn vào biểu tượng “+” (add child).

Firebase Realtime database add child

Tạo ra các trường dữ liệu bằng cách gán cho nó một tên trong ô “Key” và gán giá trị cho nó trong ô “Value” theo kiểu mà ta muốn. Dữ liệu cho “Value” có thể là kiểu int, string, float, …

Firebase Realtime database add child

Realtime Database Firebase có cấu trúc kiểu cha – con, tương tự như cấu trúc của chuỗi JSON. Vậy nên chúng ta có thể thay đổi 1 dữ liệu hoặc tất cả dữ liệu bằng cách gửi chuỗi JSON lên Database.

Tùy vào mục đích ta có thể thiết kế Database phức tạp hơn bằng cách ấn vào biểu tượng dấu cộng “+” như trên và thêm vạo các cặp “Key – Value” như mong muốn.

Trong bài viết này, chúng ta cần giám sát và điều khiển một đèn LED trên bo mạch ESP8266 NodeMCU nên chúng ta sẽ tạo ra một cơ sở dữ liệu như bên dưới.

Firebase Realtime database add child

6. Kết nối ESP32 với Firebase truyền nhận dữ liệu

Mở phần mềm Arduino IDE để viết code cho mô-đun ESP8266, sau đó ấn tổ hợp phím Ctrl + N để tạo ra trang mới như sau:

Arduino_create_new_sketch

Thay thế mã tạo sẵn bằng mã sau:

#include <Arduino.h>
#if defined(ESP32)
  #include <WiFi.h>
#elif defined(ESP8266)
  #include <ESP8266WiFi.h>
#endif
#include "FirebaseESP8266.h"

// Insert your RTDB URL
#define FIREBASE_HOST "https://my1stproject-e5e61-default-rtdb.asia-southeast1.firebasedatabase.app/"    
// Insert Firebase Database secret
#define FIREBASE_AUTH "0aIZdRvTvvFSnvpJDO8GO4RW37UmznU6NSRd2y0y"
// Insert your network credentials
#define WIFI_SSID "Victory 1107"                        
#define WIFI_PASSWORD "122345678"  

//Declares Variables
FirebaseData firebaseData; 
String fireStatus = "";       // led status received from firebase
int led = 2;  // Number of GPIO that is connected to LED
String path = "ESP8266 NodeMCU Board/Outputs/Digital/"; // path to LED on firebase Database 
void setup() 
{
  Serial.begin(115200);
  delay(1000);    
  pinMode(led, OUTPUT);  
  digitalWrite(led, HIGH);     // make external led OFF
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);            
  Serial.print("Connecting to ");
  Serial.print(WIFI_SSID);
  while (WiFi.status() != WL_CONNECTED) 
  {
    Serial.print(".");
    delay(500);
  }
  Serial.println();
  Serial.print("Connected to ");
  Serial.println(WIFI_SSID);

  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);//connect to firebase
  Firebase.setString(firebaseData, path+"LED", "OFF"); //send initial string of led status
}
 
void loop() 
{
  Firebase.getString(firebaseData, path+"LED");   // get ld status input from firebase
  fireStatus = firebaseData.stringData();
  if (fireStatus == "ON") 
  {    // compare the input of led status received from firebase
    Serial.println("Led Turned ON");       
    digitalWrite(led, LOW);       // make external led ON
  } 
  else if (fireStatus == "OFF") 
  {     // compare the input of led status received from firebase
    Serial.println("Led Turned OFF");
    digitalWrite(led, HIGH);     // make external led OFF
  }
  else 
  {
    Serial.println("Command Error! Please send ON/OFF");
    //Serial.println(fireStatus);
  }
}

 

Giải thích mã

Bước 1: Thêm thư viện

Ở đầu đoạn mã chúng ta cần thêm các thư viện cần thiết. Vì chúng ta đang sử dụng mô-đun ESP8266 để kết nối WIFI và truyền dữ liệu với firebase nên chúng ta cần thêm 2 thư viện ESP8266WiFi.h và FirebaseESP8266.h từ dòng 1-7. Đoạn code trên bạn có thể viết gọn lại như sau:

#include <ESP8266WiFi.h>

#include “FirebaseESP8266.h”

Bước 2: khai báo 2 tham số FIREBASE_HOST & FIREBASE_AUTH dùng cho truy cập đến Firebase Database. Chúng ta lấy các tham số này từ Google Firebase Console. Hai tham số này rất quan trọng để giao tiếp với firebase. Điều này cho phép trao đổi dữ liệu giữa ESP8266 và firebase.

Tiếp theo, để sử dụng Firebase Realtime Database với ESP8266, ta phải lấy host và đường dẫn đến Database để cập nhật vào code.

Để lấy mã Firebase Authentication, chúng ta quay lại Google Firebase Console, chọn Project Setting, như hình bên dưới.

Firebase_project_setting

Vào thẻ Database secrets -> Service accounts để lấy secrets code như hình dưới. Chèn mã này vào code trong Arduino IDE tại dòng 14.

firebase databse_secret_code

Tiếp đến, quay lại Google Firebase Console, vào Realtime Database để lấy đường dẫn truy cập đến Database. Chèn đường dẫn này vào code trong Arduino IDE tại dòng 11.

Firebase_databse_RTDB_URL

Sau bước này chúng ta có được mã thiết lập như sau:

// Insert your RTDB URL

#define FIREBASE_HOST “https://my1stproject-e5e61-default-rtdb.asia-southeast1.firebasedatabase.app/”    

// Insert Firebase Database secret

#define FIREBASE_AUTH “0aIZdRvTvvFSnvpvcO8GO4RW37UmznU6NSRd2y0y”

Bước 3: khai báo kết nối WIFI sẽ được sử dụng truy cập vào internet

Khai báo tên kết nối Wifi SSID và password để truy cập vào kết nối đó tại dòng 15 – 17. Thay thế SSID và mật khẩu bằng SSID và mật khẩu mạng của bạn.

// Insert your network credentials

#define WIFI_SSID “Victory 1107”                        

#define WIFI_PASSWORD “122345678”  

Bước 4: khai báo biến trung gian để truy xuất đến Firebase ở các dòng 20-22

Chú ý, biến path chứa đường dẫn tới phần tử dữ liệu LED trong cấu trúc cây dữ liệu trên Firebase.

Bước 4:  Khởi tạo phần cứng của mô-đun NodeMCu trong hàm setup()

  • Dòng 27 khởi tạo cổng nối tiếp ở tốc độ baud 115200
  • Dòng 29 khởi tạo cổng GPIO kết nối với LED ở chế độ Output. Dòng 30 điều khiển tắt LED.
  • Dòng 31-41 thực hiện kết nối WIFI. Mã này sẽ làm cho Nodemcu ESP8266 kết nối với mạng. Sau khi kết nối, nó sẽ hiển thị tên WiFi SSID.
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);                              

  Serial.print(“Connecting to “);

  Serial.print(WIFI_SSID);

  while (WiFi.status() != WL_CONNECTED)

  {

    Serial.print(“.”);

    delay(500);

  }

  • Dòng 43 thực hiện kết nối Mô-đun ESP8266 NodeMCU tới máy chủ Firebase. Nếu địa chỉ máy chủ và khóa ủy quyền là chính xác thì nó sẽ kết nối thành công. Sau đó, dòng 44 gửi một chuỗi khởi tạo trạng thái LED tới cơ sở dữ liệu firebase bằng hàm setString(). Đây là hàm được cung cấp bởi thư viện firebase để gửi một chuỗi đến máy chủ firebase.
//connect to firebase

Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);

//send initial string of led status

Firebase.setString(firebaseData, path+”LED”, “OFF”);

Bước 5: Liên tục giám sát trạng thái LED từ cơ sở dữ liệu firebase và điều khiển bật/tắt LED tương ứng trong vòng lặp loop().

  • Thực hiện chức năng lấy chuỗi trạng thái LED từ firebase bằng hàm getString() tại dòng 50, sau đó gán chuỗi trạng thái nhận được vào biến fireStatus ở dòng 52.
 // get ld status input from firebase

Firebase.getString(firebaseData, path+”LED”);  

fireStatus = firebaseData.stringData();

  • Các dòng 53-65 kiếm tra giá trị của biến fireStatus, và thiết lập bật/tắt LED. Đèn LED sẽ BẬT/TẮT tùy thuộc vào chuỗi nhận được là “ON” hoặc “OFF” tương ứng. Nếu bất kỳ ký tự nào khác được gửi đi, chương trình sẽ hiển thị thông báo “Command Error! Please send ON/OFF” trên Serial Monitor.
if (fireStatus == “ON”)

  { // compare the input of led status received from firebase

    Serial.println(“Led Turned ON”);       

    digitalWrite(led, LOW);       // make external led ON

  }

  else if (fireStatus == “OFF”)

  { // compare the input of led status received from firebase

    Serial.println(“Led Turned OFF”);

    digitalWrite(led, HIGH);     // make external led OFF

  }

  else

  {

    Serial.println(“Command Error! Please send ON/OFF”);

    //Serial.println(fireStatus);

  }

7. Kết luận

Như vậy trong bài thực nghiệm này chúng ta đã tìm hiểu cách thiết lập một cơ sở dữ liệu đơn giản để lưu giữ trạng thái của một đèn LED trên Google firebase. Chúng ta cũng đã tìm hiểu cách lập trình để kết nối mô-đun ESP8266 NodeMCU với cơ sở dữ liệu firebase. Từ đó, cho phép chúng ta có thể điều khiển đèn LED trên mô-đun ESP8266 NodeMCU từ xa thông qua bảng điều khiển của Google Firebase. Trong phần tiếp theo, chúng ta sẽ tìm cách phát triển một ứng dụng di động Android kết nối với cơ sở dữ liệu đã thiết lập ở trên. Trên ứng dụng di động chúng ta cũng thiết kế một giao diện GUI để hiển thị trạng thái LED lấy được từ cơ sở dữ liệu và các nút bấm cho phép người dùng dễ dàng bật/tắt LED.

Nguyễn Kiêm Hùng

Hung K. Nguyen studied “Electronic Engineering” in both his bachelor’s and master’s degrees at the Vietnam National University, Hanoi, Vietnam. He received the bachelor’s degree in 2003. After receiving his bachelor’s degree, He worked as an internship in the Research Center of Electronics and Telecommunications. In 2006, He received the master’s degree in electronic engineering from VNU University of Engineering and Technology (VNU-UET). Before pursuing his Ph.D’s degree, He worked as a researcher at the Laboratory for Smart Integrated Systems in VNU University of Engineering and Technology for two years. In 2008, He went to Southeast University, Nanjing, China to get his Ph.D degree. He received the Ph.D. degree in Microelectronics and Solid State Electronics from Southeast University in 2013. After got his Ph.D’s degree, He returned to VNU University of Engineering and Technology to continue his research in VLSI design. He works currently as an assistant professor and senior researcher at VNU Key Laboratory for Smart Integrated Systems. His research interests mainly include multimedia processing, reconfigurable computing, and SoC designs.

This Post Has 2 Comments

Trả lời