Auteur Sujet: nombre à virgule  (Lu 28288 fois)

coco

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
nombre à virgule
« le: décembre 20, 2018, 08:09:20 am »
Bonjour.
Actuellement je  bidouille un programme avec la sonde de température DS18b20.
J'ai donc une température ex: 20.55°. Comment convertir ce nombre à 1 chiffre après la virgule :20.5° car je voudrais faire un getTemperature de la sonde que si ce dernier change de valeur.
Avec un nombre à 2 chiffre après la virgule , le programme va faire que ça sinon.
Merci pour votre réponse.

CATPLUS

  • Sr. Member
  • ****
  • Messages: 433
    • Voir le profil
Re : nombre � virgule
« Réponse #1 le: décembre 20, 2018, 09:28:47 am »
Bonjour Mr Coco

SVP Quel rapport et utilité avec le train?

Best Regards

coco

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Re : nombre à virgule
« Réponse #2 le: décembre 20, 2018, 09:51:25 am »
aucun. Je suis utilisateur Arduino tout court sans LOCO

msport

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2217
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
Re : nombre à virgule
« Réponse #3 le: décembre 20, 2018, 10:34:26 am »
Bon, on ne va pas attendre que le Père Noël offre une loco à coco ... Tout le monde n'est pas loco.
A mon avis, si son programme ne fait que ça sinon, ça ne va pas le fatiguer beaucoup surtout s'il n'a que ça à faire.
Par contre si le problème est l'affichage, avec un petit test sur la différence d'une mesure à l'autre ce sera vite réglé.
Et enfin le formatage des affichages (qui dérivent de print) est expliqué dans la référence de l'Arduino :
https://www.arduino.cc/en/Serial/Print
Cordialement

coco

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Re : nombre à virgule
« Réponse #4 le: décembre 20, 2018, 11:16:14 am »
C'est une petite fonction dans un programme relativement lourd.
Non ce n'est pas un problème d'affichage (print machin). Je lance une routine lorsque la valeur de la sonde change.
La fonction getTempérature me retourne un float; si je garde cette varriable tel quel mon programme va passer son temps dessus.

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1713
    • Voir le profil
Re : nombre à virgule
« Réponse #5 le: décembre 20, 2018, 02:45:08 pm »
Bonjour,

Les capteurs de ce genre retournent une valeur entière, pas une valeur codée en flottant. C'est donc la bibliothèque que vous utilisez qui fait cette conversion en flottant.

Quelle bibliothèque utilisez vous ?
Cordialement

coco

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Re : nombre à virgule
« Réponse #6 le: décembre 20, 2018, 03:15:11 pm »
bibliothèque Dallas Temperature .
fonction: sensors.requestTemperature().

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1713
    • Voir le profil
Re : nombre à virgule
« Réponse #7 le: décembre 20, 2018, 04:11:05 pm »
Ok

Mais cette méthode demande aux capteurs de faire une mesure. Ce n'est pas la méthode appelée pour récupérer la température.

La méthode que vous appelez est sans doute getTempC qui retourne une température en Celsius sous forme d'un nombre à virgule flottante.

Utiliser plutôt getTemp qui retourne un uint16_t avec une résolution de 1/128e de degré.
« Modifié: décembre 20, 2018, 04:13:35 pm par Jean-Luc »
Cordialement

coco

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Re : nombre à virgule
« Réponse #8 le: décembre 20, 2018, 05:24:38 pm »
Je n'ai pas cette fonction. Je n'ai que getTempC ou getTempF.
Bon j'ai trouvé un tuto pour communiquer avec cette sonde via oneWire uniquement. le calcul pour la conversion en Celsius y est dedans. C'est un peu plus dur à comprendre car c'est de la programmation direct sur les registres.
"getTemp qui retourne un uint16_t avec une résolution de 1/128e de degré." cette info m'était très utile.
Merci pour tes réponses.
A+
« Modifié: décembre 20, 2018, 05:45:12 pm par coco »

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1713
    • Voir le profil
Re : nombre à virgule
« Réponse #9 le: décembre 20, 2018, 06:29:33 pm »
Avez vous la dernière version de la bibliothèque ?

Elle est ici : https://github.com/milesburton/Arduino-Temperature-Control-Library

Dans DallasTemperature.h ligne 115 (https://github.com/milesburton/Arduino-Temperature-Control-Library/blob/1050b661ef80ac398eb4be5b91447c7d2a77a5e8/DallasTemperature.h#L115) on voit la fonction en question

Cette bibliothèque est d'ailleurs disponible via le gestionnaire de bibliothèque. Si vous avez une ancienne version, remplacez là par cette nouvelle en utilisant le gestionnaire de bibliothèques (plutôt la 3.7.9, la 3.8.0 est une prerelease).
Cordialement

coco

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Re : nombre à virgule
« Réponse #10 le: décembre 20, 2018, 06:47:31 pm »
oui j'ai bien celle là .
regardez dans keyword il n'y est pas.


msport

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2217
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
Re : nombre à virgule
« Réponse #11 le: décembre 20, 2018, 07:37:59 pm »
Est-ce que dans l'exemple ci-dessous en remplaçant
float *temperature par int *temperature

puis   *temperature = ((data[1] << 8) | data[0]) * 0.0625;

par   *temperature = (data[1] << 8) | data[0];

on ne récupère pas la température Celsius x 128  en int ?

Par ailleurs le DS18b20 peut être programmé pour une résolution de 0.5°C, ce qui raccourcit le temps de conversion.


/**
 * Exemple de code pour lire un unique capteur DS18B20 sur un bus 1-Wire.
 */
 
/* Dépendance pour le bus 1-Wire */
#include <OneWire.h>
 
 
/* Broche du bus 1-Wire */
const byte BROCHE_ONEWIRE = 7;

/* Code de retour de la fonction getTemperature() */
enum DS18B20_RCODES {
  READ_OK,  // Lecture ok
  NO_SENSOR_FOUND,  // Pas de capteur
  INVALID_ADDRESS,  // Adresse reçue invalide
  INVALID_SENSOR  // Capteur invalide (pas un DS18B20)
};


/* Création de l'objet OneWire pour manipuler le bus 1-Wire */
OneWire ds(BROCHE_ONEWIRE);
 
 
/**
 * Fonction de lecture de la température via un capteur DS18B20.
 */
byte getTemperature(float *temperature, byte reset_search) {
  byte data[9], addr[8];
  // data[] : Données lues depuis le scratchpad
  // addr[] : Adresse du module 1-Wire détecté
 
  /* Reset le bus 1-Wire ci nécessaire (requis pour la lecture du premier capteur) */
  if (reset_search) {
    ds.reset_search();
  }
 
  /* Recherche le prochain capteur 1-Wire disponible */
  if (!ds.search(addr)) {
    // Pas de capteur
    return NO_SENSOR_FOUND;
  }
 
  /* Vérifie que l'adresse a été correctement reçue */
  if (OneWire::crc8(addr, 7) != addr[7]) {
    // Adresse invalide
    return INVALID_ADDRESS;
  }
 
  /* Vérifie qu'il s'agit bien d'un DS18B20 */
  if (addr[0] != 0x28) {
    // Mauvais type de capteur
    return INVALID_SENSOR;
  }
 
  /* Reset le bus 1-Wire et sélectionne le capteur */
  ds.reset();
  ds.select(addr);
 
  /* Lance une prise de mesure de température et attend la fin de la mesure */
  ds.write(0x44, 1);
  delay(800);
 
  /* Reset le bus 1-Wire, sélectionne le capteur et envoie une demande de lecture du scratchpad */
  ds.reset();
  ds.select(addr);
  ds.write(0xBE);
 
 /* Lecture du scratchpad */
  for (byte i = 0; i < 9; i++) {
    data[i] = ds.read();
  }
   
  /* Calcul de la température en degré Celsius */
  *temperature = ((data[1] << 8) | data[0]) * 0.0625;
 
  // Pas d'erreur
  return READ_OK;
}
 
 
/** Fonction setup() **/
void setup() {

  /* Initialisation du port série */
  Serial.begin(115200);
}
 
 
/** Fonction loop() **/
void loop() {
  float temperature;
   
  /* Lit la température ambiante à ~1Hz */
  if (getTemperature(&temperature, true) != READ_OK) {
    Serial.println(F("Erreur de lecture du capteur"));
    return;
  }

  /* Affiche la température */
  Serial.print(F("Temperature : "));
  Serial.print(temperature, 2);
  Serial.write(176); // Caractère degré
  Serial.write('C');
  Serial.println();
}
Cordialement

coco

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Re : nombre à virgule
« Réponse #12 le: décembre 20, 2018, 08:23:47 pm »
Oui je suis en train d'étudier ce programme.Pour le moment il reste bloqué sur la ligne "erreur de lecture " dans loop.Mon capteur fonctionne parfaitement avec un autre programme.Il est parfaitement reconnu avec un exemple de la bibliothèque.

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1713
    • Voir le profil
Re : nombre à virgule
« Réponse #13 le: décembre 20, 2018, 08:53:03 pm »
oui j'ai bien celle là .
regardez dans keyword il n'y est pas.

L’auteur a sans doute oublié cette fonction dans keyword qui ne sert qu’à la coloration syntaxique dans l’editeur et qui n’a rien à voir avec le programme.

Cordialement

coco

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Re : nombre à virgule
« Réponse #14 le: décembre 21, 2018, 09:25:59 am »
Bonjour.
Msport:ce programme est un reflet de l'exemple livré avec la bibliothèque onwire.il est configuré pour un 18b alors que j'ai un 18s c'est pour ça que ça ne marche pas.
On voit bien que la sonde retourne bien un int et il a fait une division pour obtenir un float en celsius.
Il ne me reste plus qu'à trouver la formule pour travailler qu'en 1/10 de degré.
Merci à tous toi et jean Luc.
À bientôt.
Désolé de ne pas être un LOCO : ca prend trop de place ce type de hobby.
Mon objectif actuel : d'être capable d'écrire une bibliothèque à partir d'un datasheet.
Ça va me prendre quelques années lumières .( je ne suis pas informaticien de métier).