PROJET ECLAIRAGE ESCALIER EN LED

Bonjour à tous
je suis entrain de travailler sur un projet d’éclairage led des marches de mon escalier(merci à MIMIX)
le coté technique est fini mais j'ai des soucis au niveau de la programmation avec adruino.
j'ai 13 marches et il y'a un detecteur avec piezzo au niveau de la première et dernière marche.
la couleur des ruban led est unique(bleu).
et les marches s'allument sequentiellement en montant et en descendant.

les rubans sont installés sur les broches 0 à 12 et le capteur 1ére et derniére marche surs broches analogiques A3 et A2;

Es ce que quelqu'un peut me vérifier ce programme. merci d'avance.
le programme d'origine était effectué sur teenesy 2++

//declaration des pins


  int activity = 27; //led interne permettant de verifier l'activitee du teensy 2.0 ++
  int marche[13] = {
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; //sorties ou sont reliees les marches, en partant de bas en haut
  int marchetest = 32; //led strip de test
  int capteurbas = A3; //capteur de presence en bas de l'escalier
  int capteurhaut = A2; //capteur de presence en haut de l'escalier
//initialisation du mode de connection des pins

  // initialisation des variables
  
  unsigned int Bright = 50;
  
  int Veille = 0;
  int Verrou = 0;
  int activitycount = 0;
  int luminositee = 0;

  //paramètres pour le cadencement
  int nbrmarche = 13; //nombre de marches 14
  
  //temps d'allumage des leds
  int tpsattente = 25000; //temps d'allumage une fois tout éclaire 25000
  int tpsallum= 98; //temps de cadencement d'une marche 98

  int marcheN;

void setup()   
{
 
  Serial.begin(9600); //utile au debug
 
 
  pinMode(activity, OUTPUT);
  pinMode(capteurbas, INPUT_PULLUP);
  pinMode(capteurhaut, INPUT_PULLUP);
  
    for (int marcheN = 0; marcheN < nbrmarche; marcheN++)  {
    pinMode(marche[marcheN], OUTPUT);      
  }
}



//programme
void loop() 
{        
 luminositee = analogRead(0);  //acquisition luminositee

//verif activite du teensy
activitycount++;

if ( activitycount == 100)
  {
    digitalWrite(activity, HIGH);
  }
if ( activitycount == 100)
  {
    digitalWrite(activity, LOW);
    activitycount = 0;
  }


// allumage si montée de personne   
  if ((digitalRead (capteurbas) == LOW)  && luminositee <= 400 && Verrou == 0) 
  {
    for (int marcheN = 0; marcheN < nbrmarche; marcheN++) 
    {
    // allumer la marche
      digitalWrite(marche[marcheN], HIGH);  
      delay(tpsallum);
    }    
    delay(tpsattente);
    
    for (int marcheN = 0; marcheN < nbrmarche; marcheN++) 
    {
      digitalWrite(marche[marcheN], LOW);
      delay(tpsallum);
    }
    
  }
// allumage si descente de personne

  if ((digitalRead (capteurhaut) == LOW) && luminositee <= 400 && Verrou == 0) 
  {
    for (int marcheN = nbrmarche - 1; marcheN >= 0; marcheN--)  
    {
    // allumer la marche
      digitalWrite(marche[marcheN], HIGH);  
      delay(tpsallum);
    }    
    delay(tpsattente);
    
    for (int marcheN = nbrmarche - 1; marcheN >= 0; marcheN--) 
    {
      digitalWrite(marche[marcheN], LOW);
      delay(tpsallum);
    }
    
  }
  
  //debug
/*
  Serial.print("Bright =");
  Serial.println(Bright);
  delay(200);
  Serial.print("Code R =");
  Serial.println(CodeR);
  delay(200);
*/


  
}

Salut, projet sympa mais déjà, si il n'est pas fonctionel il n'a rien à faire dans "Projets finis" ^^

Tu aurais du le mettre avec les autres sujets, bref !

Bon alors après un rapide coup deuil, pas grand chose de suspect mise à part :

if ( activitycount == 100)
  {
    digitalWrite(activity, HIGH);
  }
if ( activitycount == 100)
  {
    digitalWrite(activity, LOW);
    activitycount = 0;
  }

avec deux if identique qui font des chose opposé.. étrange !

Et pour le temps des delays normalement il faut utiliser un unsigned long !
Tes delays son de 98ms + 25s..... donc entre chaque marche, 25 secondes de latence, faut les descendre doucement.... . . . . . xD

Puis après tu ne nous à pas précisé ce qui ne fonctionne pas ou plutôt ce que tu n'à pas comme comportement !

Bref résume nous un peut mieux ton problème et je pense que ça devrais être vite réglé, tu à mis des cotes code, des commentaires et de surcroit ton code a l'air assez bien construit donc on devrais vite régler tes problèmes :smiley:

Skizo !

skizoh:
Tes delays son de 98ms + 25s..... donc entre chaque marche, 25 secondes de latence, faut les descendre doucement.... . . . . . xD

Non, pas tout à fait:
98ms entre chaque marche
25s après avoir tout allumé

Moi j'ai des doutes là-dessus:

(digitalRead (capteurbas) == LOW

C'est un capteur piezo. Il génère un potentiel lorsqu'on le contraint. Est-ce que cela fait vraiment descendre l'entrée jusqu'à zéro??? L'as-tu vérifié?

Mais c'est vrai que tu es un peu laconique sur ce qui ne fonctionne pas.

A oui effectivement c'est pas entre chaque marche ^^

autant pour moi :.

Pour les capteurs piezo ça ma aussi chagriner, il faudrait les câblé sur une entré analogique si les passages ne font que des variations..

EXPLIQUE NOUS CE QUI MARCHE PAS !!!!!!!

Bonsoir à Tous, merci pour votre interet.

j'ai finit par faire du menage et je suis arrivé à ce code

//declaration des pins


  //const int activity = 27; //led interne permettant de verifier l'activitee du teensy 2.0 ++
  const int marche[13] = {
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; //sorties ou sont reliees les marches, en partant de bas en haut
  const int capteurbas = A0; //capteur de presence en bas de l'escalier
  const int capteurhaut = A3; //capteur de presence en haut de l'escalier
//initialisation du mode de connection des pins

  // initialisation des variables
  
  const int Veille = 0;
  const int Verrou = 0;
  
  

  //paramètres pour le cadencement
  int nbrmarche = 13; //nombre de marches 13
  
  //temps d'allumage des leds
  const int tpsattente = 10000; //temps d'allumage une fois tout éclaire 25000
  const int tpsallum= 300; //temps de cadencement d'une marche 98

  int marcheN;

void setup()   
{
 
 
  //pinMode(activity, OUTPUT);
  pinMode(capteurbas, INPUT_PULLUP);
  pinMode(capteurhaut, INPUT_PULLUP);
  
    for (int marcheN = 0; marcheN < nbrmarche; marcheN++)  {
    pinMode(marche[marcheN], OUTPUT);      
  }
}



//programme
void loop() 
{        
 //luminositee = analogRead(0);  //acquisition luminositee

//verif activite du teensy
//activitycount++;

//if ( activitycount == 100)
  {
   // digitalWrite(activity, HIGH);
  }
//if ( activitycount == 100)
  {
   // digitalWrite(activity, LOW);
   // activitycount = 0;
  }


// allumage si montée de personne   
  if ((digitalRead (capteurbas) == LOW) && Verrou == 0) 
  {
    for (int marcheN = 0; marcheN < nbrmarche; marcheN++) 
    {
    // allumer la marche
      digitalWrite(marche[marcheN], HIGH);  
      delay(tpsallum);
    }    
    delay(tpsattente);
    
    for (int marcheN = 0; marcheN < nbrmarche; marcheN++) 
    {
      digitalWrite(marche[marcheN], LOW);
      delay(tpsallum);
    }
    
  }
// allumage si descente de personne

  if ((digitalRead (capteurhaut) == LOW) && Verrou == 0) 
  {
    for (int marcheN = nbrmarche - 1; marcheN >= 0; marcheN--)  
    {
    // allumer la marche
      digitalWrite(marche[marcheN], HIGH);  
      delay(tpsallum);
    }    
    delay(tpsattente);
    
    for (int marcheN = nbrmarche - 1; marcheN >= 0; marcheN--) 
    {
      digitalWrite(marche[marcheN], LOW);
      delay(tpsallum);
    }
    
  
  }
  
  
  
  
  
  }

là le programme fonctionne, au déclenchement du capteur piezzo, les marches s'allument une à une puis s’éteint.
par-contre si je touche de nouveau le capteur, il arrête pas les rubans.

j'ai un capteur en début d'escalier et un autre en haut.
un autre soucis, la led branchée sur le pin 1 s'allume automatiquement et ne s’arrête pas?

une autre question,, es qu'on peut jouer sur la luminosité de led à travers le adruino?

GABSI:
est ce qu'on peut jouer sur la luminosité de led à travers l' adruino?

Oui en PWM, mais pas sur toutes les pins de la carte.

Bonsoir,

Christian_R:

GABSI:
est ce qu'on peut jouer sur la luminosité de led à travers l' adruino?

Oui en PWM, mais pas sur toutes les pins de la carte.

Ou utiliser des circuits intégrés interfaces spécialisés pour augmenter le nombres de sorties PWM.
@+

Bonjour

Quelqu'un a une idée ou solution pour les problèmes:

  • le capteur avec piezzo met en marche mais n'arrête pas l'allumage!

*un autre soucis, la led branchée sur le pin 1 s'allume automatiquement et ne s’arrête pas?

[/quote]

GABSI:
Bonjour

Quelqu'un a une idée ou solution pour les problèmes:

  • le capteur avec piezzo met en marche mais n'arrête pas l'allumage!

Ton programme fait ce que tu lui dit de faire et pas plus.

S'il voit un capteur appuyé:
il allume les led l'une après l'autre
attend 25 secondes
éteint les led l'une après l'autre

l'ordre d'allumage et d'extinction dépendant du capteur appuyé.
Il n'est nul part écrit qu'il doit y avoir une extinction s'il y a détection d'un nouvel appui.

Alors, ton code étant bien simplifié, ça devient dur de comprendre pourquoi ça bugs, déjà, dans ton code, ce n'est pas le capteur qui éteint les LED mais simplement ta routine qui après allumage éteint quoi qu'il en soit, donc si aucune LED ne s'éteint c'est que tu à un sérieux problème qui ne concerne pas le capteur piezzo !!

Pour la LED sur la PIN 1, si tu parle la LED n°1, tu utilise la PIN 0 "const int marche[13] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};"
Je suis pas convaincu quel existe ou du moins quel soit pilotable, vérifie ça et en cas décale tout en faisant :

"const int marche[13] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,13};"

Sinon je vois pas ce qui pourrais causer ça, à part une erreur déjà recensé sur la PIN 1 qui est aussi une PIN série et qui à déjà pausé problème à d'autre personnes qui signalait un état haut bloqué, dans ce cas décale encore d'une PIN ( si tu en à 14 bien sur ^^ ).

GL !
Skizo !

skizoh:
Pour la LED sur la PIN 1, si tu parle la LED n°1, tu utilise la PIN 0 "const int marche[13] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};"
Je suis pas convaincu quel existe ou du moins quel soit pilotable, vérifie ça et en cas décale tout en faisant :

Justement concernant ce point c'est la broche digitale 0 ou la digitale 1 dont tu parles.
Parce que même si on peut prendre la main sur toute les broches il y a quand même quelques restriction. En particulier sur la liaison série, il ne faut pas oublier qu'il y a toujours le circuit d'interface USB <--> série de présent et qu'il peut forcer un niveau (essentiellement sur le RX).

Bonsoir

les rubans s'allument avec le bon cadencement , sinon le ruban branché sur la broche 1(tx) s'allume tout le temps!
mes rubans sont branchés sur les broches 0 à 12, j'ai 13 broches digitales et 6 analogiques A0 à A5 ou les capteurs haut et bas de l'escalier sont branchés.
comment programmer l'extinction des rubans avec le capteur d'en haut ou d'en bas.

Je commence à me demander si ton code ne sortirai pas des méandre d'internet, tu à une idée ce que tu fait ou c'est du copié collé? ( après vérification et re lecture "merci MIMIX" je me rend compte que ton code viens d'ici: Tutorial pour faire un escalier RGB ! | Forum Menuiseries intérieures - Forum Système D )

Bref !!! pour ce qui est de la led 1 bloquer, sur la pin 0 ( tx ) il faut la changer de pin, si tu n'en à plus, j'ai le regret de t'annoncer que tu devras te passer d'une LED !

Pour ce qui est de l’extinction des led par rapport au capteur du haut si tu monde et capteur du bas si tu descend, je crois que si tu a vraiment écrit ce programme, tu devrais être capable de coder ça... on va te laisser faire tes preuves, le tout cuit on aime pas trop sa nous :slight_smile:

Pour info il te suffi de modifier un peut la condition pour éteindre tes LED et de rajouter un ou deux flag d’état et ça devrais marcher.

Aller fait moi mentir et prouve nous que tu n'a pas simplement copier coller ce code sais programmer ne serais se qu'un minimum ]:slight_smile:

Skizo !

Il y a un truc extra pour résoudre ton truc, c'est un vieil outil que malheureusement même l'école laisse tomber, c'est le papier brouillon, il suffit de l'associer à un crayon. même un ordinateur n'est pas aussi puissant que cet outil :wink:

Concernant les broches 0 et 1, elles ont un statu un peu particulier puisqu'elles sont connectées aux broches RX/TX de la liaison de communication (qui sert aussi au téléchargement). En général, on évite de les utiliser parce que :

  • la liaison série est bien pratique pour la mise au point
  • le circuit d'interface entre l'USB et le processeur peu imposer un niveau non souhaité sur le RX

La solution c'est d'utiliser des broches analogiques libres en leur rendant leur fonction d'entrée/sortie logique. Par exemple, dans ton tableau d'allocation des sorties LED, tu peux remplacer les pin 0 et 1 par A1 et A2 que tu sembles ne pas utiliser.

GABSI:
comment programmer l'extinction des rubans avec le capteur d'en haut ou d'en bas.

Le problème pour résoudre ce besoin c'est que ton programme tel qu'il est écrit utilise l'instruction delay() pour les temporisations. Cette instruction bloque le fonctionnement du processeur pendant l'attente de la fin du temps programmé. Le dit blocage interdit donc la lecture de l'état des capteurs qui permettrait de faire ce que tu demandes.
Il faut remplacer ce delay() par une boucle d'attente non bloquante. Dans cette boucle, tu testerais l'état des capteurs et l'écoulement du temps (avec l'instruction millis() voir la doc arduino) la sortie de la boucle se faisant soit sur le temps limite soit sur un changement de l'état d'un capteur.

Salut, essai de l'extinction des rubans avec le capteur d'en haut ou d'en bas avec une boucle while( capteur || temps < 25s):

//declaration des pins
//const int activity = 27; //led interne permettant de verifier l'activitee du teensy 2.0 ++
const int marche[13] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; //sorties ou sont reliees les marches, en partant de bas en haut
const int capteurbas = A0; //capteur de presence en bas de l'escalier
const int capteurhaut = A3; //capteur de presence en haut de l'escalier

//initialisation du mode de connection des pins

  // initialisation des variables
  const int Veille = 0;
  const int Verrou = 0;

  //paramètres pour le cadencement
  int nbrmarche = 13; //nombre de marches 13
  
  //temps d'allumage des leds
  long tpsattente = 25000; //temps d'allumage une fois tout éclaire 25000
  const int tpsallum= 98; //temps de cadencement d'une marche 98

  int marcheN;

void setup()
{
  //pinMode(activity, OUTPUT);
  pinMode(capteurbas, INPUT_PULLUP);
  pinMode(capteurhaut, INPUT_PULLUP);
  
    for (int marcheN = 0; marcheN < nbrmarche; marcheN++)
    {
    pinMode(marche[marcheN], OUTPUT);
    }
    
}

//programme
void loop()
{        

  // allumage si montée de personne   
  if ((digitalRead (capteurbas) == LOW) && Verrou == 0) 
  {
    for (int marcheN = 0; marcheN < nbrmarche; marcheN++) 
    {
    // allumer la marche
      digitalWrite(marche[marcheN], HIGH);  
      delay(tpsallum);
    }
    
    tpsattente = millis();
    while ( (digitalRead (capteurhaut) != LOW) || (millis()-tpsattente < 25000) )
    {
    // attend capteur haut OU 25s
    }
    
    for (int marcheN = 0; marcheN < nbrmarche; marcheN++) 
    {
      digitalWrite(marche[marcheN], LOW);
      delay(tpsallum);
    }
    
  }
// allumage si descente de personne

  if ((digitalRead (capteurhaut) == LOW) && Verrou == 0) 
  {
    
    for (int marcheN = nbrmarche - 1; marcheN >= 0; marcheN--)  
    {
    // allumer la marche
      digitalWrite(marche[marcheN], HIGH);  
      delay(tpsallum);
    }    
    
    tpsattente = millis();
    while ( (digitalRead (capteurbas) != LOW) || (millis()-tpsattente < 25000) )
    {
      // attend capteur bas OU 25 secondes
    }
    
    for (int marcheN = nbrmarche - 1; marcheN >= 0; marcheN--) 
    {
      digitalWrite(marche[marcheN], LOW);
      delay(tpsallum);
    }
     
  }  
    
}