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