ESP8266 Ghi nhật ký dữ liệu NodeMCU vào cơ sở dữ liệu thời gian thực Firebase

ESP8266 Ghi nhật ký dữ liệu NodeMCU vào cơ sở dữ liệu thời gian thực Firebase

Tổng quan về dự án Firebase ghi dữ liệu ESP8266 NodeMCU

Mục đích của dự án này là ghi lại các bài đọc cảm biến thu được từ cảm biến BME280 vào cơ sở dữ liệu Firebase Realtime cùng với thời gian kỷ nguyên hiện tại. Thời gian kỷ nguyên hiện tại sẽ được lấy từ một máy chủ NTP. Trong ứng dụng bộ ghi dữ liệu, dấu thời gian Epoch rất hữu ích để ghi lại các giá trị cùng với dấu thời gian. Thời gian kỷ nguyên còn được gọi là kỷ nguyên Unix, thời gian Unix, thời gian POSIX hoặc dấu thời gian Unix.

Dữ liệu nhật ký ESP8266 vào Firebase Realtime Database

Dưới đây chúng tôi sẽ liệt kê toàn bộ quá trình dự án:

  • Thứ nhất, bảng ESP8266 bảo mật kết nối với Goggle Firebase thông qua email / mật khẩu được ủy quyền.

  • Sau khi kết nối thành công đã được thiết lập, bo mạch ESP8266 nhận UID của người dùng sẽ được sử dụng để ghi dữ liệu cảm biến vào cơ sở dữ liệu Firebase.

  • BME280 được sử dụng để đo nhiệt độ tính bằng Celsius / Fahrenheit, độ ẩm và Áp suất. Bo mạch ESP8266 có được ba kết quả đọc cảm biến này cùng với thời gian kỷ nguyên hiện tại từ máy chủ NTP. 

  • Dữ liệu này (nhiệt độ, độ ẩm, áp suất và dấu thời gian) được gửi đến Cơ sở dữ liệu thời gian thực của Firebase sau mỗi 5 phút.

Kết nối cảm biến BME280 với ESP8266 NodeMCU

Việc kết nối BME280 với bo mạch ESP8266 rất dễ dàng. Chúng ta phải kết nối thiết bị đầu cuối VCC với 3.3V, nối đất với mặt đất (mặt bằng chung), SCL của cảm biến với SCL của mô-đun và SDA của cảm biến với chân SDA của mô-đun ESP8266.

Chân I2C trong ESP8266 cho SDA là GPIO4 (D2) và cho SCL là GPIO5 (D1)

Các thành phần bắt buộc

Chúng tôi sẽ cần các thành phần sau để kết nối bo mạch ESP8266 với cảm biến BME280.

  1. Bảng ESP8266

  2. Cảm biến BME280

  3. Dây kết nối

  4. Breadboard

Sơ đồ

Kết nối thiết bị ESP8266 với BME280 như thể hiện trong sơ đồ dưới đây:

BME280 với ESP8266 MicroPython

Vin được kết nối với chân 3.3V trên mô-đun và cả bo mạch ESP8266 và cảm biến thường được nối đất.

Trong một số cảm biến BME280, thiết bị đầu cuối SCK có nghĩa là chân SCL và được kết nối với chân GPIO tương ứng trên bo mạch ESP82266. Tương tự như vậy, thiết bị đầu cuối SDI có nghĩa là chân SDA và được kết nối với chân GPIO tương ứng trên bo mạch.

Giới thiệu Google Firebase

Google Firebase là một phần mềm phát triển ứng dụng được tạo ra bởi Google. Nó có thể được sử dụng với bất kỳ ứng dụng Android / IOS, cảm biến IoT và dịch vụ web nào để tạo và thay đổi dữ liệu thu được từ chúng. Nó là một phần mềm hữu ích để xây dựng các ứng dụng di động / web một cách dễ dàng và tương tác. Các dịch vụ trả phí bao gồm cơ sở dữ liệu thời gian thực, lưu trữ firebase, lưu trữ và phòng thí nghiệm thử nghiệm. Tuy nhiên, bạn có thể sử dụng Analytics để nhắn tin nâng cao miễn phí mặc dù bạn sẽ phải tạo tài khoản trước khi truy cập.

Một trong những thuộc tính quan trọng của phần mềm này là nó thân thiện với người mới bắt đầu. Rất đơn giản để kết nối ứng dụng của bạn với Google Firebase. Bạn phải làm theo từng bước một cách cẩn thận. Nếu bạn gặp bất kỳ khó khăn nào hoặc muốn truy cập thêm thông tin, hãy xem Thiết lập Bảng điều khiển Google Firebase

Trước khi tiếp tục với dự án, hãy để chúng tôi hiểu các bước phải tuân theo để kết nối thành công với ứng dụng Google Firebase.

Đầu tiên, nhập vào tab tìm kiếm trình duyệt của bạn và nhấn enter.

Thao tác này sẽ mở trang chính của Firebase. Nhấp vào 'Chuyển đến Bảng điều khiển' như được tô sáng trong hộp hình chữ nhật màu đỏ.

Google Firebase Bắt đầu số 1

Bạn sẽ được chuyển hướng đến một trang web mới với thông điệp chào mừng. Nhấp vào nút 'Tạo dự án' như hình dưới đây.

Google Firebase Bắt đầu số 2

Trang sau mở ra.

Bước 1: Viết tên dự án của bạn. Hãy nhớ đánh dấu vào thỏa thuận thời hạn Firebase. Bây giờ hãy nhấp vào 'Tiếp tục.'

ESP32 Dự án ghi dữ liệu thời gian thực Firebase thiết lập 1

Bước 2: Không cần bật 'Google analytics cho dự án này' vì chúng tôi không yêu cầu. Nhấp vào 'Tạo dự án' để tiếp tục.

ESP32 và ESP8266 xác thực firebase pic 2

Sau một lúc, dự án của bạn sẽ được tạo.
Nhấp vào 'Tiếp tục'

ESP32 Dự án ghi dữ liệu thời gian thực Firebase thiết lập 2

Đặt phương thức xác thực

Bạn sẽ được chuyển hướng đến trang của dự án mới tạo của bạn. Chuyển đến Build > Authentication.

Nhấp vào 'Bắt đầu' để bắt đầu quá trình xác thực.

ESP32 Dự án ghi dữ liệu thời gian thực Firebase thiết lập 3

Trang sau sẽ xuất hiện. Ở đây chúng ta sẽ chuyển sang tùy chọn 'Email / Mật khẩu' làm phương thức đăng nhập.

Nhật ký dữ liệu thời gian thực ESP32 Firebase

Bật tùy chọn 'Email / Mật khẩu' bằng cách trượt thanh trượt sang phải. Sau đó lưu cài đặt.

ESP32 và ESP8266 xác thực firebase pic 7

Phương pháp xác thực này bây giờ sẽ được kích hoạt như hình dưới đây:

ESP32 và ESP8266 xác thực firebase pic 8

Bây giờ, bạn sẽ phải cung cấp Email / Mật khẩu của người dùng sẽ có quyền truy cập vào dự án firebase. Đầu tiên, nhấp vào 'Người dùng' trong tab và sau đó chuyển đến 'Thêm người dùng'.

ESP32 Dự án ghi dữ liệu thời gian thực Firebase thiết lập 5

Chỉ định email và mật khẩu của người dùng. Sau đó nhấp vào 'Thêm người dùng.'

ESP32 và ESP8266 xác thực firebase pic 10

Sau khi thêm người dùng, bạn sẽ có thể xem email, ngày tạo và UID người dùng được liên kết với người dùng mà bạn vừa ủy quyền. Bạn có thể nhận thấy rằng phần "Đã đăng nhập" trống. Điều này là do người dùng cụ thể này chưa đăng nhập vào dự án Firebase.

ESP32 Dự án ghi dữ liệu thời gian thực Firebase thiết lập 6

Lấy khóa API

Chuyển đến biểu tượng cài đặt và nhấp vào 'Cài đặt dự án'.

ESP32 Dự án ghi dữ liệu thời gian thực Firebase thiết lập 7

Trong cài đặt dự án, bạn sẽ có thể xem khóa API như được đánh dấu bên dưới. Điều này là duy nhất cho dự án của bạn. Giữ nó an toàn. Chúng tôi sẽ cần nó trong khi lập trình bảng NodeMCU ESP8266 của chúng tôi.

ESP32 Dự án ghi dữ liệu thời gian thực Firebase thiết lập 8

Cơ sở dữ liệu thời gian thực

Trong tab Xây dựng, hãy chuyển đến 'Cơ sở dữ liệu thời gian thực'. Sau đó nhấp vào 'Tạo cơ sở dữ liệu.'

ESP32 Dự án ghi dữ liệu thời gian thực Firebase thiết lập 9

Chỉ định vị trí cơ sở dữ liệu Thời gian thực và bấm Tiếp theo.

ESP32 Dự án ghi dữ liệu thời gian thực Firebase thiết lập 10

Đối với các quy tắc bảo mật, hãy bắt đầu ở chế độ thử nghiệm trong thời điểm hiện tại. Chúng tôi sẽ sớm chỉnh sửa các quy tắc. Bây giờ hãy nhấp vào 'Bật.'

ESP32 Dự án ghi dữ liệu thời gian thực Firebase thiết lập 11

Cài đặt cơ sở dữ liệu của bạn hiện đã hoàn tất. Bây giờ cơ sở dữ liệu Thời gian thực của chúng tôi sẽ được tạo. Bạn có thể xem URL cơ sở dữ liệu như hình dưới đây. Lưu nó như chúng tôi sẽ yêu cầu trong khi lập trình bảng ESP8266 của chúng tôi.

ESP32 Dự án ghi dữ liệu thời gian thực Firebase thiết lập 12

Bây giờ, hãy chuyển đến tab 'Quy tắc' và sau đó 'Chỉnh sửa quy tắc'. Sao chép các quy tắc mà chúng tôi đã trình bày bên dưới và sau đó nhấp vào nút 'Xuất bản'.

ESP32 Dự án ghi dữ liệu thời gian thực Firebase thiết lập 13

Những quy tắc này sẽ bảo mật dữ liệu của chúng tôi. Chúng tôi đã tuyên bố rằng nút 'Dữ liệu' bao gồm một nút khác sẽ là UID của người dùng. Chỉ những người dùng được xác thực mới có quyền truy cập vào nút của riêng họ. Do đó, người dùng được xác thực sẽ chỉ có thể (đọc / ghi) vào một nút khớp với UID của nó. Người dùng có UID 'x' sẽ có thể đọc/ghi dữ liệu dưới nút: Data/x.

Thiết lập Arduino IDE

Chúng tôi sẽ sử dụng Arduino IDE để lập trình bảng phát triển ESP8266 của chúng tôi. Vì vậy, bạn nên có phiên bản Arduino IDE mới nhất. Ngoài ra, bạn cũng cần cài đặt plugin cho bo mạch tương ứng mà bạn sẽ sử dụng.

Nếu IDE của bạn chưa cài đặt plugin, bạn có thể truy cập liên kết bên dưới:

Cài đặt thư viện BME280

Vì chúng tôi đang kết nối cảm biến BME280 với ESP8266, vì vậy chúng tôi sẽ phải cài đặt thư viện BME280 vào mô-đun của mình. Chúng tôi sẽ yêu cầu hai thư viện cho dự án này:

  1. Thư viện Adafruit_BME280

  2. Thư viện Adafruit_Sensor

Chúng tôi sẽ sử dụng Trình quản lý thư viện trong Arduino IDE của chúng tôi để cài đặt các phiên bản mới nhất của thư viện. Mở Arduino IDE của bạn và đi tới Sketch > Include Libraries > Manage Libraries. Nhập từng tên thư viện vào thanh tìm kiếm và cài đặt cả hai.

Cài đặt thư viện cảm biến hợp nhất Adafruit

Cài đặt Thư viện máy khách ESP của Google Firebase

Chúng tôi sẽ yêu cầu thư viện máy khách ESP firebase cho dự án này. Thư viện này tương thích với cả bảng phát triển ESP32 và ESP8266. Chúng tôi sẽ sử dụng Trình quản lý thư viện trong Arduino IDE để cài đặt nó một cách thành công.

Mở Arduino IDE và nhấp vào Sketch > Library > Manage Libraries. Nhập 'Firebase ESP Client' vào tab tìm kiếm và cài đặt phiên bản mới nhất của Firebase Arduino Client Library cho ESP8266 và ESP32 được hiển thị bên dưới.

Sau khi cài đặt thư viện, hãy khởi động lại IDE của bạn.

Arduino Sketch ESP8266 Ghi chép nhật ký dữ liệu thời gian thực

Mở Arduino IDE của bạn và đi tới Tệp > Mới để mở tệp mới.

Sao chép mã được cung cấp bên dưới trong tệp đó. Bạn cần nhập thông tin đăng nhập mạng của mình. Bạn cũng phải cung cấp khóa API web và URL cơ sở dữ liệu đã được lưu trước đó. Hơn nữa, bạn sẽ phải chỉ định email và mật khẩu mà bạn đã sử dụng trong xác thực Firebase để ủy quyền cho người dùng.

#include <Arduino.h>

#include <ESP8266WiFi.h>

#include <Firebase_ESP_Client.h>

#include <Wire.h>

#include <Adafruit_Sensor.h>

#include <Adafruit_BME280.h>

#include <NTPClient.h>

#include <WiFiUdp.h>

#include "addons/TokenHelper.h"

#include "addons/RTDBHelper.h"

 

//Enter your network credentials

const char* ssid = "YOUR_SSID";

const char* password = "YOUR_PASSWORD";

 

//Enter Firebase web API Key

#define API_KEY "AIzaSyCPU3dkKnnc--XM5vorDZroV_0NYxH****"

 

// Enter Authorized Email and Password

#define USER_EMAIL "WRITE_AUTHORIZED_EMAIL"

#define USER_PASSWORD "WRITE_AUTHORIZED_PASSWORD"

 

// Enter Realtime Database URL

#define DATABASE_URL "WRITE_YOUR_REALTIME_DATABASE_URL"

 

FirebaseData Firebase_dataObject;

FirebaseAuth authentication;

FirebaseConfig config;

 

String UID;

 

// Database main path 

String database_path;

 

String temperature_path = "/temperature";

String humidity_path = "/humidity";

String pressure_path = "/pressure";

String time_path = "/epoch_time";

 

//Updated in every loop

String parent_path;

 

int epoch_time;

FirebaseJson json;

 

// Define NTP Client to get time

WiFiUDP ntpUDP;

NTPClient timeClient(ntpUDP, "pool.ntp.org");

 

Adafruit_BME280 bme; 

float temperature;

float humidity;

float pressure;

 

//send new readings every 5 minutes

unsigned long previous_time = 0;

unsigned long Delay = 300000;

 

//get current epoch time

unsigned long Get_Epoch_Time() {

  timeClient.update();

  unsigned long now = timeClient.getEpochTime();

  return now;

}

 

void setup(){

  Serial.begin(115200);

  

    if (!bme.begin(0x76)) {

    Serial.println("Could not find BME280 sensor. Check Connections!");

    while (1);

  }

  

  WiFi.begin(ssid, password);

  Serial.print("Connecting to WiFi ..");

  while (WiFi.status() != WL_CONNECTED) {

    Serial.print('.');

    delay(1000);

  }

  Serial.println(WiFi.localIP());

  Serial.println();

  

  timeClient.begin();

 

  config.api_key = API_KEY;

  authentication.user.email = USER_EMAIL;

  authentication.user.password = USER_PASSWORD;

  config.database_url = DATABASE_URL;

 

  Firebase.reconnectWiFi(true);

  Firebase_dataObject.setResponseSize(4096);

 

  config.token_status_callback = tokenStatusCallback; 

  config.max_token_generation_retry = 5;

 

  Firebase.begin(&config, &authentication);

 

  Serial.println("Getting User UID...");

  while ((authentication.token.uid) == "") {

    Serial.print('.');

    delay(1000);

  }

  UID = authentication.token.uid.c_str();

  Serial.print("User UID: ");

  Serial.println(UID);

 

  database_path = "/Data/" + UID + "/BME280 Readings";

}

 

void loop(){

  if (Firebase.ready() && (millis() - previous_time > Delay || previous_time == 0))

{

    previous_time = millis();

 

    epoch_time = Get_Epoch_Time();

    Serial.print ("time: ");

    Serial.println (epoch_time);

 

    parent_path= database_path + "/" + String(epoch_time);

 

    json.set(temperature_path.c_str(), String(bme.readTemperature()));

    json.set(humidity_path.c_str(), String(bme.readHumidity()));

    json.set(pressure_path.c_str(), String(bme.readPressure()/100.0F));

    json.set(time_path, String(epoch_time));

    Serial.printf("Set json...%s\n",Firebase.RTDB.setJSON(&Firebase_dataObject, parent_path.c_str(), &json) ? "ok" : Firebase_dataObject.errorReason().c_str());

  }

}

Mã hoạt động như thế nào?

Chúng tôi sẽ bắt đầu bằng cách bao gồm tất cả các thư viện cần thiết cần thiết cho dự án này.

#include <Arduino.h>

#include <ESP8266WiFi.h>

#include <Firebase_ESP_Client.h>

#include <Wire.h>

#include <Adafruit_Sensor.h>

#include <Adafruit_BME280.h>

#include <NTPClient.h>

#include <WiFiUdp.h>

#include "addons/TokenHelper.h"

#include "addons/RTDBHelper.h"

Tiếp theo, chúng ta sẽ tạo hai biến toàn cục, một biến cho SSID và một biến khác cho mật khẩu. Chúng sẽ giữ thông tin đăng nhập mạng của chúng tôi sẽ được sử dụng để kết nối với bộ định tuyến không dây của chúng tôi. Thay thế cả hai bằng thông tin đăng nhập mạng của bạn để đảm bảo kết nối thành công.

 

//Enter your network credentials

const char* ssid = "YOUR_SSID";

const char* password = "YOUR_PASSWORD";

Thông tin xác thực Firebase

Tiếp theo, chúng ta sẽ định nghĩa khóa API web firebase của Google mà chúng ta đã truy cập và lưu trước đó

//Enter Firebase web API Key

#define API_KEY "AIzaSyCPU3dkKnnc--XM5vorDZroV_0NYxH****"

Bước tiếp theo là chỉ định email và mật khẩu người dùng mà chúng tôi đã sử dụng trong khi ủy quyền cho người dùng trong dự án firebase của chúng tôi. Cả hai điều này phải tương ứng với những cái bạn đã lưu trong khi thêm người dùng.

// Enter Authorized Email and Password

#define USER_EMAIL "WRITE_AUTHORIZED_EMAIL"

#define USER_PASSWORD "WRITE_AUTHORIZED_PASSWORD"

Bây giờ hãy nhập URL cơ sở dữ liệu Thời gian thực mà chúng tôi đã có được trước đó sau khi tạo cơ sở dữ liệu Thời gian thực. Trong trường hợp của chúng tôi, URL cơ sở dữ liệu là "esp-data-logging-a4e40-default-rtdb.asia-southeast1.firebasedatabase.app"

// Enter Realtime Database URL

#define DATABASE_URL "WRITE_YOUR_REALTIME_DATABASE_URL"

Tiếp theo, chúng ta sẽ tạo một số đối tượng cho một số chức năng firebase: data, authentication và configuration.

FirebaseData Firebase_dataObject;

FirebaseAuth authentication;

FirebaseConfig config;

Biến lưu trữ dữ liệu

Biến chuỗi UID sẽ lưu UID của người dùng.

String UID;

Tiếp theo, chúng ta sẽ tạo một số biến chuỗi cho các đường dẫn. 'database_path' là đường dẫn chính sẽ được cập nhật với UID của người dùng. Tiếp theo, chúng ta có các đường dẫn cho các chỉ số cảm biến bao gồm nhiệt độ, độ ẩm và áp suất và đường đi của thời đại hiện tại. 'parent_path' là đường dẫn sẽ thay đổi sau mỗi vòng lặp với dấu thời gian mới.

ESP32 Đường dẫn dự án ghi dữ liệu thời gian thực Firebase

 

String database_path;  //main path

 

String temperature_path = "/temperature";

String humidity_path = "/humidity";

String pressure_path = "/pressure";

String time_path = "/epoch_time";

 

//Updated in every loop

String parent_path;

Biến số nguyên 'epoch_time' sẽ lưu thời gian kỷ nguyên hiện tại có được thông qua máy chủ NTP.

int epoch_time;

Tiếp theo chúng ta sẽ tạo một đối tượng FirebaseJson được gọi là 'json'. Điều này sẽ được sử dụng để gửi dữ liệu cảm biến cùng với thời gian kỷ nguyên hiện tại đến cơ sở dữ liệu Realtime một cách dễ dàng.

FirebaseJson json;

Chúng tôi sẽ xác định máy khách NTP 'pool.ntp.org' để truy cập thời gian kỷ nguyên.

WiFiUDP ntpUDP;

NTPClient timeClient(ntpUDP, "pool.ntp.org");

BME280 ·

Sau đó, chúng ta sẽ định nghĩa đối tượng Adafruit_BME280 có tên bme bằng cách đặt nó trên các chân I2C GPIO mặc định của ESP8266. Ngoài ra, chúng tôi sẽ khai báo các biến để giữ các chỉ số cảm biến BME280 như nhiệt độ, áp suất và độ ẩm. Chúng được khai báo là kiểu nổi vì chúng ta sẽ xử lý các giá trị số có thể có dấu thập phân nổi. Nói cách khác, các giá trị được trả về bởi cảm biến BME280 là các giá trị dấu phẩy động.

Adafruit_BME280 bme; 

float temperature;

float humidity;

float pressure;

Ở đây, chúng ta định nghĩa hai biến previous_time và Delay. Chúng tôi sẽ bao gồm độ trễ 5 phút (300000ms) trước khi gửi các bài đọc mới. Thời gian cập nhật đang được lưu trữ trong biến 'Độ trễ'.

//send new readings every 5 minutes

unsigned long previous_time = 0;

unsigned long Delay = 300000;

Get_Epoch_Time()

Để lấy thời gian kỷ nguyên / Unix, chúng ta tạo hàm Get_Epoch_Time() sẽ trả về thời gian kỷ nguyên hiện tại bất cứ khi nào một yêu cầu được thực hiện cho máy chủ. Phần mã này hiển thị hàm và cách nó trả về thời gian.

//get current epoch time

unsigned long Get_Epoch_Time() {

  timeClient.update();

  unsigned long now = timeClient.getEpochTime();

  return now;

}

thiết lập()

Trong hàm setup(), bắt đầu giao tiếp nối tiếp với tốc độ truyền là 115200.

 Serial.begin(115200);

Các dòng sau sẽ khởi tạo cảm biến BME280. Trong trường hợp thất bại, một thông báo liên quan sẽ được in trên Màn hình nối tiếp.

    if (!bme.begin(0x76)) {

    Serial.println("Could not find BME280 sensor. Check Connections!");

    while (1);

  }

Phần mã sau đây sẽ kết nối bo mạch ESP8266 của chúng tôi với mạng cục bộ có thông tin đăng nhập mạng mà chúng tôi đã chỉ định ở trên. Chúng ta sẽ sử dụng chức năng WiFi.begin(). Các đối số sẽ là SSID và mật khẩu mà chúng ta đã xác định trước đó trong code. Sau khi kết nối được thiết lập, địa chỉ IP của bo mạch ESP8266 sẽ được in trên màn hình nối tiếp.

WiFi.begin(ssid, password);

  Serial.print("Connecting to WiFi ..");

  while (WiFi.status() != WL_CONNECTED) {

    Serial.print('.');

    delay(1000);

  }

  Serial.println(WiFi.localIP());

  Serial.println();

Chúng tôi cũng sẽ khởi tạo máy khách NTP thông qua dòng sau:

timeClient.begin();

Bây giờ, đầu tiên chúng ta sẽ sử dụng đối tượng dữ liệu firebase mà chúng ta đã tạo để cấu hình và thiết lập khóa API cũng như URL cơ sở dữ liệu. Sau đó, chúng tôi sẽ chỉ định email và mật khẩu người dùng cho đối tượng xác thực firebase.

  config.api_key = API_KEY;

  authentication.user.email = USER_EMAIL;

  authentication.user.password = USER_PASSWORD;

  config.database_url = DATABASE_URL;

 

Các dòng code sau đây sẽ được sử dụng để thiết lập hàm call-back cho tác vụ tạo token dài hạn. Chúng cũng sẽ được đặt thành đối tượng cấu hình Firebase.

  config.token_status_callback = tokenStatusCallback; 

  config.max_token_generation_retry = 5;

Sử dụng Firebase.begin() trên đường dẫn cấu hình và authentication, chúng ta sẽ khởi tạo kết nối thư viện firebase.

 

Firebase.begin(&config, &authentication);

Trong các dòng code sau đây, chúng ta sẽ truy xuất UID của người dùng

 Serial.println("Getting User UID...");

  while ((authentication.token.uid) == "") {

    Serial.print('.');

    delay(1000);

  }

  UID = authentication.token.uid.c_str();

  Serial.print("User UID: ");

  Serial.println(UID);

Hơn nữa, database_path sẽ được thiết lập như sau: Nó bao gồm Dữ liệu theo sau là UID của người dùng và tiếp theo là Bài đọc BME280.

  database_path = "/Data/" + UID + "/BME280 Readings";

vòng lặp()

Bên trong hàm loop(), chúng ta sẽ lấy thời gian kỷ nguyên hiện tại sau khi kết nối với Firebase và sau mỗi 5 phút. Thời đại kỷ nguyên này sẽ được in trong màn hình nối tiếp.

Sau đó, chúng tôi sẽ cập nhật parent_path với giá trị epoch_time hiện tại. Sử dụng json.set() chúng ta sẽ cập nhật tất cả các số đọc của cảm biến và dấu thời gian với các giá trị hiện tại. Đối số đầu tiên là đường dẫn và đối số thứ hai là giá trị.

Hơn nữa, chúng ta sẽ gọi Firebase.RTDB.setJSON(&Firebase_dataObject, parent_path.c_str(), &json) để thêm dữ liệu mới vào đường dẫn cha.

void loop(){

  if (Firebase.ready() && (millis() - previous_time > Delay || previous_time == 0)){

    previous_time = millis();

 

    epoch_time = Get_Epoch_Time();

    Serial.print ("time: ");

    Serial.println (epoch_time);

 

    parent_path= database_path + "/" + String(epoch_time);

 

    json.set(temperature_path.c_str(), String(bme.readTemperature()));

    json.set(humidity_path.c_str(), String(bme.readHumidity()));

    json.set(pressure_path.c_str(), String(bme.readPressure()/100.0F));

    json.set(time_path, String(epoch_time));

    Serial.printf("Set json... %s\n", Firebase.RTDB.setJSON(&Firebase_dataObject, parent_path.c_str(), &json) ? "ok" : Firebase_dataObject.errorReason().c_str());

  }

}

Demonstration

Chọn đúng bảng và cổng COM trước khi tải mã của bạn lên bảng. Đi tới Bảng > Công cụ và chọn NodeMCU1.0

chọn bảng ESP8266 NodeMCU

Tiếp theo, đi tới Công cụ > Cổng và chọn cổng thích hợp mà qua đó bảng của bạn được kết nối.

Cổng COM ESP8266

Nhấp vào nút tải lên để tải mã lên bảng phát triển ESP8266 của bạn.
Sau khi bạn đã tải mã của mình lên bảng phát triển, hãy nhấn nút RST của nó.

Nút đặt lại ESP8266 NodeMCU

Trong Arduino IDE của bạn, hãy mở màn hình nối tiếp và bạn sẽ có thể thấy trạng thái kết nối WIFI và địa chỉ IP của mô-đun ESP8266. Các bài đọc đầu tiên sẽ được gửi đến Cơ sở dữ liệu thời gian thực Firebase của bạn. Chuyển đến Cơ sở dữ liệu thời gian thực trong bảng điều khiển của Firebase. Tại đây bạn sẽ xem tất cả dữ liệu.

Bạn có thể thấy rằng chúng tôi có Dữ liệu theo sau là UID của người dùng, sau đó là BME280 Readings. Theo đó, chúng ta có dấu thời gian hiển thị thời gian kỷ nguyên hiện tại. Đây là dữ liệu sau 10 phút đầu tiên, do đó chúng tôi có ba dấu thời gian tại thời điểm 0, 5 phút và 10 phút.

ESP8266 Dự án ghi dữ liệu thời gian thực Firebase 1

Mở rộng từng dấu thời gian riêng lẻ, bạn sẽ có thể xem ba kết quả đọc cảm biến như sau:

ESP8266 Dự án ghi dữ liệu thời gian thực Firebase 2

Màn hình nối tiếp Arduino cũng hiển thị các thông báo liên quan:

ESP8266 Màn hình nối tiếp của Dự án ghi dữ liệu thời gian thực Firebase

>>> 100+ Mã Sản Phẩm Dây Rút: https://mecsu.vn/san-pham/day-rut-nhua.5op

>>> 1000+ Mã Sản Phẩm Đầu Cosse: https://mecsu.vn/san-pham/dau-cosse.Q1j

Bài viết cùng chuyên mục

NHANH

NHANH

Vì Đổi mới liên tục nên Nhanh hơn

ĐÚNG

ĐÚNG

Coi trọng và ưu tiên việc làm Đúng

ĐỦ

ĐỦ

Tìm và mua Đủ Đơn hàng hơn

KỊP THỜI

KỊP THỜI

Hiệu suất tối ưu bởi Kịp Thời hơn