Par avance mes excuses car j'ai débuté Arduino depuis peu, et mon programme comporte probablement plusieurs erreurs grossière, j'espère que vous ne m'en tiendrez pas rigueur.
Je cherche à réaliser un capteur de niveau d'eau à l'aide d'un capteur à ultra son.
J'ai fusionné 2 croquis fonctionnels :
Le 1er renvoyant sur le moniteur série la distance mesurée par le capteur US
Le 2eme (très simple) pour tester l'afficheur 2 digits/7 segments
Les 2 fonctionnent parfaitement.
Mais en mixant les 2, l'afficheur, même si je rentre une valeur fixe dans la fonction "sevseg.setNumber" éclaire des segments selon une logique "douteuse" (aléatoire et sans aucun sens).
Les valeurs renvoyées dans le moniteur série sont bonne.
Quelqu'un pourrait il me dire ou est l'erreur dans mon programme ?
#include "SevSeg.h"
SevSeg sevseg;
int afficheur;
int distance;
int conversion;
// broches de connexion du capteur US
#define Broche_Echo 13 // Broche Echo du HC-SR04 sur D7 //
#define Broche_Trigger 3 // Broche Trigger du HC-SR04 sur D8 //
// broches de connexion de l'afficheur (2 digits, dp non connecté)
byte numDigits = 2;
byte digitPins[] = {4, 5};
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12};
// Définitions des variables
long Duree;
long Distance;
void setup()
{
sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
sevseg.setBrightness(100);
pinMode(Broche_Trigger, OUTPUT); // Broche Trigger en sortie //
pinMode(Broche_Echo, INPUT); // Broche Echo en entree //
Serial.begin (9600);
}
void loop()
{
// Debut de la mesure avec un signal de 10 µS applique sur TRIG //
digitalWrite(Broche_Trigger, LOW); // On efface l'etat logique de TRIG //
delayMicroseconds(2);
digitalWrite(Broche_Trigger, HIGH); // On met la broche TRIG a "1" pendant 10µS //
delayMicroseconds(10);
digitalWrite(Broche_Trigger, LOW); // On remet la broche TRIG a "0" //
// On mesure combien de temps le niveau logique haut est actif sur ECHO //
Duree = pulseIn(Broche_Echo, HIGH);
// Calcul de la distance grace au temps mesure //
Distance = Duree*0.034/2;
conversion= map(Distance, 0, 200, 0, 99);
afficheur = abs(conversion-99);
if(Distance < 200)
{
Serial.print("Distance mesuree :");
Serial.print(Distance);
Serial.print("cm");
Serial.print(" ");
Serial.print(conversion);
Serial.print(" ");
Serial.println(afficheur);
sevseg.refreshDisplay();
sevseg.setNumber(afficheur, 0);
}
}
Merci pour votre réponse xfpd,
De nouveaux essais ce soir m'ont permis de comprendre le problème... mais pas de le résoudre.
Il semble que le soucis provient du temps nécessaire à la mesure de distance. Après avoir supprimé du programme la communication avec le moniteur série, les choses s'arrangent. L'affichage est correct entre 99 et 90, scintille entre 70 et 90 mais ne fonctionne plus en dessous.
Quelle peut etre la solution ?
Merci à tous!
#include "SevSeg.h"
SevSeg sevseg;
int afficheur;
int distance;
int conversion;
// broches de connexion du capteur US
#define Broche_Echo 13 // Broche Echo du HC-SR04 sur D7 //
#define Broche_Trigger 3 // Broche Trigger du HC-SR04 sur D8 //
// broches de connexion de l'afficheur (2 digits, dp non connecté)
byte numDigits = 2;
byte digitPins[] = {4, 5};
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12};
// Définitions des variables
long Duree;
long Distance;
void setup()
{
sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
sevseg.setBrightness(100);
pinMode(Broche_Trigger, OUTPUT); // Broche Trigger en sortie //
pinMode(Broche_Echo, INPUT); // Broche Echo en entree //
}
void loop()
{
// Debut de la mesure avec un signal de 10 µS applique sur TRIG //
digitalWrite(Broche_Trigger, LOW); // On efface l'etat logique de TRIG //
delayMicroseconds(0.1);
digitalWrite(Broche_Trigger, HIGH); // On met la broche TRIG a "1" pendant 10µS //
delayMicroseconds(2);
digitalWrite(Broche_Trigger, LOW); // On remet la broche TRIG a "0" //
// On mesure combien de temps le niveau logique haut est actif sur ECHO //
Duree = pulseIn(Broche_Echo, HIGH);
// Calcul de la distance grace au temps mesure //
Distance = Duree*0.034/2;
afficheur = map(Distance, 0, 200, 99, 0);
if(Distance < 200)
{
sevseg.refreshDisplay();
sevseg.setNumber(afficheur, 0);
}
}
Je vais essayer votre solution. Je pensais également qu'un lissage de valeur pouvait résoudre mon problème. je sais que ca existe mais je n'ai jamais réalisé ...