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();
}