Bonjour, Après avoir réalisé un petit montage pour afficher, sur un afficheur à 2 digits avec un décodeur DC4511 pour le multiplexage, une température positive lue par une sonde DS18B2, le tout relié à un Arduino UNO, puis à un miniPro, je me lance dans une version plus complexe pour moi : inscrire une décimale. J’ai bénéficié de l’aide précieuse de Romantik pour les étapes précédentes et je l’en remercie. J’ai donc transformé sur une platine d’essai le montage précédent en plaçant un afficheur 5631AS à 3 digits et en ajoutant un troisième transistor 2N2222 avec une résistance de 2K2. Lorsque j’alimente le montage sans avoir branché la sonde, le montage affiche trois beaux "0", mais lorsque je branche la sonde (après avoir débranché l’alimentation), je n’ai plus qu’un "0" qui s’affiche sur le digit le plus à droite, celui qui est supposé afficher une décimale.
Après bien des réflexions et des lectures, je n’arrive pas à comprendre ce qui se passe. Quelle piste devrais-je suivre pour trouver une solution ?
Merci de votre aide.
Mon code est le suivant : `[code] // Croquis permettant d’afficher la température mesurée par une sonde DS18B20 // sur un afficheur 7S-4D 5643AS à cathodes communes // en multiplexage avec un décodeur CD4511
// code devant afficher dizaines, unités et une décimale ainsi que le signe (—— ) si nécessaire (plus tard !!!
// ce code est inspiré de plusieurs autres codes trouvés sur le net, notamment sur le site zestedesavoir.com
#include <OneWire.h> #include <DallasTemperature.h>
// Broches de l’Arduino #define ONE_WIRE_BUS 12 // Broche du capteur DS18B20
// Initialiser les bibliothèques OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire);
const int bit_A = 2; const int bit_B = 3; const int bit_C = 4; const int bit_D = 5; const int signe = 6;
// définitions des broches connectant les transistors aux cathodes de chaque afficheur const int alim_signe = 10; // le signe (—— ) si nécessaire const int alim_dizaine = 9; // les dizaines const int alim_unite = 8; // les unites const int alim_decimale = 7; // un chiffre après la virgule
void setup() { // Initialiser la communication série Serial.begin(9600);
// Initialiser le capteur DS18B20 sensors.begin();
// Les broches sont toutes des sorties pinMode(bit_A, OUTPUT); pinMode(bit_B, OUTPUT); pinMode(bit_C, OUTPUT); pinMode(bit_D, OUTPUT); pinMode(signe, OUTPUT) ; pinMode(alim_dizaine, OUTPUT); pinMode(alim_unite, OUTPUT); pinMode(alim_decimale, OUTPUT);
// Les broches sont toutes mises à l’état bas digitalWrite(bit_A, LOW); digitalWrite(bit_B, LOW); digitalWrite(bit_C, LOW); digitalWrite(bit_D, LOW); digitalWrite(signe, LOW); digitalWrite(alim_signe, LOW); digitalWrite(alim_dizaine, LOW); digitalWrite(alim_unite, LOW); digitalWrite(alim_decimale, LOW); }
// * FIN DE LA FONCTION SETUP ****
void loop() { // Lire la température du capteur sensors.requestTemperatures(); float temperature = sensors.getTempCByIndex(0); // float donc "virgule flottante" if (isnan(temperature)) { // vérification qu’il s’agit bien d’un nombre Serial.println("les données reçues du capteur DS18B20 ne forment pas un nombre"); return; }
// Convertir la température en entier int temp = (int)temperature;
Serial.print ("temperature : ") ; Serial.print (temperature) ; Serial.println( ) ;
// appel de la fonction affichage avec envoi du nombre à afficher afficher_nombre(temp);
} // * FIN DE LA FONCTION LOOP ****
// fonction permettant d’afficher un nombre sur deux afficheurs void afficher_nombre(char nombre) { // initialisation de variables suplémentaires long temps; // variable utilisée pour savoir le temps écoulé… char signe = 0, unite = 0, dizaine = 0, decimale = 0 ; // variable pour chaque afficheur
if (nombre > 9) // si le nombre reçu dépasse 9 { dizaine = nombre / 100; // on récupère les dizaines
unite = nombre - (dizaine * 100); // on récupère les unités
decimale = nombre - ((dizaine * 100) + (unite * 10)) ; // on récupère la première décimale
} temps = millis(); // on récupère le temps courant
// valeur permettant de pouvoir lire le nombre affiché sans clignotement while ((millis() - temps) < 10000) { // on affiche le nombre // d’abord les dizaines pendant 10 ms // le transistor de l’afficheur des dizaines est saturé, // donc l’afficheur est allumé digitalWrite(alim_dizaine, HIGH); // on appel la fonction qui permet d’afficher le chiffre dizaine afficher(dizaine); // les autres transistors sont bloqués et leurs afficheurs éteints digitalWrite(alim_unite, LOW); digitalWrite(alim_decimale, LOW);
// la valeur du delay permet de gérer le temps d'affichage et donc d'éviter le clignotement
// si cette valeur est trop élevée
delay(5);
// puis les unités pendant 10 ms
// on éteint le transistor allumé
digitalWrite(alim_dizaine, LOW);
// on appel la fonction qui permet d'afficher le chiffre unité
afficher(unite);
// et on allume l'afficheur des unités
digitalWrite(alim_unite, HIGH);
delay(5);
// on éteint le transistor allumé
digitalWrite(alim_unite, LOW);
// on appel la fonction qui permet d'afficher le chiffre de la 1ère décimale
afficher(decimale);
// et on allume l'afficheur de la première décimale
digitalWrite(alim_decimale, HIGH);
delay(5);
} }
// fonction écrivant sur un seul afficheur // on utilise le même principe que vu plus haut void afficher(char chiffre) { digitalWrite(bit_A, LOW); digitalWrite(bit_B, LOW); digitalWrite(bit_C, LOW); digitalWrite(bit_D, LOW);
if (chiffre >= 8) { digitalWrite(bit_D, HIGH); chiffre = chiffre - 8; } if (chiffre >= 4) { digitalWrite(bit_C, HIGH); chiffre = chiffre - 4; } if (chiffre >= 2) { digitalWrite(bit_B, HIGH); chiffre = chiffre - 2; } if (chiffre >= 1) { digitalWrite(bit_A, HIGH); chiffre = chiffre - 1; } } [/code]`