Ошибка соединения Arduino Firebase с отказом

Я делаю проект для школы, в котором мне нужно отправлять данные с датчика на веб-страницу. После некоторых исследований я решил использовать базу данных Firebase в реальном времени. Безопасность на самом деле не важна, и я хочу сосредоточиться на других аспектах проекта, так что это показалось мне простым и быстрым вариантом. Я использую d1 mini (esp8266) и датчик влажности и температуры DHT11. Для библиотек я использую DHT, FirebaseArduino и ESP8266WiFi. Код:

#include <ESP8266WiFi.h>                                                    // библиотека esp8266
#include <FirebaseArduino.h>                                                // библиотека firebase
#include <DHT.h>                                                            // библиотека датчиков температуры и влажности dht11

#define FIREBASE_HOST "xx"                   // адрес имени проекта из идентификатора firebase
#define FIREBASE_AUTH "xx"            // секретный ключ, сгенерированный из firebase

#define WIFI_SSID "xx"                                             // введите имя вашего домашнего или общедоступного Wi-Fi
#define WIFI_PASSWORD "xx"                                        //пароль Wi-Fi ssid

#define DHTPIN D5                                                           // к какому цифровому выводу мы подключены
#define DHTTYPE DHT11                                                       // выберите тип dht как DHT 11 или DHT22
DHT dht(DHTPIN, DHTTYPE);                                                     

void setup() {
  Serial.begin(9600);
  delay(1000);                
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);                                     // пытаемся подключиться через Wi-Fi
  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);
  Serial.print("IP Address is : ");
  Serial.println(WiFi.localIP());                                            //печатать локальный IP-адрес
  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);                              // подключаемся к фаербазе
  dht.begin();                                                               // Начать чтение датчика dht
}

void loop() { 
  float h = dht.readHumidity();                                              // Чтение температуры или влажности занимает около 250 миллисекунд!
  float t = dht.readTemperature();                                           // Чтение температуры в градусах Цельсия (по умолчанию)

  if (isnan(h) || isnan(t)) {                                                // Проверяем, не завершились ли какие-либо операции чтения неудачно, и выходим досрочно (чтобы повторить попытку).
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }

  Serial.print("Humidity: ");  Serial.print(h);
  String fireHumid = String(h) + String("%");                                         //преобразование целочисленной влажности в строковую влажность
  Serial.print("%  Temperature: ");  Serial.print(t);  Serial.println("°C ");
  String fireTemp = String(t) + String("°C");                                                     // преобразовать целочисленную температуру в строковую температуру
  delay(4000);

  Firebase.pushString("Humidity/", fireHumid);                                       //настраиваем путь и отправляем показания
  Firebase.pushString("Temperature/", fireTemp);                                //настраиваем путь и отправляем показания

}

некоторая "конфиденциальная" информация заменена на "xx". При запуске этого кода он подключается к моему Wi-Fi-соединению и показывает данные с DHT11 в последовательном мониторе. Однако НИЧЕГО не меняется в Firebase. После включения функции для отображения обширных отзывов/ошибок в последовательном мониторе я заметил следующее:

[HTTP-Client][begin] host: https://testtesttest-bd679.firebaseio.com/ port: 443 url: /Temperature/.json?auth=xxxx httpsFingerprint: 03 D6 42 23 03 D1 0C 06 73 F7 E2 BD 29 47 13 C3 22 71 37 1B
[HTTP-Client][sendRequest] type: 'POST' redirCount: 0
[HTTP-Client] failed connect to https://xxx-xxx.firebaseio.com/:443
[HTTP-Client][returnError] error(-1): connection refused
[HTTP-Client][returnError] error(-4): not connected
[HTTP-Client][end] tcp is closed
Humidity: 43.00%  Temperature: 22.50°C

Я пробовал следующее:

  • Использование другой версии библиотеки FirebaseArduino (5.13.x (по-прежнему используется эта))
  • Обновление отпечатка пальца библиотеки FirebaseArduino вручную (см. текущий отпечаток во втором разделе кода выше)
  • Использование различных версий Arduino IDE, сейчас используется 1.8.12

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

Ничего из этого не помогло, и у меня заканчивается время для моего проекта, надеюсь, кто-то здесь знает, что не так, и может мне помочь! :)

, 👍2


1 ответ


2

Вы добавили / в конец коллекций Humidity и Temperature. например Firebase.pushString("Влажность/", fireHumid);
Firebase.pushString("Температура/", fireTemp);

API firebase преобразует его в адрес

https://testtesttest-bd679.firebaseio.com/Temperature/.json?auth=xxxx`

как мы видим на выходе.

Я почти уверен, что правильный адрес — ...Temperature.json..., а не ...Temperature/.json....

Попробуйте удалить косые черты в конце имен коллекций в операторах pushString..

Firebase.pushString("Humidity", fireHumid);    
Firebase.pushString("Temperature", fireTemp);

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

,

Спасибо за ваш ответ. Теперь он может подключиться к Firebase. Однако сейчас я получаю эту ошибку, возможно, вы знаете, как решить эту проблему :) [HTTP-Client][handleHeaderResponse] RX: 'HTTP/1.1 400 Bad Request' Эта ошибка возникает после того, как он подключается и начинает пытаться отправить информацию в базу данных., @Luukv19

Я удалил свой предыдущий комментарий, потому что мое объяснение было неверным. Я не очень хорошо знаю Firebase. В сообщении говорится, что страница (соответственно с методом API), к которой вы пытаетесь получить доступ, не существует. Возможно, она работает, если вы используете другие методы доступа. Возможно, push не поддерживается (по какой причине): например, попробуйте setString вместо pushString. Если это сработает, я не могу объяснить почему, но у вас есть отправная точка для дальнейших исследований. Было бы полезно знать, что файл Firebase. ... методы преобразуются в вызовы API REST и отправляются в виде HTTP-запросов на сервер firebase., @Peter Paul Kiefer