const int trig = PA9;
const int echo = PA10;
#define LED_BUILTIN PB3
#define ORANGE_LED PB7
#define RED_LED PB0
#define buzzer PA12
#define SWITCH_PIN PB6
#define STCP PA7
#define SHCP PA5
#define DS PA6
#define Q7S PA4
#define MR PA1
long duration;
float distance;
unsigned long lastBipTime = 0;
const byte numbers[] = {
0x7E, 0x0A, 0xB6, 0x9E, 0xCA, 0xDC, 0xF8, 0x0E, 0xFE, 0xCE
};
void setup()
{
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(ORANGE_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(SWITCH_PIN, INPUT_PULLUP);
pinMode(DS, OUTPUT);
pinMode(SHCP, OUTPUT);
pinMode(STCP, OUTPUT);
pinMode(Q7S, INPUT);
digitalWrite(MR, HIGH);
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Hello, STM32!");
}
void loop() {
// Interrupteur OFF → système arrêté
if (digitalRead(SWITCH_PIN) == HIGH) {
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
duration = pulseIn(echo, HIGH);
distance = (duration * 0.0343) / 2;
Serial.print("Distance: ");
Serial.print(distance/100.0);
Serial.println(" m");
if (distance > 120) {
// Zone verte (aucune alerte)
digitalWrite(LED_BUILTIN, HIGH);
digitalWrite(ORANGE_LED, LOW);
digitalWrite(RED_LED, LOW);
noTone(buzzer);
}
else if (distance >= 30) {
// Zone orange
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(ORANGE_LED, HIGH);
digitalWrite(RED_LED, LOW);
tone(buzzer, 440);
delay(500);
noTone(buzzer);
}
else {
// Zone rouge (danger)
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(ORANGE_LED, LOW);
digitalWrite(RED_LED, HIGH);
tone(buzzer, 440); // bip continu
}
float distM = distance / 100.0;
if (distM > 9.9) distM = 9.9;
int tens = (int)distM;
int units = (int)(distM * 10) % 10;
// Préparation des octets (Point décimal sur le premier digit)
byte tensData = numbers[tens] | 0x01;
byte unitsData = numbers[units];
digitalWrite(STCP, LOW);
shiftOut(DS, SHCP, MSBFIRST, unitsData); // Second registre [cite: 41]
shiftOut(DS, SHCP, MSBFIRST, tensData); // Premier registre [cite: 41]
digitalWrite(STCP, HIGH);
// put your main code here, to run repeatedly:
delay(500); // this speeds up the simulation
return;
}
else{
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(ORANGE_LED, LOW);
digitalWrite(RED_LED, LOW);
noTone(buzzer);
digitalWrite(STCP, LOW);
shiftOut(DS, SHCP, MSBFIRST, 0x00);
shiftOut(DS, SHCP, MSBFIRST, 0x00);
digitalWrite(STCP, HIGH);
}
}