[Programmation] Débutante programation Arduino : optimisation d'un programme
Répondre à la discussion
Affichage des résultats 1 à 12 sur 12

Débutante programation Arduino : optimisation d'un programme



  1. #1
    gwendoline

    Débutante programation Arduino : optimisation d'un programme


    ------

    Bonjour a tous

    Je viens de finir la lecture de cours sur la programmation d'arduino.

    J ai écrit un programme ( gestionnaire de jaccuzi) assez simple je trouve.

    Il fonctionne bien mais j'aurais voulu de l'aide pour le structuration et pour l’amélioration (optimisation) de mon programme

    MERCI a tous d'avance

    Code:
    #include <LiquidCrystal.h>
    
    //declaratioçn des E/S
    const int BPeau = 10;
    const int Seau = 9;
    const int BPair = 8;
    const int Sair = 7;
    const int Sdegre = 6;
    const int Lm35 = 0;
    
    unsigned long tempseau;
    unsigned long tempsair;
    
    
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
    
    char messageeau[8] = ""; //Message eau
    char messageair[8] = ""; //Message air
    char messagetemp[8] = ""; //Message chauffage
    
    int etateau = LOW; //état du bouton d'eau
    int etatair = LOW; //état du bouton d'air
    int niveautemp = 0; //conversion capteur lm35
    int niveaudegre = 0; // donnée en ° C
    int infochauff = 0; // retour d'info sortie de Sdegre
    //les memes variables mais "old" servant de mémoire pour constater un changement
    int etateau_old = LOW; //état du bouton d'eau
    int etatair_old = LOW; //état du bouton d'air
    int niveautemp_old = 0; //conversion capteur lm35
    int infochauff_old =0;// retour d'info sortie de Sdegre
    
    
    void setup()
    {
    
       pinMode(Seau, OUTPUT);
       pinMode(BPeau, INPUT_PULLUP); 
       pinMode(Sair, OUTPUT); 
       pinMode(BPair, INPUT_PULLUP);
       pinMode(Sdegre, OUTPUT);
       pinMode(infochauff,INPUT_PULLUP);
    
       //paramétrage du LCD
        lcd.begin(16, 2); // règle la  taille du LCD
        lcd.noBlink(); //pas de clignotement
        lcd.noCursor(); //pas de curseur
        lcd.noAutoscroll(); //pas de défilement
    }
    
    void loop() {
    
    recupererDonnees(); //commence par récupérer les données des boutons et capteurs
    
     if(niveautemp>= 72 && niveautemp<= 80 )
      {
    
        digitalWrite(Sdegre,HIGH); 
      }
    else
     {
      digitalWrite(Sdegre,LOW); 
     }
    
     
     if ( digitalRead(BPeau) == HIGH )
           {
            tempseau = millis(); // on demarre le comptage
            digitalWrite(Seau,HIGH); // on active la sortie
           }       
          if (millis()-tempseau >= 10000) 
          {
               digitalWrite(Seau,LOW); //on éteint la led         
        
          }     
    
           if ( digitalRead(BPair) == HIGH )
           {
            tempsair = millis(); // on demarre le comptage
            digitalWrite(Sair,HIGH); // on active la sortie
           }       
          if (millis()-tempsair >= 10000) 
          {
               digitalWrite(Sair,LOW); //on éteint la led         
        
          }   
    
            
       
            if(boutonsChanged()) //si un bouton a changé d'état
                updateEcran();
    }
    
    void recupererDonnees()
    {
        //efface les anciens avec les "nouveaux anciens"
        etateau_old = etateau;
        etatair_old = etatair;
        niveautemp_old = niveautemp;
       
    
        etateau = digitalRead(Seau);
        etatair = digitalRead(Sair); 
        niveautemp = analogRead(Lm35);
        infochauff = digitalRead(Sdegre);
        
        niveaudegre = niveautemp *(5.0 / 1023.0 * 100.0);
    
        delay(1); //pour s'assurer que les conversions analogiques sont terminées avant de passer à la suite
    }
    
    
    boolean boutonsChanged()
    {
        if(etateau_old != etateau || etatair_old != etatair || niveautemp_old != niveautemp)
            return true;
        else
            return false;
    }
    
    
    
    void updateEcran()
    {
        
            //prépare les chaines à mettre sur l'écran
            if(etateau)
                sprintf(messageeau,"eau:ON");
            else
                sprintf(messageeau,"eau:OFF");
            if(etatair)
                sprintf(messageair,"air:ON");
            else
                sprintf(messageair,"air:OFF");
           if(infochauff)
                sprintf(messagetemp,"  Tc:ON");
            else
                sprintf(messagetemp,"  Tc:OFF");
        
    
        //on envoie le texte
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print(messageeau);
        lcd.setCursor(0,1);
        lcd.print(messageair);
        lcd.setCursor(8,0);
        lcd.print(messagetemp);
        lcd.setCursor(10,1);
        lcd.print (niveaudegre);
        lcd.setCursor(13,1);
        lcd.print((char)223);
        lcd.setCursor(14,1);
        lcd.print("C");
        
    }

    -----

  2. #2
    gwendoline

    Re : Debitante programation Arduino : optimisation d'un programme

    bonjour

    Personne a de compétence en langage Arduino?

    Merci

  3. #3
    sandrecarpe

    Re : Debitante programation Arduino : optimisation d'un programme

    Salut,
    Il ne s'agit pas d'un "langage arduino" mais de C++
    Le code est clair, lisible, le nom des variables sont bien choisies, c'est bien.

    Quelques remarques pour chipoter :
    - La fonction pinMode() prend en argument deux uint8_t (8 bits), donc autant lui passer en paramètre des variables de type uint8_t et non int, ça prend moins de place
    - Les constantes LOW et HIGH sont des macros qui valent 0 ou 1. On peut donc les stocker dans des variables booleéennes, ça prend moins de place qu'un int
    - Ceci :
    Code:
    boolean boutonsChanged()
    {
        if(etateau_old != etateau || etatair_old != etatair || niveautemp_old != niveautemp)
            return true;
        else
            return false;
    }
    est équivalent à cela :
    Code:
    boolean boutonsChanged()
    {
        return etateau_old != etateau || etatair_old != etatair || niveautemp_old != niveautemp;
        
    }
    - Dans ce genre de test :
    Code:
    if (millis()-tempseau >= 10000)
    Tu compares un unsigned long (le résultat de millis()-tempseau) avec un entier. C'est mieux de comparer la même chose :
    Code:
    if (millis()-tempseau >= 10000UL)
    - N'oublie pas d'initialiser tempseau et tempsair
    Dernière modification par sandrecarpe ; 13/08/2017 à 21h13.

  4. #4
    Jack
    Modérateur

    Re : Debitante programation Arduino : optimisation d'un programme

    Comme toutes les normes du C++ ne sont pas respectées, il est préférable d'en rester au "langage arduino",même s'il en est très proche.
    Je pense même que les programmes arduino sont transformé en C++.
    Dernière modification par Jack ; 13/08/2017 à 21h56.

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

    Re : Debitante programation Arduino : optimisation d'un programme

    Merci pour vos réponses.
    Je suis contente ^^

    Le sujet peut être clos a moins que d'autres personne on autre chose a dire!

  7. #6
    micka_ch

    Re : Débutante programation Arduino : optimisation d'un programme

    Bonjour,

    Je ne sais pas quel arduino tu possède mais j’éviterais les float :

    niveaudegre = niveautemp *(5.0 / 1023.0 * 100.0); -->
    niveaudegre = (niveautemp *500)>>10;

    A peu près équivalent tant que niveautemp < 1024

    C'est une question de gout mais perso j'utilise toujours les {} avec les condition genre :

    if(boutonsChanged()) //si un bouton a changé d'état
    updateEcran();

    -->
    //si un bouton a changé d'état
    if(boutonsChanged()) {
    updateEcran();
    }

    Le sprintf ne sert pas grand chose si ton texte est constant. Autant utiliser un strcpy. D'ailleur le sprintf est gourmand en taille de code, mais je connais pas son implémentation en arduino.

    Sauf erreur tu peux remplacer tes consantes par des #define :
    const int BPeau = 10; -->
    #define BPeau 10

    Il est effectivement préférable de pas utiliser les types standards du C++ mais les définitions uint8_t, int8_t, uin16_t, int16_t, etc
    Dernière modification par micka_ch ; 16/08/2017 à 13h25.

  8. #7
    Jack
    Modérateur

    Re : Débutante programation Arduino : optimisation d'un programme

    niveaudegre = niveautemp *(5.0 / 1023.0 * 100.0);
    Pourquoi 1023? Un convertisseur 10 bits, c'est 1024 valeurs différentes, donc le quantum s'obtient en divisant par 1024.

  9. #8
    antek

    Re : Débutante programation Arduino : optimisation d'un programme

    Citation Envoyé par Jack Voir le message
    Pourquoi 1023? Un convertisseur 10 bits, c'est 1024 valeurs différentes, donc le quantum s'obtient en divisant par 1024.
    Avec 10 bit on compte 1024 nombres 0 à 1023, d'où 1023 intervalles.

  10. #9
    Jack
    Modérateur

    Re : Débutante programation Arduino : optimisation d'un programme

    et c'est reparti ...

    imagine un convertisseur 1 bit avec Vref = 10V
    en sortie du convertisseur on a '0' pour Vin entre 0 et 5V, '1' pour Vin entre 5 et 10V
    Quelle est la valeur du quantum? 5 V ou 10 V

    Reproduit le même raisonnement avec un ADC 2 bits.

    Pour moi, on a q=Vref/2n avec n nombre de bits de l'ADC.

    Bon, dans la réalité, pour ramener l'erreur à 1/2 lsb, le 1er saut s'effectue à q/2 et pas q, mais ça ne change rien à la méthode de calcul du quantum.

    Et si tu n'es toujours pas convaincu, la doc de l'AVR de l'arduino le fera peut-être mieux que moi:
    Page 215, chap 23.7

  11. #10
    antek

    Re : Débutante programation Arduino : optimisation d'un programme

    Citation Envoyé par Jack Voir le message
    et c'est reparti ...
    Oui . . .
    Ma remarque a été faite un peu trop vite en pensant à autre chose . . .

  12. #11
    Jack
    Modérateur

    Re : Débutante programation Arduino : optimisation d'un programme

    Je regrette le "c'est reparti", désolé.

    C'est juste une discussion récurrente que j'ai avec les enseignants de physique appliquée qui divisent généralement par 2N-1. Je leur montre donc la fonction de transfert de nombreux ADC, la valeur de certaines références de tension qui sont des puissance de 2, telles que 2,048V, mais j'ai du mal à les convaincre.

    A leur décharge, il existe des ADC pour lesquels il faut bien diviser par 2N - 1. Il s'agit à priori plutôt d'ADC de grande résolution, type sigma delta.
    Dernière modification par Jack ; 16/08/2017 à 18h40.

  13. #12
    antek

    Re : Débutante programation Arduino : optimisation d'un programme

    Citation Envoyé par Jack Voir le message
    Je regrette le "c'est reparti", désolé.
    Il n'y a pas de quoi !

Discussions similaires

  1. [Programmation] Cherche livre sur la programation Arduino
    Par invitec8cd64cb dans le forum Électronique
    Réponses: 29
    Dernier message: 02/06/2016, 09h29
  2. (Arduino) problème de téléversement de programme Arduino
    Par invite3e4197b0 dans le forum Électronique
    Réponses: 1
    Dernier message: 17/05/2016, 10h28
  3. Programation aide passage arduino/processing (débutant)
    Par invitef52924c3 dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 17/12/2015, 21h58
  4. Optimisation programme - µC 16F688 - CAN
    Par invite58657d44 dans le forum Électronique
    Réponses: 2
    Dernier message: 29/05/2012, 14h19
  5. Programme d'optimisation
    Par invite31b5cbad dans le forum Mathématiques du supérieur
    Réponses: 10
    Dernier message: 17/01/2008, 19h12
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...