programmation ARDUINO
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

programmation ARDUINO



  1. #1
    pierrelecap

    programmation ARDUINO


    ------

    Bonjour , je débute avec arduino et je suis en train de construire un dé electronique aléatoire .
    Je m'explique : je veux faire "tourner" un dé constitué de 7 leds . J'appui sur un poussoir , J'active une sortie pour alumer la led N°1 , j'attend une µseconde, j'allume une autre led , j'attend qqs µsec , et ainsi de suite jusqu'a afficher le 6 puis revenir au début . La partie electronique fonctionne et le programme aussi . Mon seul problème est d'arrêter le programme ou il se trouve lorsque je relache le bouton poussoir . j'ai essayé avec " while " mais cela ne fonctionne pas . Quelqu'un a une idée ?

    -----

  2. #2
    umfred

    Re : programmation ARDUINO

    tu peux montrer ton code ? tu rentres comment dans ta boucle d'affichage ? peut-être tester à la fin ou au début l'état de ton bouton et sortir alors de ta boucle si il n'est plus appuyé.

  3. #3
    pierrelecap

    Re : programmation ARDUINO

    merci de votre réponse ,voici mon code :
    le BP est sur l'entrée 7
    void setup()
    {
    pinMode(13, OUTPUT);
    pinMode(0, OUTPUT);
    pinMode(1, OUTPUT);
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);
    pinMode(7, INPUT);
    }
    void loop()
    {
    digitalWrite(0, HIGH);// allumer la led centrale ( 4 )
    digitalWrite(1, LOW);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    delay(600);
    digitalWrite(0, LOW);// eteindre la led 4
    digitalWrite(2, HIGH);// allumer les leds 1 et 7
    delay(600);
    digitalWrite(0, HIGH);// allumer la led 4
    delay(600);
    digitalWrite(0, LOW); // éteindre la led 4
    digitalWrite(3, HIGH);// allumer les leds 3 et 5
    delay(600);
    digitalWrite(0, HIGH);// allumer la led 4
    delay(600);
    digitalWrite(0,LOW);// éteindre la led 4
    digitalWrite(1,HIGH);// alumer les leds 2 et 6
    delay(600);
    }

  4. #4
    umfred

    Re : programmation ARDUINO

    en fait, tu ne testes absolument pas ton bouton dans ton code ^^ je ferai un truc comme ça:
    Code:
    void setup()
    {
        pinMode(13, OUTPUT);
        pinMode(0, OUTPUT);
        pinMode(1, OUTPUT);
        pinMode(2, OUTPUT);
        pinMode(3, OUTPUT);
        pinMode(7, INPUT);
        int Valeur=1;
        int nextValeur=Valeur;
    }
    void loop()
    {
        if(digitalRead(7) == LOW) // état appuyé (mettre HIGH si c'est l'inverse)
        {
            switch(Valeur)
            {
                case 1:  // on affiche le 1
                     digitalWrite(0, HIGH);// allumer la led centrale ( 4 )
                     digitalWrite(1, LOW);
                     digitalWrite(2, LOW);
                     digitalWrite(3, LOW);
                     nextValeur=2;
                     break;
                case 2:
                    digitalWrite(0, LOW);// eteindre la led 4
                    digitalWrite(2, HIGH);// allumer les leds 1 et 7
                    nextValeur=3;
                    break;
                case 3:
                    digitalWrite(0, HIGH);// allumer la led 4
                    nextValeur=4;
                    break;
                case 4:
                    digitalWrite(0, LOW); // éteindre la led 4
                    digitalWrite(3, HIGH);// allumer les leds 3 et 5
                    nextValeur=5;
                    break;
                case 5:
                    digitalWrite(0, HIGH);// allumer la led 4
                    nextValeur=6;
                    break;
                case 6:
                    digitalWrite(0,LOW);// éteindre la led 4
                    digitalWrite(1,HIGH);// alumer les leds 2 et 6
                    nextValeur=1;
                    break;
            }
            delay(600);
            Valeur=nextValeur;
        }
    }
    Je mettrai peut-être aussi dans chaque cas, l'état des 6 leds (et non juste les changements), comme ça je pourrais partir de n'importe quelle valeur avec l'appel à random(1,7) au début (long Valeur=random(1,7); long nextValeur=Valeur; )

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

    Re : programmation ARDUINO

    dans le code que j'ai envoyé je ne tiens pas compte de mon BP , c'est juste pour expliquer ma logique .
    je ne connais pas la commande switch . pourquoi as tu introduit un BREAK ?
    mais je vais essayer , sans comprendre , cest dommage.
    et puis je ne peux pas utiliser ramdom , car il y aurait possibilité d'avoir un 7 ( les 7 leds allumées ...)
    Dernière modification par pierrelecap ; 20/10/2020 à 17h57.

  7. #6
    pierrelecap

    Re : programmation ARDUINO

    voila ce qu'il me répond :

    In function 'void loop()':
    19:16: error: 'Valeur' was not declared in this scope
    26:18: error: 'nextValeur' was not declared in this scope
    53:9: error: 'Valeur' was not declared in this scope
    53:16: error: 'nextValeur' was not declared in this scope
    exit status 1

    j'avoue mon incompétence , je vais potasser arduino pour les nuls , je pensai à une condition simple comme while ou alors if,else mais je ne sais pas ou les inserer dans le programme .

  8. #7
    umfred

    Re : programmation ARDUINO

    ah oui, boulette de ma part, il faut déclarer Valeur et nextValeur en global (donc avant les fonctions) pour quelles soient visibles par les 2 fonctions
    Code:
    int Valeur;
    int nextValeur;
    void setup()
    {
        ...
        Valeur=1;
        nextValeur=Valeur;
    }
    void loop()
    {
        ....
    }
    Sans le break, on continuerai d'exécuter les autres cas, hors ce n'est pas ce que l'on veut
    Ton but c'est de t'arrêter sur une valeur, il faut donc sur le principe, tester avant de modifier l'affichage si le bouton est appuyé (si le bouton est appuyé, on fait la modification, sinon on ne fait rien)
    Plutôt que faire ça linéairement et répéter plusieurs fois les mêmes lignes, on fait une boucle qui dit: si le bouton est appuyé, je modifie les leds selon la valeur, je prépare la valeur suivante;
    pour le random, random(1,7) donne une valeur entre 1 et 6. Et c'est aussi pour ça que j'ai précisé que dans ce cas, je mettrais l'état des 7 leds à chaque état (comme ça, je ne dépend pas de l'état précédent des leds) (et soyons fous, on pourrait imager que l'on passe alors d'une valeur aléatoire à une valeur aléatoire sans souci)
    Dernière modification par umfred ; 20/10/2020 à 18h53.

  9. #8
    pierrelecap

    Re : programmation ARDUINO

    merci UMFRED , je comprend ton raisonement , je l'ai essayé mais il ne fonctionne pas . pas de message d'erreur mais aucune led ne s'allume .
    je cherche surtout a arreter le déroulement du programme quand je veux , par l'intermediaire d'un BP ou autre . dans mon exemple , j'ai mis 600ms pour le voir defiler , mais lorsque j'aurais réussi , je descendrais le delay à environ 10 ms ainsi , quand le BP sera actionné l'oeil verra toute les leds allumées puis en relachant le BP , seules qqe leds seront allumées .

  10. #9
    polo974

    Re : programmation ARDUINO

    Citation Envoyé par pierrelecap Voir le message
    dans le code que j'ai envoyé je ne tiens pas compte de mon BP , c'est juste pour expliquer ma logique .
    je ne connais pas la commande switch . pourquoi as tu introduit un BREAK ?
    ...
    le switch est une sorte d'aiguillage multiple, MAIS attention, on ne sort du switch que par un break ou en arrivant tout au bout ! ! !
    (en fait, on peut aussi en sortir par un return, mais j'aime moyennement semer des return au milieu du code (question de goût))

    la syntaxe:

    Code:
    switch(expression_entiere) 
    { 
    /* teste expression_entiere et branche à l'endroit correspondant ou si case pas prévu, au default s'il existe */
    case 1: /* case x: est un point de branchement, c'est juste un label */
    case 2: /* ici, soit on arrive soit par branchement car ça vaut 2, soit on arrive de la ligne avant (où ça valait 1) */
        bidule1ou2();
        /* attention, sans break, on continue ! ! ! */
    case 3: 
        { /* bloc pour isoler une variable */
          int x = expression_entiere * 57 + 13; /* x n'est visible que dans ce bloc */
          bidule1ou2ou3(x);
          
          break; /* bon, là on sort du switch */
        }
    case 5:
        bidule5(); 
        break; /* ici aussi, on sort du switch */
    default: /* pas obligatoire, mais ... */
        bidule_pas_prevu_avant();
        /* ici, on est au bout, le break n'est pas utile, on sort ... */
    }
    les case x: sont des points d'entrée MAIS PAS DES POINTS DE SORTIE DU CASE PRÉCÉDENT !!!
    POUR SORTIR, IL FAUT UN BREAK (ou arriver au bout du bloc switch) (ou un return, mais j'aime pas).

    on peut voir qu'il y a un bloc après le case 3:, c'est souvent décoratif, sauf comme ici, à y déclarer des variables dont le scope y est restreint (au bloc).

    euh, bien sûr, s'il y a une autre boucle ou un autre switch imbriqué, le break ne sort que du niveau courant, si on veut "breaker" plusieurs niveaux, il faut le coder explicitement (et si c'est conditionnel, il faut une variable et des tests...).

    pour la présentation (indentation), perso, je mets les case x: au même niveau que le switch, et j'indente le reste. d'autres indentent une fois pour le case et une autre fois pour le reste... alors si en plus, ils mettent systématiquement un bloc "décoratif", ça indente beaucoup...


    sinon, on trouve la doc sur internet:
    https://en.cppreference.com/w/c/language/switch
    https://en.cppreference.com/w/cpp/language/switch
    Dernière modification par polo974 ; 21/10/2020 à 05h41.
    Jusqu'ici tout va bien...

  11. #10
    pierrelecap

    Re : programmation ARDUINO

    merci beaucoup pour vos réponses , mais je crois que je me suis trompé de forum , je suis vraiment débutant . je voulai juste savoir si on peut interrompre un programme avec un interrupteur ...
    Je pense que ce language ne s'apprend pas en un jour , je vais persevérer .
    je vais essayer un truc dans ce genre :
    if (digitalRead (7==HIGH))
    .
    .
    .
    else BREAK

  12. #11
    umfred

    Re : programmation ARDUINO

    Dans ta demande initiale, tu indiquais qu'à l'appui du bouton, tu faisais tourner l'affichage du dé; et tu voulais qu'au relâchement, il s'arrête.
    et c'est ce que j'ai indiqué dans mon code en #4:
    le if(digitalRead(7)==LOW) est censé lire l'état du bouton et la condition est vrai si bouton appuyé (je supposait que dans ce cas-là, l'entrée 7 est à 0=LOW) et j'ai aussi indiqué en commentaire que si l'entrée 7 est à 1 si le bouton est appuyé, il fallait mettre HIGH au lieu de LOW.
    Le else n'est pas nécessaire puisque si la condition est fausse, il ne fera rien (peut-être sortir le delay(600) du if (à la limite)

Discussions similaires

  1. [Programmation] Programmation arduino
    Par Kareivis dans le forum Électronique
    Réponses: 5
    Dernier message: 27/11/2015, 18h44
  2. Programmation Arduino
    Par powerPic dans le forum Électronique
    Réponses: 3
    Dernier message: 05/05/2015, 23h34
  3. programmation arduino
    Par mayabe dans le forum Électronique
    Réponses: 1
    Dernier message: 26/01/2015, 20h41
  4. Programmation arduino !!
    Par ParraDarocha dans le forum Électronique
    Réponses: 15
    Dernier message: 10/04/2014, 18h59
  5. Programmation Arduino
    Par Gamekey dans le forum Électronique
    Réponses: 0
    Dernier message: 04/05/2013, 20h36