#include <Adafruit_NeoPixel.h>
#define PIN_RING 6 // Pin pour l'anneau LED
#define PIN_HCSR04_TRIG 7 // Pin Trig du capteur HC-SR04
#define PIN_HCSR04_ECHO 8 // Pin Echo du capteur HC-SR04
#define LED_VERTE_1 9 // Pin de la LED verte 1
#define LED_VERTE_2 10 // Pin de la LED verte 2
#define LED_VERTE_3 11 // Pin de la LED verte 3
Adafruit_NeoPixel ring = Adafruit_NeoPixel(8, PIN_RING, NEO_GRB + NEO_KHZ800);
const int distances[] = {10, 20, 30}; // Distances à trouver en cm
const int tolerance = 1; // Tolérance en cm (1 cm)
int currentCode = 0; // Index de la distance actuelle
void setup() {
Serial.begin(9600);
pinMode(PIN_HCSR04_TRIG, OUTPUT);
pinMode(PIN_HCSR04_ECHO, INPUT);
pinMode(LED_VERTE_1, OUTPUT);
pinMode(LED_VERTE_2, OUTPUT);
pinMode(LED_VERTE_3, OUTPUT);
ring.begin();
ring.show();
}
float mesurerDistance() {
digitalWrite(PIN_HCSR04_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(PIN_HCSR04_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_HCSR04_TRIG, LOW);
long duration = pulseIn(PIN_HCSR04_ECHO, HIGH);
float distance = duration * 0.034 / 2;
return distance;
}
void effetFondu(int r, int g, int b, int start, int end, int delayTime) {
for (int i = 0; i <= 255; i += 5) { // Augmente la luminosité
for (int j = start; j <= end; j++) {
ring.setPixelColor(j, ring.Color((r * i) / 255, (g * i) / 255, (b * i) / 255));
}
ring.show();
delay(delayTime);
}
for (int i = 255; i >= 0; i -= 5) { // Diminue la luminosité
for (int j = start; j <= end; j++) {
ring.setPixelColor(j, ring.Color((r * i) / 255, (g * i) / 255, (b * i) / 255));
}
ring.show();
delay(delayTime);
}
}
void allumerAnneau(float distance) {
ring.clear();
int delayTime;
if (distance < distances[currentCode] - tolerance) {
// Effet de fondu en bleu si la distance est en dessous
int diff = abs(distances[currentCode] - distance);
delayTime = map(diff, 0, 30, 5, 50); // Vitesse de fondu en fonction de la distance
effetFondu(0, 0, 255, 0, 2, delayTime); // LEDs 0, 1, 2 pour le bleu (distance en dessous)
} else if (distance > distances[currentCode] + tolerance) {
// Effet de fondu en rouge si la distance est au-dessus
int diff = abs(distance - distances[currentCode]);
delayTime = map(diff, 0, 30, 5, 50); // Vitesse de fondu en fonction de la distance
effetFondu(255, 0, 0, 5, 7, delayTime); // LEDs 5, , 7 pour le rouge (distance au-dessus)
} else {
// Lumière verte fixe si la distance est dans la tolérance
ring.setPixelColor(3, ring.Color(0, 255, 0));
ring.setPixelColor(4, ring.Color(0, 255, 0));
ring.show();
}
}
void confirmerCode() {
if (currentCode == 0) digitalWrite(LED_VERTE_1, HIGH);
else if (currentCode == 1) digitalWrite(LED_VERTE_2, HIGH);
else if (currentCode == 2) digitalWrite(LED_VERTE_3, HIGH);
}
bool validerDistanceStable(float cible) {
unsigned long startTime = millis();
bool ledState = false; // État de clignotement de la LED
int ledPin = (currentCode == 0) ? LED_VERTE_1 : (currentCode == 1) ? LED_VERTE_2 : LED_VERTE_3;
while (millis() - startTime < 2000) { // Vérification sur 2 secondes
float distance = mesurerDistance();
allumerAnneau(distance); // Affiche les couleurs avec fondu
// Clignotement de la LED correspondant au code en cours de validation
digitalWrite(ledPin, ledState ? HIGH : LOW);
ledState = !ledState;
delay(250); // Durée de chaque état de clignotement
if (distance < cible - tolerance || distance > cible + tolerance) {
digitalWrite(ledPin, LOW); // Éteint la LED si validation échoue
return false; // La distance a dévié de la plage tolérée
}
}
digitalWrite(ledPin, HIGH); // Fixe la LED en état validé
return true; // La distance est restée stable pendant 2 secondes
}
void loop() {
float distance = mesurerDistance();
Serial.print("Distance mesurée : ");
Serial.println(distance);
allumerAnneau(distance);
if (distance > distances[currentCode] - tolerance && distance < distances[currentCode] + tolerance) {
if (validerDistanceStable(distances[currentCode])) { // Validation stable avec clignotement
confirmerCode(); // Fixe la LED verte correspondant au code validé
currentCode++;
if (currentCode > 2) {
Serial.println("Code complet !");
while (true); // Arrêter le programme une fois le code complet trouvé
}
}
}
}