Gestion d'une décimale

Affichage sur 4 digits avec Arduino, décodeur BCD et sonde de T° DS18B2

Le problème exposé dans ce sujet a été résolu.

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]`

Ce n’est pas moi qui devrait répondre à ta question, mais bon …

Est-ce que ton 5631AS est bien muni d’un latch? Je n’ai rien trouvé qui le laisse penser.

Et si la valeur reçue est supérieure à 127, tu vas perdre des choses avec un type char

+0 -0

Il me semble avoir repris le code précédent pour faire celui-ci. Je vais revisiter tout ça. Quant au type "char", ce n’est pas un souci, car je ne vais mesurer que la température ambiante et même s’il fait bien chaud en ce moment, on est loin de 127.

Après relecture de mon code et du précédent, je n’ai pas vraiment trouvé de différence, ni de trace d’un "latch". J’ai donc fait des tests au niveau de la manière dont la valeur envoyée par le capteur était transformée pour ne retenir qu’un chiffre à placer dans un digit, puis dans un autre. Je suis arrivé à afficher les dizaines, puis les unités. Par contre, pour la première décimale il m’a fallu jongler entre les types "int" et "float". C’est en initialisant une variable "float" temporaire que j’ai résolu le problème… et que j’ai appris encore quelque chose. Je vais maintenant passer à la suite, c’est-à-dire trouver le moyen d’afficher un signe (——) sur un digit placé à gauche des 3 autres en cas de mesure d’une température négative. Je considère ce sujet comme résolu et je remercie PierrotLeFou de son aide.

Ce doit effectivement être des degrés Celsius, car je n’ai rien codé à ce niveau.

J’ai chargé une librairie

OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire);

et ensuite la variable température est alimentée comme suit sensors.requestTemperatures(); float temperature = sensors.getTempCByIndex(0);

Un latch est une mémoire temporaire dans le circuit qui permet de garder la valeur. Il y en avait un sur ton autre circuit.

PierrotLeFou

Je crois que le latch était sur le décodeur et du coup ne sert à rien puisque partagé aux deux afficheurs, et le code et montage du tuto, sur lequel il se base, se servent juste de le persistance rétinienne en rafraichissant suffisemment vite pour qu’on ne voit pas que ça clignote, pas de latch dans ce qu’il a appris. le rendu est pas dégeu d’après la video d’eskimon.

Ce doit effectivement être des degrés Celsius, car je n’ai rien codé à ce niveau.

J’ai chargé une librairie

Romsie

Il faut lire la doc pour en être sûr au lieu de supposer.

Si tu peux lire le lien sous la zone d’edition pour voir comment rédiger sur le forum, ça nous permettrait de lire plus facilement ton code. En plus on voit que t’essaie de faire l’effort en mettant des balises, mais là encore tu supposes alors que tu peux avoir l’info.

j’ai repéré quelques erreurs mais je vais voir le nouveau sujet pour commenter la dernière version du code.

+0 -0

Bonjour,

Dans une rare partie lisible, on peut voir que la décomposition en 3 chiffre est erronée. Exemple, valeur lue = 30.0 donne:

nombre = 30
dizaine = 30/100 = 0
unite = 30 - (0100) = 30
decimale = 30 - ((0
100) + (30 * 10)) = -270, dans un char peut être 48.
Les trois "chiffres" transmis au décodeur BCD sont : 0, 15 et 15.

Ca peut expliquer un chiffre à 0 et les autres éteints!

Merci Dalfab, bonne remarque mais le code a été corrigé. Dans sa nouvelle version dizaine = nombre / 10

J’ai fait un croquis de mon montage, mais je ne sais pas comment le placer. Je n’ai pas trouvé l’explication dans "Envie d’en savoir plus ? " C’est un pdf Merci de m’aider.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte