Problème affichage segment (bibliothèque SevSeg)

Bonjour,

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);
}

Une vidéo à l'appui : WeTransfer - Send Large Files & Share Photos Online - Up to 2GB Free

Merci pour votre attention

Bonjour,

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

Bonjour,

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.

En effet, je te remercie. Cela fonctionne !

Bonne continuation.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.