Eclairage progressif d'escalier ruban LED

Bonjour à tous!

J'ai comme projet de faire un éclairage progressif pour mes escaliers (16 marches).
J'ai vu plein d'exemples sur youtube et autres sites internet, mais en ce qui concerne la programmation je ne trouve rien! Du coup je m'y met mais je suis ultra débutant...

Alors voici mon idée:
Quand il y a une détection de passage en bas des escalier, allumage progressif avec variation (pour ne pas éblouir) des marches par incrémentation de bas en haut, càd allumage de la première marche, puis s'ajoute la seconde puis s'ajoute la troisième etc jusqu'à allumer toutes les marches. Après un délai établi, extinction progressive marche après marche de bas en haut.
Fonctionnement inverse si détection de passage en haut des marches.

Pour faire tourner tout ça je suis parti sur cette architecture:

  • Un capteur à ultrason en bas des escalier, un second en haut des escaliers HC-SR04 > je ne veux pas utiliser de capteur PIR car détection trop large.
  • des rubans Led blanc sous chacune des marches
  • un capteur de luminosité pour éviter de faire fonctionner tout ça en plein jour avec un contact sec
  • une arduino uno
  • une carte d'extension PWM adafruit 16 canaux
  • 15 modules MOSFET IRF520
  • alim 12V 5A

Etant donné que je dois gérer 16 marches, je ne peux pas utiliser directement la carte arduino, du coup je passe sur une carte extension PWM (pour la partie variation), cette dernière ne pouvant être alimentée en 12v je compte utiliser mes modules mosfet sur chacune des sorties PWM de cette carte pour brancher mes LED.

Je m'arrache surtout les cheveux pour le programme! :astonished:

J'arrive pour l'instant à allumer mes leds avec incrémentation et variation gràce au PWM, j'arrive à les éteindre après un délai avec une variation plus lente.
Je n'arrive pas à intégrer le deuxiemme capteur à ultrason et de ce fait activer sa séquence.
Je n'ai pas encore intégré le capteur de luminosité non plus (simple contact sec) que je ne sais pas où intégrer.

Comme je n'ai que très peu de bases en programmation, je dirais même que c'est le néant, si une bonne âme pouvait m'aider à m'en dépêtrer... je serais super content!
J'ai besoin de conseils et aussi de critiques car c'est ainsi que l'on améliore un projet!

Merci d'avance!

Voici mon programme:

/*ESSAI ALLUMAGE PROGRESSIF ECLAIRAGE D'ESCALIER
*AVEC CARTE D'EXTENSION PWM 16 CANAUX
*Avec capteur ultrason en haut et bas des escaliers
*Principe recherché: détection présence (avec capteur ultrason) haut des escalier > allumage progressif du haut vers le bas 
*puis délai et extinction progressive du haut vers le bas.
*Même principe à l'inverse avec le second capteur à ultrason (séquence que je n'arrive pas à intégrer)
*/

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); //chemin d'accès à la carte pwm

#define LEDMIN  0 // impulsion min (entre 0 et 4096)
#define LEDMAX  4096//impulsion max (entre 0 et 4096)
#define trigPin 12  //Trig premier capteur
#define echoPin 11  //Echo premier capteur
#define trigPin2 13 //Trig2 second capteur
#define echoPin2 10 //Echo2 second capteur

// Liste des leds
uint8_t led1 = 0;
uint8_t led2 = 1;
uint8_t led3 = 2;
uint8_t led4 = 3;
uint8_t led5 = 4;
uint8_t led6 = 5;
uint8_t led7 = 6;
uint8_t led8 = 7;
uint8_t led9 = 8;
uint8_t led10 = 9;
uint8_t led11 = 10;
uint8_t led12 = 11;
uint8_t led13 = 12;
uint8_t led14 = 13;
uint8_t led15 = 14;
uint8_t led16 = 15;
// capteur ultrason:
int mindist = 50; //distance en dessous de laquelle nous souhaitons démarrer le cycle d'allumage
int mindist2 = 50;

void setup() {
   
  pinMode(trigPin, OUTPUT);  //On défini Trig comme une sortie
  pinMode(echoPin, INPUT);   //On défini Echo comme une entrée
  pinMode(trigPin2, OUTPUT); //On défini Trig2 comme une sortie
  pinMode(echoPin2, INPUT);  //On défini Echo2 comme une entrée
 
   pwm.begin(); //démarrage carte pwm
  pwm.setPWMFreq(60);  //réglage de la fréquence
}

void setServoPulse(uint8_t n, double pulse) {
  double pulselength;
  
  pulselength = 1000000;   // 1,000,000 us per second
  pulselength /= 60;   // 60 Hz
  pulselength /= 4096;  // 12 bits of resolution
  pulse *= 1000;
  pulse /= pulselength;
  pwm.setPWM(n, 0, pulse);
}

void loop() {

//premier capteur à ultrason:
long duration, distance;
  digitalWrite(trigPin, LOW);  
  delayMicroseconds(2); 
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10); //Trig envoi pendant 10ms 
  digitalWrite(trigPin, LOW);
  
  duration = pulseIn(echoPin, HIGH);
  distance = duration*340/(2*10000);
  
// second capteur à ultrason:
long duration2, distance2;
  digitalWrite(trigPin2, LOW);  
  delayMicroseconds(2); 
  digitalWrite(trigPin2, HIGH);
  delayMicroseconds(10); //Trig envoi pendant 10ms 
  digitalWrite(trigPin2, LOW);
  
  duration2 = pulseIn(echoPin2, HIGH);
  distance2 = duration2*340/(2*10000); 


 
  if (distance < mindist) { // si capteur détecte une distance en dessous de 50cm

{unsigned long debut =millis();// permet une détection plus fréquente normalement, allumage progressif de la led 1 à 16:


for (uint8_t led=0 ; led<16; led++){
    for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen+=15) {
        pwm.setPWM(led, 0, pulselen);
    }
}
  
  delay(3000);// délai avant extinction progressive:
    
for (uint8_t led=0 ; led<16; led++){
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen-=2) {
        pwm.setPWM(led, 0, pulselen);
    }
}
}
}
  else { 
    (distance2 < mindist2); // si capteur détecte une distance en dessous de 50cm
  

{unsigned long debut =millis();// permet une détection plus fréquente normalement, allumage progressif inversé de la led 16 à 1:


for (uint8_t led=16 ; led<0; led++){
    for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen+=15) {
        pwm.setPWM(led, 0, pulselen);
    }
}
  
  delay(3000);// délai avant extinction progressive:
    
for (uint8_t led=16 ; led<0; led++){
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen-=2) {
        pwm.setPWM(led, 0, pulselen);
    }
}
}
}
}

// moderator changed quote tags to code tags
// TIP: use CTRL-T to autoformat code

J'ai comme projet de

Bonjour,
Je trouve curieux que tu puisses faire le + compliqué, et butes sur le plus simple.
Peux-tu préciser quel endroit précis du programme te pose problème, et ce que tu as tenté à cet égard, ce qui a fonctionné ou pas ?
-> si tu ne sais pas répondre, pas de souci, on remettra tout à plat