Bonjour à tous!

J'ai comme projet de faire un éclairage progressif pour mes escaliers (15 marches).
J'ai vu plein d'exemple 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 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 toute 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 importante.
- des rubans Led une couleur sous chacune des marches
- un capteur de luminosité pour éviter de faire fonctionner tout ça en plein jour
- 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 15 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!

J'arrive pour l'instant à allumer mes leds avec incrémentation mais pas avec de variation PWM, j'arrive à les éteindre après un délai avec une variation cette fois. (je l'ai pas utilisée pour l'allumage car trop longue et je n'arrive pas à réduire le temps de variation de la fonction utilisée)
Je n'arrive pas à faire varier à la vitesse souhaitée et je n'arrive pas à intégrer le deuxiemme capteur à ultrason.
Je n'ai pas encore intégré le capteur de luminosité non plus (simple contact sec)

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!
Si vous avez des conseils j'en ai bien besoin!

Merci d'avance!

je sais pas si le programme s'affiche mais le voici:

Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
 
/*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)
 *Dans l'idéal, je souhaite que l'allumage soit dimmable mais avec un délai maitrisable (pas le cas avec le code que j'utilise pour l'extinction)
 */
 
#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 
#define echoPin 11      //Echo 
//Il manque la déclaration du second capteur, le trigpin serait 13 et echopin serait 10 sur la carte.
 
// 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
 
 
void setup() {
 
  pinMode(trigPin, OUTPUT);  //On défini Trig comme une sortie
  pinMode(echoPin, INPUT);   //On défini Echo comme une entrée
 
 //manque capteur à ultrason 2
 
  pwm.begin(); //démarrage carte pwm
  pwm.setPWMFreq(60);  //réglage de la fréquence
}
 
/*Fonction ci-dessous que je ne comprend pas
 * quoi que je puisse modifier le délai entre les fonctions for ne change pas
 */
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() {
 
long duration, distance;
  digitalWrite(trigPin, LOW);  
  delayMicroseconds(2); 
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10); //Trig envoi pendant 10ms 
  digitalWrite(trigPin, LOW);
 
  // On calcule le temps pour l'aller retour du signal
  duration = pulseIn(echoPin, HIGH);
  distance = duration*340/(2*10000); 
 
 //ajouter le second capteur ici ou plus bas? 
 
  if (distance < mindist) { // si capteur détecte une distance en dessous de 60cm
 
{unsigned long debut =millis();// permet une détection plus fréquente
 
// allumage progressif des leds sans variation, dans l'espoir de trouver un moyen d'inclure la variation des leds
     pwm.setPWM(0, 4096, 0);
    delay(300);
    pwm.setPWM(1, 4096, 0);
    delay(300);
    pwm.setPWM(2, 4096, 0);
    delay(300);
    pwm.setPWM(3, 4096, 0);
    delay(300);
    pwm.setPWM(4, 4096, 0);
    delay(300);
    pwm.setPWM(5, 4096, 0);
    delay(300);
    pwm.setPWM(6, 4096, 0);
    delay(300);
    pwm.setPWM(7, 4096, 0);
    delay(300);
    pwm.setPWM(8, 4096, 0);
    delay(300);
    pwm.setPWM(9, 4096, 0);
    delay(300);
    pwm.setPWM(10, 4096, 0);
    delay(300);
    pwm.setPWM(11, 4096, 0);
    delay(300);
    pwm.setPWM(12, 4096, 0);
    delay(300);
    pwm.setPWM(13, 4096, 0);
    delay(300);
    pwm.setPWM(14, 4096, 0);
    delay(300);
    pwm.setPWM(15, 4096, 0);
  }
 
  delay(3000);// délai avant extinction progressive:
 
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led1, 0, pulselen);// impossible de changer le temps de la variation?
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led2, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led3, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led4, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led5, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led6, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led7, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led8, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led9, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led10, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led11, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led12, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led13, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led14, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led15, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led16, 0, pulselen);
  }
  }
}
 
/*Partie qui ne marche pas encore,grosses difficultés à déclarer le deuxième capteur à ultrason:
 
if (distance2 < mindist) { // si capteur détecte une distance en dessous de 50cm
 
{unsigned long debut =millis();// permet une détection plus fréquente
 
// allumage progressif des leds dans le sens inverse sans variation
     pwm.setPWM(15, 4096, 0);
    delay(300);
    pwm.setPWM(14, 4096, 0);
    delay(300);
    pwm.setPWM(13, 4096, 0);
    delay(300);
    pwm.setPWM(12, 4096, 0);
    delay(300);
    pwm.setPWM(11, 4096, 0);
    delay(300);
    pwm.setPWM(10, 4096, 0);
    delay(300);
    pwm.setPWM(9, 4096, 0);
    delay(300);
    pwm.setPWM(8, 4096, 0);
    delay(300);
    pwm.setPWM(7, 4096, 0);
    delay(300);
    pwm.setPWM(6, 4096, 0);
    delay(300);
    pwm.setPWM(5, 4096, 0);
    delay(300);
    pwm.setPWM(4, 4096, 0);
    delay(300);
    pwm.setPWM(3, 4096, 0);
    delay(300);
    pwm.setPWM(2, 4096, 0);
    delay(300);
    pwm.setPWM(1, 4096, 0);
    delay(300);
    pwm.setPWM(0, 4096, 0);
  }
  
  delay(3000);// dans le futur, serai remplacé par une détection du capteur opposé à celui qui a démarré l'allumage
    
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led16, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led15, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led14, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led13, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led12, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led11, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led10, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led9, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led8, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led7, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led6, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led5, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led4, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led3, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led2, 0, pulselen);
  }
for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
    pwm.setPWM(led1, 0, pulselen);
  }
 }
}
*/