Inverser l'état de plusieurs dels

Bonjour à tous,

Mon projet consiste à inverser l’état de 3 dels à l’appui d’un bouton. Les 3 dels n’ont pas le même état.

J’ai fait quelques recherches sur internet mais je n’ai rien trouvé concernant plus de 2 dels.

Alors voila, j’ai monté un sketch mais il fonctionne une fois sur 2.

Il est évident qu’il manque quelques choses, peut-être une variable pour stocker l’état?

Si quelqu’un peut m’aider à débugger ce mini programme, j’en serais très heureux.

int led1 = 7;
int led2 = 6;
int led3 = 5;

int bouton1 = A0;
int bouton2 = A1;



void setup()
{

  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);

  //Verifier l'etat des leds

  digitalWrite(led1, HIGH);
  digitalWrite(led2, HIGH);
  digitalWrite(led3, HIGH);
  delay(500);
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  delay(500);


  //Au depart, seule la led1 est allumée

  digitalWrite(led1, HIGH);
}
void loop()
{
  if (digitalRead(bouton1) == HIGH) //bouton1 appuyé
  { if (digitalRead(led1) == LOW) 
    {
      digitalWrite(led1, HIGH);
    }
    else
    {
      digitalWrite(led1, LOW);
    }

    if (digitalRead(led2) == LOW) 
    {
      digitalWrite(led2, HIGH);
    }
    else
    {
      digitalWrite(led2, LOW);
    }

    if (digitalRead(led3) == LOW) 
    {
      digitalWrite(led3, HIGH);
    }
    else
    {
      digitalWrite(led3, LOW);
    }

  }
}

Bonjour.

Je dirais 3 variables pour stocker les 3 états des leds.

Au lieu de tester l'état du bouton, il serait plus simple d'utiliser une interruption.

Pour inverser l'état d'une variable booléenne, pas besoin de la tester avant:

monBooleen = 1 - monBooleen

Bonjour ick210

A0 et A1 sont des entrées analogiques. Après , il faudrait vérifier votre câblage.

Je vous suggère de commencer avec une seule Led puis une Led et un bouton. N'oubliez pas que la loop va boucler à 16Mhz.

Cordialement, bidouilleelec

Heu: Leds ou dels ?

Bonjour,

Le problème est que tu testes l'état du bouton alors qu'il faudrait tester le changement d'état en testant aussi l'état précédent. Ce qui donne

void loop()
{
  static byte etatPrecBouton1=LOW;  // état précédent du bouton
  byte etatBouton1=digitalRead(bouton1);
  
  if (etatBouton1==HIGH && etatPrecBouton1==LOW) //bouton1 vient d'être appuyé
  { if (digitalRead(led1) == LOW)
    {
      digitalWrite(led1, HIGH);
    }
    else
    {
      digitalWrite(led1, LOW);
    }

    if (digitalRead(led2) == LOW)
    {
      digitalWrite(led2, HIGH);
    }
    else
    {
      digitalWrite(led2, LOW);
    }

    if (digitalRead(led3) == LOW)
    {
      digitalWrite(led3, HIGH);
    }
    else
    {
      digitalWrite(led3, LOW);
    }
  }
  etatPrecBouton1=etatBouton1;
  delay(20);        // anti rebond
}

digitalRead() sur une déclarée en sortie, ça fonctionne ? Logiquement oui, mais j'aurais pas osé

bidouilleelec: A0 et A1 sont des entrées analogiques.

en fonction secondaire, oui. Sinon ce sont des broches digitales, utilisables comme le reste des broches digitales.

Heu: Leds ou dels ?

DEL = diode électro luminescente LED = light emissing diode

Del c'est du français, led c'est de l'anglais US, pour une fois que quelqu'un parle français il se fait reprendre ! Vous devriez plutôt suivre son exemple :)

PS : A0 jusqu'à A5 s'appellent aussi officiellement dans l'IDE arduino "14 à 19" et sont primitivement des entrées numériques comme toutes les autres. Ce n'est qu'en activant la fonction analogRead(Ax) qu'elles basculent sur leur seconde fonction qui est la mesure analogique. Idem A4 et A5 deviennent SDA et SCL quand la bibliothèque Wire est activé Idem D0 et D1 deviennent Rx et Tx quand la liaison série est activé Idem pour les pins PWM qui ne le sont que quand la PWM est activée par analogWrite(x) Idem pour D10, D11, D12, D13 qui deviennent les pins pour le SPI quand le SPI est activé

Seules A6 et A7 sur les cartes équipées d'un 328P en boîtier CMS 32 broches (nano, mini-pro et certains clones de UNO) ne sont pas reliées à un port numérique et sont exclusivement des entrées analogiques.

68tjs: A0 jusqu'à A5 s'appellent aussi officiellement dans l'IDE arduino "14 à 19"...

Ce n'est valable que pour les cartes UNO et autres cartes avec atmega328. Ce n'est pas valable pour les cartes avec d'autres processeurs comme la Mega ou la Leonardo Il vaut beaucoup mieux utiliser A0 à A5.

Merci pour vos réponses.

Kamill,

J'ai utilisé votre solution mais voici ce qui se passe:

Le del1 fonctionne bien - il suit les commandes

Les autres dels clignotent sans arrêt même sans toucher au bouton et ne répondent pas à celui-ci lorsque poussé.

Quel correctif apporter?

Bonjour,

Heu: Leds ou dels ?

DEL = diode électro luminescente LED = light emissing diode

Del c'est du français, led c'est de l'anglais US, pour une fois que quelqu'un parle français il se fait reprendre ! Vous devriez plutôt suivre son exemple :)

OUPS! J'ai écrit une bêtise. Toutes mes excuses. Et en plus je le savais. So sorry :-)

Cordialement, bidouilleelec

@ kamill Bien sur que 14 à 19 n'est valable que le 328p, c'était une façon d'insister sur le fait qu'arduino ( ou Wiring) a quand même prévu de les utiliser en pures I/O numériques

Nick210: J'ai utilisé votre solution mais voici ce qui se passe:

Le del1 fonctionne bien - il suit les commandes

Les autres dels clignotent sans arrêt même sans toucher au bouton et ne répondent pas à celui-ci lorsque poussé.

Quel correctif apporter?

Le programme est utra simple et doit fonctionner sans problème. S'il y a problème c'est sans doute un problème hard. Vérifie le cablage. Il y a bien une résistance de pull-down sur ton bouton?

En effet, le code fonctionne très bien. C'est moi qui ai mis trop d'accolades. Maintenant que c'est corrigé, tout est parfait.

Merci encore,