[Programmation] Probleme gestion consommation arduino uno
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Probleme gestion consommation arduino uno



  1. #1
    invite21365b4f

    Probleme gestion consommation arduino uno


    ------

    Bonjour à tous (et à toutes),
    Je m'appelle Valentin et j'ai 16 ans et je suis un débutant en programmation. J'ai créé un poulailler automatique (qui lève et ferme la trappe en fonction de la luminosité) et qui fonctionne avec un panneau solaire qui recharge une batterie de 550mAh. Lorsque la trappe se ferme, un bip-bip retentit et une LED clignote. Lorsque la trappe est fermée, la led reste allumée jusqu'au matin en attendant la levée de la trappe. Je souhaiterais éventuellement ajouter un capteur de température et une led bleue. Lorsque la température sera inférieure à 3°C, la LED bleue s'allumera et le système cessera de fonctionner. Cependant, la batterie ne se recharge pas assez ce qui fait que les poules ne peuvent pas sortir le matin. La cause : ma carte Arduino et tous les capteurs, LED, bipper… consomment trop. Le panneau solaire peine à recharger la batterie même si celle ci arrive à fermer la trappe le soir. En effet, l'énergie produite par ce dernier se rends en majorité dans la carte et est consommée immédiatement (et inutilement). C'est pour cela que je sollicite votre aide afin de pouvoir mener à bout mon petit projet. Je souhaiterai pouvoir réduire la consommation de mon Arduino UNO en la mettant en veille entre toutes les mesures faites par la photorésistance (qui ont lieu toutes les 30 minutes) et ce, directement dans le programme même de mon Arduino. Je sais que cela est possible car je me suis renseigné mais je ne suis pas assez aguerri pour tout comprendre . Voici le code actuel :


    Code:
    int analogPin=0;
    int analogValue=0;
    int ledPin=6;
    int led2Pin=10;
    int ouvert=0;
    int ferme=0;
    const int switchPin1 = 2;
    const int switchPin2 = 4;
    
    void setup() {
      Serial.begin(9600);
      pinMode(ledPin,OUTPUT);
      pinMode(led2Pin,OUTPUT);
      pinMode(12,OUTPUT);
      pinMode(9,OUTPUT);
      pinMode(switchPin1, INPUT); 
      digitalWrite(switchPin1, HIGH);
      pinMode(switchPin2, INPUT); 
      digitalWrite(switchPin2, HIGH);
    }
    
    void loop() {
       analogValue=analogRead(analogPin);
      if (analogValue >= 70)
      {
        if (ouvert == 0)
           {
           digitalWrite(12,HIGH);
           digitalWrite(9,LOW);
           analogWrite(3,255);
           if(digitalRead(switchPin1) == LOW){
           digitalWrite(9,HIGH);
           digitalWrite(ledPin,LOW);
           ouvert=1;
           ferme=0;
           delay(1800000);
           }
        }
      }
       else
      {
        if (ferme == 0)
        {
        
        
        digitalWrite(ledPin,HIGH);
        digitalWrite(led2Pin, HIGH);
        delay(500);
        digitalWrite(ledPin,LOW);
        digitalWrite(led2Pin, LOW);
        delay(500);
        digitalWrite(ledPin,HIGH);
        digitalWrite(led2Pin, HIGH);
        delay(500);
        digitalWrite(ledPin,LOW);
        digitalWrite(led2Pin, LOW);
        delay(500);
        digitalWrite(ledPin,HIGH);
        digitalWrite(led2Pin, HIGH);
        delay(500);
        digitalWrite(ledPin,LOW);
        digitalWrite(led2Pin, LOW);
        delay(500);
        digitalWrite(ledPin,HIGH);
        digitalWrite(led2Pin, HIGH);
        delay(500);
        digitalWrite(ledPin,LOW);
        digitalWrite(led2Pin, LOW);
        delay(500);
        digitalWrite(led2Pin, LOW);
        digitalWrite(ledPin,HIGH); 
        digitalWrite(12,LOW);
        digitalWrite(9,LOW);
        analogWrite(3,255);
        if(digitalRead(switchPin2) == LOW){
        digitalWrite(9,HIGH);
        delay(1800000);
        ouvert=0;
        ferme=1;
    
        }
        else
        {
             
        }
      }
     }
    }

    Bon je sais, il n'est pas parfait-parfait...mais il fonctionne !!! Je vous remercie d'avoir pris le temps de me lire. En esperant pouvoir être aidé,
    Bonne journée
    Cordialement
    Valentin

    -----
    Dernière modification par Vincent PETIT ; 04/09/2019 à 12h19. Motif: Ajout des balises [CODE]...[\CODE]

  2. #2
    bobflux

    Re : Probleme gestion consommation arduino uno

    Si tu recherches "arduino sleep" tu vas trouver pas mal d'infos.

    http://www.engblaze.com/hush-little-microprocessor-avr-and-arduino-sleep-mode-basics/

    L'idée est de mettre le micro en veille, et de le réveiller de temps en temps avec le timer watchdog. Sinon tu peux aussi baisser la fréquence.

    Par contre il faudra surveiller la consommation des LED, et aussi celle du régulateur 5V de l'arduino. Si tu as le schéma, tu peux regarder la datasheet du régulateur, voir si il est basse consommation ou pas, etc.

  3. #3
    invite21365b4f

    Re : Probleme gestion consommation arduino uno

    Bonjour,
    Tout d'abord, merci pour cette réponse rapide. J'ai modifié mon programme et ai utilisé un WDT comme vous m'avez conseillé. Voici ce que cela donne :
    Code:
    int analogPin=0;
    int analogValue=0;
    int ledPin=6;
    int led2Pin=10;
    int ouvert=0;
    int ferme=0;
    const int switchPin1 = 2;
    const int switchPin2 = 4;
    #include <avr/interrupt.h>
    #include <avr/power.h>
    #include <avr/sleep.h>
    volatile int f_wdt = 1;
    
    void setup() {
      Serial.begin(9600);
      pinMode(ledPin,OUTPUT);
      pinMode(led2Pin,OUTPUT);
      pinMode(12,OUTPUT);
      pinMode(9,OUTPUT);
      pinMode(switchPin1, INPUT); 
      digitalWrite(switchPin1, HIGH);
      pinMode(switchPin2, INPUT); 
      digitalWrite(switchPin2, HIGH);
      setup_watchdog(9);
    }
    
    void loop() {
       analogValue=analogRead(analogPin);
      if (analogValue >= 70)
      {
        if (ouvert == 0)
           {
           digitalWrite(led2Pin, HIGH);
           delay(1000);
           digitalWrite(led2Pin,LOW);
           digitalWrite(12,HIGH);
           digitalWrite(9,LOW);
           analogWrite(3,255);
           if(digitalRead(switchPin1) == LOW){
           digitalWrite(9,HIGH);
           digitalWrite(ledPin,LOW);
           ouvert=1;
           ferme=0;
           sommeil();
         
          }
        }
      }
       else sommeil();
      {
        if (ferme == 0)
        {
        
        
        digitalWrite(ledPin,HIGH);
        digitalWrite(led2Pin, HIGH);
        delay(500);
        digitalWrite(ledPin,LOW);
        digitalWrite(led2Pin, LOW);
        delay(500);
        digitalWrite(ledPin,HIGH);
        digitalWrite(led2Pin, HIGH);
        delay(500);
        digitalWrite(ledPin,LOW);
        digitalWrite(led2Pin, LOW);
        delay(500);
        digitalWrite(ledPin,HIGH);
        digitalWrite(led2Pin, HIGH);
        delay(500);
        digitalWrite(ledPin,LOW);
        digitalWrite(led2Pin, LOW);
        delay(500);
        digitalWrite(ledPin,HIGH);
        digitalWrite(led2Pin, HIGH);
        delay(500);
        digitalWrite(ledPin,LOW);
        digitalWrite(led2Pin, LOW);
        delay(500);
        digitalWrite(led2Pin, LOW);
        digitalWrite(ledPin,HIGH); 
        digitalWrite(12,LOW);
        digitalWrite(9,LOW);
        analogWrite(3,255);
        if(digitalRead(switchPin2) == LOW){
        digitalWrite(9,HIGH);
        ouvert=0;
        ferme=1;
        sommeil();
    
        }
        else sommeil();
        {
             
        }
      }
     }
    }
    ISR(WDT_vect)
    {
      if (f_wdt == 0)
      {
        f_wdt = 1; // flag global }
      }
    }
    
    void setup_watchdog(int ii) {
      byte bb;
      int ww;
      if (ii > 9 ) ii = 9;   // pour 8 secondes
      bb = ii & 7;
      if (ii > 7) bb |= (1 << 5);
      bb |= (1 << WDCE);
      ww = bb;
      // Clear the reset flag
      MCUSR &= ~(1 << WDRF);
      // start timed sequence
      WDTCSR |= (1 << WDCE) | (1 << WDE);
      // set new watchdog timeout value
      WDTCSR = bb;
      WDTCSR |= _BV(WDIE);
    }
    
    // active la mise en veille pour 8 secondes
    void sommeil(void) {
      set_sleep_mode(SLEEP_MODE_STANDBY);
      sleep_enable();
      sleep_mode(); //Entre dans le mode veille choisi
      //le micro passe en sommeil pour 8 secondes
      sleep_disable();
      // Le programme va reprendre ici après le timeout du WDT
    }

    Pouvez-vous me dire si cela est correct svp car je n'ai pas encore testé ce programme sur mon Arduino… Je vous remercie de m'avoir aidé jusque là. En espérant enfin pouvoir voir mon système fonctionner !!! En attendant une brève réponse,
    Bonne journée
    Cordialement
    Valentin

  4. #4
    Seb.26

    Re : Probleme gestion consommation arduino uno

    La carte Arduino va consommer pas grand chose au final, genre 20mA, si ta batterie ne peut pas absorber cela, ça veut dire que je système est sous dimensionné ...
    > un peu de poussière sur les panneaux = -30% de production
    > un ciel un peu nuageux = -60% de production
    ...etc...

    Et au final les 10 ou 30 mA que tu vas gagner ne changeront rien.

    Revois la recharge

    [Edit] pour gagner sur la carte, il faut retirer le convertisseur, passer en sleep et tout optimiser (capteurs & co)
    Dernière modification par Seb.26 ; 04/09/2019 à 15h09.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  5. A voir en vidéo sur Futura
  6. #5
    invite21365b4f

    Re : Probleme gestion consommation arduino uno

    Ah oui ! Je ne pensais pas que c'était aussi important ! Au fait, est ce que mon code avec le sleep mode est correct??

  7. #6
    Jack
    Modérateur

    Re : Probleme gestion consommation arduino uno

    Sinon, tu peux passer à l'ESP32 ou ESP8266 qui descend à quelques µA en mode veille et qui se programme également avec l'outil de développement de l'arduino. En plus c'est plus puissant et moins cher qu'une UNO.

  8. #7
    Seb.26

    Re : Probleme gestion consommation arduino uno

    Citation Envoyé par VALENTIN1234 Voir le message
    Au fait, est ce que mon code avec le sleep mode est correct??
    Le plus simple : utilise une librairie faite pour ça ...

    Par exemple :

    Code:
    #include <LowPower.h> // https://github.com/rocketscream/Low-Power
    
    ...
    
    void setup()
    {
      ...
    
      // Passe toutes les pin non utilisées en OUT + LOW
      pinMode( ***, OUTPUT );
      digitalWrite( ***, LOW );
    
      ...
    }
    
    void loop()
    {
      ...
      LowPower.powerDown( SLEEP_8S, ADC_OFF, BOD_OFF);
      ...
    }
    il y a d'autres options pour "powerDown" ... voir la doc ...

    Avec ceci, sur une carte à base de ATmega328 sans quartz (8Mhz interne), j'arrive à moins de 0.5uA de conso en sommeil ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  9. #8
    onilink_

    Re : Probleme gestion consommation arduino uno

    1. Vérifier que le panneau solaire est pas sous dimensionné (donc faire des mesures)
    2. Sleep quand possible (ça a déjà été dit)
    3. Utiliser autre chose qu'un arduino uno (qui consomme beaucoup pour pas grand chose), par ex un arduino mini 3.3V

  10. #9
    invite63dca6cd

    Re : Probleme gestion consommation arduino uno

    Bonsoir Valentin,
    quoi que tu fasses avec les modse de veille de l'arduino ça ne fait qu'économiser sur le microcontroleur lui même, mais tu risques de consommer énormement avec un Arduino Uno du fait de l'électronique qu'il y a autour (régulateur de tension, connectique USB même quand elle est débranchée ...).
    Une fois le programme au point, il vaut donc mieux le transférer sur un microcontroleur "nu".

    Sur les anciens modèles de Uno, ou l'ATMega est un modèle enfiché et pas soudé en surface, on peut le programmer et le déconnecter pour le mettre ensuite sur une carte maison avec juste l'alimentation.
    On peut aussi utiliser un ATmini à la place. C'est ce que j'ai fait pour la sonnette de ma porte d'entrée, et elle tient 2 ans avec une simple pile 4,5V

  11. #10
    Seb.26

    Re : Probleme gestion consommation arduino uno

    Pour aller au bout du bout, tu passe sur un uCPU nu, sans quartz ... avec les 3 pin GND/TX/RX sur un header 2.54mm et tu utilise un convertisseur UART <-> USB (en TTL 3.3v!!) pour le bootloader ou mieux : un programmateur ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  12. #11
    invitef86a6203

    Re : Probleme gestion consommation arduino uno

    Lorsqu'on développe un système embarqué soit à pile ou à batterie.
    La première question à se poser est la consommation !

    Si on a 2 LEDs qui consomment 20ma , sur 24h, on aura 40ma x 24 = 960mah.
    La batterie ne tient pas la journée.
    Quant aux cellules solaire les valeurs annoncées sont dans les conditions optimum... (à midi, à l'équateur, sans nuage)
    Autrement dit, il faudra x10 la capacité annoncée pour avoir quelque chose de viable.

    Il faut donc se poser la question de l'utilité de ce que fait le programme.
    La plupart du temps il ne fait rien, donc la consommation principale est totalement gâchée.

    Donc le processeur et surtout les périphériques n'ont pas besoin d'être sous tension en permanence !
    Surtout pour faire 2 opérations par jour qui prennent 1 seconde chacune.

    L'idée est donc d'alimenter ce qui consomme juste quand on en a besoin.
    Une fois par heure ou tout les quart d'heure , au choix, selon le besoin par exemple.
    Pour ça un simple transistor Darlington suffit pour alimenter le µp principale.

    Pour réveiller périodiquement l'Arduino principal un µc comme un attiny85 suffit pour mettre sous tension cette Arduino principal.
    L'attiny85 peut se programmer aussi avec l'IDE Arduino
    Premier site trouvé qui en parle sur google;
    https://phmarduino.wordpress.com/201...-un-attiny-85/
    Il y en a d'autre...

    Au sujet des voyants LEDs, un servo moteur qui fonctionne pendant 330ms qui consommerait, admettons 300ma ,
    (330ma = 1/3 A) (1 heure = 3600 secondes)
    aura une consommation de 300ma / (3600 secondes/3) = 2.5mah par jour LOL dérisoire.
    Bon!
    2 fois par jour on peut en mettre plusieurs si on veut.
    Un disque avec des ronds de couleurs qui défilent devant une fenêtre, ça fait un voyant correcte, pas lumineux certes mais visible, en plus on est pas limité à la taille d'une led , ni même à un rond on peut mettre ce qu'on veut.

    Il faudra aussi coupé l'alime des servos lorsqu'ils ne bouge pas, c'est à dire presque tout le temps, là encore le µc principale commande un transistor pour les alimenter.

Discussions similaires

  1. [Arduino, C++] gestion des sleep-modes
    Par invitea4787add dans le forum Électronique
    Réponses: 9
    Dernier message: 15/01/2018, 21h17
  2. [Energie] Gestion moteur 3V depuis Arduino
    Par invitea982278a dans le forum Électronique
    Réponses: 5
    Dernier message: 21/03/2016, 20h32
  3. Gestion de consommation électrique d'une pompe à chaleur,
    Par invitebcd2781f dans le forum Bricolage et décoration
    Réponses: 3
    Dernier message: 09/04/2015, 17h53
  4. Gestion boutons arduino
    Par invite0f178c4b dans le forum Électronique
    Réponses: 10
    Dernier message: 21/10/2013, 19h04
  5. programme gestion led avec arduino
    Par invite039e7366 dans le forum Électronique
    Réponses: 4
    Dernier message: 03/01/2012, 18h29
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...