Aide : Firebase

Bonjour à tous, une nouvelle fois …

J’essaie en ce moment d’envoyer mes données (DHT22) sur le serveur Firebase.

Grâce à ce tuto : ESP32 Data Logging to Firebase Realtime Database | Random Nerd Tutorials

J’ai modifié le code pour remplacer cette sonde BME280 par la DHT22. Je passe par l’IDE Arduino
Et bien sûr il y a quelques coquilles que je ne trouve pas …

  • Sur la page firebase les données ne s’accumule pas (en plus d’une légère différence de valeur par rapport au moniteur Arduino)
  • L’horodatage n’a pas l’air de fonctionner

Ma page Firebase

Le moniteur IDE Arduino :

Voici le code de base du tuto :

#include <Arduino.h>
#include <WiFi.h>
#include <Firebase_ESP_Client.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include "time.h"

// Provide the token generation process info.
#include "addons/TokenHelper.h"
// Provide the RTDB payload printing info and other helper functions.
#include "addons/RTDBHelper.h"

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

// Insert Firebase project API Key
#define API_KEY "REPLACE_WITH_YOUR_PROJECT_API_KEY"

// Insert Authorized Email and Corresponding Password
#define USER_EMAIL "REPLACE_WITH_THE_USER_EMAIL"
#define USER_PASSWORD "REPLACE_WITH_THE_USER_PASSWORD"

// Insert RTDB URLefine the RTDB URL
#define DATABASE_URL "REPLACE_WITH_YOUR_DATABASE_URL"

// Define Firebase objects
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;

// Variable to save USER UID
String uid;

// Database main path (to be updated in setup with the user UID)
String databasePath;
// Database child nodes
String tempPath = "/temperature";
String humPath = "/humidity";
String presPath = "/pressure";
String timePath = "/timestamp";

// Parent Node (to be updated in every loop)
String parentPath;

int timestamp;
FirebaseJson json;

const char* ntpServer = "pool.ntp.org";

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

// Timer variables (send new readings every three minutes)
unsigned long sendDataPrevMillis = 0;
unsigned long timerDelay = 180000;

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

// Initialize WiFi
void initWiFi() {
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("Connecting to WiFi ..");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(1000);
  }
  Serial.println(WiFi.localIP());
  Serial.println();
}

// Function that gets current epoch time
unsigned long getTime() {
  time_t now;
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    //Serial.println("Failed to obtain time");
    return(0);
  }
  time(&now);
  return now;
}

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

  // Initialize BME280 sensor
  initBME();
  initWiFi();
  configTime(0, 0, ntpServer);

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

  // Assign the user sign in credentials
  auth.user.email = USER_EMAIL;
  auth.user.password = USER_PASSWORD;

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

  Firebase.reconnectWiFi(true);
  fbdo.setResponseSize(4096);

  // Assign the callback function for the long running token generation task */
  config.token_status_callback = tokenStatusCallback; //see addons/TokenHelper.h

  // Assign the maximum retry of token generation
  config.max_token_generation_retry = 5;

  // Initialize the library with the Firebase authen and config
  Firebase.begin(&config, &auth);

  // Getting the user UID might take a few seconds
  Serial.println("Getting User UID");
  while ((auth.token.uid) == "") {
    Serial.print('.');
    delay(1000);
  }
  // Print user UID
  uid = auth.token.uid.c_str();
  Serial.print("User UID: ");
  Serial.println(uid);

  // Update database path
  databasePath = "/UsersData/" + uid + "/readings";
}

void loop(){

  // Send new readings to database
  if (Firebase.ready() && (millis() - sendDataPrevMillis > timerDelay || sendDataPrevMillis == 0)){
    sendDataPrevMillis = millis();

    //Get current timestamp
    timestamp = getTime();
    Serial.print ("time: ");
    Serial.println (timestamp);

    parentPath= databasePath + "/" + String(timestamp);

    json.set(tempPath.c_str(), String(bme.readTemperature()));
    json.set(humPath.c_str(), String(bme.readHumidity()));
    json.set(presPath.c_str(), String(bme.readPressure()/100.0F));
    json.set(timePath, String(timestamp));
    Serial.printf("Set json... %s\n", Firebase.RTDB.setJSON(&fbdo, parentPath.c_str(), &json) ? "ok" : fbdo.errorReason().c_str());
  }
}

Mon code modifié :

#include <Arduino.h>
#include <WiFi.h>
#include <Firebase_ESP_Client.h>
#include <Wire.h>
#include "time.h"
#include "DHT.h" 

// Provide the token generation process info.
#include "addons/TokenHelper.h"
// Provide the RTDB payload printing info and other helper functions.
#include "addons/RTDBHelper.h"

// Définition Pin DHT22
#define DHTPIN 2
#define DHTTYPE DHT22

// Déclaration DHT22
DHT dht(DHTPIN, DHTTYPE);

// Insert your network credentials
#define WIFI_SSID "*******"
#define WIFI_PASSWORD "*******"

// Insert Firebase project API Key
#define API_KEY "*******"

// Insert Authorized Email and Corresponding Password
#define USER_EMAIL "*******"
#define USER_PASSWORD "*******"

// Insert RTDB URLefine the RTDB URL
#define DATABASE_URL "*******"

// Define Firebase objects
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;

// Variable to save USER UID
String uid;

// Database main path (to be updated in setup with the user UID)
String databasePath;
// Database child nodes
String tempPath = "/temperature";
String humPath = "/humidity";
String timePath = "/timestamp";

// Parent Node (to be updated in every loop)
String parentPath;

int timestamp;
FirebaseJson json;

const char* ntpServer = "pool.ntp.org";

float temperature;
float humidity;

// Timer variables (send new readings every three minutes)
unsigned long sendDataPrevMillis = 0;
unsigned long timerDelay = 180000;

// Initialize WiFi
void initWiFi() {
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("Connecting to WiFi ..");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(1000);
  }
  Serial.println(WiFi.localIP());
  Serial.println();
}

// Function that gets current epoch time
unsigned long getTime() {
  time_t now;
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    //Serial.println("Failed to obtain time");
    return(0);
  }
  time(&now);
  return now;
}

void setup(){
  Serial.begin(115200); 
//  Serial.println(F("DHTxx test!")); 
  
  // Initialise le DHT22 & Wifi & Time
  dht.begin();
  initWiFi();
  configTime(0, 0, ntpServer);

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

  // Assign the user sign in credentials
  auth.user.email = USER_EMAIL;
  auth.user.password = USER_PASSWORD;

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

  Firebase.reconnectWiFi(true);
  fbdo.setResponseSize(4096);

  // Assign the callback function for the long running token generation task */
  config.token_status_callback = tokenStatusCallback; //see addons/TokenHelper.h

  // Assign the maximum retry of token generation
  config.max_token_generation_retry = 5;

  // Initialize the library with the Firebase authen and config
  Firebase.begin(&config, &auth);

  // Getting the user UID might take a few seconds
  Serial.println("Getting User UID");
  while ((auth.token.uid) == "") {
    Serial.print('.');
    delay(1000);
  }
  // Print user UID
  uid = auth.token.uid.c_str();
  Serial.print("User UID: ");
  Serial.println(uid);

  // Update database path
  databasePath = "/UsersData/" + uid + "/readings";
}

void loop(){

  // Temps entre chaques mesures
  delay(180000);

  // La lecture de la température ou de l'humidité prend environ 250 millisecondes !
  // Les lectures du capteur peuvent également être "anciennes" jusqu'à 2 secondes (c'est un capteur très lent)
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  // Vérifiez si des lectures ont échoué et quittez plus tôt (pour réessayer).
  if (isnan(h) || isnan(t)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }

  // Send new readings to database
  if (Firebase.ready() && (millis() - sendDataPrevMillis > timerDelay || sendDataPrevMillis == 0)){
    sendDataPrevMillis = millis();

    //Get current timestamp
    timestamp = getTime();
    Serial.print ("time: ");
    Serial.println (timestamp);

    parentPath= databasePath + "/" + String(timestamp);

    json.set(tempPath.c_str(), String(dht.readTemperature()));
    json.set(humPath.c_str(), String(dht.readHumidity()));
    json.set(timePath, String(timestamp));
    Serial.printf("Set json... %s\n", Firebase.RTDB.setJSON(&fbdo, parentPath.c_str(), &json) ? "ok" : fbdo.errorReason().c_str());
  }

  // Calculer l'indice de chaleur en Fahrenheit (valeur par défaut)
//  float hif = dht.computeHeatIndex(f, h);
  // Calculer l'indice de chaleur en degrés Celsius (isFahreheit = false)
//  float hic = dht.computeHeatIndex(t, h, false);

  // Ecriture dans le moniteur
  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.print(F("°C "));
//  Serial.print(f);
//  Serial.print(F("°F  Heat index: "));
//  Serial.print(hic);
//  Serial.print(F("°C "));
//  Serial.print(hif);
//  Serial.println(F("°F"));
}

Je pense que cela vient de l'horodatage ...
Vous voyez le loup ?

MODIFICATION :
Est possible que certaine carte ne puisse pas faire d'horodatage ? Car je viens d'essayer un code pour comprendre l'horodatage sur mon ESP CAM 32 mais cela ne s'acremente pas
https://randomnerdtutorials.com/epoch-unix-time-esp32-arduino/

Visiblement la fonction getLocalTime tu revois faux, donc timeinfo n'a pas été mis à jour.
A priori dans ta table, tu devrais avoir quand même un enregistrement?

A tu accès à internet?

Tu vois comment qu'il y a cette erreur ? par experience et connaissance des timers ?

Sur Firebase ? oui je vois la valeur d'humidité ce modifier
Sur le moniteur arduino ? oui aussi.

Oui je suis bien connecté (PC par cable, et en partage de connexion wifi sur l'ESP 32 Cam)

Ton timestamp est toujours à zéro et c'est le code suivant qui renvois cette valeur

En gros j'ai l'impression que tu ne récupère pas l'heure sur le serveur NTP et donc la fonction getLocalTime ne peux te renvoyer l'heure.
Je ne sais pas comment est implémenté cette fonction, donc c'est difficile de savoir ce qui cloche.
Il faudrait regarder dans l'implémentation de la fonction pour voir ce qu'il cherche à faire.

Mon idée de soucis d'horodatage est bonne alors,
Je commence a comprendre d'ou vienne les soucis, les reglers c'est une autre paire de manche lol.

Je me demande si les ESPCAM32 sont capable de faire cela car avec ce tuto Timer pareil le décompte ne fonctionne pas.
J'ai une commande d'un ESP32 Wrover DevKit (nouvelle version) qui devrait arriver dans quelques jours, je pourrai faire la comparaison, en attendant je vais chercher pourquoi ce timer ne fonctionne pas.

Je ne vois pas ton adresse IP après le "Connecting to WiFi .." c'est normal ?
J'essaye de voir ce que fait configTime lorsqu'il ne peux pas ce connecter au serveur NTP, mais je ne sais pas si je suis sur le bon github.

Tu peux essayer de mettre une adresse IP bidon, pour voir les erreurs remontées si il y en a.

C’est vrai maintenant que tu le dis c’est bizarre que ca n’affiche pas l’ip.
Malgré tout il doit être connecté puisque il envoie une valeur ( j’ai fais un test en effaçant la base de données sur firebase et ça envoie bien les mesures)

Je reprend de nouveau test ce soir.

Oui c'est bizarre, quelques tests seront les bienvenues, je ne sais pas si ça peut aider de mettre quelques délais par-ci par-là

L'adresse IP ne serait pas sous le trait rouge par hasard?
Elle doit en principe être sur la même ligne que "Connecting to WiFi .. juste après les points qui s'affichent toutes les secondes en attendant la connexion.

Autant pour moi, effectivement c’est l’adresse IP.
Désolé …

Le soucis est réglé !

Je pense que cela venait dû faite que pour connecter l'ESP à internet je fais un partage de connexion avec le PC ( lui relié à internet par câble), au travail.
Chez moi l'ESP est sur la box.
Demain je vais faire un nouvel essai pour être sûr.
Modif : Confirmé, c'est bien le partage de connexion qui posait problème

Et merci bien sur pour vos recherches, une nouvelle fois :pray:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.