Conseil pour une variable utilisé pour la température

Bonjour,

Débutant sur Arduino, je me suis fait un petit “projet” dans ma tête pour m’initier au codage.J’essaie d’utiliser un capteur de température, de récupérer la valeur et de l’afficher sur un écran LCD.
Vous me direz, rien de difficile, mais j’ai quand même quelque soucis, qui malgré des tentatives de modification de tous les côtés, persistent. :sob:

Bon je vais vous expliquez, j’ai récupérer un code pour mon capteur (DS18B20) sur un tutoriel, que j’ai modifié pour mon cablage :

#include <Wire.h>
#include <Adafruit_MCP23017.h>
#include <Adafruit_RGBLCDShield.h>

#include <OneWire.h> // Inclusion de la librairie OneWire

#define DS18B20 0x28     // Adresse 1-Wire du DS18B20

Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();


OneWire ds(5); // Création de l'objet OneWire ds
 
// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d'erreur
boolean getTemperature(float *temp){
  byte data[9], addr[8];
  // data : Données lues depuis le scratchpad
  // addr : adresse du module 1-Wire détecté
 
  if (!ds.search(addr)) { // Recherche un module 1-Wire
    ds.reset_search();    // Réinitialise la recherche de module
    return false;         // Retourne une erreur
  }
   
  if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l'adresse a été correctement reçue
    return false;                        // Si le message est corrompu on retourne une erreur
 
  if (addr[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
    return false;         // Si ce n'est pas le cas on retourne une erreur
 
  ds.reset();             // On reset le bus 1-Wire
  ds.select(addr);        // On sélectionne le DS18B20
   
  ds.write(0x44, 1);      // On lance une prise de mesure de température
  delay(800);             // Et on attend la fin de la mesure
   
  ds.reset();             // On reset le bus 1-Wire
  ds.select(addr);        // On sélectionne le DS18B20
  ds.write(0xBE);         // On envoie une demande de lecture du scratchpad
 
  for (byte i = 0; i < 9; i++) // On lit le scratchpad
    data[i] = ds.read();       // Et on stock les octets reçus
   
  // Calcul de la température en degré Celsius
  *temp = ((data[1] << 8) | data[0]) * 0.0625; 
   
  // Pas d'erreur
  return true;
}
 
// setup()
void setup() {
  Serial.begin(9600); // Initialisation du port série
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
}
 
// loop()
void loop() {
  float temp;
   
  // Lit la température ambiante à ~1Hz
  if(getTemperature(&temp)) {
     
    // Affiche la température
    lcd.print("Temp : ");
    lcd.print(temp);
//    lcd.write(176); // caractère °
    lcd.println(' C');
    lcd.println();
  }
}

Le problème est que sur mon écran LCD(2x16), il s’affiche(par exemple):

Temp : 24,123456
Temp : 24,123456

Ce qui ne me plait pas du tout, j’aimerai qu’il n’affiche que 2 chiffres après la virgule avec le " C" derrière (je n’arrive pas non plus à afficher le ° mais sa c’est autre chose, je l’ai donc mis en commentaire)

J’ai donc penser que cela venais du “float temp;” juste après le “void loop” mais j’ai essayer avec “int” par exemple, sa affiche la température à la suite sans retour à la ligne ce qui rend très moche et de plus sa ne résous pas mon problème avec les chiffres après la virgule …

De plus, ce que je trouve étrange avec ce programme lorsque je l’affiche sur le serial, je n’ai aucun problème, je veux dire tout fonctionne comme je le désire, il m’affiche :

Temp : 24,12°C
Temp : 24,13°C

c’est lorsque j’ai essayer de le passer sur mon LCD que les problèmes sont apparues …

J’ai regarder sur d’autre forum, tuto, … mais personne n’a l’air d’avoir ce problème, donc je viens vous demander votre aide :smiley:

J’espère que vous avez compris mon problème, j’ai essayer d’expliquer au mieux.

Je vous remercie d’avance pour votre temps et votre savoir pour essayer de m’aider :wink:

spiky:
...
J'ai regarder sur d'autre forum, tuto, ... mais personne n'a l'air d'avoir ce problème, donc je viens vous demander votre aide :smiley:

J'espère que vous avez compris mon problème, j'ai essayer d'expliquer au mieux.

Je vous remercie d'avance pour votre temps et votre savoir pour essayer de m'aider :wink:

bonsoir
regarde ce topic

Bonsoir,

Merci de votre aide pour commencer, un post que j'ai a priori oublier de regarder ...

Si j'ai bien compris le sujet que vous venez de m'envoyer, je devrais réécrire mon void loop comme ceci :

void loop() {
  float temp;
   
  // Lit la température ambiante à ~1Hz
  if(getTemperature(&temp)) {
     
    // Affiche la température
    lcd.print("Temp : ");
    sprintf(temp,"la valeur est %f8.2",temp);
    lcd.print(temp);
//    lcd.write(176); // caractère °
    lcd.println(' C');
    lcd.println();
  }
}

J'ai rajouter la ligne

sprintf(temp,"la valeur est %f8.2",temp);

Mais je ne suis pas sûre de ce qu'il va se passer, je n'ai pas mon matériel pour essayer le code actuellement, je vous tiendrai au courant demain !

Merci d'avance

Bonjour,

J'ai essayer ce matin mais je reçois l'erreur suivante :

capteurtemperaturelcd.ino: In function 'void loop()':
capteurtemperaturelcd.ino:68:44: error: cannot convert 'float' to 'char*' for argument '1' to 'int sprintf(char*, const char*, ...)'
Erreur lors de la compilation.