#define echoPin A0
#define trigPin A1
#define greenLED D13
#define orangeLED A3
#define redLED A2
#define switchPin D1
#define buzzerPin D2
#define SHCP D5
#define STCP D4
#define DS D3

long duration, distance;
byte segments[] = {
  B01111110, // 0
  B00001010, // 1
  B10110110, // 2
  B10011110, // 3
  B11001010, // 4
  B11011100, // 5
  B11111100, // 6
  B00001110, // 7
  B11111110, // 8
  B11011110  // 9
};


void setup() {
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(greenLED, OUTPUT);
  pinMode(orangeLED, OUTPUT);
  pinMode(redLED, OUTPUT);
  pinMode(switchPin, INPUT_PULLUP);
  pinMode(buzzerPin, OUTPUT);
  
  pinMode(SHCP, OUTPUT);
  pinMode(STCP, OUTPUT);
  pinMode(DS, OUTPUT);
}

void loop() {
  if (digitalRead(switchPin) == LOW) {
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
      
    duration = pulseIn(echoPin, HIGH);
    distance = (duration * 0.034 / 2)/10;
    Serial.print("Distance: ");
    Serial.print(distance);
    Serial.println(" cm");

    // Contrôle des LED en fonction de la distance
    if (distance > 120) {
      digitalWrite(greenLED, HIGH);
      digitalWrite(orangeLED, LOW);
      digitalWrite(redLED, LOW);
    } 
    else if (distance >= 75 && distance <= 120) {
      digitalWrite(greenLED, LOW);
      digitalWrite(orangeLED, HIGH);
      digitalWrite(redLED, LOW);
      tone(buzzerPin, 440);
      delay(200);
      noTone(buzzerPin);
      Serial.print("Temps d'arrêt: ");
      Serial.print(map(distance, 5, 50, 500, 1000));
      Serial.println(" ms");
      delay(map(distance, 5, 50, 500, 1000));
    } 
    else if (distance > 30 && distance <= 75) {
      digitalWrite(greenLED, LOW);
      digitalWrite(orangeLED, HIGH);
      digitalWrite(redLED, LOW);
      tone(buzzerPin, 440);
      delay(200);
      noTone(buzzerPin);
      Serial.print("Temps d'arrêt: ");
      Serial.print(map(distance, -30, 5, 0, 500));
      Serial.println(" ms");
      delay(map(distance, -30, 5, 0, 500));
    }
    else {
      digitalWrite(redLED, HIGH);
      digitalWrite(orangeLED, LOW);
      Serial.println("Diode Rouge allumée");
      tone(buzzerPin, 440);
      delay(200);
      digitalWrite(buzzerPin, LOW);
    } 
  } 
  else { 
    // Si l'interrupteur est désactivé, éteindre toutes les LED et le buzzer
    digitalWrite(greenLED, LOW);
    digitalWrite(orangeLED, LOW);
    digitalWrite(redLED, LOW);
    noTone(buzzerPin); 
    digitalWrite(buzzerPin, LOW);
  }

  int digit1 = distance / 10;
  int digit2 = distance % 10;

  digitalWrite(STCP, LOW);

  shiftOut(DS, SHCP, MSBFIRST, segments[digit2]);
  shiftOut(DS, SHCP, MSBFIRST, segments[digit1]);

  digitalWrite(STCP, HIGH);
  delay(50);
} 
74HC595
74HC595
Loading
st-nucleo-l031k6