[Résolu] Réduire la consommation sur batterie

Bonjour,
Mon circuit d'automatisme pour ouvrir et fermer une trappe une fois par jour, consomme en moyenne 20 mA en 3 secondes en tout pour ce travail d'après un multimètre ordinaire.

J'utilise

LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);

le reste du temps.

Pro mini seul, 16 Mhz, 5 V, sans led "power" et régulateur dessoudé, je mesure moins de 2 µA calibre 200 µA.

Un mosfet coupe l'alimentation du servomoteur qui en temps normal consomme plus de 5 mA au repos.
Seulement, il consomme encore 2.4 mA par la broche de commande (4).

Comment réduire cette conso qui ne baisse pas, même avec la méthode detach() ?

Autre question :
Comme j'alimente par la broche VCC, est-il possible de ne pas mettre de pont de mesure de la tension de batterie, la tension n'excédant pas 5.7V ?

La 100 k provoque une consommation de 40 µA, ce n'est pas beaucoup, c'est surtout le fait de dépasser les 5 V sur une entrée, est-ce possible sans problème ?

J'ai déjà fait ce genre de chose, mais j'utilise un PMOSFET, et je ne coupe pas le GND mais le +5V, et le servomoteur ne consomme plus rien.

Merci,

Ok, faut que j'essaie de nouveau, ça n'avait pas marché avec un mosfet P. Javais aussi cette conso de 2.4 mA qui disparait en débranchant le fil.

Et pour le dépassement de tension d'entrée ?

Dépasser la tension d'alimentation sur une entrée engendre une consommation à travers les diodes de protection.
Sur mes montages alimentés par batterie j'utilise couramment un pont diviseur 1MΩ + 330KΩ, sans problème.

Merci,
1 Megohm j'osais pas.
"Dépasser la tension d'alimentation sur une entrée engendre une consommation à travers les diodes de protection." OK donc sans pont ça doit aller aussi, juste une résistance série.

Faudra que j'essaies avec d'autres servos :wink:

1MΩ c'est possible, si absence de poussière et humidité !

Concernant le servo, Il n'y a pas de raison qu'il y ait une consommation si le +5V est coupé et si la sortie PWM est à LOW.
Quand je veux couper le servo, j'appelle detach() et je coupe l'alimentation.

hbachetti:
Quand je veux couper le servo, j'appelle detach() et je coupe l'alimentation.

J'ai du mal employer cette méthode.

Je viens de faire un essai avec le code de base sans faire appel servo.h et il n'y a pas cette conso. Je vais revoir mon code alors.
Voilà l'actuel qui fonctionne bien en dehors de ce soucis.

/*
  Trappe automatique solaire, avec servomoteur
  Charge à  c/20 en début de charge
  et environ c/50 en charge d'entretien.
  consommation en veille (led power et régulateur enlevés) :
  Pro mini 6 µA en veille
  conso servo/ jour : 17 mA pendant 2.5 secondes

  bouton activé le jour :
  - premier appui : niveau de batterie
    1 flash : faible, 2 flashs : normal; 3 flashs : chargé
  - appuis suivants : ouverture ou fermeture forcée
  retour à la normale à l'aube du jour suivant.

*/

#include <Servo.h>
#include <LowPower.h>
//#define Debug  // mode test et moniteur série

/* noms des broches entrées/sorties */
const byte interruptPin = 2;
const byte AlimServo = 3;
Servo monServo;// pin 4
const byte led = 10; //
const byte pinPV = A0; // tension panneau
const byte bat = A1; // tension batterie

/* variables */
int niveau_bat;
byte batLed;
bool afBat = 1;
int crepuscule = 31; // seuil nuit 0.15 V
int aube = 265;  // seuil jour 1.3 V
int UPV; // mesure de tension sur le panneau
bool retard = 2; // évite de déclencher sur variation de luminosité bréve
byte nbCycle = 0; // retard à l'ouverture X 8 secondes de veille.
bool ouvert = 0; //
volatile bool etatBP = 0;
bool manuel = 0; // 0 = sans modification; 1 = fermeture forcée

void setup()
{
  // initialisation entree/sortie
  pinMode(interruptPin, INPUT_PULLUP);
  pinMode(AlimServo, OUTPUT);
  //monServo.attach(4);
  //pinMode(charge, OUTPUT);
  pinMode(led, OUTPUT);
  pinMode(pinPV, INPUT);
  pinMode(bat, INPUT);
  // pinMode(pinmoteur, INPUT);
  attachInterrupt(digitalPinToInterrupt(interruptPin), pressBP, RISING);

#ifdef Debug
  Serial.begin(115200);
  Serial.println ("valider le moniteur série") ;
  delay(10) ;
  nbCycle = 0;// ouvre et ferme sans retard
#endif // Debug
}

void loop() {
  monServo.detach();
  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
  UPV = analogRead(pinPV);

  if (ouvert)// trappe ouverte
  {
    modeManuel();//activable seulement le jour
    if (UPV < crepuscule) { // seuil nuit
      if (manuel) { // déjà fermé
        manuel = 0;// annule le forçage
        ouvert = 0;// fermé
      }
      else
        fermeture();
    }
    else retard = 0;// réinitialise le compteur d'attente
  }
  else // fermée
  {
    if (UPV > aube) ouverture();
    else retard = 0;
  }

}// fin de loop

void pressBP() {// appui bouton sur interruption
  etatBP = 1 ;
}

void modeManuel() { // le jour, annulé à l'aube suivante
  if (etatBP)//appuie bouton
  {
    if (afBat) {// premier appui de la journée
      testBat();
      afBat = 0;
    }
    else {// appuis suivants
      if (!manuel) {//ouvert
        fermer();
        manuel = 1;
      }
      else {
        ouvrir();
        manuel = 0;
      }
    }
    etatBP = 0;
  }
}

void ouverture() {
  retard++;
  if (retard > nbCycle) {
    ouvrir();
    ouvert = 1 ; // ouverte
    afBat = 1; // affiche l'info batterie en premier appui
  }
}

void fermeture() {
  retard++;
  if (retard > nbCycle) {
    fermer();
    ouvert = 0; // fermée
  }
}

void ouvrir() {
  monServo.attach(4);
  digitalWrite(AlimServo, 1);//alimente le servomoteur
  monServo.write(16);
  delay(1000);  // ouverture en 1 secondes
  monServo.detach();
//  delay(100);
  digitalWrite(AlimServo, 0);
}

void fermer() {
  monServo.attach(4);
  digitalWrite(AlimServo, 1);
  for (int i = 16; i < 174; i++) {
    monServo.write(i);
    delay(12);  // trappe fermé en 2 secondes
  }
  monServo.detach();
 // delay(100);
  digitalWrite(AlimServo, 0);
}

void testBat() {
  niveau_bat = analogRead(bat); // valeur / 1.15 / 0.049
  if (niveau_bat < 834)batLed = 1; // faible 4.7 V
  else if (niveau_bat > 833 && niveau_bat < 976)
    batLed = 2; // normal entre 4.7 et 5.5 V
  else if (niveau_bat > 975)batLed = 3; // pleine charge 5.5 V

  for (int i = 0; i < batLed; i ++) {
    digitalWrite(led, 1); delay(50); digitalWrite(led, 0);
    delay(300);
  }
}

J'ai mis à jour le code dans le message précédent.

Problème résolu avec une alimentation séparée pour le servomoteur.

Après augmentation des résistances des ponts de mesure : consommation du montage en veille 16 µA.

Merci du coups de main. :wink:

hbachetti:
J'ai déjà fait ce genre de chose, mais j'utilise un PMOSFET, et je ne coupe pas le GND mais le +5V, et le servomoteur ne consomme plus rien.

C'était bien le NMosfet qui avait une consommation résiduelle.

J'ai remis la résistance de 2.2 ohm.
Ça fonctionne parfaitement avec un PMosfet et une alimentation 5 V 800mA sans provoquer le reboot du Pro Mini et sans utiliser detach();.