#include <LiquidCrystal.h>
#define LED_VERTE PB5
#define LED_ORANGE PB4
#define LED_ROUGE PB3
#define TRIG_PIN PA5
#define ECHO_PIN PA6
#define BUTTON_PIN PA0
#define BUZZER PA4
// Afficheur 7 segments (segments A à G et DP)
const int SEG_PINS[8] = {PB0, PB7, PB6, PB1, PC15, PA8, PA11, PA12};
// Chiffres 0 à 9 pour affichage 7 segments (anode commune)
const byte digits[10] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_VERTE, OUTPUT);
pinMode(LED_ORANGE, OUTPUT);
pinMode(LED_ROUGE, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(BUZZER, OUTPUT);
for (int i = 0; i < 8; i++) pinMode(SEG_PINS[i], OUTPUT);
Serial.begin(115200);
}
int mesurerDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH,30000);
int distance = duration * 0.034 / 2;
return (distance > 400) ? 400 : distance;
}
void gererSignalisation(int distance) {
if (distance > 400) {
digitalWrite(LED_ROUGE, LOW);
digitalWrite(LED_ORANGE, LOW);
digitalWrite(LED_VERTE, HIGH);
noTone(BUZZER);
} else if (distance > 30) {
// Bip lent
digitalWrite(LED_ROUGE, LOW);
digitalWrite(LED_ORANGE, LOW);
digitalWrite(LED_VERTE, HIGH);
tone(BUZZER,1000);
delay(500);
} else if (distance > 10) {
// Bip moyen
digitalWrite(LED_ROUGE, LOW);
digitalWrite(LED_ORANGE, HIGH);
digitalWrite(LED_VERTE, LOW);
tone(BUZZER,1500);
delay(300);
} else {
// Bip rapide
digitalWrite(LED_ROUGE, HIGH);
digitalWrite(LED_ORANGE, LOW);
digitalWrite(LED_VERTE, LOW);
tone(BUZZER,2000);
delay(100);
}
}
void eteindreSignalisation() {
digitalWrite(LED_VERTE, LOW);
digitalWrite(LED_ORANGE, LOW);
digitalWrite(LED_ROUGE, LOW);
noTone(BUZZER);
}
void afficherChiffre(int digitPin, int chiffre) {
digitalWrite(digitPin, LOW);
for (int i = 0; i < 8; i++) {
digitalWrite(SEG_PINS[i], bitRead(digits[chiffre], i));
}
delay(5);
digitalWrite(digitPin, HIGH);
}// Affiche la distance sur l'afficheur 7 segments
void afficherDistance(int distance) {
int dizaines = distance / 10;
int unites = distance % 10;
afficherChiffre(SEG_PINS[0], dizaines);
delay(5);
afficherChiffre(SEG_PINS[1], unites);
delay(5);
}
void loop() {
int distance = mesurerDistance();
if (digitalRead(BUTTON_PIN) == LOW) {
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
gererSignalisation(distance);
afficherDistance(distance);
} else {
eteindreSignalisation();
}
delay(100);
}
Loading
st-nucleo-l031k6
st-nucleo-l031k6