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 :

Variable BP et LED


Sujet :

Arduino

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2017
    Messages : 41
    Points : 26
    Points
    26
    Par défaut Variable BP et LED
    Bonjour,

    J'ai 3 LED qui brillent en continu et un bouton poussoir.

    Grâce au code ci-dessous, à chaque appui sur mon BP, je joue sur la variable "led" qui me permet d'éteindre ces dernières les unes après les autres. Le souci c'est que, pour se faire, je dois à chaque fois ré-appuyer sur le BP.

    Je souhaiterai jouer sur cette même variable, non pas en ré-appyuant sur le BP, mais en le maintenant en continu pour qu'il y en ait une qui s'éteigne chaque seconde. Ce qui aurait le même effet, mais sans ré-appuyer dessus. Est-ce possible ?

    Merci

    P.S: Mon but étant pas de ne pas recréer cette séquence avec la fonction delay()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    #define RED 12
    #define GREEN 11
    #define BLUE 10
    #define BUTTON 7
    int val = 0;
    int old_val = 0;
    int state = 0;
    int led = 12;
    int newled = 12;
     
     
    void setup ()
    {
      Serial.begin(9600); 
      pinMode (RED, OUTPUT);
      pinMode (GREEN, OUTPUT);
      pinMode (BLUE, OUTPUT);
      pinMode (BUTTON, INPUT);
     
    }
     
     
    void loop ()
    { 
      val = digitalRead (BUTTON);
       if((val == HIGH) && (old_val == LOW))
     
       {
        newled = led - 1; 
         if (newled == 8) { newled = 12; } 
        led = newled;
        delay(100);
       }
     
      old_val = val;
     
      if (led == 12)
      {
        digitalWrite(RED, HIGH);
        digitalWrite(GREEN, LOW);
        digitalWrite(BLUE, LOW);
        delay (100);
        digitalWrite(RED, LOW);
        delay (100);    
      }
     if (led == 11)
      {
        digitalWrite(RED, LOW);
        digitalWrite(GREEN, HIGH);
        digitalWrite(BLUE, LOW);
        delay (100);
        digitalWrite(GREEN, LOW);
        delay (100);    
      }
     if (led == 10)
      {
        digitalWrite(RED, LOW);
        digitalWrite(GREEN, LOW);
        digitalWrite(BLUE, HIGH);
        delay (100);
        digitalWrite(BLUE, LOW);
        delay (100);    
      } 
     if (led == 9)
      {
        digitalWrite(RED, LOW);
        digitalWrite(GREEN, LOW);
        digitalWrite(BLUE, LOW);
      } 
     
      Serial.print ("LED: ");
      if (led == 12) { Serial.println ("RED"); }
      if (led == 11) { Serial.println ("GREEN"); }
      if (led == 10) { Serial.println ("BLUE"); }
      if (led == 9) { Serial.println ("OFF"); }
    }

  2. #2
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonjour ochey54
    Citation Envoyé par ochey54 Voir le message
    P.S: Mon but étant pas de ne pas recréer cette séquence avec la fonction delay()
    Le remplacement de delay() qui est bloquant, se fait en utilisant l'horloge interne de l'Arduino, millis().
    Mais, avant tout, quand on veut faire ce genre de programme avec plusieurs LED, il est bon d'indexer (mettre en tableaux (array)) tout ça pour permettre l'écriture du programme plus aisément. Autre avantage des tableaux, pour ajouter une ou plusieurs LED, il suffit d'en ajouter les paramètres, rien à faire dans le corps du programme.

    Ainsi pour les pins des LED:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int ledPins[] = {12, 11, 10};
    Ce qui simplifie l'initialisation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	for(int i = 0; i < ledNombre; i++)                     // Boucle avec chaque LED (de ledRed à ledBlue)
    	{
    		pinMode (ledPins[i], OUTPUT);                      // En sortie
    		digitalWrite(ledPins[i], HIGH);                    // Allumée
    	}
    Pour éteindre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    		digitalWrite(ledPins[ledEnCours], LOW);                                // Extinction de la LED en cours
    et ça donne ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    int ledPins[] = {12, 11, 10};
    enum couleursIndex {ledRed, ledGreen, ledBlue, ledNombre};
    char* couleursNom[] = {"Rouge", "Vert", "Bleu"};
     
    #define BUTTON 7
    int ledEnCours;                                            
    boolean phaseExtinction = false;                           // True si en phase d'extinction
     
    unsigned long ledTempo = 1000;                             // Toutes les secondes
    unsigned long ledTempoStart = millis();                    // Horloge de temporisation
     
    void setup ()
    {
    	Serial.begin(9600);
     
    	for(int i = 0; i < ledNombre; i++)                     // Boucle avec chaque LED (de ledRed à ledBlue)
    	{
    		pinMode (ledPins[i], OUTPUT);                      // En sortie
    		digitalWrite(ledPins[i], HIGH);                    // Allumée
    	}
     
    	pinMode (BUTTON, INPUT);                               // En entrée
     
    }
     
     
    void loop ()
    {
    	if((digitalRead(BUTTON) == HIGH) && !phaseExtinction)                      // Si boutont pressé et pas phase d'extinction
    	{
    		phaseExtinction = true;
    		ledEnCours = ledRed;                                                   // Première LED
    	}
     
    	if(millis()-ledTempoStart >= ledTempo && phaseExtinction)                  // Si temps écoulé et en phase d'extinction
    	{
    		digitalWrite(ledPins[ledEnCours], LOW);                                // Extinction de la LED en cours
     
    		Serial.println("\t\tLed " + (String)couleursNom[ledEnCours] + " OFF");
     
    		ledEnCours ++;                                                         // Led suivante
    		if (ledEnCours >= ledNombre) 
    		{
    			phaseExtinction = false;                                           / Si toutes les LED éteintes
    		}
    		else
    		{
    			ledTempoStart = millis();                                          // (re)Démarrage tempo d'extinction
    		}	
     
    	}
    	//Serial.println("Le programme tourne");
    }
    Une courte pression sur le bouton éteint immédiatement le première LED et, ensuite, chaque secondes éteint la suivante. Pour tout ré allumer, faire un reset.

    Ce n'est certainement pas la seule façon de procéder, mais ça peut donner des idées.

    Bonne journée
    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2017
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    Merci beaucoup pour ta réponse ! Tu m'es d'une grande aide !

    Je voulais juste poser encore une question. Il s'agit là plus de la curiosité. Si j'utilisais mes sorties sur un I2C, comme le MCP23017, comment je pourrais définir leur nom de sortie ?

    Dans ton code tu écris ledPins[] = {12, 11, 10}; Elles correspondent aux sorties de l'Atmega. Mais sur un MCP, comment les définir ?

    Merci encore !

  4. #4
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonjour ochey54
    Citation Envoyé par ochey54 Voir le message
    Dans ton code tu écris "ledPins[] = {12, 11, 10};" Elles correspondent aux sorties de l'Atmega. Mais sur un MCP, comment les définir ?
    La même chose, en utilisant la librairie Adafruit-MCP23017, la numérotation des ports de chaque MCP23017 démarre à 0, pour le reste la syntaxe est identique à celle de l'Arduino pour les ports digitaux sauf qu'il faut ajouter le nom de l'objet (mcp en l'occurence) devant la commande. Le même programme avec quelques adaptions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #include <Wire.h>
    #include <Adafruit_MCP23017.h>
    Adafruit_MCP23017 mcp;
     
    int ledPins[] = {0, 1, 2};
    enum couleursIndex {ledRed, ledGreen, ledBlue, ledNombre};
    char* couleursNom[] = {"Rouge", "Vert", "Bleu"};
     
    #define BUTTON 7
    int ledEnCours;
    boolean phaseExtinction = false;                           // True si en phase d'extinction
     
    unsigned long ledTempo = 1000;                             // Toutes les secondes
    unsigned long ledTempoStart = millis();                    // Horloge de temporisation
     
    void setup ()
    {
    	Serial.begin(9600);
     
    	for(int i = 0; i < ledNombre; i++)                     // Boucle avec chaque LED (de ledRed à ledBlue)
    	{
    		mcp.pinMode (ledPins[i], OUTPUT);                  // En sortie
    		mcp.digitalWrite(ledPins[i], HIGH);                // Allumée
    	}
     
    	pinMode (BUTTON, INPUT);                               // En entrée
     
    }
     
     
    void loop ()
    {
    	if((digitalRead(BUTTON) == HIGH) && !phaseExtinction)                      // Si boutont pressé et pas phase d'extinction
    	{
    		phaseExtinction = true;
    		ledEnCours = ledRed;                                                   // Première LED
    	}
     
    	if(millis()-ledTempoStart >= ledTempo && phaseExtinction)                  // Si temps écoulé et en phase d'extinction
    	{
    		mcp.digitalWrite(ledPins[ledEnCours], LOW);                            // Extinction de la LED en cours
     
    		Serial.println("\t\tLed " + (String)couleursNom[ledEnCours] + " OFF");
     
    		ledEnCours ++;                                                         // Led suivante
    		if (ledEnCours >= ledNombre)
    		{
    			phaseExtinction = false;                                           // Si toutes les LED éteintes
    		}
    		else
    		{
    			ledTempoStart = millis();                                          // (re)Démarrage tempo d'extinction
    		}
     
    	}
    	//Serial.println("Le programme tourne");
    }
    Je n'ai pas pu tester, je n'ai pas ce circuit, je te laisse jouer au jeu des 7 différences (en fait il y en a 6, je crois) pour voire l'adaptation.

    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2017
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    Merci infiniment !

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/07/2002, 13h32
  2. variables locales ou globales ???
    Par elvivo dans le forum C
    Réponses: 13
    Dernier message: 03/07/2002, 08h22
  3. Procédure avec un nombre variable d'arguments
    Par charly dans le forum Langage
    Réponses: 15
    Dernier message: 21/06/2002, 11h08
  4. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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