Nodemcu + DHT22 sur panneau solaire : gestion de la batterie?

Bonjour,

J’ai réalisé une petite station météo avec 2 nodemcu + 2 capteurs DHT22 pour avoir la température et l’humidité intérieures et extérieures et un Raspberry avec un écran pour visualiser tout ça dans la maison. Les nodemcu envoient les données par wifi au raspberry. L'un des 2 nodemcu est branché sur le Raspberry car à l'intérieur, l'autre en revanche est sur batterie/panneau solaire pour rester dehors.

J'ai suivi ce tutoriel pour faire mes branchements du nodemcu extérieur :

Contrairement au tuto, dans mon circuit, je n'ai qu'un panneau solaire 6V 4,5W, et 2 batteries 18650 3,7V 3500mAh branchées en parallèle. De mon point de vue, je suis donc censé avoir 3,7V mais 7000mAh, de quoi tenir quelques temps sans soleil (en tout cas c'est le but, de mémoire environ 20 jours d'après mes calculs théoriques, et en utilisant le deep sleep bien sûr !).

Depuis la mise en service, je remarque que parfois le capteur extérieur n'envoie plus de données. Quand je regarde les batteries, elles sont en dessous des 3,7V nécessaires (aujourd'hui 2,88V chacune par exemple). Alors je sais que je n'ai pas du soleil tous les jours en ce moment, mais je devrait au moins tenir quelques jours.

Ma question est la suivante : quel est le risque pour la (les) batterie si sa tension descend en dessous de 3,7V ? Quel est le risque pour le reste du circuit, le nodemcu notamment ? Quels seraient vos conseils pour la bonne gestion de l'ensemble ?
Tout commentaire pour optimiser le code si besoin est bien sûr le bienvenu !

Merci beaucoup pour votre aide !
François

Ci-dessous, le code du nodemcu extérieur :

/*********
  Rui Santos
  Complete project details at https://randomnerdtutorials.com/esp8266-dht11dht22-temperature-and-humidity-web-server-with-arduino-ide/
*********/

// Import required libraries
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <Hash.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>

// Replace with your network credentials
const char* ssid = "xxxx";
const char* password = "xxxx";

#define DHTPIN 4     // Digital pin connected to the DHT sensor

// Uncomment the type of sensor in use:
//#define DHTTYPE    DHT11     // DHT 11
#define DHTTYPE    DHT22     // DHT 22 (AM2302)
//#define DHTTYPE    DHT21     // DHT 21 (AM2301)

DHT dht(DHTPIN, DHTTYPE);

// current temperature & humidity, updated in loop()
float t = 0.0;
float h = 0.0;

// Create AsyncWebServer object on port 80
AsyncWebServer server(80);

// Set your Static IP address
IPAddress local_IP(192, 168, 0, 30);
// Set your Gateway IP address
IPAddress gateway(192, 168, 0, 10);

IPAddress subnet(255, 255, 0, 0);
IPAddress primaryDNS(8, 8, 8, 8);   //optional
IPAddress secondaryDNS(8, 8, 4, 4); //optional

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;    // will store last time DHT was updated

// Updates DHT readings every 10 seconds
const long interval = 10000;  

//milliseconds to sleep
const int sleepingDuration = 300e6;

void setup(){
  WiFi.forceSleepWake();
  delay(1);
  WiFi.mode(WIFI_STA); 
  
  // Serial port for debugging purposes
  Serial.begin(115200);
  dht.begin();

  // Configures static IP address
  if (!WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS)) {
    Serial.println("STA Failed to configure");
  }
  
  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  Serial.println("Connecting to WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println(".");
  }

  // Print ESP8266 Local IP Address
  Serial.println(WiFi.localIP());

  // Route for root / web page
  server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){
    AsyncWebServerResponse *response = request->beginResponse(200, "text/plain", String(t).c_str());
    response->addHeader("Access-Control-Allow-Origin", "*");
    response->addHeader("Access-Control-Allow-Methods", "PUT,POST,GET,OPTIONS");
    response->addHeader("Access-Control-Allow-Headers", "*");
    response->addHeader("Access-Control-Allow-Credentials", "true");
    request->send(response);
  });
  server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request){
    AsyncWebServerResponse *response = request->beginResponse(200, "text/plain", String(h).c_str());
    response->addHeader("Access-Control-Allow-Origin", "*");
    response->addHeader("Access-Control-Allow-Methods", "PUT,POST,GET,OPTIONS");
    response->addHeader("Access-Control-Allow-Headers", "*");
    response->addHeader("Access-Control-Allow-Credentials", "true");
    request->send(response);
  });

  // Start server
  server.begin();
}

void deepSleep()
{
  //https://github.com/esp8266/Arduino/issues/644
  WiFi.mode(WIFI_OFF);
  WiFi.forceSleepBegin();
  delay(1);
  ESP.deepSleep(sleepingDuration);
}
 
void loop(){  

    float newT = dht.readTemperature();

    if (isnan(newT)) {
      Serial.println("Failed to read from DHT sensor!");
    }
    else {
      t = newT;
    }
    // Read Humidity
    float newH = dht.readHumidity();
    // if humidity read failed, don't change h value 
    if (isnan(newH)) {
      Serial.println("Failed to read from DHT sensor!");
    }
    else {
      h = newH;
    }

    delay(5000);
    Serial.println("Going to sleep mode for 30 seconds");
    deepSleep();
}

Bonjour @fanfan88

quelques remarques rapides

-tes calculs d'autonomie sont basés sur la valeur nominale (=commerciale) de capactité des éléments. Sur le marché des éléments LI-On au format 18650 on assiste à une escalade ridicule des valeurs affichées, les valeurs réelles sont souvent aux alentours de la moitié de la valeur inscrite !

Les bonnes références sont chez Sanyo, Samsung et LG

ici un article faisant le point sur la base de mesures :
https://lygte-info.dk/info/BatteriesRidiculousRatings%20UK.html

En dessous de 3V mieux vaut retirer les accus pour les recharger si les élémnts n'ont pas un circuit de protection contre les décharge profondes qu'i faut absolument éviter.

Une carte NodeMCU sous alimentée ne fonctionne pas , rien de plus

Serial.println("Going to sleep mode for 30 seconds");
    deepSleep();

le deepsleep de 30 secondes est cosmétique, impact négligeable sur l'autonomie le serveur travaillant quasiment 24/24

Avec un panneau 6V 1W sous nos lattitudes on peut être serein si le code est celui d'un client se réveillant brièvement toutes les heures (ou un peu plus souvent) pour envoyer les mesures vers un serveur.(ordre de grandeur 10 secondes d'activité par heure)

Ton nodeMCU à un régulateur qui arrêtera de fournir sa tension de 3.3V à l'ESP, donc il ne fonctionnera plus en dessous de 3.3 + un delta qui dépend du régulateur utilisé(1V pour un AMS1117-3.3).

Bonjour @al1fch et @terwal,

Merci pour votre retour.

Je lirai l'article sur les bases de mesures, ça doit être intéressant :slight_smile:

Je suis rassuré pour le nodemcu, il survivra ! Par contre je n'ai pas fait exprès de mettre 30s de deep sleep, c'était lors de mes tests et j'ai oublié de changer ça ! Je partais sur 30 minutes de deep sleep, et j'ai mesuré 10 secondes d'activité.

Merci et bonne journée !
François

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