#include <Arduino.h>
// Capteur ultrason
#define TRIG A7
#define ECHO A6
// LEDs
#define LGREEN D5
#define LORANGE D2
#define LRED D3
// Buzzer
#define buzzerpin D4
// Switch
#define switchpin A0
// 7SEG-Click (2 digits avec point decimal)
#define DATA_PIN D7
#define LATCH_PIN A4
#define CLOCK_PIN D6
// Variables
long duree;
float distance; // en mètres
// Table des segments pour chiffres 0-9
byte digits[10] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
// Fonction pour afficher un nombre sur 2 digits avec point décimal
// num : nombre en mètres * 10 (ex : 2.4m -> 24)
void displayNumber(int num) {
if(num > 99) num = 99;
int tens = num / 10;
int units = num % 10;
digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, digits[units]);
// tens avec point decimal activé
byte tensByte = digits[tens] | 0b10000000; // point decimal
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, tensByte);
digitalWrite(LATCH_PIN, HIGH);
}
void setup() {
Serial.begin(115200);
// Capteur ultrason
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
// LEDs
pinMode(LGREEN, OUTPUT);
pinMode(LORANGE, OUTPUT);
pinMode(LRED, OUTPUT);
// Buzzer
pinMode(buzzerpin, OUTPUT);
// Switch
pinMode(switchpin, INPUT_PULLUP);
// 7SEG-Click
pinMode(DATA_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
}
void loop() {
int etatswitch = digitalRead(switchpin);
// Switch OFF -> tout désactivé
if(etatswitch == HIGH){
digitalWrite(LGREEN, LOW);
digitalWrite(LORANGE, LOW);
digitalWrite(LRED, LOW);
noTone(buzzerpin);
displayNumber(0);
Serial.println("System OFF");
delay(500);
return;
}
// Envoi impulsion TRIG
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
// Lecture ECHO
duree = pulseIn(ECHO, HIGH);
// Calcul distance en mètres
distance = duree * 0.034 / 200; // cm -> m
// Affichage terminal
Serial.print("Distance: ");
Serial.print(distance, 1); // 1 chiffre après la virgule
Serial.println(" m");
// Affichage 7SEG
int displayVal = (int)(distance*10); // ex: 2.4m -> 24
if(displayVal > 99) displayVal = 99; // max 2 digits
displayNumber(displayVal);
// Contrôle LEDs
if(distance > 1.2){
digitalWrite(LGREEN, HIGH);
digitalWrite(LORANGE, LOW);
digitalWrite(LRED, LOW);
noTone(buzzerpin);
} else if(distance > 0.3){ // 30 cm à 1.2 m
digitalWrite(LGREEN, LOW);
digitalWrite(LORANGE, HIGH);
digitalWrite(LRED, LOW);
// Buzzer signalisation
float t = map(distance*100, 30, 120, 0, 1000); // intervalle entre bips en ms
t = constrain(t, 0, 1000);
tone(buzzerpin, 440);
delay(100); // bip court
noTone(buzzerpin);
delay((int)t);
} else { // < 30cm
digitalWrite(LGREEN, LOW);
digitalWrite(LORANGE, LOW);
digitalWrite(LRED, HIGH);
// Buzzer signalisation rapide
float t = map(distance*100, 0, 30, 0, 1000);
t = constrain(t, 0, 1000);
tone(buzzerpin, 440);
delay(100);
noTone(buzzerpin);
delay((int)t);
}
}