Programme d'éclairage progressif pour les marches d'un escalier avec détecteurs

Bonjour à tous,

Je suis nouveau sur ce site et c'est la première fois que je me connecte sur un forum. J'espère faire les choses dans l'ordre et correctement ...
Je commence dans le monde du langage C++, j'ai programmé il y a qques années en Basic.

Voici le contexte de mon projet :
Je me lance dans la fabrication d'un escalier tout simple, droit, avec des limons latéraux en tubes carrés, des marches en chêne clair, avec une rampe, tout ce qui a de plus standard. L'idée est de mettre des spots intégrés dans les limons latéraux, de chaque côtés des marches, de les déclencher avec des détecteurs de présence en haut et en bas.

La partie matériel :
J'ai déjà réalisé toute cette partie. J'utilise une carte MEGA 2560, 2 cartes relais pour le pilotage de mes 16 spots. Les spots sont fais de 4 leds en série dans un morceau de PE transparent le tout coulé dans de la résine avec un connecteur type "T-Plug" pour pouvoir les changer. J'utilise un capteur de luminosité en mode tous ou rien, une tempo réglable dans tous les sens, une alimentation 12V pour le tout.

Le fonctionnement du programme :
Si la personne arrive en bas des escaliers, le détecteur bas est activé et les spots s'allument de bas en haut. Si la personne arrive en haut des escaliers le détecteur de présence haut est activé et les spots s'allument de haut en bas.
Quand la personne monte ou descend l'escalier et qu'elle arrive devant le détecteur opposé au sens d'entrée dans les escaliers, les spots s'éteignent dans le sens dans lequel ils se sont allumés.
Si la personne fait demi-tour dans les escaliers dans les deux sens de détection au bout d'un certain temps les spots s'éteignent. C'est la raison pour laquelle j'ai mis une tempo réglable.

J'ai réalisé un programme qui fonctionne à peu près mais je n'arrive pas à considérer un deuxième IF dans un premier IF. Qd les spots sont allumés j'attends d'avoir l'impulsion de la fin de ma tempo ou l'impulsion de mon détecteur ( haut ou bas ) mais la ça coince.

Après plusieurs tentatives en vain je me tourne vers ce forum pour savoir si quelqu'un peut me filer un coup de main …
Voici mon code …
Merci a vous

Escalier25_05.ino (5.19 KB)

bonjour,
tu règle ta tempo comment?
fais un serial print de tes variables pour voir ce qui cloche et pourquoi ca ne fonctionne pas.

si ca ne rentre pas dans le second if, c'est que les conditons ne sont pas remplies.

Salut Fabien,

il se trouve que quelque chose ne tourne pas rond ds ton code ^^.
Ton programme ne rentrera jamais dans les 2nd conditions car les valeurs changent uniquement hors des 1er conditions.

Est ce que tu peux tester un petit truc ?

const int TempoAtteinte = 43;
const int Detecteurluminosite = 41;
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;
const int Marche14 =  48;
const int Marche15 =  50;
const int Marche16 =  52;
const int Deptempo = 39;

int Etat_det_luminosite = 0; 
int Tempo_atteinte = 0;
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(Marche14, OUTPUT);
  pinMode(Marche15, OUTPUT);
  pinMode(Marche16, OUTPUT);
  pinMode(Deptempo, OUTPUT); 
  pinMode(TempoAtteinte, INPUT);
  pinMode(Detecteurluminosite, INPUT); 
  pinMode(Detecteurhaut, INPUT); 
  pinMode(Detecteurbas, INPUT);
}

void loop()
{
  Etat_det_luminosite = digitalRead(Detecteurluminosite);
  Etat_det_haut = digitalRead(Detecteurhaut);
  Etat_det_bas = digitalRead(Detecteurbas);
  Tempo_atteinte = digitalRead(TempoAtteinte);
  if (Etat_det_bas==HIGH&&Etat_det_luminosite==LOW)
  {
    digitalWrite(39, HIGH); 
    delay(50); 
    digitalWrite(39, LOW);
    delay(40); 
    digitalWrite(2, HIGH); 
    delay(40); 
    digitalWrite(3, HIGH);
    delay(50); 
    digitalWrite(4, HIGH);
    delay(60); 
    digitalWrite(5, HIGH);
    delay(70);
    digitalWrite(6, HIGH); 
    delay(80); 
    digitalWrite(7, HIGH);
    delay(90); 
    digitalWrite(8, HIGH);
    delay(100); 
    digitalWrite(9, HIGH);
    delay(110);
    digitalWrite(38, HIGH); 
    delay(120); 
    digitalWrite(40, HIGH);
    delay(130); 
    digitalWrite(42, HIGH);
    delay(140); 
    digitalWrite(44, HIGH);
    delay(150);
    digitalWrite(46, HIGH); 
    delay(160); 
    digitalWrite(48, HIGH);
    delay(170); 
    digitalWrite(50, HIGH);
    delay(180); 
    digitalWrite(52, HIGH);  
    
    while (Tempo_atteinte != HIGH && Etat_det_haut != HIGH) {
      Etat_det_haut = digitalRead(Detecteurhaut);
      Tempo_atteinte = digitalRead(TempoAtteinte);
      delay(0.1);
    }

    //on ajoute un while qui check jusqu'à un changement de valeur et on enlève le if.

     digitalWrite(2, LOW); 
     delay(40); 
     digitalWrite(3, LOW);
     delay(50); 
     digitalWrite(4, LOW);
     delay(60); 
     digitalWrite(5, LOW);
     delay(70);
     digitalWrite(6, LOW); 
     delay(80); 
     digitalWrite(7, LOW);
     delay(90); 
     digitalWrite(8, LOW);
     delay(100); 
     digitalWrite(9, LOW);
     delay(110);
     digitalWrite(38, LOW); 
     delay(120); 
     digitalWrite(40, LOW);
     delay(130); 
     digitalWrite(42, LOW);
     delay(140); 
     digitalWrite(44, LOW);
     delay(150);
     digitalWrite(46, LOW); 
     delay(160); 
     digitalWrite(48, LOW);
     delay(170); 
     digitalWrite(50, LOW);
     delay(180); 
     digitalWrite(52, LOW);
  }
      //On enlève aussi le crochet du if qui ne sert plus a rien ici.
       
  if (Etat_det_haut==HIGH&&Etat_det_luminosite==LOW) 
  {         
    digitalWrite(39, HIGH); 
    delay(50); 
    digitalWrite(39, LOW);
    delay(40);  
    digitalWrite(52, HIGH); 
    delay(40); 
    digitalWrite(50, HIGH);
    delay(50); 
    digitalWrite(48, HIGH);
    delay(60); 
    digitalWrite(46, HIGH);
    delay(70);
    digitalWrite(44, HIGH); 
    delay(80); 
    digitalWrite(42, HIGH);
    delay(90); 
    digitalWrite(40, HIGH);
    delay(100); 
    digitalWrite(38, HIGH);
    delay(110);
    digitalWrite(9, HIGH); 
    delay(120); 
    digitalWrite(8, HIGH);
    delay(130); 
    digitalWrite(7, HIGH);
    delay(140); 
    digitalWrite(6, HIGH);
    delay(150);
    digitalWrite(5, HIGH); 
    delay(160); 
    digitalWrite(4, HIGH);
    delay(170); 
    digitalWrite(3, HIGH);
    delay(180); 
    digitalWrite(2, HIGH);
    
     // On enlève le if et on remplace par une boucle semblable à celle ci-dessus

    while(Tempo_atteinte != HIGH && Etat_det_bas != HIGH) {
      Etat_det_bas = digitalRead(Detecteurbas);
      Tempo_atteinte = digitalRead(TempoAtteinte);
      delay(0.1);
    }

    digitalWrite(52, LOW); 
    delay(40); 
    digitalWrite(50, LOW);
    delay(50); 
    digitalWrite(48, LOW);
    delay(60); 
    digitalWrite(46, LOW);
    delay(70);
    digitalWrite(44, LOW); 
    delay(80); 
    digitalWrite(42, LOW);
    delay(90); 
    digitalWrite(40, LOW);
    delay(100); 
    digitalWrite(38, LOW);
    delay(110);
    digitalWrite(9, LOW); 
    delay(120); 
    digitalWrite(8, LOW);
    delay(130); 
    digitalWrite(7, LOW);
    delay(140); 
    digitalWrite(6, LOW);
    delay(150);
    digitalWrite(5, LOW); 
    delay(160); 
    digitalWrite(4, LOW);
    delay(170); 
    digitalWrite(3, LOW);
    delay(180); 
    digitalWrite(2, LOW);

     // On enlève aussi le crochet du if .
  }
}

J'ai modifié ça à la va-vite dans le forum sans essayer de compiler le code et sans le tester ^^ dis moi si il y a un problème :stuck_out_tongue:

Bonjour,

Tout d'abord merci pour votre intérêt pour mon programme.

Le code fais a la va vite marche pas mal même très bien, mais il y a encore qque chose ...
Pour répondre infobarquee, ma tempo est un module avec plusieurs type de temporisation, celle que j'ai choisi attend un front montant, ensuite elle fais un décompte visible sur un afficheur, une fois la tempo atteinte un relais se met en route pendant un temps réglable aussi. C'est plus facile a programmer et en plus c'est plus accessible pour un réglage.
Il y a un sens qui marche très bien, de haut en bas. Dans l'autre sens de bas en haut, lorsque la tempo arrive ça s'éteint nickel, par contre si j'ai le détecteur haut ça s'éteint et dans la foulée ca se rallume comme un nouveau cycle, comme si qqu'un arrivais d'en haut ...

Je n'arrive pas a voir ce qui cloche dans le programme mais c un bon début :frowning:

Je pense avoir trouvé le problème ^^

Essaye de remplacer la ligne 141 : if (Etat_det_haut==HIGH&&Etat_det_luminosite==LOW)

Par else if (Etat_det_haut==HIGH && Etat_det_luminosite==LOW)

et dis moi si ça fonctionne comme ça ^^.

Parfait ! Ca marche nickel !
Merci Black_Ware !

Cool !
Content d'avoir pu t'aider !
:slight_smile: