[RISOLTO]Scrivere valore di temperatura su shield "display Nokia 6100"

:slight_smile:

edit: poi se il metodo non è sovraccarico per accettare anche i long, allora stai dando un long che viene ricastato ad int e usato come indirizzo dell'array di char, e quindi stampi un area di memoria più o meno a caso.

Ciao Lesto e ti ringrazio per la risposta, in effetti avevo dimenticato una parentesi in quella riga di programma, ma alla base c' era un bell' errore di concetto.

Adesso torno a studiare un po', grazie soprattutto al tuo aiuto.

Ciao

Ciao, purtroppo non riesco a capire come mai non scrive all' interno della variabile "test":

//Programma di test display 6100

#include <ColorLCDShield.h>

LCDShield lcd;    
int potPin = 0;
char test[20] = "";
float temperature = 0;
long val=0;



void setup()
{
  lcd.init(PHILLIPS);  //Driver display
  lcd.contrast(40);  // contrasto
  lcd.clear(WHITE);  // reset schermo
  lcd.setStr("TEMPERATURA", 2, 20, SLATE, WHITE);
  lcd.setStr("MISURATA", 20, 30, SLATE, WHITE);
  Serial.begin(9600); 
}

void loop()
{
  val = analogRead(potPin);                 //Leggo la temperatura da analogica
  temperature = (5*val*100/1024);       //converto la tensione in temperatura
  printf(test, "%f", temperature);
  Serial.println (temperature);             //scrivo su seriale
  lcd.setStr(test, 40, 40, SLATE, RED); // scrivo su display Nokia 6600
}

Non ne esco purtroppo

Saluti

Sprintf non printf!!!mi sa che devi includere la stdio.h

lesto:
Sprintf non printf!!!mi sa che devi includere la stdio.h

Quando si dorme è così eheh, nel frattempo ho incluso "stdio.h" e adesso mi compare un punto di domanda sul display, a cosa potrebbe essere dovuto?

Grazie ancora

Ciao

//Programma di test display 6100

#include <ColorLCDShield.h>
#include <Stdio.h>

LCDShield lcd;    
int potPin = 0;
char test[20] = "";
float temperature = 0;
long val=0;



void setup()
{
  lcd.init(PHILLIPS);  //Driver display
  lcd.contrast(40);  // contrasto
  lcd.clear(WHITE);  // reset schermo
  lcd.setStr("TEMPERATURA", 2, 20, SLATE, WHITE);
  lcd.setStr("MISURATA", 20, 30, SLATE, WHITE);
  Serial.begin(9600); 
}

void loop()
{
  val = analogRead(potPin);                 //Leggo la temperatura da analogica
  temperature = (5*val*100/1024);       //converto la tensione in temperatura
  sprintf(test, "%f", temperature);
  Serial.println (temperature);             //scrivo su seriale
  lcd.setStr(test, 40, 40, SLATE, RED); // scrivo su display Nokia 6600
}

tu preso temperature (float, non stampabile), trasformato in stringa e riposta la stringa all'interno di test(array di char == stringa, stampabile), ora dovresti stampare la stringa invece continui a stampare il float, causando un casino simile a quello coi puntatoriu con il long, ma dai risultati più imprevedibili (vuiene usato come indirizzo alcuni bit della mantissa e quelli dell'esponente se non erro, ma di questa è una sottigliezza che puoi ignorare)

La prossima volta penso proprio che utilizzerò un bel display seriale, per far comparire un valore su questo shield, ci vuole un opera d'ingegneria eheheh :slight_smile:
grazie ancora per la tua disponibilità e vediamo se riesco ad uscire dal pantano.

Nel frattempo ho trovato dei vecchi post su questo argomento, come mi avevi consigliato.

lesto:
tu preso temperature (float, non stampabile), trasformato in stringa e riposta la stringa all'interno di test(array di char == stringa, stampabile), ora dovresti stampare la stringa invece continui a stampare il float, causando un casino simile a quello coi puntatoriu con il long, ma dai risultati più imprevedibili (vuiene usato come indirizzo alcuni bit della mantissa e quelli dell'esponente se non erro, ma di questa è una sottigliezza che puoi ignorare)

Grazie Lesto per la tua partecipazione al mio problema, alla fine ho risolto grazie anche ad un tuo vecchio post del 2011, sulla scomposizione in due interi..., adesso funziona, certo ho tanto da imparare eheh

guarda che dal tuo codice di prima ([RISOLTO]Scrivere valore di temperatura su shield "display Nokia 6100" - #8 by matrix77 - Software - Arduino Forum) bastava cambiare

Serial.println (temperature); //scrivo su seriale

in

Serial.println (test); //scrivo su seriale

lesto:
guarda che dal tuo codice di prima ([RISOLTO]Scrivere valore di temperatura su shield "display Nokia 6100" - #8 by matrix77 - Software - Arduino Forum) bastava cambiare

Serial.println (temperature); //scrivo su seriale

in

Serial.println (test); //scrivo su seriale

Si, ma il mio problema principale era che visualizzavo un "?" sul display

Riveduto e corretto:

void loop()
{
  val = analogRead(potPin);                 //Leggo la temperatura da analogica
  temperature = (5*val*100/1024);       //converto la tensione in temperatura
  Serial.println (buffer);             //scrivo su seriale
  lcd.setStr(buffer, 50, 20, SLATE, RED); // scrivo su display Nokia 6600
  int temp1 = (int)temperature; //trova la parte intera
  int temp2 = (temperature - (int)temperature) * 100; //trova la parte decimale
  sprintf(buffer,"Gradi: %d.%d", temp1, temp2);
}

Ciao

void loop()
{
  val = analogRead(potPin);                 //Leggo la temperatura da analogica
  temperature = (5.0*val*100.0/1024.0);       //converto la tensione in temperatura
  sprintf(buffer,"Gradi: %f.2", temperature );
  Serial.println (buffer);             //scrivo su seriale
  lcd.setStr(buffer, 50, 20, SLATE, RED); // scrivo su display Nokia 6600
}

notare i .0 sul calcolo: forzano l'operazione matematica ad essere fatta con i float e non con i numeri interi, altrimenti la parte dopo la virgola verrebbe troncata! (vale nel caso val sia long o int, se float non serve ma sempre meglio specificare una volta in più che una volta in meno, sono il genere di errori stupidi che fanno perdere giornate anche ai programmatori più esperti)

Hai ragione Lesto, i decimali non erano presi in considerazione, adesso funzionano.......sono in debito di parecchi caffè.

sommali in una birra :wink:

dimenticavo:

sprintf(buffer,"Gradi: %f.2", temperature );

il %f.2 vuol dire che vuoi visualizzare solo 2 decimali. scrivere solo %f usa i decimali che gli servono (mi pare il massimo sia 9 decimali) ma tanto la precisione è limitata sia dal sensore che dall'ADC arduino, quindi direi che 2 decimali sono il giusto.

lesto:
dimenticavo:

sprintf(buffer,"Gradi: %f.2", temperature );

il %f.2 vuol dire che vuoi visualizzare solo 2 decimali. scrivere solo %f usa i decimali che gli servono (mi pare il massimo sia 9 decimali) ma tanto la precisione è limitata sia dal sensore che dall'ADC arduino, quindi direi che 2 decimali sono il giusto.

Ah ok, ma perdona la mia domanda io ho fatto così, ma va bene lo stesso vero?
sprintf(buffer,"Gradi: %d.%d", temp1, temp2);
E' meglio eliminare i due interi?
Ciao

non cambia molto, è solo una questione di leggibilità del codice e risparmio delle risorse; 2 variabili int in meno, ovvero 4 byte di ram, e un po' di operazioni matematiche in meno.

in oltre col tuo loop di prima alla prima stampa buffer è vuoto perchè deve essere ancora fatta la sprintf, nulla di grave se hai inizializzato a ""

Ok, grazie per la precisazione

Ciao