#define PIN_BUTTON A1  
#define PIN_TRIG A6
#define PIN_ECHO A2
#define vert A4
#define orange A5
#define rouge A0 
#define BUZZER_PIN A7

#include <SPI.h> // Include the SPI library
#include <Wire.h> // Include the Wire library for Serial communication

#define DATA_PIN  D11   // Data pin DS
#define CLOCK_PIN  D13 // Clock pin SHCP
#define LATCH_PIN  D10  // Latch pin STCP

void shiftOutCustom(byte dataPin, byte clockPin, byte latchPin, byte val) {
  digitalWrite(latchPin, LOW); // Pull latch low to start sending data
  shiftOut(dataPin, clockPin, LSBFIRST, val);
  digitalWrite(latchPin, HIGH); // Pull latch high to update the outputs
}

const byte segments[] = {
  B11111100, // 0
  B01100000, // 1
  B11011010, // 2
  B11110010, // 3
  B01100110, // 4
  B10110110, // 5
  B10111110, // 6
  B11100000, // 7
  B11111110, // 8 
  B11110110  // 9
};

void setup() {
  pinMode(BUZZER_PIN, OUTPUT);  // Set the buzzer pin as an output
  Serial.begin(115200);
  pinMode(PIN_BUTTON, INPUT_PULLUP);  
  pinMode(PIN_TRIG, OUTPUT);
  pinMode(PIN_ECHO, INPUT);
  pinMode(rouge, OUTPUT);
  pinMode(orange, OUTPUT);
  pinMode(vert, OUTPUT);

  // 7-segment display setup
  Serial.begin(9600); 
  pinMode(DATA_PIN, OUTPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  pinMode(LATCH_PIN, OUTPUT); // Set latch pin as output
}

void loop() {
  int button_state=digitalRead(PIN_BUTTON) ;
  if (button_state== LOW) 
  {
    delay(10); 
    digitalWrite(PIN_TRIG, HIGH);
    delayMicroseconds(10);
    digitalWrite(PIN_TRIG, LOW);

    int duration = pulseIn(PIN_ECHO, HIGH);
    float distance = duration / 58.0;  
    Serial.print("Distance in CM: ");
    Serial.println(distance);

    // Display the distance on the 7-segment display
    int tens = (int)distance / 10;
    int ones = (int)distance % 10;
    shiftOutCustom(DATA_PIN, CLOCK_PIN, LATCH_PIN, segments[tens]);
    delay(500);
    shiftOutCustom(DATA_PIN, CLOCK_PIN, LATCH_PIN, segments[ones]);
    delay(500);

    if(distance <= 30) {
      tone(BUZZER_PIN, 440, 0);
      digitalWrite(rouge, HIGH);
      digitalWrite(orange, LOW);
      digitalWrite(vert, LOW);
    }
    else if ((distance > 30 )&& (distance <= 120)) {
    digitalWrite(rouge, LOW);
    digitalWrite(orange, HIGH);
    digitalWrite(vert, LOW);
    
    int dur = map(distance - 30, 90, 0, 1000,0);
    
    tone(BUZZER_PIN,440);
    delay(200);
    noTone(BUZZER_PIN);
    digitalWrite(BUZZER_PIN, LOW);
    delay(dur);
    }
    else if(distance > 120) {
        digitalWrite(rouge, LOW);
        digitalWrite(orange, LOW);
        digitalWrite(vert, HIGH);
        noTone(BUZZER_PIN);
    }
  }
}
74HC595
74HC595