Ошибка соединения 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 для добавления данных в базу данных.
Ничего из этого не помогло, и у меня заканчивается время для моего проекта, надеюсь, кто-то здесь знает, что не так, и может мне помочь! :)
@Luukv19, 👍2
1 ответ
Вы добавили /
в конец коллекций 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);
Если это не помогает, возможно, проблема связана со строкой аутентификации или именем хоста. например, завершающие или начальные пробелы или что-то в этом роде.
- Почему IDE не может найти плату, несмотря на то, что она четко видна и выбрана?
- HTTP POST от Arduino/ESP8266/ESP32 Как отправлять параметры (x-www-form-urlencoded)
- ESP8266 не отвечает через случайные промежутки времени
- esp32 http client response только 200 не получил данные после этого
- Как отправить почтовый запрос Arduino Yun на локальный хост?
- Выполнение HTTPS-запросов с использованием команд ESP8266 AT
- Метод HTTP PUT на NodeMCU/ESP8266
- Использование функций в заголовочных файлах
Спасибо за ваш ответ. Теперь он может подключиться к 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