#define trig PB6
#define echo PB1
#define LED_BUILTIN PB3
#define ORANGE_LED PB7
#define RED_LED PB0
#define buzzer PA8
#define DS PA0 // Data
#define SH_CP PA1 // Clock
#define ST_CP PA3 // Latch
#define MR PA4
#define SWITCH_PIN PB4
long duration;
float distance;
unsigned long lastBipTime = 0;
// Table de vérité pour afficheur 7 segments (ajustée selon votre définition)
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(SH_CP, OUTPUT);
pinMode(ST_CP, OUTPUT);
pinMode(MR, OUTPUT);
digitalWrite(MR, HIGH); // Désactive le Reset du registre [cite: 212]
Serial.begin(115200);
Serial.println("Hello, STM32!");
}
void loop() {
// Le système ne fonctionne que si l'interrupteur est actionné (LOW) [cite: 13, 43]
if (digitalRead(SWITCH_PIN) == LOW) {
// 1. Mesure de la distance [cite: 24]
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);
Serial.println(" cm");
// 2. Gestion de la signalisation visuelle et sonore [cite: 44, 45, 46, 48]
if (distance > 120) {
digitalWrite(LED_BUILTIN, HIGH); // Vert [cite: 44]
digitalWrite(ORANGE_LED, LOW);
digitalWrite(RED_LED, LOW);
noTone(buzzer);
}
else if (distance >= 30) {
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(ORANGE_LED, HIGH); // Orange [cite: 45]
digitalWrite(RED_LED, LOW);
// Calcul de l'intervalle linéaire (1s à 120cm, 0s à 30cm)
int interval = map(distance, 30, 120, 0, 1000);
if (millis() - lastBipTime >= interval) {
tone(buzzer, 440, 100); // Bip 440Hz [cite: 49]
lastBipTime = millis();
}
}
else {
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(ORANGE_LED, LOW);
digitalWrite(RED_LED, HIGH); // Rouge [cite: 46]
tone(buzzer, 440); // Bip continu
}
// 3. Affichage sur les deux 7 segments [cite: 40, 47]
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(ST_CP, LOW);
shiftOut(DS, SH_CP, MSBFIRST, unitsData); // Second registre [cite: 41]
shiftOut(DS, SH_CP, MSBFIRST, tensData); // Premier registre [cite: 41]
digitalWrite(ST_CP, HIGH);
}
else {
// Mode veille : tout éteindre [cite: 43]
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(ORANGE_LED, LOW);
digitalWrite(RED_LED, LOW);
noTone(buzzer);
digitalWrite(ST_CP, LOW);
shiftOut(DS, SH_CP, MSBFIRST, 0x00);
shiftOut(DS, SH_CP, MSBFIRST, 0x00);
digitalWrite(ST_CP, HIGH);
}
delay(50); // Simulation plus fluide
}Loading
st-nucleo-l031k6
st-nucleo-l031k6