PROJET LED ET CAPTEUR IR ARDUINO MEGA

Bonsoir,

Je travaille seul sur un projet avec un arduino et mon niveau n’est pas très bon. C’est pour cela que je viens vers vous pour m’éclaircir sur la manière de coder mon projet.

L’idée est d’avoir 16 capteurs ir qui vont détecter le déplacement d 'un objet sur un rail.
ces 16 capteurs alimenteront 16 leds correspondant au 16 capteurs respectifs ( capteur1-led1; capteur2-led2…). les leds doivent rester allumées et s 'éteindre au prochain passage devant les capteurs. Au dernier capteur les 16 leds partent en animation pendant 10 secondes.

Ce système est pour équiper un jeux. Le jeux de la mailloche, on tape sur une enclume et le poids monte (avec les leds qui s’allument)

Mon code est en pièce jointe. il fonction pour un capteur et une led. quelle serait la demarche pour rajouter les 15 autres capteurs et 15 autres leds?

const int buttonPin  = A0;    
const int ledPin     = 53;  
 
int buttonState      = 0;    
int lastButtonState  = 0;    
int ledState         = 0;  
 
void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);  
}
 
void loop() {

  buttonState = digitalRead(buttonPin);
 

  if (buttonState != lastButtonState) {
    

    if (buttonState == 1) {
      if(ledState==1) ledState=0;
      else            ledState=1;        
    }
    

    lastButtonState = buttonState;
  }
  

  digitalWrite(ledPin, ledState);
  

}

Je vous remercie par avance pour votre aide.

LED_ET_IR_CAPTEUR.ino (568 Bytes)

Tu peux utiliser les tableaux.

int buttonPin[16];
int ledPin[16];

int buttonState[16];
int lastButtonState[16];
int ledState[16];

Merci pour votre réponse. Ce code signifie quoi exactement? Je suis novice, j ai besoin d explications. Merci

Tu peux utiliser les pin 14~29 pour BoutonPin et 30~45 pour ledPin
Pour les initialiser fait une boucle das le setup:

for (int a = 0; a < 16; a++)
  {
    pinMode((a + 14), INPUT);
    pinMode((a + 30), OUTPUT);
    buttonState[a] = 0;
    lastButtonState[a] = 0;
    ledState[a] = 0;
  }

Après ta boucle peut être comme ça sans bouleverser ton code :

void loop() {
  for (int a = 0; a < 16; a++)
  {
    buttonState[a] = digitalRead(a + 14);


    if (buttonState[a] != lastButtonState[a]) {


      if (buttonState[a] == 1) {
        if (ledState[a] == 1) ledState[a] = 0;
        else            ledState[a] = 1;
      }


      lastButtonState[a] = buttonState[a];
    }

    digitalWrite((a + 30), ledState[a]);

  }
}

Les pros diront si j’ai fait juste.

Merci beaucoup, j'essaye cela ce soir

Ceci

if (buttonState[a] == 1) {
        if (ledState[a] == 1) ledState[a] = 0;
        else            ledState[a] = 1;
      }

Peut être remplacé par

if (buttonState[a]) ledState[a] = 1 - ledState[a];

if (buttonState[a]) ledState[a] = 1 - ledState[a];

Genial!! une autre chose à mettre dans le tiroir!

Ça suppose quand même que buttonState ne prendra que 1 et 0 comme valeurs. Pour s'en assurer, même si c'est équivalent, il est plus rigoureux de lui assigner (ou de le tester avec) les valeurs HIGH et LOW.

bonjour a tous, je reprend mon projet et je bloque sur la compilation du sketch, je ne sais pas comment le mettre en forme. A quel niveau dois je indiqué le numero de mes entree/sortie ?

En général ça se fait dans le setup

Merci pour votre aide, j'ai réussi à assigner les pin.

je fais tourner le programme avec 4 capteurs et 4 leds. cela fonctionne bien mais j'aimerai rajouter quelques fonctionnalités.

1: Lorsque le capteur 4 est déclenché, toutes les leds doivent s 'éteindre et un chenillard s 'active pendant 5 secondes

2:Si au bout de 5s, il n'y a pas de 2eme passage devant le capteur de chaque led pour les éteindre, les leds doivent s 'éteindre toutes seules les unes après les autres.

j 'aimerai faire plusieurs code simple et les déclenché via le code principal, est ce la bonne démarche ?

Merci

Je ne sais pas, ça pourrait dépendre de ton code actuel. Poste le

le voici, soyez indulgent je suis novice :)

//ASSIGNATION DES CAPTEURS
const int buttonPin1  = A0;   
const int buttonPin2  = A1;   
const int buttonPin3  = A2;   
const int buttonPin4  = A3;

//ASSIGNATION DES LEDS
const int ledPin1     = 41; 
const int ledPin2     = 43;
const int ledPin3     = 45; 
const int ledPin4     = 47;
 

int buttonState1      = 0;   
int lastButtonState1  = 0;   
int ledState1         = 0; 

int buttonState2      = 0;   
int lastButtonState2  = 0;   
int ledState2         = 0; 

int buttonState3      = 0;   
int lastButtonState3  = 0;   
int ledState3         = 0; 

int buttonState4      = 0;   
int lastButtonState4  = 0;   
int ledState4         = 0;




void setup() {
 
//ASSIGNATION DES ENTREES/SORTIE
 pinMode(buttonPin1, INPUT);
 pinMode(ledPin1, OUTPUT); 
 pinMode(buttonPin2, INPUT);
 pinMode(ledPin2, OUTPUT);
 pinMode(buttonPin3, INPUT);
 pinMode(ledPin3, OUTPUT);
 pinMode(buttonPin4, INPUT);
 pinMode(ledPin4, OUTPUT); 
}


void loop() {

 buttonState1 = digitalRead(buttonPin1);
 buttonState2 = digitalRead(buttonPin2);
 buttonState3 = digitalRead(buttonPin3);
 buttonState4 = digitalRead(buttonPin4);

 
 //BUTTON--1
 if (buttonState1 != lastButtonState1) {
  

   if (buttonState1 == 1) {
     if(ledState1==1) ledState1=0;
     else            ledState1=1;       
   }
  

   lastButtonState1 = buttonState1;
 }

 

//BUTTON--2
if (buttonState2 != lastButtonState2) {
  

   if (buttonState2 == 1) {
     if(ledState2==1) ledState2=0;
     else            ledState2=1;       
   }
  

   lastButtonState2 = buttonState2;
 }


 digitalWrite(ledPin2, ledState2);


//BUTTON--3
if (buttonState3 != lastButtonState3) {
  

   if (buttonState3 == 1) {
     if(ledState3==1) ledState3=0;
     else            ledState3=1;       
   }
  

   lastButtonState3 = buttonState3;
 }


 digitalWrite(ledPin3, ledState3);


//BUTTON4
if (buttonState4 != lastButtonState4) {
  

   if (buttonState4 == 1) {
     if(ledState4==1) ledState4=0;
     else            ledState4=1;       
   }
  

   lastButtonState4 = buttonState4;
 }


 digitalWrite(ledPin4, ledState4);


}

STP, édite ton message précédent pour mettre ton code entre balises CODE (le bouton </>)

J’ai repris ton code en utilisant les propositions de Savoriano : utiliser les tableaux.
Du coup, il faudrait connecter les boutons aux pins 14 et suivantes.

#define NB_CAP 4
int buttonPin[NB_CAP];
int ledPin[NB_CAP];

int buttonState[NB_CAP];
int lastButtonState[NB_CAP];
int ledState[NB_CAP];

unsigned long chrono[NB_CAP];

void setup() {
  Serial.begin(115200);
  for (int a = 0; a < NB_CAP; a++) {
    buttonPin[a] = a + 14;
    ledPin[a] = a + 30;
    pinMode(buttonPin[a], INPUT); // Boutons sur pins 14, 15, 16, 17
    pinMode(ledPin[a], OUTPUT);// Leds sur pins 30, 31, 32, 33
    buttonState[a] = 0;
    lastButtonState[a] = 0;
    ledState[a] = 0;
  }
}

void loop() {
  for (int a = 0; a < NB_CAP; a++) {
    buttonState[a] = digitalRead(buttonPin[a]);
    if (buttonState[a] == 1) {
      ledState[a] = 1 - ledState[a];
      chrono[a] = millis();
      Serial.print("Lancement chrono ");
      Serial.println(a);
      delay(20); // Debounce du bouton, à ôter pour les capteurs
    }
    lastButtonState[a] = buttonState[a];
    if (millis() - chrono[a] > 5000ul) ledState[a] = 0;
    digitalWrite(ledPin[a], ledState[a]);
  }
}

Pour l’utiliser, règle la console sur 115200 bauds (bouton en bas à droite de la console).

Pour l’instant, ça ne fait que surveiller les boutons, allumer ou éteindre les leds sur appui des boutons et éteindre la led X si son bouton n’a pas été touché depuis 5 secondes.

Pour le chenillard, c’est un peu plus compliqué. Tu dis

Lorsque le capteur 4 est déclenché, toutes les leds doivent s’éteindre et un chenillard s 'active pendant 5 secondes

Eteindre les leds si le bouton 4 est appuyé, ce n’est pas dur. Il suffit de changer ceci :

void loop() {
  for (int a = 0; a < NB_CAP; a++) {
    buttonState[a] = digitalRead(buttonPin[a]);
    if (buttonState[a] == 1) {
      ledState[a] = 1 - ledState[a];
      chrono[a] = millis();
      Serial.print("Lancement chrono ");
      Serial.println(a);
      if (a == 3) { // <-- on ajoute ces lignes
        for (int b = 0; b < NB_CAP; b++) {
          ledState[b] = 0;
          digitalWrite(ledPin[b], ledState[b]);
        }
      } // <-- jusqu'ici
      delay(20); // Debounce du bouton, à ôter pour les capteurs
    }
    lastButtonState[a] = buttonState[a];
    if (millis() - chrono[a] > 5000ul) ledState[a] = 0;
    digitalWrite(ledPin[a], ledState[a]);
  }
}

Par contre, il faut que tu précises des choses sur le chenillard :

  • Quelle durée d’allumage de chaque led
  • Combien de cycles
  • Faut-il surveiller les boutons pendant le chenillard ?

Merci pour ce code modifié, il fonctionne mise a part que les leds s 'eteignent toute au 4eme capteur et que le chenillard ne se lance pas.

Voici les precisions pour le chenillard:

-pas besoin de surveiller les boutons pendant le chenillard
-elles clignotent 1s
-elles font 3 cycles

Par la suite j’aimerai écrire une vraie animation pendant 10 secondes ( le dernier capteur sera le marquage de la victoire dans le jeux)

le projet ira aussi jusqu’à 16 LED ET 16 CAPTEUR.

J’attends vos elements de réponse pour la suite du code.

Merci pour votre aide

Tu veux dire :

  • LED 1 allumée 1s puis éteinte
  • LED 2 allumée 1s puis éteinte
  • LED 3 allumée 1s puis éteinte
  • LED 4 allumée 1s puis éteinte
  • Et on recommence 2 autres fois
    C’est bien ça ?

Le plus simple c’est de coder ça dans une fonction, appelée chenillard par exemple, et de le faire avec des delay (1000)
Elle serait appelée depuis la loop juste avant la ligne où j’ai mis la flèche.

void chenillard () {
for (byte i=0;i<3;i++) {
    for (int b = 0; b < NB_CAP; b++) {
          digitalWrite(ledPin[b], HIGH);
          delay (1000);
          digitalWrite(ledPin[b], LOW);
        } 
    } 
}

À tester…

Merci ! cela fonctionne tres bien :slight_smile:

Tu ajoutes juste la ligne

chenillard ();

à l’endroit où tu veux appeler la fonction :

void loop() {
  for (int a = 0; a < NB_CAP; a++) {
    buttonState[a] = digitalRead(buttonPin[a]);
    if (buttonState[a] == 1) {
      ledState[a] = 1 - ledState[a];
      chrono[a] = millis();
      Serial.print("Lancement chrono ");
      Serial.println(a);
      if (a == 3) { // <-- on ajoute ces lignes
        for (int b = 0; b < NB_CAP; b++) {
          ledState[b] = 0;
          digitalWrite(ledPin[b], ledState[b]);
        }
        chenillard(); // <-- ici
      } delay(20); // Debounce du bouton, à ôter pour les capteurs
    }
    lastButtonState[a] = buttonState[a];
    if (millis() - chrono[a] > 5000ul) ledState[a] = 0;
    digitalWrite(ledPin[a], ledState[a]);
  }
}

je suis vraiment novive et j 'apprends gràce à vous! Merci

Serait il possible d'avoir un chenillard (un autre chenillard) permanent tant que le capteur 1 n 'a pas été déclenché ? ( le capteur 1 donnera l info qu'un joueur a taper sur l 'enclume et que le jeux commence ).

J'aimerai également déclencher une autre fonction en parallèle lors du déclenchement du capteur 4 : une LED qui clignote également ( une 5ème LED pin ), toutes les 2 secondes à 5 reprises. Peux t'on envoyer deux fonctions simultanément ?