// STM32 Nucleo-C031C6 I2C Example
// Simulation: https://wokwi.com/projects/36542166601806131
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Configuration de l'écran LCD
LiquidCrystal_I2C lcd(0x3F, 16, 2);
// Définition des broches du capteur HC-SR04
#define TRIG_PIN PB9 // Broche Trig
#define ECHO_PIN PC7 // Broche Echo (modifiée de D8 vers PC7)
// Définition des broches des LED
#define RED_LED PA6 // LED rouge
#define YELLOW_LED PB15 // LED orange (jaune)
#define GREEN_LED PB2 // LED verte
void setup() {
Serial.begin(9600); // Initialisation de la communication série
// Initialisation de l’écran LCD
lcd.init();
lcd.backlight(); // Activation du rétroéclairage
// Configuration des modes des broches
pinMode(TRIG_PIN, OUTPUT); // Trig en sortie
pinMode(ECHO_PIN, INPUT); // Echo en entrée
pinMode(RED_LED, OUTPUT); // LED rouge en sortie
pinMode(YELLOW_LED, OUTPUT); // LED orange en sortie
pinMode(GREEN_LED, OUTPUT); // LED verte en sortie
}
// Fonction pour obtenir la distance mesurée
float getDistance() {
// Envoi de l'impulsion de déclenchement
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Lecture de la durée de l’impulsion Echo
long duration = pulseIn(ECHO_PIN, HIGH, 30000); // Timeout de 30ms ajouté
// Conversion de la durée en distance (en cm)
float distance_cm = duration * 0.034 / 2;
// Si la distance est hors plage, retourner -1 (aucun objet détecté)
if (duration == 0 || distance_cm <= 2 || distance_cm >= 400) {
return -1;
}
return distance_cm;
}
void loop() {
float distance_cm = getDistance(); // Obtenir la distance mesurée
// Affichage dans le moniteur série
Serial.print("Distance : ");
if (distance_cm == -1) {
Serial.println("Aucun objet");
} else {
Serial.print(distance_cm);
Serial.println(" cm");
}
// Affichage sur l'écran LCD sans scintillement
lcd.setCursor(0, 0);
lcd.print("Distance: "); // Nettoyer les anciennes valeurs
lcd.setCursor(10, 0);
if (distance_cm == -1) {
lcd.print("No Obj ");
} else {
lcd.print(distance_cm);
lcd.print("cm ");
}
// Logique des LED en fonction de la distance
if (distance_cm != -1) {
if (distance_cm < 10) {
digitalWrite(RED_LED, HIGH);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(GREEN_LED, LOW);
} else if (distance_cm < 30) {
digitalWrite(RED_LED, LOW);
digitalWrite(YELLOW_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
} else {
digitalWrite(RED_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(GREEN_LED, HIGH);
}
} else {
// Aucun objet détecté, toutes les LED éteintes
digitalWrite(RED_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(GREEN_LED, LOW);
}
delay(500); // Petite pause avant la prochaine mesure
}
Loading
st-nucleo-c031c6
st-nucleo-c031c6