Programme 2 capteurs / 3 LEDs

Bonjour,

je viens vers vous car j'ai un léger soucis avec le fonctionnement de mon premier programme + je bloque pour une partie.

Déjà voici le programme (que j'ai récupéré en grande partie sur internet) :

// ******** Déclaration des constants ********//
const int LED_1 = 7;
const int LED_2 = 3;
const int LED_3 = 5;
const int BUTTON_1 = 13;
const int BUTTON_2 = 12;

// ******** Fonction SETUP = Code d'initialisation ********//
void setup(){  
  pinMode(LED_1, OUTPUT);
  pinMode(LED_2, OUTPUT);
  pinMode(LED_3, OUTPUT);
  pinMode(BUTTON_1, INPUT);
  pinMode(BUTTON_2, INPUT);
}

void loop(){
  int b = 1;
  int d = 1;
  int a = digitalRead(13);
  int c = digitalRead(12);

  if(a==b)
  {digitalWrite(7,HIGH);
  }else
  digitalWrite(7, LOW);

  if(c==d)
  {digitalWrite(3,HIGH);
  }else
  digitalWrite(3, LOW);

   if(a==b && c==d) 
  {digitalWrite(5,HIGH);
  }else
  digitalWrite(5, LOW);
}
  • Premièrement, le programme fonctionne comme je le souhaite MAIS lorsque j'active, par exemple, 1s le capteur inductif branché sur le pin12, la LED correspondante va rester allumée 2s (aucun problème avec le capteur branché sur le pin13). J'ai remarqué que ce problème était présent sur les pins 1 à 12.
    J'ai peut-être raté une étape ?

  • Deuxièmement, je voudrais demander au programme de ne pas allumer les LEDs 1 et 2 lorsque la LED 3 s'allume, mais j'ai du mal à voir comment faire.

Merci de votre aide :slight_smile:

À quoi servent b et d ? Pourquoi ne pas utiliser directement HIGH dans les comparaisons ?
Vous donnez des petits noms aux LEDs pourquoi ensuite utiliser des chiffres ?

La pin 13 a une LED attachée (donc peut consommer du courant) et pas les autres - généralement si on peut on évite de la mettre en Input car elle n’a pas tout à fait les mêmes caractèristiques que les autres

Vous nous en dites plus sur vos « boutons » et câblage exact ?

  • Deuxièmement, je voudrais demander au programme de ne pas allumer les LEDs 1 et 2 lorsque la LED 3 s'allume, mais j'ai du mal à voir comment faire.

En commençant par ce test et en mettant les autres tests dans le else de ce premier test

Merci pour la réponse rapide ! :o

Pour répondre :
À quoi servent b et d ? Pourquoi ne pas utiliser directement HIGH dans les comparaisons ?
Vous donnez des petits noms aux LEDs pourquoi ensuite utiliser des chiffres ?
Je n'aurai pas trop de réponse pour ça, il s'agit de mon tout premier programme. Je me suis basé sur un programme que j'ai trouvé sur internet, donc il pouvait contenir des erreurs ^^'

Vous nous en dites plus sur vos « boutons » et câblage exact ?
Les "boutons" sont des capteurs inductifs que j'alimente avec la sortie 5V de l'Arduino Nano (j'avais oublié de préciser qu'il s'agissait d'un Nano, si ça peut aider).

Voilà un schéma (je crois pas m'être trompé en le recopiant). Il peut y avoir des (graves) erreurs, j'en suis totalement conscient ahah :

"La pin 13 a une LED attachée (donc peut consommer du courant) et pas les autres - généralement si on peut on évite de la mettre en Input car elle n'a pas tout à fait les mêmes caractèristiques que les autres "
Effectivement, la LED de l'Arduino s'allume quand le pin13 est activé, contrairement aux autres pin. Je pensais que c'était justement anormal qu'elle ne s'allume pas. Mince... ^^

"En commençant par ce test et en mettant les autres tests dans le else de ce premier test"
OK, je vais essayer de voir ça, merci !

EDIT :

"En commençant par ce test et en mettant les autres tests dans le else de ce premier test"

Je viens de tester, voici le nouveau programme (je n'ai pour l'instant pas touché aux noms des LEDs etc, car je ne sais pas trop comment les modifier du coup ^^) :

// ******** Déclaration des constants ********//
const int LED_1 = 7;
const int LED_2 = 3;
const int LED_3 = 5;
const int BUTTON_1 = 13;
const int BUTTON_2 = 12;

// ******** Fonction SETUP = Code d'initialisation ********//
void setup(){  
  pinMode(LED_1, OUTPUT);
  pinMode(LED_2, OUTPUT);
  pinMode(LED_3, OUTPUT);
  pinMode(BUTTON_1, INPUT);
  pinMode(BUTTON_2, INPUT);
}

void loop(){
  int b = 1;
  int d = 1;
  int a = digitalRead(13);
  int c = digitalRead(12);

  if(a==b && c==d)
  {digitalWrite(7,LOW);
  digitalWrite(3,LOW);
  }else
  if(a==b)
  {digitalWrite(7,HIGH);
  }else
  digitalWrite(7, LOW);

  if(c==d)
  {digitalWrite(3,HIGH);
  }else
  digitalWrite(3, LOW);

   if(a==b && c==d)
  {digitalWrite(5,HIGH);
  }else
  digitalWrite(5, LOW);
}

Est-il bon ?
Il fonctionne presque : la LED liée au capteur sur le pin13 s'éteint bien, mais pas celle liée au capteur sur le pin12...

Tout ce problème de pin12 doit donc être lié... ^^

Merci pour votre aide :slight_smile:

Comme vous avezconst int LED_1 = 7; // serait encore mieux en const byteau lieu d’écriredigitalWrite(7,LOW);il vaut mieux pour la lisibilité écriredigitalWrite(LED_1,LOW);idem pour les autres

Comme un digitalRead() retourne HIGH ou LOW, et au lieu de déclarer ses variables qui valent 1 pour b et d puis faireif(a==b && c==d) {...autant écrireif(a==HIGH && c==HIGH) {...

Votre else du premier if ne contient pas les deux autres tests mais qu’un seul

if (condition1) {
  ...
} else {
  //======== TOUT DANS LE ELSE ========
  if (condition2) {
    ...
  } else {
    ...
  } 

  if (condition3) {
    ...
  } else {
    ...
  } 
  // ==========================
} // fin condition1

Super, merci beaucoup J-M-L !

Voici mon nouveau programme (j'espère avoir bien appliqué tes conseils !) :

// ******** Déclaration des constants ********//
const int LED_1 = 7;
const int LED_2 = 3;
const int LED_3 = 5;
const int BUTTON_1 = 10;
const int BUTTON_2 = 12;

// ******** Fonction SETUP = Code d'initialisation ********//
void setup(){  
  pinMode(LED_1, OUTPUT);
  pinMode(LED_2, OUTPUT);
  pinMode(LED_3, OUTPUT);
  pinMode(BUTTON_1, INPUT);
  pinMode(BUTTON_2, INPUT);
}

void loop(){
  int a = digitalRead(BUTTON_1);
  int b = digitalRead(BUTTON_2);

if(a==HIGH && b==HIGH){
  digitalWrite(LED_1,LOW);
  digitalWrite(LED_2,LOW);
  digitalWrite(LED_3,HIGH);
}else{
  if(a==HIGH){
  digitalWrite(LED_1,HIGH);
  digitalWrite(LED_3,LOW);
  }else{
  digitalWrite(LED_1, LOW);
  }
  if(b==HIGH){
  digitalWrite(LED_2,HIGH);
  digitalWrite(LED_3,LOW);
  }else{
  digitalWrite(LED_2, LOW);
  }
  }
}

J'ai eu un peu de mal à savoir où placer la condition pour éteindre la LED_3, mais ça fonctionne comme ça en tout cas :slight_smile:

Il ne me reste plus qu'à résoudre ce soucis de LED qui ne s'éteignent pas tout de suite après l'ouverture du capteur...
J'ai l'impression qu'il s'agit d'interférences, c'est possible ? J'ai trouvé ce sujet à propos de ça. Je pense que je suis dans la même situation...
Une idée ? Placer une résistance juste avant les pin 10 et 12 ? :slight_smile:

Et autre petit question, je risque de devoir alimenter mes 2 capteurs avec une pile 9V (question de simplicité...), est-ce que je dois mettre une résistance en sortie de signal du capteur avant de le faire rentrer dans l'Arduino ? Si oui, de quelle valeur ?

Merci beaucoup en tout cas, j'ai bien avancé là ! :slight_smile:

J'ai eu un peu de mal à savoir où placer la condition pour éteindre la LED_3, mais ça fonctionne comme ça en tout cas :slight_smile:

il faut écrire une table de vérité sur vos éléments de conditions ici vous avez a et b qui peuvent être HIGH ou LOW. Soit vous testez les 4 possibilités (HH, HL, LH, LL) qui sont mutuellement exclusives donc des else entre chaque test, soit vous regroupez et c'est ça qui vous donne comment mettre les if - else

vous avez un lien sur vos capteurs ?

J-M-L:
il faut écrire une table de vérité sur vos éléments de conditions ici vous avez a et b qui peuvent être HIGH ou LOW. Soit vous testez les 4 possibilités (HH, HL, LH, LL) qui sont mutuellement exclusives donc des else entre chaque test, soit vous regroupez et c'est ça qui vous donne comment mettre les if - else

Ok merci, j'étudierai ça !

Un lien ? Une doc ? Je les ai acheté sur Amazon (ceux-là, PNP 3 fils). Mais aucune doc PDF ou autre.

6-36V (oui je sais l'Arduino délivre du 5V, c'est aussi pour ça que je veux utiliser un pile 9V... ^^)
300mA

Mais je me demande si ça vient des capteurs car si je les branche en direct sur les LEDs ça fonctionne très bien, aucune "latence" lors de l'extinction des LEDs.

Vos LEDs tirent du courant donc s'il y a une petite accumulation d'énergie dans le capteur, elle est mangée par la LED. Quand une entrée est en INPUT elle a une résistance super élevée et donc ne va rien consommer et il se peut donc que le capteur mette un peu de temps à se décharger.

Si vous faites tourner ce programme

const byte BUTTON_1 = 10;

void setup() {
  Serial.begin(115200);
  pinMode(BUTTON_1, INPUT);
}

void loop()
{
  if (digitalRead(BUTTON_1) == HIGH) Serial.println("HIGH");
  else Serial.println("LOW");
}

et que vous ouvrez la console série à 115200 bauds et que vous touchez le bouton, est-ce que le HIGH/LOW qui défilent dans la console changent de manière instantanée ?

Le LOW -> HIGH se fait instantanément.

Mais le HIGH -> LOW ne l'est pas, effectivement ! Ça alterne pendant quelques instants entre HIGH et LOW, d'où le petit clignotement de la LED avant de s'éteindre.

essayez avec ce code là:

const byte BUTTON_1 = 10;

void setup() {
  Serial.begin(115200);
  pinMode(BUTTON_1, INPUT_PULLUP);
}

void loop()
{
  if (digitalRead(BUTTON_1) == HIGH) Serial.println("RIEN");
  else Serial.println("COUCOU");
}

Là pour le coup il reste bloqué sur le RIEN et n'affiche pas COUCOU

OK donc à ne pas utiliser avec un pull-up

essayez de mettre un pull-down sur la ligne

Donc si je comprends bien, mettre un pull-down c'est ajouter une résistance (j'ai mis un 5K1 Ohm)?

J'ai donc fait comme ça :

Et ça fonctionne nickel ! Tout est bon ?

Et concernant mon autre interrogation, tu aurais une réponse ? Je risque de devoir alimenter mes 2 capteurs avec une pile 9V, est-ce que je dois mettre une résistance en sortie de signal du capteur avant de le faire rentrer dans l'Arduino ? Si oui, de quelle valeur ?

Et encore merci ! :slight_smile:

oui pour le pull down c'est bien. la résistance pourrait sans doute être moindre mais si ça répond comme vous voulez c'est le principal

Je risque de devoir alimenter mes 2 capteurs avec une pile 9V,

Pourquoi devez vous "risquer" ? pourquoi 9V et pas un autre type d'alimentation ?

je ne connais pas le capteur mais sur la fiche ils disent "Tension de travail: DC 6-36V" --> vous aurez en sortie la tension d'entrée. Si vous voulez revenir dans les clous pour un arduino, il faudrait éventuellement un pont de résistance pour passer de 9V vers 4.5 par exemple (qui sera lu comme HIGH). Mais pourquoi alimenter en 9V ? comment sera alimenté l'arduino?

Ce serait surtout une question de simplicité. Dans mon projet final, le câblage sera caché donc je me dis que ça peut-être bien d'avoir accès à l'alimentation des capteurs. Et comme il est indiqué 6V-36V pour les capteurs et que je les alimente pour l'instant avec les 5V de l'Arduino, cela ne craint pas pour les capteurs ? (en tout cas ils fonctionnent très bien comme ça...).
Après si je peux laisser les capteurs sur l'alimentation de l'Arduino, c'est tout aussi simple effectivement. Je contrôle tout avec l'alim de l'Arduino, ce serait le top !

Après je dis "pile 9V" car je trouve que c'est assez simple à mettre en place mais si tu as une alternative meilleure, je suis preneur ! :slight_smile:

Bonne question pour l'Arduino, mais je voudrais que ce soit une alimentation externe autre que via le câble USB (au pire je prend un Uno si besoin)

vu qu'il faut tirer des fils de toutes façons entre l'Arduino et le capteur et qu'il faut alimenter l'arduino, je ne vois pas trop l'intérêt de séparer les alimentations dans ce cas. passer deux ou trois fils ça ne change pas grand chose.. j'ai raté un truc ?

Vous pouvez alimenter votre Nano (si c'est un officiel) avec une tension de 7 à 12V (recommendé) et entre 6 et 20V pour Vin - mais si votre capteur fonctionne bien et de manière stable en 5V quand même autant rester sur du simple.

J-M-L:
vu qu'il faut tirer des fils de toutes façons entre l'Arduino et le capteur et qu'il faut alimenter l'arduino, je ne vois pas trop l'intérêt de séparer les alimentations dans ce cas. passer deux ou trois fils ça ne change pas grand chose.. j'ai raté un truc ?

Non c'est vrai, je vais pas m'embêter dans ce cas.. ^^

Il s'agit de ce Nano. C'est indique "5V ~ 12V DC & pile 9V " donc ça devrait le faire ! :slight_smile:

Une pile 9V (type alcaline) a une capacité de l'ordre de 500 mAh - soit 50mA pendant 10h par exemple. Vous savez combien votre système consomme ?

J-M-L:
Une pile 9V (type alcaline) a une capacité de l'ordre de 500 mAh - soit 50mA pendant 10h par exemple. Vous savez combien votre système consomme ?

Non, aucune idée... Et je n'ai pas ce qu'il faut pour regarder ça, pour le coup :confused:

Sachant que je vais devoir brancher d'autres capteurs (dont les sorties signal seront toutes sur la même entrée digitale, mais il n'y aura qu'un seul capteur d'activé à la fois), il vaudrait peut-être mieux que je branche l'Arduino sur le secteur en 12V ? (je préfère ça à un câble USB relié sur un PC...)

Si vous avez le secteur oui c’est plus simple. préférez 9V que 12V, le delta part en chauffage inutile de la planète... et si tous vos capteurs tiennent en 5V c’est encore mieux t’il existe des alims 5V 2A qui ont une sortie jack compatible ou un chargeur de tel avec sortie USB)