Salut al1fch. Je suppose que tu as déjà fait des essais de veille profonde avec la S3 WEMOS, et tu as peut être mesuré la conso ?
Bonjour hbachetti . Pas encore mesuré mais je
peux le faire demain
Normalement, elle devrait être de 45 à 50µA, en grande partie due au ME6211.
Je partage ta façon de voir, mais je ne trouvais pas cela très claire dans tes messages précédents ![]()
Je fais ça par passion, pas professionnellement, mais ce qui m'intéresse c'est surtout apprendre et découvrir, avoir un projet propre et bien fini et un plus mais ce n'est pas toujours la finalité.
mauvaise surprise : 410µA mesurés en deep-sleep avec mon exemplaire de carte LOLIN S3 MIni
-régulateur marqué S2VH , référence ? courant de repos typique ?
-courant de repos de la Led RGB WS1812 ?
Sur une WS2812B, DIN reliée à GND, je mesure 550µA sous 3.3V, 750µA sous 5V.
Effectivement, l'intégration de cette LED semble une mauvaise idée.
carte S3 MIni de LOLIN/WEMOS : Elimination réversible de la consommation superflue en DeepSleep :
Heureusement la piste qui amène le 3,3V à la WS2812 est facile à couper sur cette carte ![]()

courant mesuré en DeepSleep après le coup de scalpel : 39µA (alimentation en 5V)
Cela devient donc une solution basse consommation intéressante.
Une petite LIPO ou LIFEPO4 de 500mAH suffirait à l'alimenter pendant un an.
Au final j'ai pris un ESP32S, je me suis imprimé un support d'ESP32 à positionner entre deux breadboard.
Ce qui m'a permis de téléverser un programme (merci hbachetti pour ton site) et de vérifier que tout fonctionne correctement.
Voici la photo du montage :
Maintenant il faut que je vois pour gérer le mode veille, ajouter ce capteur à mon serveur pour une visualisation sur une page web.
Et encore d'autres choses mais pas dans un premier temps.
Si un de vous à un petit tuto sur le mode veille, de toute façon je vais faire mes recherches de mon coté.
Bonsoir @Treza88
![]()
pour le mode Deep-sleep tu peux voir içi :
https://randomnerdtutorials.com/esp32-deep-sleep-arduino-ide-wake-up-sources/
Pour les autres modes de sommeil (que je n'ai jamais ressenti le besoin de tester) voir ici
https://lastminuteengineers.com/esp32-sleep-modes-power-consumption/
En complément pour réduire un peu les pics de courant pendant les phases de réveil avec le WiFI activé tu peux tester une baisse puissance émise :
https://github.com/G6EJD/ESP32-8266-Adjust-WiFi-RF-Power-Output/blob/main/README.md
Merci al1fch,
ça fait pas mal de lecture, mais certainement plein d'info à connaitre, je vais regarder ça.
Par contre j'ai un peu de mal sur la compréhension de la réduction des pics de courant, tu veux dire de réduire l'émission du wifi au moment du réveil et de le remettre en normal après le réveil ?
Aurais tu un exemple, parce que ça me parait vachement abstrait, et que l'exemple de ton lien n'est pas associé au deep sleep, il parle uniquement de la réduction de puissance.
Quand le WIfI est actif et prinpalement au moment de l'établissement de la connection à la box le courant varie dans de grandes proportions sous forme de salves de plusieurs centaines de mA.
L'amplitude de ces salves de courant est liée à la puissance radio émise.
Il n'est pas toujours nécessaire d'émettre à pleine puissance , réduire celle ci . un peu en autonomie.
Le troisième lien décrit la commande permettant de fixer le niveau de puissance radio émise, les deux autres portent sur les divers modes de fonctionnement dont le Deep Sleep
je n'ai jamais fait cela je me contente de choisir le niveau de juste nécessaire au vu de la distance d'avec la box et de l'environnment (cloisons....)
Le niveau dans mes codes est défini juste avant le WiFI.begin() et ne change pas
Ok je comprend mieux le principe, merci pour le complément d'info.
J'ai réalisé le deep sleep sur mon ESP32, au réveil il se connecte en wifi a un serveur web par le biais de la librairie esp-now.h sur l'ESP32 (émetteur) et espnow.h sur l'ESP8266 (récepteur et serveur web).
Il y a t il un moyen de détecter la réception des données par quelque chose du genre :
if (réception de nouvelles données == true) {
Envoyer les données sur le web;
}
Existe t il une fonction ou autre que l'on pourrait tester avec une condition pour détecter l'arrivée de nouvelles données ?
Après si ça n'existe pas, je peux toujours m'en sortir en testant si mes données on changé depuis le dernier envoie.
Oui, c'est possible, mais comme cela dépend de quoi tu parle et comment tu es connecté à l'autre appariel, on ne peut pas te répondre précisement.
Il faudrait que tu donnes ton code.
Voici le code de réception des données, j'ai fait mon test sur le changement de valeur depuis le dernier envoie.
Mais je me demandait si il y avait un test possible au niveau de la bibliothèque espnow.h.
J'ai essayer de regarder au niveau de la bibliothèque, si je trouvais quelque chose que j'aurais pu tester, mais sans réussite.
Mon code désolé s'il n'est pas très commenté et mal nettoyé :
// Import required libraries
#include <ESP8266WiFi.h>
#include <ESPAsyncWebServer.h>
#include <Wire.h>
#include <espnow.h>// https://github.com/esp8266/Arduino/blob/master/tools/sdk/include/espnow.h
uint8_t broadcastAddress[] = {0x80, 0x7d, 0x3a, 0x44, 0x5a, 0xb6};//80:7d:3a:44:5a:b6
// Replace with your network credentials
const char* ssid = "*********";
const char* password = "*********";
IPAddress ip(192, 168, 0, 39);
AsyncWebServer server(1039);
// current temperature & humidity, updated in loop()
float t1 = 0.0; // temperature exterieur
float h1 = 0.0; // temperature interieur
float newT1 = 0;
float newH1 = 0;
// Structure example to receive data
// Must match the sender structure
typedef struct struct_message {
float t1;
float h1;
} struct_message;
struct_message myData;
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
<style>
html
{
font-family: Arial;
display: inline-block;
margin: 0px auto;
text-align: center;
}
h2 { font-size: 2.5rem; }
p { font-size: 2.5rem; }
.units { font-size: 1.2rem; }
.dht-labels
{
font-size: 1.5rem;
vertical-align:middle;
padding-bottom: 5px;
}
</style>
</head>
<body>
<h2>Capteur serre</h2>
<p>
<i class="fas fa-thermometer-half" style="color:#059e8a;"></i>
<span class="dht-labels">Temperature Exterieur</span>
<br>
<span id="temperature1">%TEMPERATURE1%</span>
<sup class="units">°C</sup>
</p>
<p>
<i class="fas fa-tint" style="color:#00add6;"></i>
<span class="dht-labels">Humidity Exterieur</span>
<br>
<span id="humidity1">%HUMIDITY1%</span>
<sup class="units">%%</sup>
</p>
</body>
<script>
setInterval(function ( )
{
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function()
{
if (this.readyState == 4 && this.status == 200)
{
document.getElementById("temperature1").innerHTML = this.responseText;
}
};
xhttp.open("GET", "/temperature1", true);
xhttp.send();
}, 10000 ) ;
setInterval(function ( )
{
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function()
{
if (this.readyState == 4 && this.status == 200)
{
document.getElementById("humidity1").innerHTML = this.responseText;
}
};
xhttp.open("GET", "/humidity1", true);
xhttp.send();
}, 10000 ) ;
</script>
</html>)rawliteral";
// Replaces placeholder with DHT values
String processor(const String& var)
{
//Serial.println(var);
if(var == "TEMPERATURE INTERIEUR")
{
return String(t1);
}
else if(var == "HUMIDITE INTERIEUR")
{
return String(h1);
}
return String();
}
// rappel en cas de réception de données
void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) {
memcpy(&myData, incomingData, sizeof(myData));
Serial.print("Bytes received: ");
Serial.println(len);
Serial.print("Float: ");
Serial.println(myData.t1);
Serial.print("Float: ");
Serial.println(myData.h1);
Serial.println();
}
void setup(){
// Serial port for debugging purposes
Serial.begin(115200);
// Set device as a Wi-Fi Station
WiFi.mode(WIFI_AP_STA);
// Init ESP-NOW
if (esp_now_init() != 0)
{
Serial.println("Error initializing ESP-NOW");
return;
}
Serial.print(F("\nReciever initialized : "));
Serial.println(WiFi.macAddress());
// Define receive function
esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
esp_now_register_recv_cb(OnDataRecv);
//dateCourante2=millis();
//pinMode(ledpin, OUTPUT);
IPAddress dnServer(89, 2, 0, 1);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);
WiFi.config(ip, dnServer, gateway, subnet);
// 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("/", HTTP_GET, [](AsyncWebServerRequest *request)
{
request->send_P(200, "text/html", index_html, processor);
});
server.on("/temperature1", HTTP_GET, [](AsyncWebServerRequest *request)
{
request->send_P(200, "text/plain", String(t1).c_str());
});
server.on("/humidity1", HTTP_GET, [](AsyncWebServerRequest *request)
{
request->send_P(200, "text/plain", String(h1).c_str());
});
// Start server
server.begin();
Serial.println(WiFi.macAddress());
}
void loop(){
unsigned long currentMillis = millis();
if (newT1 != myData.t1 || newH1 != myData.h1)
{
// Read Temp
newT1 = myData.t1;
// si la lecture de la température a échoué, ne pas modifier la valeur t1
if (isnan(newT1))
{
Serial.println("Failed to read from DHT sensor!");
}
else
{
t1 = newT1;
Serial.print("temp : ");
Serial.println(t1);
}
// Read Humidity
newH1 = myData.h1;
// si la lecture de l'humidité a échoué, ne pas modifier la valeur h1
if (isnan(newH1))
{
Serial.println("Failed to read from DHT sensor!");
}
else
{
h1 = newH1;
Serial.print("hum : ");
Serial.println(h1);
}
}
}
Après, je me pose peut être trop de questions car juste tester le changement de valeur peut etre le meilleur choix ?
Oui, je pense aussi.
Tu n'a pas besoin de tester la réception de donnée, puidque tu as donnée ta fonction de rappel "OnDataRecv" via la fonction "esp_now_register_recv_cb".
Cette fonction de rappel étant enregistré au près de ESP-NOW, ESP-NOW va appeler cette fonction à chaque fois qu'il recevra des données.
Après je ne connais pas trop ESP-NOW, ni le code utilisé sur l'ESP32
Je reviens sur le sujet, car je voudrais afficher dans mon projet basse consommation un indicateur de pourcentage de batterie.
Je me suis dit au départ, ça va être simple, un pont diviseur de tension sur une entrée analogique. Eh hop c'est tout bon.
Mais en creusant le sujet, c'est moins simple qu'il n'y parait, déjà parce que je suis en basse consommation et que le pont diviseur de tension risque d'après ce que j'ai lu de vider ma batterie.
J'ai lu egalement des choses avec l'adc interne de l'esp32, mais là je n'ai pas compris grand chose.
Je voudrais trouver quelque chose qui n'épuise pas ma batterie, mais qui reste assez facile de mise en œuvre.
J'ai lu pas mal de chose également sur le site de @hbachetti, mais peut être trop de chose car je n'ai pas réussi à en ressortir quelque chose de concret.
En plus entre Arduino et ESP32, il y a des différences de codage.
Donc je ne sais plus par ou commencer. Mes donner de départ un ESP32s nu, une batterie Lipo 1500 mah et une carte chargeur de batterie (la verte sur Aliexpress) dont le lien ci dessous.
Pouvez vous m'aiguiller sur la bonne piste ?
