IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Condition if() Arduino UNO


Sujet :

Arduino

  1. #1
    Membre averti

    Homme Profil pro
    Electronicien
    Inscrit en
    Février 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Electronicien

    Informations forums :
    Inscription : Février 2014
    Messages : 20
    Par défaut Condition if() Arduino UNO
    Bonjour,
    j'ai une question concernant la programmation, voici le code, très simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    unsigned char i=0;
    void setup() {
      // put your setup code here, to run once:
    Serial.begin(9600);
    }
     
    void loop() {
      // put your main code here, to run repeatedly:
      if (i<10) Serial.println(i);
      i++;
      delay (1000);
     
    }
    pourquoi l'incrémentation de la variable global i de type char ne s'arrête pas après 9 si je mets un delay (100) ?
    pour un "delay (1000)" ça fonctionne, mais si par exemple je ne mets pas le "delay()" alors le comptage ne s'arrête pas.

    Merci pour vos retours d'expérience.

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 152
    Billets dans le blog
    47
    Par défaut
    Bonjour,

    Le programme ne s'arrête jamais puisqu'il est dans une boucle infinie loop(). Et quand i atteint 255, il repart à 0.

  3. #3
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 766
    Par défaut
    Hello,

    Derrière un if ne peut se trouver qu'une seule instruction. Donc, quelque soit la valeur de i, le i++ sera effectué. Pour pouvoir mettre plusieurs instructions dans un if (else / for / while / do....while), il faut créer un bloc d'instructions, et donc mettre les instrucitons entre accolades:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void loop(void) {
        if(i<10) {
            Serial.printnl(i);
            ++i;
        }
        delay(1000);
    }

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 893
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 893
    Par défaut
    Un peu plus d'explications :

    la loop tourne sans fin

    votre variable i est de type unsigned char, donc une valeur sur un octet entre 0 et 255

    Comme l'a dit edgarjacobs, votre i++ n'est pas dans le bloc d'instruction lié au if donc il est exécuté en permanence

    ==> les 10 premiers coups (de 0 à 9) on imprime puis on n'imprime plus et i continue d'augmenter (10, 11, 12, ...)

    Quand on atteint 255 et qu'on augmente la valeur on passe à 0 (rollover)

    le if est à nouveau valide et donc on recommence à imprimer de 0 à 9 et ça recommence


    Vous dites
    ne s'arrête pas après 9 si je mets un delay (100) ?
    pour un "delay (1000)" ça fonctionne
    en fait vous voyez que pour 245 incrémentations on n'affichera rien. Si vous faites un délai court, par exemple 10ms, alors en 2.45s vous avez fait le tour du compteur et vous imprimez la suite.
    si vous mettez 1s (1000ms) alors il faut attendre 245 secondes avant que ça recommence. Je suis sûr que vous n'avez pas eu la patience d'attendre, c'est pour cela que vous avez cru que ça marchait






    si vous ne voulez pas mettre d'accolades au if, vous pouvez mettre le ++ dans l'impression

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    unsigned char i = 0;
    void setup() {
      Serial.begin(9600);
    }
     
    void loop() {
      if (i < 10)  Serial.println(i++); // exécution conditionnelle
      delay(100); // toujours exécuté
    }

  5. #5
    Membre averti

    Homme Profil pro
    Electronicien
    Inscrit en
    Février 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Electronicien

    Informations forums :
    Inscription : Février 2014
    Messages : 20
    Par défaut
    Merci à tous les intervenants,

    c'est très clair, je comprends mon erreur. Je dois dire que passer de micropython à C m'a perturbé.
    Je vous suis reconnaissant pour l'aide apportée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Bluetooth Module Pro et Arduino Uno
    Par benimut2012 dans le forum Arduino
    Réponses: 1
    Dernier message: 07/09/2016, 09h09
  2. Réponses: 6
    Dernier message: 30/08/2016, 14h07
  3. Recyclage de clavier d'ordi portable avec Arduino Uno
    Par jeremygosset dans le forum Arduino
    Réponses: 3
    Dernier message: 24/06/2016, 23h58
  4. arduino uno et xbee
    Par rakiii dans le forum Sécurité
    Réponses: 0
    Dernier message: 12/04/2015, 22h19
  5. Acquisition de signal Labview et Arduino uno
    Par zangetsum dans le forum LabVIEW
    Réponses: 2
    Dernier message: 25/03/2014, 13h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo