ESP32/ESP8266 Firebase: Отправка показаний BME280 в Realtime Database

В этом руководстве вы узнаете, как отправлять показания датчика BME280 в Firebase Realtime Database с помощью плат ESP32 или ESP8266 NodeMCU. Плата ESP будет аутентифицироваться как пользователь с email и паролем, а также вы добавите правила безопасности базы данных для защиты ваших данных. Платы будут программироваться с использованием ядра Arduino.

ESP32 ESP8266 NodeMCU Firebase Отправка показаний BME280 в Realtime Database

Обновлено 30 апреля 2025 года

Часть 2 этого проекта: ESP32/ESP8266: Веб-приложение Firebase для отображения показаний датчиков (с аутентификацией)

Другие руководства по Firebase с ESP32/ESP8266, которые могут вас заинтересовать:

Что такое Firebase?

Логотип Firebase

Firebase – это платформа разработки мобильных приложений от Google, которая помогает создавать, улучшать и развивать ваше приложение. Она имеет множество сервисов для управления данными из любого Android, iOS или веб-приложения, таких как аутентификация, база данных реального времени, хостинг и другие.

Обзор проекта

Следующая диаграмма показывает общий обзор проекта, который мы создадим.

Firebase ESP32 ESP8266 NodeMCU Отправка показаний BME280 в базу данных -- Обзор проекта
  1. ESP32/ESP8266 аутентифицируется как пользователь с email и паролем (этот пользователь должен быть настроен в методах аутентификации Firebase);

  2. После аутентификации ESP получает UID пользователя;

  3. База данных защищена правилами безопасности. Пользователь может получить доступ только к узлам базы данных под узлом со своим UID. После получения UID пользователя ESP может публиковать данные в базу данных;

  4. ESP отправляет температуру, влажность и давление в базу данных.

Вот основные шаги для выполнения этого проекта:

  1. Создание проекта Firebase

  2. Настройка методов аутентификации

  3. Получение API-ключа проекта

  4. Настройка Realtime Database

  5. Настройка правил безопасности базы данных

  6. ESP32/ESP8266 Отправка показаний датчика в Realtime Database

Вы можете продолжить с проектом Firebase из этого предыдущего руководства или создать новый проект. Если вы используете проект Firebase из предыдущего руководства, вы можете перейти к разделу 4) Настройка Realtime Database, так как методы аутентификации уже настроены.

Подготовка Arduino IDE

Для этого руководства мы будем программировать платы ESP32 и ESP8266 с использованием ядра Arduino. Поэтому убедитесь, что у вас установлен аддон ESP32 или ESP8266 в Arduino IDE:

Если вы хотите программировать платы ESP с помощью VS Code с расширением PlatformIO, следуйте этому руководству:

1) Создание проекта Firebase

Следуйте инструкциям ниже, чтобы создать новый проект в Firebase.

  1. Перейдите на Firebase и войдите с помощью Google-аккаунта.

  2. Перейдите в консоль Firebase и создайте новый проект.

  3. Дайте имя вашему проекту, например: ESP-Project, и нажмите Continue.

Настройка проекта Firebase для ESP32 и ESP8266 -- Шаг 1
  1. Далее включите или отключите AI-помощника для вашего проекта. Это необязательно.

Настройка проекта Firebase для ESP32 и ESP8266 -- Включение AI-помощника
  1. Отключите опцию Enable Google Analytics для этого проекта, так как она не нужна. Затем нажмите Create project.

Отключение Google Analytics для проекта Firebase
  1. Настройка проекта займёт несколько секунд. Нажмите Continue, когда всё будет готово.

Проект Firebase для ESP32 готов
  1. Вы будете перенаправлены на страницу консоли вашего проекта.

Консоль проекта Firebase

2) Настройка методов аутентификации

Чтобы разрешить аутентификацию по email и паролю, сначала необходимо настроить методы аутентификации для вашего приложения.

«Большинству приложений необходимо знать идентификатор пользователя. Другими словами, аутентификация отвечает за вход в систему и идентификацию пользователей (в данном случае ESP32 или ESP8266). Знание идентификатора пользователя позволяет приложению безопасно сохранять данные в облаке и обеспечивать одинаковый персонализированный опыт на всех устройствах пользователя.» Чтобы узнать больше о методах аутентификации, вы можете прочитать документацию.

  1. На левой боковой панели нажмите Build > Authentication, а затем Get started.

Настройка аутентификации в проекте Firebase
  1. Существует несколько методов аутентификации: email и пароль, Google-аккаунт, Facebook-аккаунт и другие.

Методы аутентификации Firebase
  1. Выберите Email/Password и включите этот метод аутентификации. Затем нажмите Save.

Включение аутентификации по Email/Password в Firebase
  1. Затем вверху нажмите на вкладку Users. Потом нажмите Add user.

Создание нового пользователя в Firebase
  1. Создайте нового пользователя с email и паролем. Email может быть вашим личным. Придумайте пароль для этого пользователя (вам нужно будет запомнить пароль позже). Наконец, нажмите Add user.

Добавление пользователя с email и паролем в Firebase
  1. Пользователь появится в списке. Вы можете увидеть информацию о пользователе: когда он был создан, когда последний раз входил в систему, и его UID.

Пользователь Firebase создан

3) Получение API-ключа проекта

Для взаимодействия с вашим проектом Firebase через платы ESP32 или ESP8266 вам необходимо получить API-ключ проекта. Следуйте инструкциям ниже.

  1. Чтобы получить API-ключ проекта, на левой боковой панели нажмите Project Settings.

Настройки проекта Firebase Realtime Database
  1. Скопируйте API Key в безопасное место, так как он понадобится позже.

API-ключ проекта Firebase

4) Настройка Realtime Database

Теперь создадим базу данных реального времени и настроим правила для нашего проекта.

1) На левой боковой панели нажмите Realtime Database, а затем Create Database.

Создание базы данных в проекте Firebase

2) Выберите расположение базы данных. Оно должно быть ближайшим к вашему местоположению.

Настройка расположения Firebase Realtime Database

3) Настройте правила безопасности для базы данных. Вы можете выбрать Start in test mode. Мы изменим правила базы данных через мгновение.

Firebase Realtime Database -- Запуск в тестовом режиме

4) Ваша база данных создана. Вам нужно скопировать и сохранить URL базы данных – он выделен на следующем изображении – так как он понадобится позже в коде ESP32/ESP8266.

URL Firebase Realtime Database

5) Настройка правил безопасности базы данных

Теперь настроим правила базы данных. На вкладке Realtime Database выберите вкладку Rules вверху. Затем нажмите Edit rules, скопируйте следующие правила и нажмите Publish.

// These rules grant access to a node matching the authenticated
// user's ID from the Firebase auth token
{
  "rules": {
    "UsersData": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}
Настройка правил Firebase Realtime Database

Эти правила разрешают доступ только к узлу, соответствующему UID аутентифицированного пользователя. Это гарантирует, что каждый пользователь может получить доступ только к своим данным. Другими словами, пользователь может читать или записывать данные только в те части базы данных, которые расположены под его конкретным UID. Любые данные, хранящиеся за пределами узла с его UID, будут ему недоступны.

Например, представьте, что UID нашего пользователя – RjO3taAzMMXBB2Xmir2LQ. С нашими правилами безопасности он может читать и записывать данные в базу данных под узлом UsersData/RjO3taAzMMXBB2Xmir2LQ.

Вы лучше поймёте, как это работает, когда начнёте работать с ESP32/ESP8266.

6) ESP32/ESP8266 Отправка показаний датчика в Realtime Database

В этом разделе мы запрограммируем платы ESP32 или ESP8266 для выполнения следующих задач:

  1. Аутентификация как пользователь с email и паролем (пользователь, которого вы настроили в этом разделе);

  2. Отправка показаний датчика в Firebase Realtime Database как авторизованный пользователь в узел, соответствующий его UID.

Необходимые компоненты

Для этого проекта вам понадобятся следующие компоненты*:

* вы также можете протестировать проект со случайными значениями вместо показаний датчика, или использовать любой другой знакомый вам датчик.

Вы можете использовать ссылки выше или перейти напрямую на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Схема подключения

В этом руководстве мы будем отправлять показания датчика BME280 в Firebase Realtime Database. Поэтому вам нужно подключить датчик BME280 к вашей плате. Следуйте одной из следующих схем подключения.

ESP32 с BME280

Мы будем использовать I2C-связь с модулем датчика BME280. Для этого подключите датчик к стандартным выводам ESP32: SCL (GPIO 22) и SDA (GPIO 21), как показано на следующей схеме.

Схема подключения ESP32 и датчика BME280 (температура, влажность, давление)

Не знакомы с BME280 на ESP32? Прочитайте это руководство: ESP32 с датчиком BME280 в Arduino IDE (давление, температура, влажность)

ESP8266 с BME280

Мы будем использовать I2C-связь с модулем датчика BME280. Для этого подключите датчик к выводам ESP8266: SDA (GPIO 4) и SCL (GPIO 5), как показано на следующей схеме.

Схема подключения ESP8266 NodeMCU и датчика BME280 (температура, влажность, давление)

Не знакомы с BME280 на ESP8266? Прочитайте это руководство: ESP8266 с датчиком BME280 в Arduino IDE (давление, температура, влажность)

Установка библиотек

Для этого проекта вам нужно установить следующие библиотеки:

Установка библиотек – VS Code

Следуйте этим инструкциям, если вы используете VS Code с расширением PlatformIO или pioarduino.

Установка библиотеки FirebaseClient

Нажмите на иконку PIO Home и выберите вкладку Libraries. Найдите «FirebaseClient». Выберите библиотеку Firebase Client Library от Mobitz.

Установка библиотеки FirebaseClient в VS Code

Затем нажмите Add to Project и выберите проект, над которым вы работаете.

Добавление библиотеки FirebaseClient в проект в VS Code

Установка библиотеки BME280

На вкладке Libraries найдите BME280. Выберите библиотеку Adafruit BME280.

Поиск библиотеки BME280 в PlatformIO VS Code

Затем нажмите Add to Project и выберите проект, над которым вы работаете.

Добавление библиотеки в проект PlatformIO VS Code

Также измените скорость монитора на 115200, добавив следующую строку в файл platformio.ini вашего проекта:

monitor_speed = 115200

Установка – Arduino IDE

Следуйте этому разделу, если вы используете Arduino IDE.

Вам нужно установить следующие библиотеки:

Перейдите в Sketch > Include Library > Manage Libraries, найдите библиотеки по имени и установите их.

Установка библиотеки Firebase Client в Arduino IDE

Теперь всё готово для программирования плат ESP32 и ESP8266 для взаимодействия с базой данных.

Код отправки показаний датчика в Realtime Database

Скопируйте следующий код в Arduino IDE или в файл main.cpp, если вы используете VS Code.

Вам нужно вставить ваши сетевые учётные данные, API-ключ проекта, URL базы данных, а также email и пароль авторизованного пользователя.

/*
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at our blog: https://RandomNerdTutorials.com/esp32-esp8266-firebase-bme280-rtdb/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#define ENABLE_USER_AUTH
#define ENABLE_DATABASE

#include <Arduino.h>
#if defined(ESP32)
  #include <WiFi.h>
#elif defined(ESP8266)
  #include <ESP8266WiFi.h>
#endif
#include <WiFiClientSecure.h>
#include <FirebaseClient.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

// Network and Firebase credentials
#define WIFI_SSID "REPLACE_WITH_YOUR_SSID"
#define WIFI_PASSWORD "REPLACE_WITH_YOUR_PASSWORD"

#define Web_API_KEY "REPLACE_WITH_YOUR_PROJECT_API_KEY"
#define DATABASE_URL "REPLACE_WITH_YOUR_DATABASE_URL"
#define USER_EMAIL "REPLACE_WITH_THE_USER_EMAIL"
#define USER_PASSWORD "REPLACE_WITH_THE_USER_PASSWORD"

// User function
void processData(AsyncResult &aResult);

// Authentication
UserAuth user_auth(Web_API_KEY, USER_EMAIL, USER_PASSWORD);

// Firebase components
FirebaseApp app;
WiFiClientSecure ssl_client;
using AsyncClient = AsyncClientClass;
AsyncClient aClient(ssl_client);
RealtimeDatabase Database;

// Timer variables for sending data every 10 seconds
unsigned long lastSendTime = 0;
const unsigned long sendInterval = 10000;

// Variable to save USER UID
String uid;

// Variables to save database paths
String databasePath;
String tempPath;
String humPath;
String presPath;

// BME280 sensor
Adafruit_BME280 bme; // I2C
float temperature;
float humidity;
float pressure;

// Initialize BME280
void initBME(){
  if (!bme.begin(0x76)) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }
  Serial.println("BME280 Initialized with success");
}

void setup(){
  Serial.begin(115200);

  initBME();

  // Connect to Wi-Fi
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("Connecting to Wi-Fi");
  while (WiFi.status() != WL_CONNECTED)    {
    Serial.print(".");
    delay(300);
  }
  Serial.println();

  ssl_client.setInsecure();
  #if defined(ESP32)
    ssl_client.setConnectionTimeout(1000);
    ssl_client.setHandshakeTimeout(5);
  #elif defined(ESP8266)
    ssl_client.setTimeout(1000); // Set connection timeout
    ssl_client.setBufferSizes(4096, 1024); // Set buffer sizes
  #endif

  // Initialize Firebase
  initializeApp(aClient, app, getAuth(user_auth), processData, "authTask");
  app.getApp<RealtimeDatabase>(Database);
  Database.url(DATABASE_URL);
}

void loop(){
  // Maintain authentication and async tasks
  app.loop();

  // Check if authentication is ready
  if (app.ready()){

    // Periodic data sending every 10 seconds
    unsigned long currentTime = millis();
    if (currentTime - lastSendTime >= sendInterval){
      // Update the last send time
      lastSendTime = currentTime;

      // Get User UID
      Firebase.printf("User UID: %s\n", app.getUid().c_str());
      uid = app.getUid().c_str();
      databasePath = "UsersData/" + uid;

      // Update database path for sensor readings
      tempPath = databasePath + "/temperature"; // --> UsersData/<user_uid>/temperature
      humPath = databasePath + "/humidity"; // --> UsersData/<user_uid>/humidity
      presPath = databasePath + "/pressure"; // --> UsersData/<user_uid>/pressure

      // Get latest sensor readings
      temperature = bme.readTemperature();
      humidity = bme.readHumidity();
      pressure = bme.readPressure()/100.0F;

      Serial.println("Writing to: " + tempPath);

      Database.set<float>(aClient, tempPath, temperature, processData, "RTDB_Send_Temperature");
      Database.set<float>(aClient, humPath, humidity, processData, "RTDB_Send_Humidity");
      Database.set<float>(aClient, presPath, pressure, processData, "RTDB_Send_Pressure");

    }
  }
}

void processData(AsyncResult &aResult){
  if (!aResult.isResult())
    return;

  if (aResult.isEvent())
    Firebase.printf("Event task: %s, msg: %s, code: %d\n", aResult.uid().c_str(), aResult.eventLog().message().c_str(), aResult.eventLog().code());

  if (aResult.isDebug())
    Firebase.printf("Debug task: %s, msg: %s\n", aResult.uid().c_str(), aResult.debug().c_str());

  if (aResult.isError())
    Firebase.printf("Error task: %s, msg: %s, code: %d\n", aResult.uid().c_str(), aResult.error().message().c_str(), aResult.error().code());

  if (aResult.available())
    Firebase.printf("task: %s, payload: %s\n", aResult.uid().c_str(), aResult.c_str());
}

Исходный код на GitHub

Как работает код

Продолжайте чтение, чтобы узнать, как работает код, или перейдите к разделу демонстрации.

Подключение библиотек

Сначала подключаем необходимые библиотеки. Мы подключаем разные WiFi-библиотеки для ESP32 и ESP8266.

#include <Arduino.h>
#if defined(ESP32)
    #include <WiFi.h>
#elif defined(ESP8266)
    #include <ESP8266WiFi.h>
#endif
#include <WiFiClientSecure.h>
#include <FirebaseClient.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

Сетевые учётные данные

Укажите ваши сетевые учётные данные в следующих строках, чтобы платы могли подключиться к интернету через вашу локальную сеть.

// Insert your network credentials
#define WIFI_SSID "REPLACE_WITH_YOUR_SSID"
#define WIFI_PASSWORD "REPLACE_WITH_YOUR_PASSWORD"

API-ключ проекта Firebase, пользователь Firebase и URL базы данных

Вставьте API-ключ вашего проекта Firebase – тот, который вы получили в этом разделе.

#define Web_API_KEY "REPLACE_WITH_YOUR_PROJECT_API_KEY"

Вставьте URL вашей базы данных в следующую строку:

// Insert RTDB URL
#define DATABASE_URL "REPLACE_WITH_YOUR_DATABASE_URL"

Вставьте авторизованный email и соответствующий пароль – это данные пользователя, которого вы добавили в этом разделе.

#define USER_EMAIL "REPLACE_WITH_THE_USER_EMAIL"
#define USER_PASSWORD "REPLACE_WITH_THE_USER_PASSWORD"

Объявление аутентификации и компонентов Firebase

Следующая строка создаёт объект аутентификации с использованием API-ключа проекта, email и пароля пользователя.

UserAuth user_auth(Web_API_KEY, USER_EMAIL, USER_PASS);

Это создаёт экземпляр FirebaseApp с именем app, который ссылается на приложение Firebase.

FirebaseApp app;

Следующие строки настраивают фреймворк асинхронной связи для взаимодействия с Firebase Realtime Database. По сути, вы создаёте SSL-клиент с помощью библиотеки WiFiClientSecure. Затем создаёте асинхронный клиент aClient, который обеспечивает безопасное HTTPS-соединение. Это позволит обрабатывать сетевые операции асинхронно.

WiFiClientSecure ssl_client;
using AsyncClient = AsyncClientClass;
AsyncClient aClient(ssl_client);

Следующая строка создаёт объект RealtimeDatabase с именем Database, который представляет Firebase Realtime Database.

RealtimeDatabase Database;

Переменные таймера и данных

Затем создаём переменные для отслеживания времени. Мы будем отправлять показания датчика в базу данных каждые 10 секунд.

// Timer variables for sending data every 10 seconds
unsigned long lastSendTime = 0;
const unsigned long sendInterval = 10000;

Создаём переменную для сохранения UID пользователя. Переменная uid будет использоваться для сохранения UID пользователя. Мы можем получить UID после аутентификации.

// Variable to save USER UID
String uid;

Создаём переменные для сохранения пути к базе данных и конкретных узлов. Мы обновим эти переменные позже в коде, когда получим UID пользователя.

// Variables to save database paths
String databasePath;
String tempPath;
String humPath;
String presPath;

Переменные BME280

Затем создаём объект Adafruit_BME280 с именем bme. Это автоматически создаёт объект датчика на стандартных I2C-выводах ESP32 или ESP8266.

Adafruit_BME280 bme; // I2C

Следующие переменные будут хранить показания температуры, влажности и давления с датчика.

float temperature;
float humidity;
float pressure;

initBME()

Функция initBME() инициализирует датчик BME280. Мы вызовем её позже в setup().

// Initialize BME280
void initBME(){
  if (!bme.begin(0x76)) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }
  Serial.print("BME280 Initialized with success");
}

setup()

В setup() инициализируем Serial Monitor, датчик BME280 и подключаем плату к вашей Wi-Fi сети.

void setup(){
    Serial.begin(115200);

    initBME();

    // Connect to Wi-Fi
    WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
    Serial.print("Connecting to Wi-Fi");
    while (WiFi.status() != WL_CONNECTED)    {
        Serial.print(".");
        delay(300);
    }
    Serial.println();

Настройка SSL-клиента.

ssl_client.setInsecure();
#if defined(ESP32)
  ssl_client.setConnectionTimeout(1000);
  ssl_client.setHandshakeTimeout(5);
#elif defined(ESP8266)
  ssl_client.setTimeout(1000); // Set connection timeout
  ssl_client.setBufferSizes(4096, 1024); // Set buffer sizes
#endif

Следующая строка инициализирует приложение Firebase с аутентификацией и устанавливает processData() в качестве функции обратного вызова для асинхронных результатов (это означает, что любые результаты от функции initializeApp() будут обрабатываться в функции обратного вызова processData()).

initializeApp(aClient, app, getAuth(user_auth), processData, "authTask");

Затем указываем, что объект Database, определённый ранее, должен использоваться как база данных для нашего приложения Firebase.

app.getApp<RealtimeDatabase>(Database);

Наконец, устанавливаем URL базы данных.

Database.url(DATABASE_URL);

loop()

Библиотека Firebase, которую мы используем, работает асинхронно и с функциями обратного вызова. Это означает, что при возникновении события запускаются соответствующие назначенные функции обратного вызова. Чтобы приложение Firebase продолжало работать, обрабатывая аутентификацию и асинхронные задачи, нам нужно добавить app.loop() в начало нашей функции loop().

void loop(){
  app.loop();

Команда app.ready() проверяет, завершена ли аутентификация Firebase и готова ли она, чтобы мы могли продолжить с другими операциями Firebase (такими как запись в базу данных).

if (app.ready()){

Следующие строки проверяют, прошло ли 10 секунд (sendInterval). Мы будем использовать это для периодической отправки данных каждые 10 секунд.

// Periodic data sending every 10 seconds
unsigned long currentTime = millis();
if (currentTime - lastSendTime >= sendInterval){
   // Update the last send time
  lastSendTime = currentTime;

После успешной аутентификации мы получаем UID пользователя и сохраняем его в переменной uid. Затем обновляем путь к базе данных на UsersData/<USER_UID>.

 // Get User UID
Firebase.printf("User UID: %s\n", app.getUid().c_str());
uid = app.getUid().c_str();
databasePath = "UsersData/" + uid;

Затем обновляем путь для каждого узла, где будут сохраняться показания.

// Update database path for sensor readings
tempPath = databasePath + "/temperature"; // --> UsersData/<user_uid>/temperature
humPath = databasePath + "/humidity"; // --> UsersData/<user_uid>/humidity
presPath = databasePath + "/pressure"; // --> UsersData/<user_uid>/pressure

Получение показаний датчика

Затем получаем новые показания датчика и сохраняем их в переменных temperature, humidity и pressure.

// Get sensor readings
temperature = bme.readTemperature();
humidity = bme.readHumidity();
pressure = bme.readPressure()/100.0F;

Отправка данных в базу данных

Для отправки данных в базу данных мы используем Database.set(). Эта функция шаблонизирована для поддержки различных типов данных. Вот общий синтаксис и аргументы:

Database.set<T>(AsyncClient &client, const String &path, T value, AsyncResultCallback callback, const String &uid);

Разберём, как это работает:

  • <T> – тип данных. В коде используется как Database.set<String>, Database.set<int> и Database.set<float>. Вы можете использовать другие типы данных.

  • AsyncClient &client – объект асинхронного клиента (aClient в коде), который управляет сетевым подключением к Firebase.

  • const String &path – путь в Firebase Realtime Database, куда будут записаны данные. Путь относителен к корню базы данных (определённому DATABASE_URL). Например: «test/string».

  • T value – значение, которое будет записано по указанному пути.

  • AsyncResultCallback callback – указатель на функцию обратного вызова, которая обрабатывает результат асинхронной операции. В коде это функция processData(). Она обрабатывает объект AsyncResult для логирования событий, ошибок, отладочных сообщений или успешных данных. Функция вызывается, когда сервер Firebase отвечает или при возникновении ошибки во время запроса.

  • const String &uid – уникальный идентификатор задачи, используемый для отслеживания конкретной операции в функции обратного вызова. Это помогает различать несколько асинхронных задач в функции processData().

Подробнее: ESP32: Начало работы с Firebase (Realtime Database)

В нашем примере мы будем отправлять переменные типа float. Мы используем функцию set() следующим образом для отправки показаний в их конкретные пути узлов базы данных.

Database.set<float>(aClient, tempPath, temperature, processData,"RTDB_Send_Temperature");
Database.set<float>(aClient, humPath, humidity, processData, "RTDB_Send_Humidity");
Database.set<float>(aClient, presPath, pressure, processData, "RTDB_Send_Pressure");

Обработка асинхронных результатов

Наконец, функция processData() логирует результаты асинхронных операций Firebase.

void processData(AsyncResult &aResult) {
  if (!aResult.isResult())
    return;

  if (aResult.isEvent())
    Firebase.printf("Event task: %s, msg: %s, code: %d\n", aResult.uid().c_str(), aResult.eventLog().message().c_str(), aResult.eventLog().code());

  if (aResult.isDebug())
    Firebase.printf("Debug task: %s, msg: %s\n", aResult.uid().c_str(), aResult.debug().c_str());

  if (aResult.isError())
    Firebase.printf("Error task: %s, msg: %s, code: %d\n", aResult.uid().c_str(), aResult.error().message().c_str(), aResult.error().code());

  if (aResult.available())
    Firebase.printf("task: %s, payload: %s\n", aResult.uid().c_str(), aResult.c_str());
}

Демонстрация

Загрузите приведённый выше код на вашу плату. Код совместим как с ESP32, так и с ESP8266. Не забудьте вставить ваши сетевые учётные данные, API-ключ проекта, URL базы данных, email пользователя и соответствующий пароль.

После загрузки кода нажмите кнопку RST на плате, чтобы запустить выполнение кода. Плата должна аутентифицироваться в Firebase, получить UID пользователя и сразу же отправить новые показания в базу данных.

Откройте Serial Monitor на скорости 115200 бод и убедитесь, что всё работает как ожидается.

ESP32 Отправка показаний BME280 в Firebase RTDB -- Serial Monitor

Дополнительно перейдите в Realtime Database в интерфейсе вашего проекта Firebase и убедитесь, что новые показания сохраняются. Обратите внимание, что данные сохраняются под узлом с UID пользователя – это способ ограничения доступа к базе данных.

Показания датчика ESP32 в Firebase Realtime Database

Вот и всё. Вы успешно отправили показания датчика в Firebase Realtime Database и защитили данные с помощью правил базы данных.

Заключение

В этом руководстве вы узнали, как аутентифицировать ESP32/ESP8266 как пользователя с email и паролем, отправлять показания датчика в базу данных и настраивать правила безопасности для защиты базы данных и ограничения доступа.

В Части 2 мы создадим веб-приложение Firebase с аутентификацией (вход по email и паролю), которое отображает показания датчиков, сохранённые в базе данных. Только авторизованный вошедший пользователь сможет получить доступ к данным. Позже вы сможете модифицировать этот проект для отображения различных данных и ограничения или предоставления доступа к данным конкретным пользователям.

Надеемся, что это руководство было для вас полезным.

>> Перейти к Части 2: ESP32/ESP8266: Веб-приложение Firebase для отображения показаний датчиков (с аутентификацией)

Если вам нравятся проекты с Firebase, посмотрите нашу электронную книгу:

Узнайте больше об ESP32 и ESP8266 с нашими ресурсами:

Источник: :doc:`ESP32/ESP8266 Firebase: Send BME280 Sensor Readings to the Realtime Database <../esp32-esp8266-firebase-bme280-rtdb/index>` by Rui Santos & Sara Santos – Random Nerd Tutorials