Go Down

Topic: projet éclairage escalier led (Read 284 times) previous topic - next topic

Nicko_du_70

Dec 16, 2018, 12:39 pm Last Edit: Dec 16, 2018, 03:54 pm by Nicko_du_70
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:

Code: [Select]
// 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?




hazerty565

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

lesept

#2
Dec 16, 2018, 02:31 pm Last Edit: Dec 16, 2018, 02:31 pm by lesept
D'abord tu dois simplifier ton code, on y verra plus clair. Tu vas déclarer tes pins dans un tableau
Code: [Select]
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
Code: [Select]
#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):
Code: [Select]
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
Code: [Select]
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 :)
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

J-M-L

#3
Dec 16, 2018, 02:42 pm Last Edit: Dec 16, 2018, 03:08 pm by J-M-L
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
Code: [Select]
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 :) et donc juste remplacer
Code: [Select]
#define NMarches 13par
Code: [Select]
const byte NMarches = sizeof(pinMarches) / sizeof(pinMarches[0]);


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

ça doit ressembler à cela:
Code: [Select]
// 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..


Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Nicko_du_70

tout d'abord merci pour votre attention.

voici mon code modifier:

Code: [Select]
  //
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é.

lesept

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 :
Code: [Select]
// 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.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

J-M-L

#6
Dec 16, 2018, 05:04 pm Last Edit: Dec 16, 2018, 05:38 pm by J-M-L
Visiblement, tu ne connais pas la syntaxe des boucles for, je te conseille de lire de la documentation.
@lesept --> oooopss... :)

Code: [Select]
for (byte i=NMarches; i>=0 ; i--) ça ne va pas fonctionner comme attendu
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

lesept

#7
Dec 16, 2018, 05:57 pm Last Edit: Dec 16, 2018, 06:19 pm by lesept
Oui, c'est juste : c'est "i=NMarches-1"...

[excuse_bidon]C'était pour voir si tu suivais... :))[/excuse_bidon]
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

J-M-L

#8
Dec 16, 2018, 11:26 pm Last Edit: Dec 17, 2018, 12:21 am by J-M-L
Oui, c'est juste : c'est "i=NMarches-1"...

[excuse_bidon]C'était pour voir si tu suivais... :))[/excuse_bidon]
toujours Ooooopss :) (faut trouver une seconde excuse bidon)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

lesept

Argh, je suis à court...

Code: [Select]
for (int i=NMarches-1; i>=0 ; i--)
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

J-M-L

#10
Dec 17, 2018, 09:27 am Last Edit: Dec 17, 2018, 09:44 am by J-M-L
Bravo :)

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  
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Nicko_du_70

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?

Code: [Select]
//
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/]

lesept

Tu n'as pas fait la correction du message #9 dans la fonction Descente
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

lesept

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.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Go Up