projet éclairage escalier led

Bonjour a tous,

je me suis mis dans la tête de me me lancer sur ce projet il y a environ 3 mois.

donc je me suis lancer en tant que débutant avec l'arduino.

j'ai acheter pour cela:

  • un arduino mega 2560.
  • une platine labdec.
  • deux carte relais 5v-230v.
  • deux transformateurs 230v-12v pour les bandes led.
  • un jeu de jumper.
  • deux capteur PIR HCSR501.

voici mon montage vu avec friting: (en pièce jointe)

ainsi que mon programme:

 // programme

const int Detecteurhaut = 45;
const int Detecteurbas = 47;
const int Marche1 =  2;
const int Marche2 =  3;
const int Marche3 =  4;
const int Marche4 =  5;
const int Marche5 =  6;
const int Marche6 =  7;
const int Marche7 =  8;
const int Marche8 =  9;
const int Marche9 =  38;
const int Marche10 =  40;
const int Marche11 =  42;
const int Marche12 =  44;
const int Marche13 =  46;

int Etat_det_haut = 0; 
int Etat_det_bas = 0;


void setup()
{
pinMode(Marche1, OUTPUT); 
pinMode(Marche2, OUTPUT);
pinMode(Marche3, OUTPUT);
pinMode(Marche4, OUTPUT);
pinMode(Marche5, OUTPUT); 
pinMode(Marche6, OUTPUT);
pinMode(Marche7, OUTPUT);
pinMode(Marche8, OUTPUT);
pinMode(Marche9, OUTPUT); 
pinMode(Marche10, OUTPUT);
pinMode(Marche11, OUTPUT);
pinMode(Marche12, OUTPUT);
pinMode(Marche13, OUTPUT); 
pinMode(Detecteurhaut, INPUT); 
pinMode(Detecteurbas, INPUT);
}

void loop()
{
Etat_det_haut = digitalRead(Detecteurhaut);
Etat_det_bas = digitalRead(Detecteurbas);

if (Etat_det_bas==HIGH)
{{
digitalWrite(2, HIGH); 
delay(100); 
digitalWrite(3, HIGH);
delay(150); 
digitalWrite(4, HIGH);
delay(200); 
digitalWrite(5, HIGH);
delay(250);
digitalWrite(6, HIGH); 
delay(300); 
digitalWrite(7, HIGH);
delay(350); 
digitalWrite(8, HIGH);
delay(400); 
digitalWrite(9, HIGH);
delay(450);
digitalWrite(38, HIGH); 
delay(500); 
digitalWrite(40, HIGH);
delay(550); 
digitalWrite(42, HIGH);
delay(600); 
digitalWrite(44, HIGH);
delay(650);
digitalWrite(46, HIGH);
delay(700);

}

  
while (Etat_det_haut != HIGH);
  Etat_det_haut = digitalRead(Detecteurhaut);

{


 digitalWrite(2, LOW); 
 delay(100); 
 digitalWrite(3, LOW);
 delay(150); 
 digitalWrite(4, LOW);
 delay(200); 
 digitalWrite(5, LOW);
 delay(250);
 digitalWrite(6, LOW); 
 delay(300); 
 digitalWrite(7, LOW);
 delay(350); 
 digitalWrite(8, LOW);
 delay(400); 
 digitalWrite(9, LOW);
 delay(450);
 digitalWrite(38, LOW); 
 delay(500); 
 digitalWrite(40, LOW);
 delay(550); 
 digitalWrite(42, LOW);
 delay(600); 
 digitalWrite(44, LOW);
 delay(650);
 digitalWrite(46, LOW); 
 delay(700); 
 }
 
Etat_det_haut = digitalRead(Detecteurhaut);
Etat_det_bas = digitalRead(Detecteurbas);


}else if (Etat_det_haut==HIGH)

{         
digitalWrite(46, HIGH); 
delay(100); 
digitalWrite(44, HIGH); 
delay(150); 
digitalWrite(42, HIGH);
delay(200); 
digitalWrite(40, HIGH);
delay(250); 
digitalWrite(38, HIGH);
delay(300);
digitalWrite(9, HIGH); 
delay(350); 
digitalWrite(8, HIGH);
delay(400); 
digitalWrite(7, HIGH);
delay(450); 
digitalWrite(6, HIGH);
delay(500);
digitalWrite(5, HIGH); 
delay(550); 
digitalWrite(4, HIGH);
delay(600); 
digitalWrite(3, HIGH);
delay(650); 
digitalWrite(2, HIGH);
delay(700);
}
 

while(Etat_det_bas != HIGH) ;
  Etat_det_bas = digitalRead(Detecteurbas);
{

digitalWrite(46, LOW); 
delay(100); 
digitalWrite(44, LOW); 
delay(150); 
digitalWrite(42, LOW);
delay(200); 
digitalWrite(40, LOW);
delay(250); 
digitalWrite(38, LOW);
delay(300);
digitalWrite(9, LOW); 
delay(350); 
digitalWrite(8, LOW);
delay(400); 
digitalWrite(7, LOW);
delay(450); 
digitalWrite(6, LOW);
delay(500);
digitalWrite(5, LOW); 
delay(550); 
digitalWrite(4, LOW);
delay(600); 
digitalWrite(3, LOW);
delay(650); 
digitalWrite(2, LOW);
delay(700);
}}

avec tous ça, ça ne fonctionne pas. je suis perdu.

pouvez vous me dire ce qu'il ne va pas?

juste pour info, met ton code entre balise [ code ] [ /code ]

D'abord tu dois simplifier ton code, on y verra plus clair. Tu vas déclarer tes pins dans un tableau
const byte pinMarches[] = {2,3,4,5,6,7,8,9,38,40,42,44,46};et le nombre de marches dans une variable ou en dur avec un

#define NMarches 13

Ensuite, tu peux changer toutes tes lignes qui se ressemblent par des boucles for. Un exemple (je te laisse faire le reste tout seul):

pinMode(Marche1, OUTPUT); 
pinMode(Marche2, OUTPUT);
pinMode(Marche3, OUTPUT);
pinMode(Marche4, OUTPUT);
pinMode(Marche5, OUTPUT); 
pinMode(Marche6, OUTPUT);
pinMode(Marche7, OUTPUT);
pinMode(Marche8, OUTPUT);
pinMode(Marche9, OUTPUT); 
pinMode(Marche10, OUTPUT);
pinMode(Marche11, OUTPUT);
pinMode(Marche12, OUTPUT);
pinMode(Marche13, OUTPUT);

devient

for (int i=0; i< NMarches; i++) pinMode(pinMarches|i], OUTPUT);

Pour le reste, comme tes delay() sont de longueurs variables (mais linéaires, enfin affines) tu peux les calculer et faire des boucles sans trop de problèmes.

Reviens avec le code simplifié, ce sera plus facile pour débugguer :slight_smile:

et voici l'image

--> ATTENTION VOUS RISQUEZ DE FAIRE PASSER TROP DE PUISSANCE DANS LA BREADBOARD... ALIMENTEZ DIRECTEMENT LES RUBANS

petite typo de lesept, il voulait écrire

for (int i=0; i< NMarches; i++) pinMode(pinMarches[i], OUTPUT);

Notez qu'au lieu de compter soi même le nombre de marche on peut laisser faire le compilo :slight_smile: et donc juste remplacer#define NMarches 13parconst byte NMarches = sizeof(pinMarches) / sizeof(pinMarches[0]);

corrigez votre post ci dessus et modifiez les code tags autour du code (enlevez les espaces)
[code]`` [color=blue]// votre code ici[/color] ``[/code].

ça doit ressembler à cela:// votre code ici

faites aussi ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit indenté correctement --> là c'est un peu difficile à lire sur téléphone

Enfin - il serait bien d'expliquer ce que vous souhaitez que le code fasse (en français).

  • Quand quelqu'un est détecté en haut et que tout est éteint
  • Quand quelqu'un est détecté en bas et que tout est éteint
  • Quand quelqu'un est détecté en haut et qu'une séquence déclenchée à partir d'en bas est en cours
  • Quand quelqu'un est détecté en bas et qu'une séquence déclenchée à partir d'en haut est en cours

etc..

tout d'abord merci pour votre attention.

voici mon code modifier:

  // 
const int Detecteurhaut = 45;
const int Detecteurbas = 47;
const byte pinMarches[] = {2, 3, 4, 5, 6, 7, 8, 9, 38, 40, 42, 44, 46};
const byte NMarches = sizeof(pinMarches) / sizeof(pinMarches[0]);
int Etat_det_haut = 0;
int Etat_det_bas = 0;


void setup()
{
  for (int 1 = 0; 1 < NMarches; 1++) pinMode(pinMarches | 1], OUTPUT);
    for (int 2 = 0; 2 < NMarches; 2++) pinMode(pinMarches | 2], OUTPUT);
for (int 3 = 0; 3 < NMarches; 3++) pinMode(pinMarches | 3], OUTPUT);
  for (int 4 = 0; 4 < NMarches; 4++) pinMode(pinMarches | 4], OUTPUT);
    for (int 5 = 0; 5 < NMarches; 5++) pinMode(pinMarches | 5], OUTPUT);
      for (int 6 = 0; 6 < NMarches; 6++) pinMode(pinMarches | 6], OUTPUT);
        for (int 7 = 0; 7 < NMarches; 7++) pinMode(pinMarches | 7], OUTPUT);
          for (int 8 = 0; 8 < NMarches; 8++) pinMode(pinMarches | 8], OUTPUT);
            for (int 9 = 0; 9 < NMarches; 9++) pinMode(pinMarches | 9], OUTPUT);
              for (int 10 = 0; 10 < NMarches; 10++) pinMode(pinMarches | 10], OUTPUT);
                for (int 11 = 0; 11 < NMarches; 11++) pinMode(pinMarches | 11], OUTPUT);
                  for (int 12 = 0; 12 < NMarches; 12++) pinMode(pinMarches | 12], OUTPUT);
                    for (int 13 = 0; 13 < NMarches; 13++) pinMode(pinMarches | 13], OUTPUT);
                      pinMode(Detecteurhaut, INPUT);
                      pinMode(Detecteurbas, INPUT);
                    }

void loop()
{
  Etat_det_haut = digitalRead(Detecteurhaut);
  Etat_det_bas = digitalRead(Detecteurbas);

  if (Etat_det_bas == HIGH)
  {{
      digitalWrite(2, HIGH);
      delay(100);
      digitalWrite(3, HIGH);
      delay(150);
      digitalWrite(4, HIGH);
      delay(200);
      digitalWrite(5, HIGH);
      delay(250);
      digitalWrite(6, HIGH);
      delay(300);
      digitalWrite(7, HIGH);
      delay(350);
      digitalWrite(8, HIGH);
      delay(400);
      digitalWrite(9, HIGH);
      delay(450);
      digitalWrite(38, HIGH);
      delay(500);
      digitalWrite(40, HIGH);
      delay(550);
      digitalWrite(42, HIGH);
      delay(600);
      digitalWrite(44, HIGH);
      delay(650);
      digitalWrite(46, HIGH);
      delay(700);

    }


    while (Etat_det_haut != HIGH);
    Etat_det_haut = digitalRead(Detecteurhaut);

    {


      digitalWrite(2, LOW);
      delay(100);
      digitalWrite(3, LOW);
      delay(150);
      digitalWrite(4, LOW);
      delay(200);
      digitalWrite(5, LOW);
      delay(250);
      digitalWrite(6, LOW);
      delay(300);
      digitalWrite(7, LOW);
      delay(350);
      digitalWrite(8, LOW);
      delay(400);
      digitalWrite(9, LOW);
      delay(450);
      digitalWrite(38, LOW);
      delay(500);
      digitalWrite(40, LOW);
      delay(550);
      digitalWrite(42, LOW);
      delay(600);
      digitalWrite(44, LOW);
      delay(650);
      digitalWrite(46, LOW);
      delay(700);
    }

    Etat_det_haut = digitalRead(Detecteurhaut);
    Etat_det_bas = digitalRead(Detecteurbas);


  } else if (Etat_det_haut == HIGH)

  {
    digitalWrite(46, HIGH);
    delay(100);
    digitalWrite(44, HIGH);
    delay(150);
    digitalWrite(42, HIGH);
    delay(200);
    digitalWrite(40, HIGH);
    delay(250);
    digitalWrite(38, HIGH);
    delay(300);
    digitalWrite(9, HIGH);
    delay(350);
    digitalWrite(8, HIGH);
    delay(400);
    digitalWrite(7, HIGH);
    delay(450);
    digitalWrite(6, HIGH);
    delay(500);
    digitalWrite(5, HIGH);
    delay(550);
    digitalWrite(4, HIGH);
    delay(600);
    digitalWrite(3, HIGH);
    delay(650);
    digitalWrite(2, HIGH);
    delay(700);
  }


  while (Etat_det_bas != HIGH) ;
  Etat_det_bas = digitalRead(Detecteurbas);
  {

    digitalWrite(46, LOW);
    delay(100);
    digitalWrite(44, LOW);
    delay(150);
    digitalWrite(42, LOW);
    delay(200);
    digitalWrite(40, LOW);
    delay(250);
    digitalWrite(38, LOW);
    delay(300);
    digitalWrite(9, LOW);
    delay(350);
    digitalWrite(8, LOW);
    delay(400);
    digitalWrite(7, LOW);
    delay(450);
    digitalWrite(6, LOW);
    delay(500);
    digitalWrite(5, LOW);
    delay(550);
    digitalWrite(4, LOW);
    delay(600);
    digitalWrite(3, LOW);
    delay(650);
    digitalWrite(2, LOW);
    delay(700);
  }
}

sinon je voudrais:

quand une personne monte les escalier, que les bandes LED s'allume de bas en haut et que quand il arrive en haut elle s’éteignent de le même sens.
vice et versa dans le sens opposé.

Visiblement, tu ne connais pas la syntaxe des boucles for, je te conseille de lire de la documentation.

J'ai réécrit ton code, j'espère que c'est ce que tu cherches à faire :

// programme

const byte Detecteurhaut = 45;
const byte Detecteurbas = 47;
// Numéros des pins des leds, du bas vers le haut
const byte pinMarches[] = {2,3,4,5,6,7,8,9,38,40,42,44,46};
const byte NMarches = sizeof(pinMarches) / sizeof(pinMarches[0]);

byte Etat_det_haut = 0; 
byte Etat_det_bas = 0;

void Montee (bool state) {
	// Allumer ou éteindre les marches une par une à partir du bas
	for (byte i=0; i< NMarches; i++) 
	{
	digitalWrite(pinMarches[i], state);
	int duration = 50*pinMarches[i];
	if (pinMarches[i] > 30) duration = 500 + (pinMarches[i] - 38) * 25;
	delay(duration);
	}
}

void Descente (bool state) {
	// Allumer ou éteindre les marches une par une à partir du haut
	for (byte i=NMarches; i>=0 ; i--) 
	{
	digitalWrite(pinMarches[i], state);
	int duration = 350 + 50*(9-pinMarches[i]);
	if (pinMarches[i] > 30) duration = 100 + (46 - pinMarches[i]) * 25;
	delay(duration);
	}
}


void setup()
{
	for (int i=0; i< NMarches; i++) pinMode(pinMarches[i], OUTPUT);
	pinMode(Detecteurhaut, INPUT); 
	pinMode(Detecteurbas, INPUT);
}

void loop() {
	Etat_det_haut = digitalRead(Detecteurhaut);
	Etat_det_bas = digitalRead(Detecteurbas);
	if (Etat_det_bas==HIGH)	{
		Montee (HIGH);
		while (Etat_det_haut != HIGH); Etat_det_haut = digitalRead(Detecteurhaut);
		Montee (LOW);
	} else if (Etat_det_haut==HIGH) {
		Descente (HIGH);         
		while(Etat_det_bas != HIGH) Etat_det_bas = digitalRead(Detecteurbas);
		Descente (LOW);
	}
}

Ce n'est qu'une réécriture, je ne sais pas si ça fera exactement ce que tu veux. Ça sera une base pour l'améliorer au besoin.

lesept:
Visiblement, tu ne connais pas la syntaxe des boucles for, je te conseille de lire de la documentation.

@lesept --> oooopss... :slight_smile:

for (byte i=NMarches; i>=0 ; i--) ça ne va pas fonctionner comme attendu

Oui, c'est juste : c'est "i=NMarches-1"...

[excuse_bidon]C'était pour voir si tu suivais... :))[/excuse_bidon]

lesept:
Oui, c'est juste : c'est "i=NMarches-1"...

[excuse_bidon]C'était pour voir si tu suivais... :))[/excuse_bidon]

toujours Ooooopss :slight_smile: (faut trouver une seconde excuse bidon)

Argh, je suis à court...

for (int i=NMarches-1; i>=0 ; i--)

Bravo :slight_smile:

Il faut effectivement bien penser à utiliser une variable signée quand on décrémente jusqu’à 0 compris dans un for sinon on repasse (avec un byte) à 255 et la boucle ne s’arrête pas;

Cependant l’idée d’économiser Un peu de mémoire n’était pas mauvaise, vous auriez pu prendre un int8_t ou un char pour rester sur un seul octet vu qu’on a sans doute moins de 128 marches

bonjour les amis arduineur,

j'ai téléversé le programme modifier comme dessous et malheur sa ne fonctionne pas!!!.

par précaution, j'ai fait l'essai avec un simple interrupteur pour voir si sa venait de mes capteurs mais toujours le même problème.

que dois je faire?

 // 
const byte Detecteurhaut = 45;
const byte Detecteurbas = 47;
// Numéros des pins des leds, du bas vers le haut
const byte pinMarches[] = {2, 3, 4, 5, 6, 7, 8, 9, 38, 40, 42, 44, 46};
const byte NMarches = sizeof(pinMarches) / sizeof(pinMarches[0]);

byte Etat_det_haut = 0;
byte Etat_det_bas = 0;

void Montee (bool state) {
  // Allumer ou éteindre les marches une par une à partir du bas
  for (byte i = 0; i < NMarches; i++)
  {
    digitalWrite(pinMarches[i], state);
    int duration = 50 * pinMarches[i];
    if (pinMarches[i] > 30) duration = 500 + (pinMarches[i] - 38) * 25;
    delay(duration);
  }
}

void Descente (bool state) {
  // Allumer ou éteindre les marches une par une à partir du haut
  for (byte i = NMarches - 1; i >= 0 ; i--)
  {
    digitalWrite(pinMarches[i], state);
    int duration = 350 + 50 * (9 - pinMarches[i]);
    if (pinMarches[i] > 30) duration = 100 + (46 - pinMarches[i]) * 25;
    delay(duration);
  }
}


void setup()
{
  for (int i = 0; i < NMarches; i++) pinMode(pinMarches[i], OUTPUT);
  pinMode(Detecteurhaut, INPUT);
  pinMode(Detecteurbas, INPUT);
}

void loop() {
  Etat_det_haut = digitalRead(Detecteurhaut);
  Etat_det_bas = digitalRead(Detecteurbas);
  if (Etat_det_bas == HIGH) {
    Montee (HIGH);
    while (Etat_det_haut != HIGH); Etat_det_haut = digitalRead(Detecteurhaut);
    Montee (LOW);
  } else if (Etat_det_haut == HIGH) {
    Descente (HIGH);
    while (Etat_det_bas != HIGH) Etat_det_bas = digitalRead(Detecteurbas);
    Descente (LOW);
  }
}
[code/]

Tu n'as pas fait la correction du message #9 dans la fonction Descente

Que dois tu faire ? Nous en dire plus.

Sur ton montage, comment sont câblés tes boutons?
Sur ce que tu vois lorsque tu lances le code.

bonjour,

désolé du retard pour la réponse mais j'ai eu des problème de santé... (rien de grave)

merci de prendre en considération mon projet et de l'aide que vous m'apporter.

mes détecteurs sont brancher: un fil sur le +, un sur le - et le troisième sur la borne 47 et 45 de l'arduino selon le détecteur haut ou bas.

dès que je met en marche l'arduino, tout mes relais sont en position haut et aucun mouvement se produit.

donc j'ai enlever mes capteurs et installer un poussoir à la place pour simuler un passage.(une borne sur le + et l'autre sur les bornes 47 et 45 de l'arduino)

quand je met le bouton en place sur la borne 45, les relais se remette sur la position zéro à tour de rôle sans appuyer sur le bouton.

ensuite en installant le bouton sur la borne 47 plus rien ne se passe et le programme se fige on dirait.

voici mon programme:

//
const byte Detecteurhaut = 45;
const byte Detecteurbas = 47;
// Numéros des pins des leds, du bas vers le haut
const byte pinMarches[] = {2, 3, 4, 5, 6, 7, 8, 9, 38, 40, 42, 44, 46};
const byte NMarches = sizeof(pinMarches) / sizeof(pinMarches[0]);

byte Etat_det_haut = 0;
byte Etat_det_bas = 0;

void Montee (bool state) {
  // Allumer ou éteindre les marches une par une à partir du bas
  for (byte i = 0; i < NMarches; i++)
  {
    digitalWrite(pinMarches[i], state);
    int duration = 50 * pinMarches[i];
    if (pinMarches[i] > 30) duration = 500 + (pinMarches[i] - 38) * 25;
    delay(duration);
  }
}

void Descente (bool state) {
  // Allumer ou éteindre les marches une par une à partir du haut
  for (int i = NMarches - 1; i >= 0 ; i--)
  {
    digitalWrite(pinMarches[i], state);
    int duration = 350 + 50 * (9 - pinMarches[i]);
    if (pinMarches[i] > 30) duration = 100 + (46 - pinMarches[i]) * 25;
    delay(duration);
  }
}


void setup()
{
  for (int i = 0; i < NMarches; i++) pinMode(pinMarches[i], OUTPUT);
  pinMode(Detecteurhaut, INPUT);
  pinMode(Detecteurbas, INPUT);
}

void loop() {
  Etat_det_haut = digitalRead(Detecteurhaut);
  Etat_det_bas = digitalRead(Detecteurbas);
  if (Etat_det_bas == HIGH) {
    Montee (HIGH);
    while (Etat_det_haut != HIGH); Etat_det_haut = digitalRead(Detecteurhaut);
    Montee (LOW);
  } else if (Etat_det_haut == HIGH) {
    Descente (HIGH);
    while (Etat_det_bas != HIGH) Etat_det_bas = digitalRead(Detecteurbas);
    Descente (LOW);
  }
}
[code/]

Un PIR et un bouton-poussoir n'ont pas un comportement identique.
Comme les boutons sont actifs au niveau haut, comme un PIR d'ailleurs, tu ne peux pas utiliser les pull-ups du processeur.
Pour chaque bouton-poussoir il te faut une résistance de pull-down.

J'allais dire la même chose que hbachetti. Tu peux lire ceci qui explique bien ton problème. Il faut une résistance pull down comme ceci:


Tu testeras un niveau HIGH pour savoir si le bouton est appuyé.

Tu mets des ";" après les while :

    while (Etat_det_haut != HIGH); Etat_det_haut = digitalRead(Detecteurhaut);

Ça veut dire qu'il va attendre que Etat_det_haut soit LOW pour passer à l'instruction suivante (le digitalRead) mais sans jamais le lire, d'où blocage. Ce n'est pas ce que tu veux : tu veux lire le bouton en permanence et passer à la suite lorsqu'il est enfoncé. Pour ça, il faut ôter le ; (même chose plus bas)
while (Etat_det_haut != HIGH) Etat_det_haut = digitalRead(Detecteurhaut);Petit changement de code, grosse différence de comportement !!!

Hugh ! œil de lynx a parlé.

merci pour ces réponses,

si j'ai bien compris mon capteur PIR ne m'envoi pas de 0 volt aussi, il n'envoi que du 5 volt.

donc mes capteurs ne sont pas adapter

j'ai suivi à la lettre le montage avec les bouton poussoir!

il y a une importance de mettre une résistance plus faible genre 100 ohm?