// ===== CONFIGURATION =====
const int pirBas = A4; // PIR bas (montée)
const int pirHaut = A3; // PIR haut (descente)
const int potVitesse = A0; // Potentiomètre VITESSE
const int potSeuil = A1; // Potentiomètre SEUIL LUMINOSITÉ
const int ledCount = 10;
int leds[ledCount] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
unsigned long tempoAllume = 1000; // Temps que les LEDs restent allumées après l'effet
// Variables d'état
bool systemeActif = false;
bool lastPirBas = LOW;
bool lastPirHaut = LOW;
unsigned long lastTriggerTime = 0;
const unsigned long cooldown = 800;
// ===== SETUP =====
void setup() {
pinMode(pirBas, INPUT);
pinMode(pirHaut, INPUT);
for (int i = 0; i < ledCount; i++) {
pinMode(leds[i], OUTPUT);
digitalWrite(leds[i], LOW);
}
Serial.begin(9600);
}
// ===== FONCTIONS =====
int lireVitesse() {
int val = analogRead(potVitesse);
return map(val, 0, 1023, 30, 1000); // 30ms à 1000ms
}
int lireSeuilLuminosite() {
int val = analogRead(potSeuil);
return map(val, 0, 1023, 200, 850);
}
void verifierLumiere() {
int ldrValue = analogRead(A2);
int seuilAllumage = lireSeuilLuminosite();
int seuilExtinction = seuilAllumage + 70;
Serial.print("LDR: ");
Serial.print(ldrValue);
Serial.print(" | Seuil: ");
Serial.print(seuilAllumage);
Serial.print("-");
Serial.print(seuilExtinction);
Serial.print(" | Actif: ");
Serial.println(systemeActif ? "OUI" : "NON");
if (ldrValue < seuilAllumage) {
systemeActif = true;
}
else if (ldrValue > seuilExtinction) {
systemeActif = false;
}
}
// ====================== EFFET MONTÉE ======================
void effetMontee(int vitesse) {
// Allumage : bas → haut
for (int i = 0; i < ledCount; i++) {
digitalWrite(leds[i], HIGH);
delay(vitesse);
}
delay(tempoAllume);
// Extinction : même sens (bas → haut) à la même vitesse
for (int i = 0; i < ledCount; i++) {
digitalWrite(leds[i], LOW);
delay(vitesse); // ← Vitesse identique à l'allumage
}
}
// ====================== EFFET DESCENTE ======================
void effetDescente(int vitesse) {
// Allumage : haut → bas
for (int i = ledCount - 1; i >= 0; i--) {
digitalWrite(leds[i], HIGH);
delay(vitesse);
}
delay(tempoAllume);
// Extinction : même sens (haut → bas) à la même vitesse
for (int i = ledCount - 1; i >= 0; i--) {
digitalWrite(leds[i], LOW);
delay(vitesse); // ← Vitesse identique à l'allumage
}
}
// ===== LOOP =====
void loop() {
verifierLumiere();
int vitesse = lireVitesse();
// Si il fait jour → tout éteindre
if (!systemeActif) {
for (int i = 0; i < ledCount; i++) {
digitalWrite(leds[i], LOW);
}
delay(150);
return;
}
// Lecture des PIR
bool pirBasActuel = digitalRead(pirBas);
bool pirHautActuel = digitalRead(pirHaut);
// Détection montée
if (pirBasActuel == HIGH && lastPirBas == LOW &&
millis() - lastTriggerTime > cooldown) {
effetMontee(vitesse);
lastTriggerTime = millis();
}
// Détection descente
if (pirHautActuel == HIGH && lastPirHaut == LOW &&
millis() - lastTriggerTime > cooldown) {
effetDescente(vitesse);
lastTriggerTime = millis();
}
lastPirBas = pirBasActuel;
lastPirHaut = pirHautActuel;
delay(50);
}