> For the complete documentation index, see [llms.txt](https://itdocs.kvantorium21.ru/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://itdocs.kvantorium21.ru/it-engineering/i.-internet-veshei/keis-1b-internet-veshei-dlya-diy/mini-case-6.md).

# Мини-кейс: Загрузка данных в Firebase \[ПЕРЕДЕЛАТЬ]

Финальное испытание, пройти которое мы собирались - загрузка данных в облачную базу данных Firebase.

*Познакомимся с сервисом Firebase от Google. Будем записывать и считывать из Realtime Database данные.*

### ЧТО ДЕЛАЕМ?

1. **Создайте новый проект**\
   Следуйте следующим инструкциям, чтобы создать новый проект в Firebase.
   1. Заходим в[ firebase.google.com](https://firebase.google.com/?hl=ru) и войдите, используя учетную запись Google.
   2. На главной странице нажимаем на **Get Started** и далее на **Add project**.
   3. При создании проекта на первом шаге укажите имя.\
      ![](https://1234485992-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LuCyLoyEs8r9SqV2MS6%2Fuploads%2F6KC7THhQYjTfZKnrzbTE%2Fimage.png?alt=media\&token=c55bd90e-d435-4dfa-9327-1ccc7b96540a)
   4. На втором шаге создания проекта выключите аналитику и нажмите на **Create project***.*\
      ![](https://1234485992-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LuCyLoyEs8r9SqV2MS6%2Fuploads%2F0FqILbiO63UAxIJWLLFG%2Fimage.png?alt=media\&token=03b3aba2-11e9-4422-ad70-21bde1223c08)
   5. Создание проекта займёт некоторое время. Затем нажмите **Continue**, когда будет всё готово.\
      ![](https://1234485992-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LuCyLoyEs8r9SqV2MS6%2Fuploads%2F7dkEyoKgmJeD597W2OJs%2Fimage.png?alt=media\&token=f8fda287-1f14-4fc9-be1c-6f4a6772e78d)
   6. Создайте `Realtime Database` в разделе Build.
   7. Вы будете перенаправлены на страницу консоли проекта.\
      ![](https://1234485992-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LuCyLoyEs8r9SqV2MS6%2Fuploads%2FaM29IuHoZtmQ3mJIJim2%2Fimage.png?alt=media\&token=e010edb2-681c-4786-92e7-a1bc703ec241)
2. **Установите методы аутентификации**
   1. Вам необходимо установить методы аутентификации для вашего приложения.\
      «Большинство приложений должны знать пользователя. Другими словами, сервис заботится о входе в систему и идентификации пользователей (в данном случае ESP8266). Знание о пользователе позволяет приложению безопасно сохранять пользовательские данные в облаке и обеспечивать одинаковый персонализированный опыт на всех устройствах пользователя».
      1. На левой боковой панели нажмите **«*****Authentication*****»**, а затем ***«Get started*****»**.\
         ![](https://1234485992-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LuCyLoyEs8r9SqV2MS6%2Fuploads%2F9QRxG5TeVWc9LSkNPC04%2Fimage.png?alt=media\&token=8748edf5-c055-4cda-bf76-85ee7a0c8c0b)
      2. Существует несколько методов аутентификации, таких как электронная почта и пароль, учетная запись Google, учетная запись Facebook и другие.\
         ![](https://1234485992-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LuCyLoyEs8r9SqV2MS6%2Fuploads%2FdkQU2ZOL6AyS1mRqjOhG%2Fimage.png?alt=media\&token=340870a4-97da-4c00-a6cc-c34c3266a601)
      3. В целях тестирования мы можем выбрать ***Anonymous*** пользователя (требовать аутентификацию, не требуя от пользователей предварительного входа в систему путем создания временных анонимных учетных записей). Включите эту опцию и нажмите *Сохранить*.\
         ![](https://1234485992-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LuCyLoyEs8r9SqV2MS6%2Fuploads%2FWASFgKEBOKlBXdqOo8s2%2Fimage.png?alt=media\&token=5e73beb5-b97a-4e7c-8266-f0bb0d0339b5)
3. **Создание базы данных в реальном времени**\
   Следующим шагом является создание базы данных реального времени для вашего проекта. Выполните следующие шаги, чтобы создать базу данных.
   1. На левой боковой панели нажмите **«*****Realtime Database*****»**, а затем нажмите **«*****Create Database*****»**.\
      ![](https://1234485992-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LuCyLoyEs8r9SqV2MS6%2Fuploads%2F55WrKC2aGOpqpIvm4iJr%2Fimage.png?alt=media\&token=e3b490ec-fc6e-4a3f-8c11-ffa4d5419276)
   2. Выберите местоположение вашей базы данных. Он должен быть ближе всего к вашему местонахождению.\
      ![](https://1234485992-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LuCyLoyEs8r9SqV2MS6%2Fuploads%2FvW7zKJJQnunW3Xvc7avD%2Fimage.png?alt=media\&token=96e16962-49c6-45c3-9fc1-d51c16120e1c)
   3. Настройте правила безопасности для вашей базы данных.\
      В целях тестирования выберите ***Start in test mode***. В последующих руководствах вы узнаете, как защитить базу данных с помощью правил базы данных.\
      ![](https://1234485992-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LuCyLoyEs8r9SqV2MS6%2Fuploads%2FkPUMvr8nMBq95QsiyVZY%2Fimage.png?alt=media\&token=9b52a001-d2df-41f7-aa50-f7c71e8d3b11)
   4. Теперь ваша база данных создана. Вам нужно скопировать и сохранить URL-адрес базы данных, выделенный на следующем изображении, потому что он понадобится вам позже в коде ESP8266.\
      ![](https://1234485992-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LuCyLoyEs8r9SqV2MS6%2Fuploads%2Fk9rKNWcACLLyITED7T6I%2Fimage.png?alt=media\&token=7b049256-8756-4788-aa19-e7b2b1e690e3)\
      База данных реального времени настроена. Теперь вам также необходимо получить ключ API вашего проекта.
4. **Получите ключ API проекта**
   1. Чтобы получить ключ API вашего проекта, на левой боковой панели нажмите иконку с шестерёнкой, а далее «*Project Settings*».\
      ![](https://1234485992-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LuCyLoyEs8r9SqV2MS6%2Fuploads%2F4YyqDBC6W6X2qlMZNyes%2Fimage.png?alt=media\&token=4c5ab503-f459-4eb4-bc7f-a19ccc3fab9d)
   2. Скопируйте ключ API в безопасное место, так как он понадобится вам позже.\
      ![](https://1234485992-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LuCyLoyEs8r9SqV2MS6%2Fuploads%2F4XMGWOUtGvxGBLPbEcuY%2Fimage.png?alt=media\&token=a58f602c-9770-454e-9011-77c1687eb3df)\
      Теперь у вас есть все необходимое для взаимодействия ESP8266 с базой данных.
5. **Запрограммируйте ESP8266 для взаимодействия с Firebase**
   1. Перейдите в `Скетч > Подключить библиотеку > Управление библиотеками...`
   2. Найдите *клиент Firebase ESP* и установите клиентскую библиотеку **Firebase Arduino Client Library for ESP8266 and ESP32** от Mobitz.\
      ![](https://1234485992-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LuCyLoyEs8r9SqV2MS6%2Fuploads%2FaT30upkT6aeXEoxqEH2n%2Fimage.png?alt=media\&token=acdf4634-843a-4dfd-bde2-5daf11547a37)\
      Теперь все готово для начала программирования платы ESP8266 для взаимодействия с базой данных.
   3. Скопируйте следующий код в вашу Arduino IDE. Этот скетч вставляет целое число и число с плавающей запятой в базу данных каждые 15 секунд. Это простой пример, показывающий, как подключить ESP8266 к базе данных и хранить данные.

```cpp
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <Firebase_ESP_Client.h>

#include "addons/TokenHelper.h"
#include "addons/RTDBHelper.h"

#define WIFI_SSID "dimdimdim" // Имя WI-FI точки
#define WIFI_PASSWORD "08001800" // Пароль к WI-FI

#define API_KEY "REPLACE_WITH_YOUR_FIREBASE_PROJECT_API_KEY" // Ваш API ключ к проекту
#define DATABASE_URL "REPLACE_WITH_YOUR_FIREBASE_DATABASE_URL" // Ваша ссылка db проекта

FirebaseData fbdo; //Define Firebase Data object

FirebaseAuth auth;
FirebaseConfig config;

unsigned long sendDataPrevMillis = 0;
int count = 0;
bool signupOK = false;

void setup() {
  Serial.begin(115200);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("Connecting to Wi-Fi");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(300);
  }
  Serial.println();
  Serial.print("Connected with IP: ");
  Serial.println(WiFi.localIP());
  Serial.println();

  /* Assign the api key (required) */
  config.api_key = API_KEY;

  /* Assign the RTDB URL (required) */
  config.database_url = DATABASE_URL;

  /* Sign up */
  if (Firebase.signUp(&config, &auth, "", "")) {
    Serial.println("ok");
    signupOK = true;
  } else{
    Serial.printf("%s\n", config.signer.signupError.message.c_str());
  }

  /* Assign the callback function for the long running token generation task */
  config.token_status_callback = tokenStatusCallback; //see addons/TokenHelper.h
  
  Firebase.begin(&config, &auth);
  Firebase.reconnectWiFi(true);
}

void loop() {
  if (Firebase.ready() && signupOK && (millis() - sendDataPrevMillis > 15000 || sendDataPrevMillis == 0)){
    sendDataPrevMillis = millis();
    // Write an Int number on the database path test/int
    if (Firebase.RTDB.setInt(&fbdo, "test/int", count)){
      Serial.println("PASSED");
      Serial.println("PATH: " + fbdo.dataPath());
      Serial.println("TYPE: " + fbdo.dataType());
    }
    else {
      Serial.println("FAILED");
      Serial.println("REASON: " + fbdo.errorReason());
    }
    count++;
    
    // Write an Float number on the database path test/float
    if (Firebase.RTDB.setFloat(&fbdo, "test/float", 0.01 + random(0,100))){
      Serial.println("PASSED");
      Serial.println("PATH: " + fbdo.dataPath());
      Serial.println("TYPE: " + fbdo.dataType());
    }
    else {
      Serial.println("FAILED");
      Serial.println("REASON: " + fbdo.errorReason());
    }
  }
}
```

1. В Firebase слева в меню зайдите в `Realtime Database` и посмотрите что происходит. Нажмите на `"Создать базу данных"`. При создании выбираем `"Тестовый режим"`.
2. Открываем вкладку `"Правила`" и там указываем так:

   ```
   {
     "rules": {
       ".read": true,
       ".write": true,
     }
   }
   ```
3. Во вкладке `"Данные"` смотрим что происходит.

   ![](https://1234485992-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LuCyLoyEs8r9SqV2MS6%2F-MKUxTZ9aRzT8C46p-_U%2F-MKUxwF-nqrkVZ16K5-5%2Fcase162.png?alt=media\&token=dc452186-dce9-4e27-b028-53f965a1d77c)

*Теперь вы знаете как работать с **Realtime Database** в **Firebase**.*

{% hint style="info" %}
***Источник:***\
<https://randomnerdtutorials.com/esp8266-nodemcu-firebase-realtime-database/#database-url>
{% endhint %}

{% hint style="success" %}
**Дополнительное задание:**

Загружать данные с датчика в Firebase. Вам нужно будет, чтобы **Arduino** передавала по **Serial** данные, а **ESP8266**, а **WI-FI модуль** уже грузил в **Firebase**.
{% endhint %}
