Partage
  • Partager sur Facebook
  • Partager sur Twitter

Optimisation digitalWrite...

Arduino UNO

Sujet résolu
    15 janvier 2019 à 13:56:45

    Bonjour à tous,

    Je débute en Arduino, et je souhaiterais avoir votre avis concernant un problème qui ne doit pas en être un... Mais j'aime bien creuser un peu les choses et essayer d'optimiser mes programmes (et ma carte Arduino).

    Pour faire simple, considérons un bouton qui commande l'allumage d'une LED. Dans le loop, on pourrait très bien écrire :

    void loop() {
       digitalWrite(pinLed, digitalRead(pinBouton));
       delay(100);
    }

    Toutes les 100ms, on appelle la fonction digitalWrite.

    On pourrait également utiliser un booléen pour ne pas avoir à appeler la fonctiondigitalWrite trop souvent :

    bool ledAllumee = false;
    
    void loop() {
       if(digitalRead(pinBouton) and !ledAllumee) {
          digitalWrite(pinLed, HIGH);
          ledAllumee = true;
       }
       else if (!digitalRead(pinBouton) and ledAllumee) {
          digitalWrite(pinLed, LOW);
          ledAllumee = false;
       }
    
       delay(100);   
    }

    Le code est plus long, utilise une variable, mais n'appelle la fonctiondigitalWrite que lorsque nécessaire.

    À première vue, je me dis que la première solution est préférable (beaucoup plus simple et claire) mais appeler la fonction digitalWrite toutes les 100ms me dérange un peu, surtout dans le cas où la carte tourne 24/24.

    Quelle solution est préférable selon vous ? Faire undigitalWrite toutes les 100ms ne réduit-il pas la durée de vie de la carte ? (même si je présume qu'elle doit pouvoir en faire un bon paquet)

    Merci d'avance de vos réponses !

    • Partager sur Facebook
    • Partager sur Twitter
      15 janvier 2019 à 17:03:03

      Bonjour,

      Tu peux utiliser une interruption avec par exemple un programme du genre :

      const byte ledPin = 13;
      const byte pinBouton = 2;
      volatile byte ledState = LOW;
      
      void setup() {
        pinMode(ledPin, OUTPUT);
        pinMode(pinBouton, INPUT_PULLUP);
        attachInterrupt(digitalPinToInterrupt(pinBouton), blink, CHANGE);
      }
      
      void loop() {
        //plus rien dans le loop
      }
      
      void blink() {
        ledState = !ledState;
        digitalWrite(ledPin, ledState);
      }




      Quand un changement d'état est détecté sur la pin configurée (donc celle du bouton), le programme sort du loop pour venir exécuter la routine blink qui lui est associée, puis reviens dans le loop où il en était.

      Tu pourras trouver plus de détails ici : https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

      Attention aux phénomènes de rebond avec le bouton !

      Les appels à digitalRead ou digitalWrite n'impacte pas la durée de vie de la carte, j'ai en une qui génère un signal pwm pour un ruban led, qui fait un write toutes les 8ms environ, qui fonctionne plusieurs heures par jours depuis 5 ans.

      Par contre les écritures trop répétées dans l'eeprom diminue la durée de vie qui est donnée pour environ 100 000 cycles.

      -
      Edité par Arkturus 15 janvier 2019 à 17:07:59

      • Partager sur Facebook
      • Partager sur Twitter
        15 janvier 2019 à 20:07:10

        Merci pour ta réponse.

        En fait, je dois commander l'activation d'un ventilateur selon la température, de façon autonome, donc sans interruption.

        Arkturus a écrit:

        Les appels à digitalRead ou digitalWrite n'impacte pas la durée de vie de la carte, j'ai en une qui génère un signal pwm pour un ruban led, qui fait un write toutes les 8ms environ, qui fonctionne plusieurs heures par jours depuis 5 ans.


        Parfait, c'est exactement le genre de réponse que je cherchais. Je passerai le sujet en résolu dans quelques temps, peut-être que quelqu'un a une réponse complémentaire à apporter.

        Merci encore.



        • Partager sur Facebook
        • Partager sur Twitter
          15 janvier 2019 à 22:28:35

          Je rejoins ce que dit Arkturus : à part l'EEPROM qui a une durée de vie de 100.000 cycle d'écriture, il n'y a aucun périphérique de l'arduino suceptible de s'user.

          Donc à part les fonctions EEPROM.write et EEPROM.update qu'il faut utiliser judiscieusement, il n'y aucune contrainte sur les autres fonctions.

          Bien sûre, il faut quand même rester dans les limites acceptables de l'arduino pour ne pas l'endommager.

          Par exemple, faire un digitalWrite peut s'avérer très néfaste si la pin est connectée à un moteur qui consomme beaucoup trop par rapport aux 20mA maxi que peut supporter une pin OUTPUT de l'arduino.

          Mais dans le cas d'une petite LED, il n'y a aucune inquiétude.

          Tu pourrais même supprimer le delay et spammer le digitalWrite à la vitesse d'exécution du processeur ;)

          • Partager sur Facebook
          • Partager sur Twitter
            16 janvier 2019 à 12:58:10

            Merci pour la réponse.

            Je passe le sujet en résolu.

            • Partager sur Facebook
            • Partager sur Twitter

            Optimisation digitalWrite...

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown