Pb affichage float ILI9341

Bonjour,
Je travail sur un projet dont le but serait de gérer l'éclairage de ma cible au stand de tir depuis le pas de tir.
Coté cible:
-Un arduino UNO,
-2 LED 3W indépendantes commandées en PWM
-Un capteur de température TMP36

  • Un module nrf24l01 en liaison SPI

la température lue sur la broche du tmp36 passe par la libraire runningAverage pour en sortir une valeur moyenne afin d'éviter les variations parasites.
Cette moyenne sous forme int est ensuite envoyée à l'arduino du pas de tir via le nrf24l01.

Coté pas de tir:
-Un arduino UNO

  • 2 potentiomètres ( 1 par LED)
  • Un écran tft 3,2" 240X320 en liaison SPI
  • Un module nrf24l01 en liaison SPI

Pour calculer la température en °C j'utilise:

 float voltage = payload.reading * 5.0;
  voltage = voltage/1024.0;
  tempcible =( (voltage - .5) * 100 );

payload.reading étant la valeur moyenne de la température sous la forme int reçue par le nrf24l01.
j'envoie ensuite la valeur en °C sous la forme float à mon écran tft avec ce code:

tft.setTextColor(ILI9341_NAVY,ILI9341_BLUE);
tft.setCursor(90, 50);
tft.print(tempcible);

Le problème est que la valeur affichée à l'écran "oubli" le chiffre des dizaine...
Par exemple pour une température de 19,123°C
l'écran m'affiche 9,123°C
quand j'ajoute :

 Serial.println(tempcible);

je lis bien 19,123°C sur le moniteur serie.
Donc la communication entre les 2 arduino fonctionne et la conversion en °C aussi...
j'ai également essayé de réduire le nombre de décimale, rien à faire, le chiffre des dizaines ne s'affiche toujours pas.

Voici le code de l'arduino du pas de tir:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>



//**********RNF24L01**************
#define _csnrf 10
RF24 radio(9, _csnrf); // CE, CSN
//nRF24L01 radio(9, _csnrf); // CE, CSN
const byte addresses[][6] = {"00001", "00002"};



//*********ILI9341****************
 //#define _rst 6
 #define _dc 5
// #define _miso 12
 //#define _mosi 11
 //#define _sclk 13
 #define _cstft 7

 Adafruit_ILI9341 tft = Adafruit_ILI9341(_cstft, _dc); 


//********** BROCHAGE***********
#define plum A0 // broche A0 potentiometre de LED
#define puv A1 // broche A1 potentiometre de LED UV



//***********VARIABLES ET CONSTANTES**********
typedef struct{
  int potlum; // valeure lue sur broche A0 (entre 0 et 1023)
  int potuv;  // valeure lue sur broche A1 (entre 0 et 1023)
  int reading; // valeur de temperature lue par arduino cible (entre 0 et 1023)
}data;
data payload;   // Structure de données echangée par module radio

float tempcible; // température de la cible affichée (°C)

void setup() {

pinMode(_cstft, OUTPUT);
pinMode(_csnrf, OUTPUT);
//digitalWrite(_cstft,HIGH); // Désactivation écran
//digitalWrite(_csnrf,HIGH); // Désactivation radio
SPI.begin();
Serial.begin(9600);
 
 
 //***************** RADIO **********  
  digitalWrite(_cstft,HIGH); // Désactivation écran
  digitalWrite(_csnrf,LOW); // Activation radio
  radio.begin();
  radio.setChannel(125);
  radio.openWritingPipe(addresses[1]); // 00002
  radio.openReadingPipe(1, addresses[0]); // 00001
  radio.setPALevel(RF24_PA_MIN);
  
 //*************** ECRAN TFT ****************
 digitalWrite(_csnrf,HIGH); // Désactivation radio
 digitalWrite(_cstft,LOW); //Activation écran
 tft.begin(3000000);

              //** ECRITURE DU FOND D'ECRAN***
           
          tft.fillScreen(ILI9341_BLUE);
          tft.setRotation(3);
          tft.setTextSize(2);
          tft.fillRect(159, 0, 3, 239, ILI9341_DARKGREY);
          tft.setTextColor(ILI9341_BLACK);
          tft.setCursor(20, 10);
          tft.println("PAS DE TIR");
          tft.setCursor(212, 10);
          tft.println("CIBLE");
           
            
          tft.setTextSize(1.7);
            //***********PAS DE TIR*****************
            
          
          tft.setTextColor(ILI9341_NAVY);
          tft.setCursor(5, 50);
          tft.println("Temperature:");
          tft.setCursor(140, 50);
          tft.println((char)247); //°
          tft.setCursor(146, 50); //C
          tft.println("C");
          tft.setCursor(5, 70);
          tft.println("humidite:");
          tft.setCursor(5, 90);
          tft.println("U batterie:");
          tft.setCursor(5, 110);
          tft.println("I batterie:");
          tft.setCursor(5, 130);
          tft.println("P LED");
          tft.setCursor(5, 150);
          tft.println("P LED-UV");
            
            //***********CIBLE********************* 

           tft.setTextColor(ILI9341_NAVY);
           tft.setCursor(164, 50);
           tft.println("Temperature:");
           tft.setCursor(164, 70);
           tft.println("humidite:");
           tft.setCursor(164, 90);
           tft.println("U batterie:");
           tft.setCursor(164, 110);
           tft.println("U batterie:");
  
  
 
  
  delay(5);
}

void loop() {

  //**************[RECEPTION]************************/
 digitalWrite(_cstft,HIGH); // Désactivation écran
 digitalWrite(_csnrf,LOW); // Activation radio

 radio.startListening();
 reception();
 radio.stopListening();
 delay(5);
  
  
  //****************[ EMISSION ]***************************/

 radio.stopListening();
 emitting();
 delay(15);
 radio.startListening();
 digitalWrite(_csnrf,HIGH); // Désactivation radio
 digitalWrite(_cstft,LOW); //Activation écran
 
  
//*************[AFFICHAGE]**********************/
  ecritureecran();
  delay(5);
}




void reception(){  //*********** SOUS PROGRAMME RECPTION****************
  if(radio.available()){
    radio.read(&payload, sizeof(payload));
  }
  


}
void emitting(){//*********** SOUS PROGRAMME EMISSION****************
  payload.potlum = analogRead(plum);
  payload.potuv = analogRead(puv);
  radio.write(&payload, sizeof(payload));
}


void ecritureecran(){//***************SOUS PROGRAMME CALCUL/AFFICHAGE************
 
 float voltage = payload.reading * 5.0;
  voltage = voltage/1024.0;
  tempcible =( (voltage - .5) * 100 );
 
  Serial.println(tempcible);

 tft.setTextColor(ILI9341_NAVY,ILI9341_BLUE);
 tft.setCursor(90, 50);
 tft.print(tempcible);
  
}

Quelqu'un aurait-il déja eu le même problème ?
merci de votre aide :slight_smile:

Est-ce que c'est pareil si tu changes les coordonnées d'affichage de cette variable?

Et si tu lui envoies la chaîne de caractères:

tft.print( "19.123" );

il affiche quoi ?
Tu n'as pas donné la suite du code qui affiche "°C", ça peut jouer ?

lesept:
Est-ce que c'est pareil si tu changes les coordonnées d'affichage de cette variable?

Oui, j'ai essayé à plusieurs endroits de l'écran, ca ne change rien.

biggil:
Et si tu lui envoies la chaîne de caractères:

tft.print( "19.123" );

il affiche quoi ?
Tu n'as pas donné la suite du code qui affiche "°C", ça peut jouer ?

si j'envoie :

tft.print( "19.123" );

il m'affiche bien 19,123
le code du symbole °C est:

tft.setCursor(140, 50);
tft.println((char)247); //°
tft.setCursor(146, 50); 
tft.println("C");//C

il se trouve dans le setup, dans la partie "écriture du fond d'écran" / "pas de tir"

C'est pas banal comme problème. S'il y avait une telle erreur dans les bibliothèques Adafruit concernées, elle aurait dû être détecté depuis longtemps.
Tout ce que je peux te suggérer c'est d'essayer avec une autre bibliothèque, par exemple TFT_eSPI
Sinon, puisque les textes s'affichent bien, tu peux écrire ta valeur dans un char array et afficher ce dernier

char monTexte[10];
sprintf(monTexte, "%4.1",tempcible);
tft.print(monTexte);

Je l'ai formatté avec un chiffe après la virgule, ce doit être suffisant...

EDIT : c'était

sprintf(monTexte, "%4.1f",tempcible);

lesept:
C'est pas banal comme problème. S'il y avait une telle erreur dans les bibliothèques Adafruit concernées, elle aurait dû être détecté depuis longtemps.
Tout ce que je peux te suggérer c'est d'essayer avec une autre bibliothèque, par exemple TFT_eSPI
Sinon, puisque les textes s'affichent bien, tu peux écrire ta valeur dans un char array et afficher ce dernier

char monTexte[10];

sprintf(monTexte, "%4.1",tempcible);
tft.print(monTexte);



Je l'ai formatté avec un chiffe après la virgule, ce doit être suffisant...

Je viens d'essayer... ca n'affiche plus rien du tout.... :smiling_imp:

en essayant:
dans le sketch:

char monTexte;

puis dans "écriture écran":

 tft.setTextColor(ILI9341_NAVY,ILI9341_BLUE);
 tft.setCursor(90, 150);
 tft.print(monTexte);
 tft.println(tempcible, 1);

ca m'affiche: 19,10 8)
ne me demandez pas pourquoi...
le 0 est fixe et je n'arrive pas à le supprimer malgré le fait que je ne demande qu'une seule décimale...
mais bon je vais pas chipoter....
Par contre une erreur dans la bibliothèque me paraît possible puisque j'en ai vraiment chi... à faire fonctionner le nrf24l01 et le ili9341 sur la même liaison SPI...!
A cause d'une histoire de SPI software et hardware....
Apres 3 jours de recherches intensives, d'essais, et de refontes totales du programme... en vain.
je suis miraculeusement tombé sur ce post:
https://github.com/adafruit/Adafruit_ILI9341/issues/65
Apres modification de la librairie adafruit_ili9341 mes problèmes étaient résolus...
En tout cas merci à tous de vos conseils
et si quelqu'un passe ici par hasard avec le pourquoi du comment du problème je suis preneur !

shootduino:
Je viens d'essayer... ca n'affiche plus rien du tout.... :smiling_imp:

C'est normal. %f n'est pas supporté sur les processeurs AVR, donc ne fonctionne pas sur une carte UNO.

J'avais oublié le 'f' dans le format.
sprintf ne marche pas sur un AVR en format flottant ?

EDIT: je suis tombé sur ça sur StackExchange, qui résout le problème de l'affichage formatté de float. A conserver dans un coin...

Fortunately there's a function specifically for formatting a float into a character array (C-string), called dtostrf and is used thus:

float myVal = 23.49173783;

char *buffer[10]; // Enough room for the digits you want and more to be safe
dtostrf(myVal, 9, 1, buffer);




The first number in the parameter list is how many characters you want to have in your output, including the . and any leading -. Any extra characters are padded with space. The second number is how many decimal places. If the first number is negative the value is left-aligned. If it's positive it's right-aligned. So the code above would give you:


**〿〿〿〿〿23.5␀**
(Note: I am using 〿 to denote a space character.) If you used -9 you'd get:


**23.5〿〿〿〿〿␀**
You can, of course, feed that created string into another string using snprintf and the %s placeholder.



char buf2[32];
snprintf(buf2, 32, "The temperature is: %s\r\n", buffer);




buf2 ⇒ "**The temperature is: 23.5〿〿〿〿〿**"

Ensuite, il suffit d'afficher buf2 sur l'écran.

Non, ce serait trop coûteux en FLASH.
Utiliser dtostrf()

Alors j'ai en partie résolu le problème en supprimant les lignes:

digitalWrite(_cstft,HIGH); // Désactivation écran
digitalWrite(_csnrf,LOW); // Activation radio

je me suis aperçu que les bibliothèques adafruit_ili9341 et NRF24 gèrent très bien leurs pin _cs respectives sans interventions extérieure.
je me suis aussi aperçu que:

#include <SPI.h>
// et
SPI.begin();

ne servaient à rien....
en supprimant tout ça, le chiffre des dizaines est réapparu avec la commande toute simple:

 tft.setCursor(20, 15);
tft.print(tempcible, 1);

La température affiché pour une température de 19,123°C est:
19,10 sur l'écran
19,1 sur le moniteur série
pour:

 tft.setCursor(20, 15);
tft.print(tempcible, 2);

sur l'écran 19,120
sur le moniteur: 19,12
Il y a toujours ce zéro à la fin qui est fixe et que je n'arrive pas à supprimer...
En convertissant la valeur en int via la fonction:

int tempvalue= round (tempcible);
tft.print(tempvalue);

toujours pour une température de 19,123°C:
190 sur l'écran
19 sur le moniteur série
Je precise que ce zéro est totalement fixe malgré la valeur de la décimale dont il prend la place...
y a t'il une solution ?

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.