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

Salve a tutti e buon anno!

Oggi sono qui perchè ho incontrato un piccolo problema, utilizzando lo shield "display Nokia 6100" ed in sostanza, non riesco a trovare il modo di visualizzare la temperatura, su questo display.
Posto le poche righe di codice create:

//Programma di test display 6100

#include <ColorLCDShield.h>

LCDShield lcd;  
int potPin = 0;                             
float temperature = 0;                      
int redLED=07;   //Pin10 = Green LED
int yellowLED=12;
int greenLED=13;
long val=0;

void setup()
{
  lcd.init(PHILLIPS);  //Driver display
  lcd.contrast(40);  // contrasto
  lcd.clear(WHITE);  // fondo schermo
  pinMode(redLED, OUTPUT);                  //LED controllo soglia...
  pinMode(greenLED, OUTPUT);    //LED controllo soglia...
  pinMode(yellowLED, OUTPUT);   //LED controllo soglia...
  Serial.begin(9600);  
  Serial.println("Test Sonda    ");       //Test scrittura su seriale
  lcd.setStr("TEMPERATURA", 2, 20, SLATE, WHITE);
  lcd.setStr("MISURATA", 20, 30, SLATE, WHITE);
  lcd.setStr(long)temperature, 40, 30, SLATE, WHITE); //questa riga l'ho creata con lo scopo di scrivere sul display, ma a quanto pare non funziona
}

void loop()
{
  val = analogRead(potPin);                 //Leggo la temperatura da analogica
  temperature = (5*val*100/1024);           //Converto la tensione in temperatura
  Serial.println ((long)temperature);       //Stampo la temperatura senza virgole
  
  if (temperature >= 150) {
    digitalWrite (redLED, HIGH); 
    lcd.setStr("yes", 90, 30, SLATE, WHITE);
}
else
{
  digitalWrite (redLED, LOW); 
    lcd.setStr("NO", 90, 30, SLATE, WHITE);
}
}

Ho creato questo piccolo programma con lo scopo di fare pratica con questo shield, ma il mio problema è nell' utilizzo della funzione "lcd.setStr" che riesco ad utilizzare solo, con caratteri alfanumerici.
Ho provato a leggere le istruzioni della funzione nel file allegato alla libreria, ma non riesco a riportare nel display, la temperatura rilevata.
In rete non ho trovato nessun esempio, a parte l'ormai consolidato display con libreria "Lcdcrystal".
Per chi volesse provare a compilare il codice, ricordo che funziona solo con IDE 1.0.

Ciao

a parte che

lcd.setStr(long)temperature, 40, 30, SLATE, WHITE);

è errata a priori

ma il punto è che la funzione si aspetta di ricevere un array di char, ovvero una stringa, quindi devi convertire il numero in stringa. Puoi farlo a mano, ci sono vari esempi nel forum, la sprintf:

char str[20]  = "";
float f = 4.5;
sprintf(str, "%f", f);

ma sappi che potrebbe occupare un po' di spazio in più che farselo a mano, per via del fatto che gestisce molti tipi di formato, precisione, e permette persino di usare altre stringhe

Lesto, per errata a priori ti riferisci solo alla mancanza di una "(" ?

: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