Site icon AranaCorp

Pilotez 3 leds avec Arduino et un bouton

3.4
(5)

L’un des moyens les plus efficaces pour commencer l’apprentissage de la programmation et de l’électronique avec Arduino est l’utilisation de LEDs. Nous allons voir dans ce tutoriel comment contrôler des LEDs et comment activer plusieurs fonctions à l’aide d’un bouton poussoir. Cela résume bien ce qui peut être trouvé dans un robot: le cerveau (carte Arduino), les capteurs (le bouton) et les sorties (LEDs) qui peuvent représenter des moteurs, par exemple.

Matériel

Objectif

Nous allons définir plusieurs fonctions qui feront s’allumer les LEDs de manière différentes en fonction des actions sur le bouton poussoir. C’est le principe même (simplifié) de la programmation en robotique: effectuer une action en fonction des informations provenant des capteurs.

Schéma de câblage

Le bouton est branché sur la pin 8, la LED1 sur la pin 9, lED2 sur la pin 10 et LED3 sur la pin 11. Notez bien la présence des résistances pour éviter d’endommager les composants. Selon les composants utilisés ces résistances ne sont pas toujours nécessaires. Vérifiez les spécifications techniques de vos composants.

Code

La fonction utilisée pour contrôler une diode est digitalWrite() avec comme paramètre HIGH pour l’allumer, LOW pour l’éteindre.

  digitalWrite(led1Pin,HIGH);
  delay(30);
  digitalWrite(led1Pin,LOW);
  delay(30);

Il est aussi possible de moduler la luminosité de la LED en utilisant la fonction analogWrite().

  int brightness = 0; 
  int fadeAmount = 5;   

 for (brightness=0;brightness<=255;brightness+=fadeAmount){
    analogWrite(led1Pin, brightness);
    delay(30);  
  }

Ces fonctions de base sont utilisées dans les exemples Blink et Fade de l’IDE Arduino. A l’aide de celles-ci, nous pouvons créer plusieurs fonctions pour piloter les LEDs différemment selon le mode sélectionné.

Pour lire l’état d’un bouton, la fonction utilisée est généralement digitalRead(). Ici, nous voulons que le bouton puisse activer plusieurs fonctions. Pour cela, nous allons compter le nombre de fois que le bouton est appuyé. Nous utilisons donc la fonction pulseIn() qui permet de mesurer la longueur d’une impulsion.

unsigned long buttonState = 0;
int funcState=0;

void buttonPressed() {
    buttonState = pulseIn(btnPin,HIGH,1000000);
    if (buttonState > 50){
      funcState += 1;
      Serial.print("Button state n: ");
      Serial.println(funcState);
    }
    funcState=funcState%NBSTATE;
  }

La variable funcState contiendra le mode sélectionné. Il nous suffit ensuite de définir ces modes et d’y associer les fonctions correspondantes. Nous utilisons pour cela les mot clé enum, qui permet de créer facilement une liste d’entier, et switch..case, qui permet de d’exécuter un code en fonction d’une variable.

enum fcnMode { 
  OFF, 
  LED1, 
  LED2, 
  LED3,
  FADE1, 
  ALL,
  BLINK,
  NBSTATE
  }; // OFF = 0 and NBSTATE=7

  switch(funcState){
    case OFF:
    break;
    case LED1:
      digitalWrite(led1Pin,HIGH);
    break;
    case LED2:
      digitalWrite(led2Pin,HIGH);
    break;
    case LED3:
       digitalWrite(led3Pin,HIGH);
    break;
    case FADE1:
      fade1();
      break;
    case ALL:
      digitalWrite(led1Pin,HIGH);
      digitalWrite(led2Pin,HIGH);
      digitalWrite(led3Pin,HIGH);
    break;
    case BLINK:
      blinkLed1();
      blinkLed2();
      blinkLed3();
    break;
  }

Code complet

Voici le code complet que vous pouvez adapter à votre projet.

// Pin assignement
const int btnPin = 8;
const int led1Pin = 9;
const int led2Pin = 10;
const int led3Pin = 11;

enum fcnMode {
  OFF,
  LED1,
  LED2,
  LED3,
  FADE1,
  ALL,
  BLINK,
  NBSTATE
}; // OFF = 0 and NBSTATE=7

int ledState1 = LOW, ledState2 = LOW, ledState3 = LOW;           // ledState used to set the LED
unsigned long buttonState = 0;
int funcState = 0;
unsigned long currentMillis1, currentMillis2, currentMillis3;      // will store current time
unsigned long previousMillis1, previousMillis2, previousMillis3;      // will store last time LED was updated
const long interval1 = 100;           // interval at which to blink (milliseconds)
const long interval2 = 300;
const long interval3 = 500;
/******************************************************************\
  PRIVATE FUNCTION: setup

  PARAMETERS:
  ~ void

  RETURN:
  ~ void

  DESCRIPTIONS:
  Initiate inputs/outputs

  \******************************************************************/
void setup() {
  Serial.begin(9600); // initialize serial port
  pinMode(btnPin, INPUT_PULLUP);
  pinMode(led1Pin, OUTPUT);
  pinMode(led2Pin, OUTPUT);
  pinMode(led3Pin, OUTPUT);
}

/******************************************************************\
  PRIVATE FUNCTION: loop

  PARAMETERS:
  ~ void

  RETURN:
  ~ void

  DESCRIPTIONS:
  Main Function of the code
  \******************************************************************/
void loop() {
  buttonPressed();
  setMode();
}

/******************************************************************
  SUBFUNCTIONS
  \******************************************************************/
void buttonPressed() {
  buttonState = pulseIn(btnPin, HIGH, 1000000);
  if (buttonState > 50) {
    funcState += 1;
    Serial.print("Button state n: ");
    Serial.println(funcState);
  }
  funcState = funcState % NBSTATE;
}
void setMode() {
  // All Off
  digitalWrite(led1Pin, LOW);
  digitalWrite(led2Pin, LOW);
  digitalWrite(led3Pin, LOW);

  Serial.print("Function : ");
  Serial.println(funcState);

  switch (funcState) {
    case OFF:
      break;
    case LED1:
      digitalWrite(led1Pin, HIGH);
      break;
    case LED2:
      digitalWrite(led2Pin, HIGH);
      break;
    case LED3:
      digitalWrite(led3Pin, HIGH);
      break;
    case FADE1:
      fade1();
      break;
    case ALL:
      digitalWrite(led1Pin, HIGH);
      digitalWrite(led2Pin, HIGH);
      digitalWrite(led3Pin, HIGH);
      break;
    case BLINK:
      blinkLed1();
      blinkLed2();
      blinkLed3();
      break;
  }
}

void fade1() {
  int brightness = 0;
  int fadeAmount = 5;

  for (brightness = 0; brightness <= 255; brightness += fadeAmount) {
    analogWrite(led1Pin, brightness);
    delay(30);
  }
  for (brightness = 255; brightness >= 0; brightness -= fadeAmount) {
    analogWrite(led1Pin, brightness);
    delay(30);
  }

}
void blinkLed1() {
  currentMillis1 = millis();
  if (currentMillis1 - previousMillis1 >= interval1) {
    // save the last time you blinked the LED
    previousMillis1 = currentMillis1;
    // if the LED is off turn it on and vice-versa:
    if (ledState1 == LOW) {
      ledState1 = HIGH;
    } else {
      ledState1 = LOW;
    }
    // set the LED with the ledState of the variable:
    digitalWrite(led1Pin, ledState1);
  }
}

void blinkLed2() {
  currentMillis2 = millis();
  if (currentMillis2 - previousMillis2 >= interval2) {
    // save the last time you blinked the LED
    previousMillis2 = currentMillis2;
    // if the LED is off turn it on and vice-versa:
    if (ledState2 == LOW) {
      ledState2 = HIGH;
    } else {
      ledState2 = LOW;
    }
    // set the LED with the ledState of the variable:
    digitalWrite(led2Pin, ledState2);
  }
}

void blinkLed3() {
  currentMillis3 = millis();
  if (currentMillis3 - previousMillis3 >= interval3) {
    // save the last time you blinked the LED
    previousMillis3 = currentMillis3;
    // if the LED is off turn it on and vice-versa:
    if (ledState3 == LOW) {
      ledState3 = HIGH;
    } else {
      ledState3 = LOW;
    }
    // set the LED with the ledState of the variable:
    digitalWrite(led3Pin, ledState3);
  }
}

N’hésitez pas à laisser un commentaire pour partager vos réalisations ou nous faire part de vos remarques. Vous pouvez aussi nous contacter pour toutes questions.

Application

Source

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie

How useful was this post?

Click on a star to rate it!

Average rating 3.4 / 5. Vote count: 5

No votes so far! Be the first to rate this post.

Quitter la version mobile