Go Down

Topic: [RISOLTO]Scrivere valore di temperatura su shield "display Nokia 6100" (Read 1 time) previous topic - next topic

matrix77

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:
Code: [Select]
//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

lesto

a parte che

Code: [Select]
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:

Code: [Select]
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
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Michele Menniti

Lesto, per errata a priori ti riferisci solo alla mancanza di una "(" ?
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

lesto

#3
Jan 05, 2013, 02:09 am Last Edit: Jan 05, 2013, 02:10 am by lesto Reason: 1
:)

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.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

matrix77

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

matrix77

#5
Jan 07, 2013, 12:09 am Last Edit: Jan 07, 2013, 12:12 am by matrix77 Reason: 1
Ciao, purtroppo non riesco a capire come mai non scrive all' interno della variabile "test":
Code: [Select]
//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


lesto

Sprintf non printf!!!mi sa che devi includere la stdio.h
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

matrix77


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
Code: [Select]
//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
}

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)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

matrix77

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 :)
grazie ancora per la tua disponibilità e vediamo se riesco ad uscire dal pantano.

matrix77

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

matrix77


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

lesto

guarda che dal tuo codice di prima (http://arduino.cc/forum/index.php/topic,140717.msg1060981.html#msg1060981) bastava cambiare

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

in

Serial.println (test);             //scrivo su seriale
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

matrix77


guarda che dal tuo codice di prima (http://arduino.cc/forum/index.php/topic,140717.msg1060981.html#msg1060981) 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

matrix77

#14
Jan 07, 2013, 04:01 pm Last Edit: Jan 07, 2013, 04:16 pm by matrix77 Reason: 1
Riveduto e corretto:

Code: [Select]
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

Go Up