Un byte est un entier non signé entre 0 & 255. Pour la montée, les numéros vont de 0 à la valeur maximale et restent positifs. Un byte suffit.
Pour la descente, les numéros décroissent jusqu'à passer en dessous de 0,ce qui est le critère d'arrêt. Un byte passera à 255 après être passé à 0 et la boucle ne s'arrêtera pas. En plus on aura un dépassement d'indice de tableau. Il faut donc utiliser un int dans ce cas, pour qu'il aille jusqu'à -1 et que la boucle s'arrête.
Si je comprends bien, la descente ne fonctionne pas. Peux tu poster ton code en l'état actuel et préciser ce que tu fais pour dire que la descente ne marche pas ?
Un escalier qui ne marche pas ! C'est un comble...
"si mes capteurs sont bon et que mon programme aussi, alors qu'est ce qui cloche?"
Si vous avez fait une petite faute de frappe lors de la copie des bouts de programmes, on ne peut pas la détecter (on sait déjà que la montée est bien testée; la descente a l'air de clocher).Peut être que rappeler le programme tel qu'il est (on n'a vu que tel qu'il devrait être) rendrait les choses plus faciles, avec la dernière version du programme chez vous....
quand j'appuis sur le bouton haut escalier, les led s'allume de bas en haut.
j'appuis sur bouton bas, les led s'eteigne de bas en haut.
et sa fonctionne que dans ce sens.
sinon quand j'appuis sur bouton haut deux fois d'affilé les led s'eteigne de haut en bas.
je rappuis sur bouton bas et les led se rallume de haut en bas.
// programme actuelle dans l'arduino
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);
}
}
les étapes à intégrer au programme:
quand on veut monté l'escalier les LED s'allument de bas en haut et s’éteignent quand on atteint le capteur haut de bas en haut.
quand on veut descendre l'escalier les LED s'allument de haut en bas et s’éteignent quand on atteint le capteur bas de haut en bas.
si on rebrousse chemin il faudrait une tempo pour éteindre les LED de 1 min d'attente.
quand on veut monté l'escalier les LED s'allument de bas en haut et s'éteignent quand on atteint le capteur haut de bas en haut.
Allumer l'éclairage sur détection d'une personne en bas de l'escalier et l'éteindre sur détection de la même personne en haut est une mauvaise idée.
Rien ne garantit qu'il s'agisse de la même personne. Un capteur de passage HC-SR501 ne détecte pas le sens de passage.
De plus une autre personne peut très bien descendre, et donc être détectée par le capteur du haut, alors que la première personne est en train de monter, et éteindre l'éclairage à ce moment-là n'est pas une bonne idée, car s'il fait nuit les deux personnes se retrouvent dans le noir.
Deux personnes montent.
La première arrive au niveau du détecteur du haut.
L'éclairage s'éteint alors que la deuxième est encore au milieu de l'escalier.
Mauvaise idée.
En test chez moi depuis quelques mois. J'ai eu le temps de corriger les erreurs.
C'est clair. Nous on est 5 et c'est très rare qu'on se croise dans l'escalier. Ce que je voulais dire, c'est qu'il vaut mieux faire un sketch simple qui fonctionne plutôt qu'un programme exhaustif qui sera complexe à finaliser.
Pour ta seconde remarque, il suffit d'ajouter une temporisation de quelques secondes avant d'éteindre. Il faut aussi éviter que la détection de la seconde personne soit prise pour une personne qui descend : prévoir une temporisation avant de relancer la détection
Ce que je voulais dire, c'est qu'il vaut mieux faire un sketch simple qui fonctionne plutôt qu'un programme exhaustif qui sera complexe à finaliser.
tant que
si détection de présence bas
allumer de bas en haut
armer timer
si détection de présence haut
allumer de haut en bas
armer timer
si timer écoulé
éteindre
C'est très simple au contraire. L'extinction est faite uniquement sur timer.
Si une personne est détectée on allume systématiquement.
Pour ta seconde remarque, il suffit d'ajouter une temporisation de quelques secondes avant d'éteindre. Il faut aussi éviter que la détection de la seconde personne soit prise pour une personne qui descend : prévoir une temporisation avant de relancer la détection
Tu compliques déjà les choses. Tu arriveras à un sketch beaucoup plus complexe au final.
tant que
si détection de présence bas
capteur_bas = 1
si capteur_haut
armer timer
sinon
allumer de bas en haut
si détection de présence haut
capteur_haut = 1
si capteur_bas
armer timer
sinon
allumer de haut en bas
si timer écoulé
capteur_bas = 0
capteur_haut = 0
éteindre
Et encore une fois, si deux personnes se croisent, cela ne marche pas.
Alors qu'un solution de timer unique réarmable est plus simple.
Une seule condition pour l'extinction.
Et ça marche dans tous les cas.
ayant le projet d'installer des rubans led dans mon escalier
etant plutot debutant en Arduino
j ai recherché sur le forum des exemples de codes et j'ai trouvé le votre tres interressant
je me suis mis a la simulation sur Tinkercad pour voir avec une carte UNO j'utilise les pin A4,A5
et 0 a 13 pour les sorties (j'ai 16 marches)
j'ai pris A1 et A2 pour les capteurs haut et bas
j'ai lancé la simulation mais ca ne fonctionne pas
si j'appuie sur le bp du bas les leds s'allument, restent allumées, lorsque j'appuie sur le capteur du haut il ne se passe rien , et inverssement si je commence par le capteur du haut