Trasmettere una temperatura corretta al display Nextion

Buongiorno a tutti,
mi sono programmato il display in oggetto per poter visualizzare, al momento una temperatura.

Ho provato a scrivere (anche scopiazzando qua e la) un codice, il quale rilevando una tensione dall'ingresso A0 (collegato un LM35) dovrebbe trasmettere la temperatura al mio display.

Sicuramente trasmette, perche vedo apparire dei numeri nella casella associata, ma son dei numeri a caso.
Non riesco a capire cosa stia trasmettendo al display.
Vi allego il codice, magari qualche buon'anima, mi da un paio di dritte ?

Grazie

#include <NexText.h>                                 

NexText lbAnalogico = NexText(0, 2, "temp");          

void setup() {
  Serial.begin(9600);

  nexInit();                                        
}

unsigned long t1, dt;                               

void loop() {

  dt = millis() - t1;
  if (dt > 1000) {
    updateNextion();
    t1 = millis();
  }
}

void updateNextion() {

  unsigned int v = analogRead(A0);
  float coeff = 5000.0 / (1023.0 * 10.0);
  float temperatura = v * coeff;

  char str[2];
  sprintf(str, "%02i", temperatura);
  lbAnalogico.setText(str);

}

Grazie

PS se volete inserisco anche i commenti

Aumenta str di almeno 1 carattere, 2 sono la temperatura es. 21 gradi, ma DEVE esserci una cella per il fine stringa (ovvero '\0' ovvero 0)

Ciao e grazie,
str inizialmente era 6 ma non leggevo correttamente

Sul Nextion l'oggetto che contiene la stringa è definito carattere o numerico? Perché se è numerico è normale che vedi valori "strani". Se invece è correttamente testo è di una lunghezza sufficiente a contenere la stringa o no?

Stai usando %i sinonimo di %d quindi numeri interi, tu passi un float, normale legge strano
Purtroppo non puoi usare %f, non attivo su arduino
Prendi temperatura e mettilo in un int, tanto a te non servono i decimali

Vero. Ma basta usare "dtostrf()" ossia fare una cosa del tipo:

char sTemp[6]
...
    // esempio variabile float "temp" in stringa di 5 caratteri, 2 decimali
    dtostrf(temp, 5, 2, sTemp);
...

Ciao,
l'oggetto sul Nextion è impostato come testo, in merito alla lunghezza si riescono a visualizzare cifre di 6 caratteri.

Invece per quanto riguarda le informazioni fornite da @nid69ita e @docdoc che ringrazio, devo dire che ancora non mi hanno (non sono più che altro) risolto il problema, però visualizzo numeri più veritieri.

Visualizzo valori intorno ai 56, che ovviamente non sono corretti inoltre non sono stabili continuano a variare.

Posto la parte di codice che ho modificato:

void updateNextion() {

  unsigned int v = analogRead(A0);
  float coeff = 5000.0 / (1023.0 * 10.0);
  int temperatura = v * coeff;

  //char str[3];
  char sTemp[6];

  //sprintf(str, "%02i", temperatura);
  dtostrf(temperatura, 5, 1, sTemp);

  lbAnalogico.setText(sTemp);

}
  1. Hai provato il sensore stampando su serial monitor, ovvio senza in display?
  2. Che senso ha usare dtostrf se poi il valore da convertire lo spari in un int che NON ha le virgole?

Ciao,
si ho effettuato la prova e sul serial monitor mi ritrovo i dati di temperatura corretti.
Data la mia poca praticità non riesco propio a capire come mai al display vengo inviati dati errati.

Grazie

Prova a dichiarare temperatura di tipo float.

Ho provato a mettere la variabile “temperatura” sia float che int, uguale per la variabile “coeff” sia float che int.
Sul display vengono visualizzati valori non reali.

Non so propio cosa fare.

Prova a mettere fisso un valore
lbAnalogico.setText("25");

Cosi sul display visualizzo 25, oppure se scrivo:

lbAnalogico.setText("25.4");

visualizzo 25.4, anche se metto una scritta:

lbAnalogico.setText("prova")

visualizzo prova.

Per me c'è qualche problema nelle righe del codice dove vado a prendere la mia variabile "temperatura" e la invio al display.
Ci sto perdendo via la testa, ma non sono ancora riuscito a risolvere.

Grazie per l'interessamento.

Perchè riposti una cosa dove ti ho già detto che ci sono 3 errori dentro ?

  1. str a 2 è troppo piccolo
  2. %02i devi passare un int e non un float, ovvio dia valori stambi
  3. se vuoi usare un float, allora devi usare dtostrf() perchè su arduino la sprintf con %f non funziona

al massimo prova:
char str[3];
int t=(int)temperatura;
sprintf(str, "%02i", t);

1 Like

Ciao, avevo seguito tutte le tue indicazioni, i tre errori che mi hai giustamente rimarcato sono ripostati perché dopo aver provato con le tue correzioni ero tornato ancora indietro.

Comunque sia, ancora non riesco a visualizzare le temperatura corretta sul display nonostante abbia:

  • riprogrammato il display
  • provato altri sketch

Sul serial monitor, continuano ad essere corrette.
Secondo voi, cosa potrebbe essere ?

Grazie

So che sembra una prova stupida ma se fai:

#define max_len 5
int nTemp=32;
char sToDisplay[max_len];
memset(sToDisplay, 0, max_len);
itoa(nTemp, sToDisplay,10);
lbAnalogico.setText(sToDisplay);

Cosa succede?
Il codice non l'ho provato quindi ci potrebbero essere errori

1 Like

Ciao,
Succede che sulla casella del display visualizzo 32.

Grazie

Ok, se al posto della itoa metti:

sprintf(sToDisplay, "%02i", nTemp);

è ancora corretta la visualizzazione?

Sempre 32, sia su display che su serial monitor

#define max_len 7
float nTemp=32.72;
char sToDisplay[max_len];
memset(sToDisplay, 0, max_len);
dtostrf(nTemp, 3, 2, sToDisplay);
lbAnalogico.setText(sToDisplay);

Prova questo quindi, se ti funziona evidentemente è una delle cose che @nid69ita sta ripetendo da tempo