J'essaie de prendre en main le module Arduino donc je suis plutôt novice à ce sujet.
J'ai réalisé un montage afin d'afficher la distance capturé par le capteur à ultrason HC-SR04, sur l'écran 4 Digit 7-Segment Display.
Cependant, il semblerait que les distances ne s'affichent pas entièrement, c'est plutôt une alternance de chaque segments différents toutes les secondes.
Séparément (programme du capteur, et programme pour afficher un nombre) les programmes fonctionnent mais dès que je combine les 2 modules : problème
(J'ai pensé au temps de rafraichissement trop court, ou bien à un problème d'électromagnétisme mais cela me semble peu plausible).
Ci-joint mon programme :
#include "SevSeg.h"
SevSeg sevseg;
// Déclaration des broches de l'affichage 4 digits 7 segments
const byte numDigits = 4;
const byte digitPins[] = {2, 3, 4, 5};
const byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
const byte resistorsOnSegments = 0;
// Déclaration des broches du capteur ultrasonique HC-SR04
const byte trigPin = A0; // Broche de déclenchement (Trigger)
const byte echoPin = A1; // Broche de réception (Echo)
// Variables pour le calcul de la distance
long duration;
int distance;
void setup() {
// Initialise la communication série
Serial.begin(9600);
// Configuration des broches du capteur ultrasonique
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Configuration de l'affichage 4 digits 7 segments
sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
sevseg.setBrightness(90); // Réglez la luminosité de l'affichage (0-100)
}
void loop() {
// Génère une impulsion de 10 microsecondes sur la broche de déclenchement (trigPin)
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Mesure la durée de l'impulsion sur la broche echoPin
duration = pulseIn(echoPin, HIGH);
// Calcule la distance en fonction de la durée de l'impulsion
distance = duration * 0.034 / 2;
// Affiche la distance mesurée sur l'affichage 4 digits 7 segments
sevseg.setNumber(distance, 0); // Affiche la distance avec 0 décimales
sevseg.refreshDisplay(); // Met à jour l'affichage
// Affiche la distance mesurée dans la console série
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
// Attend une seconde avant la prochaine mesure
delay(1000);
}
refreshDisplay doit être appelé suffisamment souvent (maximum toutes les 20 ms environ).
Comme indiqué dans la doc de SevSeg Any calls to delay() will interfere with the display
Essaie l'exemple Counter de la librairie pour vérifier que ton afficheur fonctionne bien, puis modifie ton programme pour ne pas utiliser delay() en prenant exemple sur le programme Blink Without Delay
Merci pour ton retour. J'ai mis à jour le programme en supprimant la fonction display.
Ainsi cela me donne :
#include "SevSeg.h"
SevSeg sevseg;
// Déclaration des broches de l'affichage 4 digits 7 segments
const byte numDigits = 4;
const byte digitPins[] = {2, 3, 4, 5};
const byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
const byte resistorsOnSegments = 0;
// Déclaration des broches du capteur ultrasonique HC-SR04
const byte trigPin = A0; // Broche de déclenchement (Trigger)
const byte echoPin = A1; // Broche de réception (Echo)
// Variables pour le calcul de la distance
long duration;
int distance;
// Variables pour la gestion des intervalles de mesure
unsigned long previousMillis = 0;
const unsigned long interval = 1000; // Interval de mesure en millisecondes
void setup() {
// Initialise la communication série
Serial.begin(9600);
// Configuration des broches du capteur ultrasonique
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Configuration de l'affichage 4 digits 7 segments
sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
sevseg.setBrightness(90); // Réglez la luminosité de l'affichage (0-100)
}
void loop() {
unsigned long currentMillis = millis();
// Vérifie si l'intervalle de mesure est écoulé
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; // Mise à jour du temps précédent
// Génère une impulsion de 10 microsecondes sur la broche de déclenchement (trigPin)
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Mesure la durée de l'impulsion sur la broche echoPin
duration = pulseIn(echoPin, HIGH);
// Calcule la distance en fonction de la durée de l'impulsion
distance = duration * 0.034 / 2;
// Affiche la distance mesurée sur l'affichage 4 digits 7 segments
sevseg.setNumber(distance, 0); // Affiche la distance avec 0 décimales
sevseg.refreshDisplay(); // Met à jour l'affichage
// Affiche la distance mesurée dans la console série
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
}
}
Cependant je rencontre toujours le même problème d'affichage.
Qu'entends tu par la fonction counter de la librairie ? Tu souhaites que je fasses une fonction qui permet d'afficher successivement tous les chiffres ou est-ce autre chose ?
Merci
sevseg.refreshDisplay() est toujours appelé toutes les secondes.
Il faut que tu le mettes après la fin du if (currentMillis - previousMillis >= interval) {, c'est à dire à la fin de la loop.