Pages: [1] 2   Go Down
Author Topic: [RISOLTO]Scrivere valore di temperatura su shield "display Nokia 6100"  (Read 1688 times)
0 Members and 1 Guest are viewing this topic.
(Italy)
Offline Offline
Full Member
***
Karma: 2
Posts: 171
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
//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
« Last Edit: January 07, 2013, 10:29:11 am by matrix77 » Logged

0
Online Online
Shannon Member
****
Karma: 130
Posts: 10450
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

a parte che

Code:
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:
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
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 527
Posts: 12346
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

0
Online Online
Shannon Member
****
Karma: 130
Posts: 10450
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

smiley

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.
« Last Edit: January 04, 2013, 08:10:54 pm by lesto » Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

(Italy)
Offline Offline
Full Member
***
Karma: 2
Posts: 171
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

(Italy)
Offline Offline
Full Member
***
Karma: 2
Posts: 171
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao, purtroppo non riesco a capire come mai non scrive all' interno della variabile "test":
Code:
//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

« Last Edit: January 06, 2013, 06:12:36 pm by matrix77 » Logged

0
Online Online
Shannon Member
****
Karma: 130
Posts: 10450
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

(Italy)
Offline Offline
Full Member
***
Karma: 2
Posts: 171
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
//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
}
Logged

0
Online Online
Shannon Member
****
Karma: 130
Posts: 10450
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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)
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

(Italy)
Offline Offline
Full Member
***
Karma: 2
Posts: 171
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

(Italy)
Offline Offline
Full Member
***
Karma: 2
Posts: 171
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

(Italy)
Offline Offline
Full Member
***
Karma: 2
Posts: 171
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Online Online
Shannon Member
****
Karma: 130
Posts: 10450
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

(Italy)
Offline Offline
Full Member
***
Karma: 2
Posts: 171
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

(Italy)
Offline Offline
Full Member
***
Karma: 2
Posts: 171
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Riveduto e corretto:

Code:
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
« Last Edit: January 07, 2013, 10:16:01 am by matrix77 » Logged

Pages: [1] 2   Go Up
Jump to: