d1 mini & capteur température

Portrait de jgranie

Bonjour,

J'ai un petit bricolage alimenté sur batterie 18650 avec un d1 mini que je connecte en wifi à ma box domotique et j'aimerais optimiser l'utilisation de la batterie.

Actuellement une piste que j'entrevois c'est que je n'utilise la batterie que dans la plage 4.2V/3.5V alors qu'elle pourrait descendre à 2.75V.

Le D1 mini se comporte bien jusqu'à environ 2.85V en entrée (normalement il n'est pas censé descendre en dessous de 3V), mais le capteur (AM2320) ne veut rien savoir si sa tension d'entrée tombe en dessous de 3.1V (ce qui est normal vu le datasheet), il retourne systématiquement un puéril "nan".

Le 3.1V dans le circuit correspond à peu près à 3.5/3.6V en sortie de la batterie sans charge.

Du coup ma question : quelles seraient les possibilités pour utiliser mieux la capacité de la batterie ?

Ah oui : Je cherche une solution qui soit dans une fourchette de prix cohérente avec l'ensemble.

Merci :)

Portrait de Louis.D

J'ignore quel code vous utilisez mais voici un exemple qui fonctionne avec un serveur Web en fonction 24/24 sur le même réseau.

Pour facilité le code je n'envoie pas les données sur un serveur mais sur la console série, le principe restant le même.

#include <Arduino.h>
#ifdef ESP32
#include <WiFi.h>
#else
#include <ESP8266WiFi.h>
#endif

String Transfert;

void WIFI_ON() {
  WiFi.begin("SSID", "MDP");
  while (WiFi.status() != WL_CONNECTED) {
    delay(200);
    Serial.print(".");
  }
  Serial.println();
  Serial.println("Connecté");
}

void setup() {
  // initialize digital pin 13 as an output.
  Serial.begin(115200);
  WIFI_ON();
}

void loop() {
  ESP.deepSleep(120E6); // mise en veille profonde
  /* Sort de la veille toute les 2 mn
    Interroge par exemple un capteur de Température
    et autre et stocke les valeurs dans unechaine de
     caractères*/

  if (WiFi.status() != WL_CONNECTED)
    WIFI_ON(); // Active la WIFI
  /* Suite de votre de votre programme qui envoie
  Transfert ici sur la console série */
  Serial.println("Transfert OK");
  delay(3000);
  /* reprend le cycle ceci vous permet de n'utiliser
    la WIFI que 30 fois par heures donc avec une
    consommation très faible il est tout a fait
    possible de changer les valeurs*/
}

Portrait de Louis.D

Une autre solution est de stocker les valeurs dans une SD CARD et de pratiquer le transfert toute les 24 heures par exemple

Portrait de jgranie

Merci pour votre réponse,

Côté soft je passe effectivement en deep-sleep, et je sauvegarde les données de la connection wifi dans la mémoire RTC user pour avoir la connection la plus rapide possible sans scan du network (et donc limiter le temps où le wifi est actif).

Je me suis basé sur cette page : https://www.bakke.online/index.php/2017/06/24/esp8266-wifi-power-reducti...
Niveau soft je pense être à peu près allé au bout de ce que je peux gagner (ormis quelques optimisations anecdotiques), c'est plutôt du côté du circuit que je pense qu'il y a moyen d'améliorer et notamment cette histoire de batterie que je n'utilise que dans la moitié de sa plage de fonctionnement. 

J'utilise un MCP1700-3302 pour réguler la tension à 3.3V avec un condensateur et une plaquette TP4056 pour manager la batterie.

Portrait de Walter

Difficile de te conseiller, on ne sait pas pourquoi et comment tu t’arrête d'utiliser ton projet en dessous de 3.5V
Si tu peux l'utiliser jusqu’à 3.1V, pourquoi ne le fait tu pas?
En fait je ne comprends pas ta demande.

Portrait de Louis.D

Les abaisseurs de tension consomment de l'énergie ! Les régulateurs c'est pire encore !!

Portrait de jgranie

Pardon, c'était pas clair :s Quand je parlais des 3.5V, c'était la tension de batterie hors charge quand mon capteur s'arrête de me retourner des valeurs je débranche la batterie et je la mesure, j'obtiens 3.5. je n'avais pas besoin de le préciser ça ne présente aucun intérêt. 

Si je mesure la tension dans mon circuit au moment où le capteur commence à retourner nan j'obtiens 3.1V.

Je me dis que je pourrais descendre jusqu'aux 2.75V (dans le circuit) limite de la batterie si j'avais un moyen de booster la tension à 3.3V et donc augmenter significativement la durée de fonctionnement sur une charge.

 Mais mon raisonnement est peut-être (probablement) trop simpliste, je suis un grand débutant :)

Mais j'interprète peut-être mal mes mesures.

Portrait de jgranie

Je précise que j'ai entre 40 et 50j. d'autonomie avec une batterie de 3500mAh et un réveil toutes les 10 minutes pour envoyer la mesure par mqtt.

Portrait de Louis.D

jgranie  je serais curieux de voir ton code si tu le veux bien, évidement ! Car je ne pense pas que les pins OUTPUT et INPUT fonctionnent en deepsleep ! Mais je me trompe peut être !

Portrait de jgranie

Pas de souci bien sûr, je peux le mettre directement dans un post ?

Portrait de hercule124

Bonjour;

tu peux mettre en série avec la batterie une diode,  avec sa tension de seuil .

pas besoin de régulateur . exemple 1N400x  tension de seuil 0.6v 0.7 v (4.2v a 3.5v) et de plus ça te protège d'une éventuelle inversion de polarité.

Portrait de Louis.D

La consommation reste la même  !

Portrait de hercule124

bonjour,

wiki Etude de la consommation sur un ESP8266 D1Mini

Consommation en régime établi :

Consommation en régime établi
GPIO non orientés 18,5 mAh
GPIO en INPUT 17,0 mAh
GPIO en OUTPUT (niveau indéterminé) 26,7 mAh
GPIO en OUTPUT HIGH 16,9 mAh
GPIO en OUTPUT LOW 26,5 mAh

Il est préférable de définir toutes les sorties à OUTPUT HIGH ou INPUT.

Portrait de jgranie

Ah oui merci pour l'info je n'avais pas pensé qu'il pouvait y avoir des différences.

Portrait de Louis.D

J'attend avec impatience ton code et merci pour ton accord !

Portrait de jgranie

Je l'ai mis en fichier attaché

Portrait de Louis.D

Merci pour le code. J'ai jeté un œil rapide sur celui-ci qui me parait bien compliqué avec des commandes dont je ne vois pas l'utilité mais, je n'ai certainement pas tout compris, encore merci !

Par contre le plus simple pour augmenter l'autonomie de ton montage c'est peut-être de multiplier les batteries 18650 en parallèles (les pôles '+' reliés ensemble ainsi que les pôles '--' mais séparément ) ! Attention pas en série (ne pas les mettre les unes à la suite des autres ) !

Portrait de jgranie

Oui, c'est un code qui "vit" depuis quelques années et que je modiife à la va-vite quand j'ai un peu de temps il est tout sauf propre. Je vais essayer de le rendre un peu plus clair et je le posterai à nouveau.

En attendant je détaille un peu l'algo : 

extinction du wifi pour économiser un peu de batterie

Si le bouton pin D5 est enfoncé

    Démarrage wifi manager (serveur web pour avoir les credentials du wifi) // retourne quand connexion OK

    Sauvegarde des infos de connexion dans la mémoire RTC

    Entrée en sleep mode // fin

Fin si

Si lecture settings wifi OK // depuis la mémoire RTC, vérif. checksum

    Si connection wifi OK // avec settings mémoire RTC, sans scan du réseau

        Sauvegarde des infos de connexion dans la mémoire RTC

        Envoi des infos temp/humidité/batterie via mqtt

    Fin si

Sinon

    démarrage wifi manager (serveur web pour avoir les credentials du wifi)

Fin si

entrée en sleep mode // fin

La partie wifi manager est accessoire

Portrait de Louis.D

J'ai pensé à une autre solution que la Wemos tout du moins pour l'acquisition des valeurs avec un attiny85 qui consomme moins qu'une Wemos. Pour le transfert des datas un  ESP8266-01 alimenté par un Mosfet lui même piloté par l'Attiny et ce uniquement lors de transfert de data. Les attiny85 sont très peu exigeant en énergie, 1.2 mA à 1Mhz, alimenté entre 5.5 v et 2.7 v.

Transfert des datas par liaison série sur l'ESP après avoir reçu l'acqui de la wifi puis retour à 0 de l'alimentation de ce module wifi.

Et un code beacoup plus light !

Portrait de jgranie

Merci pour cette idée, si je comprends bien et après avoir regardé un peu l'attiny que je ne connaissais pas, si j'ai bien compris c'est lui qui assurerait le deep-sleep et l'esp-01 n'est pas alimenté du tout pendant l'inactivité ?

Je vais me pencher là dessus plus en détail.

Portrait de Louis.D

C'est tout à fait cela et du coup la plus grosse consommation de courant se fait uniquement pour les transferts de Datas. Par contre L’ATTINY85-20SH n’a que 1024 octets de RAM donc tu devras faire des transferts environ toutes les 8 heures. Mais tu peux encore gagner du temps en ne stockant de nouvelles valeurs, que s’il y a eu changement depuis la dernière prise de température  et hygrométrie. Ce qui devrait être assez courant le long dans une journée. Tu peux aussi opter pour une première prise de température et d'hygrométrie, puis uniquement la différence pour chacun des deux paramètres ce qui te fait passer à 12 heures entre deux transferts de Datas.

Pour programmer les attiny 85 j'ai fait un tuto ici : Utiliser un programmateur SparkFun Tiny AVR pour Attiny85/45/25

Portrait de Louis.D

Encodage avec économie de mémoire :

En utilisant des mots de 16 bits. Si tu utilises les premiers 6 bits (0 à 64) pour d’hygrométrie de 0 à 100 % en incrémentant  par 2% puis les 10 bits (0 à1023) suivants pour la température. Si tu admets d’avoir une précision à 0.1 degrés cela soit 10 valeurs par degrés entiers, 1023 te donne une fourchette de 102 valeurs soit -40° à 62,3°. Je sais que la planète se réchauffe mais -40° en France c’est rare et + 62,3° c’est du jamais vu et ce n'est pas pour demain !

Donc si on laisse 324 octets pour des calcul il en reste 720 / 2 = 360 emplacements de stockage.
360 fois 2 minutes = 720 minutes qui divisées par 60 minutes dans l’heure = 12 heures ! Donc sans problème pour faire 2 transferts de Datas par jour avec une bonne marge de sécurité ! Tu peux utiliser 24 octets de plus pour donner les heures pleines entre chaque heure de relevé. Donc il te reste 300 octets de mémoire pour les calculs, je pense que cela devrait suffire.

Encodage hygrométrie : de 2 en 2%

Pour 0     ( 0B00 0000 en binaire)  =     0 x 2 =    0 %
Pour 25   ( 0B01 1001 en binaire)  =   25 x 2 =  50 %
Pour 26   ( 0B01 1010 en binaire)  =   26 x 2 =  52 %
Pour 50   ( 0B11 0010 en binaire )   =  50 x 2 = 100 %

Encodage Température :

Pour 0       ( 0B00 0000 0000 en binaire)  = 0 - 400        = - 400 / 10    = - 40.0°C
Pour 125   ( 0B00 0111 1101  en binaire)  = 125 - 400    = - 375 / 10   = - 37.5°C
Pour 400   ( 0B01 1001 0000 en binaire)  = 400 - 400    =     0 / 10    =     0.0°C
Pour 625   ( 0B10 1011 0001en binaire)  = 625 - 400    =     225 / 10    =  22.5°C
Pour 1023 ( 0B11 1111 1111 en binaire )   =  1023 - 400 = 623 / 10    =   62.3°C.

Si tu ne piges pas tout dis moi le je t’expliquerai plus en détail.
 

  

Portrait de jgranie

Oui je vois l'idée, par contre avec une recherche rapide l'attiny85 et l'esp8266-01 sont tous les 2 plus chers que le d1 mini, du coup ça double le prix de la partie "intelligente". D'un autre côté je peux économiser sur la batterie en prenant une capacité plus faible, je vais calculer ça.

EDIT : Il reste la question de la tension du capteur et de l'esp-01, si je remplace le LDO 3302 par un module buck boost 3.3V, ça peut marcher ? (j'en ai trouvé à un prix raisonnable mais je ne trouve pas de datasheet)

EDIT2 (désolé) : J'ai trouvé des attiny85 a un meilleur prix, donc c'est bon, et l'idée d'optimiser l'envoi des données me plaît bien :)

Portrait de Louis.D

Oui le buck boost 3.3V convient très bien pour cette application !

Portrait de jgranie

Bon, j'attends la livraison et il faudra que je me familiarise avec l'attiny85. Dans l'ensemble je pense que la résolution de mon problème est bien avancée, merci à tous :)
(je vous tiendrai au courant de l'avancée)

Portrait de Louis.D

attention je me suis fait avoir sur un site il donnait 1024 octets de RAM hors il semble qu'il y en ai que 512 ! Donsc tu seras obligé de faire plus de transferts ! Désolé !

Portrait de jgranie

C'est pas un souci, même en divisant par 2 le gain d'autonomie sera assez énorme, en fait j'avais même hésité à prendre un attiny45 qui était un peu moins cher. Et puis ça me fait un nouveau truc à découvrir :)