Saluti a tutti questo è il mio secondo post.Sto cercando di far visualizare un intero long sul lcd 12864 st7920 sto usando una libreria trovata su http://www.dfrobot.com/image/data/FIT0021/LCD12864RSPI.rar A scrivere un messaggio si riesce bene mi serve poter scrivere anche un numero qundi ho aggiunto queste righe :
#include <DFrobot_char.h>
#include <LCD12864RSPI.h>
#define AR_SIZE( a ) sizeof( a ) / sizeof( a[0] )
#define SCR 10 // scr collegato pin 10
unsigned char Titolo[]="Timer";
unsigned char Testo1[]="Minuti";
unsigned char Testo2[]="Secondi";
char secondi_char[16];
questo in void loop
LCDA.DisplayString(2,1,Testo2,7);
unsigned long secondi_ulong = secondi();
sprintf(secondi_char,"%lu", secondi_ulong); // Works OK: sprintf uses char arrays.
LCDA.DisplayString(0, 0, (unsigned char *)secondi_char, 16);// The LCDA function requires unsigned char arrays.
quando provo a compilarlo mida il seguente errore
'secondi' cannot be used as a function
non riesco a capire il perche
Grazzie
mi posti il codice bene con tutti i void nei tag
#include <DFrobot_char.h>
#include <LCD12864RSPI.h>
#define AR_SIZE( a ) sizeof( a ) / sizeof( a[0] )
#define SCR 10 // scr collegato pin 10
unsigned char Titolo[]="Timer";
unsigned char Testo1[]="Minuti";
unsigned char Testo2[]="Secondi";
char secondi_char[16];
int tempo = 0;
int T_totale = 0;
int long minuti = 0;
int long secondi = 0;
void setup()
{
LCDA.Initialise(); // INIT SCREEN
//delay(5000);
minuti = 1; // tempo in minuti
secondi = 45; // tempo in secondi
T_totale = (minuti * 60) + secondi; //tempo totale in secondi
Serial.begin(9600); // apre la porta seriale x il pc
}
void loop() {
LCDA.CLEAR(); //Cancella display
LCDA.DisplayString(0,2,Titolo,6);
LCDA.DisplayString(1,1,Testo1,7);
LCDA.DisplayString(2,1,Testo2,7);
unsigned long secondi_ulong = secondi();
sprintf(secondi_char,"%lu", secondi_ulong); // Works OK: sprintf uses char arrays.
LCDA.DisplayString(0, 0, (unsigned char *)secondi_char, 16);// The LCDA function requires unsigned char arrays.
delay(1500);
while ((minuti > 0) || (secondi > 0))
{
delay(1000);
T_totale = (minuti * 60) + secondi; //tempo totale in secondi
if (secondi > 0) {
digitalWrite(SCR, 1);
secondi--;
Serial.println(minuti); //stampa il valore sulla porta seriale
Serial.println(secondi); //stampa il valore sulla porta seriale
}
else {
if (minuti > 0) {
minuti--;
secondi = 60;
}
}
}
digitalWrite(SCR, 0);
}
Meno male che hai messo il tag code ``
#include <DFrobot_char.h>
#include <LCD12864RSPI.h>
#define AR_SIZE( a ) sizeof( a ) / sizeof( a[0] )
#define SCR 10 // scr collegato pin 10
unsigned char Titolo[]="Timer";
unsigned char Testo1[]="Minuti";
unsigned char Testo2[]="Secondi";
char secondi_char[16];
int tempo = 0;
int T_totale = 0;
int long minuti = 0;
int long secondi = 0;
void setup()
{
LCDA.Initialise(); // INIT SCREEN
//delay(5000);
minuti = 1; // tempo in minuti
secondi = 45; // tempo in secondi
T_totale = (minuti * 60) + secondi; //tempo totale in secondi
Serial.begin(9600); // apre la porta seriale x il pc
}
void loop() {
LCDA.CLEAR(); //Cancella display
LCDA.DisplayString(0,2,Titolo,6);
LCDA.DisplayString(1,1,Testo1,7);
LCDA.DisplayString(2,1,Testo2,7);
unsigned long secondi_ulong = secondi();
sprintf(secondi_char,"%lu", secondi_ulong); // Works OK: sprintf uses char arrays.
LCDA.DisplayString(0, 0, (unsigned char *)secondi_char, 16);// The LCDA function requires unsigned char arrays.
delay(1500);
while ((minuti > 0) || (secondi > 0))
{
delay(1000);
T_totale = (minuti * 60) + secondi; //tempo totale in secondi
if (secondi > 0) {
digitalWrite(SCR, 1);
secondi--;
Serial.println(minuti); //stampa il valore sulla porta seriale
Serial.println(secondi); //stampa il valore sulla porta seriale
}
else {
if (minuti > 0) {
minuti--;
secondi = 60;
}
}
}
digitalWrite(SCR, 0);
}
unsigned long secondi_ulong = secondi();
ecco la riga incriminata!
e anche la dichiarazioni che fai "int long" non è che mi convincano proprio... ma quì non so se creano problemi, sinceramente io uso direttamente long
Io ho cercato di usare per mio uso questa parte di codice
char millis_char[16];
unsigned long millis_ulong = millis();
sprintf(millis_char,"%lu", millis_ulong); // Works OK: sprintf uses char arrays.
LCDA.DisplayString(0, 0, (unsigned char *)millis_char, 16);// The LCDA function requires unsigned char arrays.
che ho trovato in rete. che ho provato cosi nel mio programma funziona stampando sul dispay i millisecondi
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1287283512
tecnico
ah ok, tu hai visto che esiste la millis() e allora ti sei inventato la secondi(), giusto?
l'elenco di funzioni di arduino lo trovi quì:
allora, leggi i MilliSecondi (che partono da 0 ogni volta che accendi arduino, e continuano a aumentare per circa 55 giorni, poi overflow e riprende da 0) e dividi per 1000...
A questo punto potresti crearti la funzione secondi() che fa questo al posto tuo mi dirai... NO!
perchè la parola secondi è già stata usata come nome di variabile nel tuo codice, quindi o chiami in altro modo la variabile o la funzione.
Ah a lungo andare (se ti metti a contare minuti, ore ecc..) ti accorgerai che arduino è impreciso, si usano orologi esterni per precisione da orologio, appunto ;D
il problema è in più generale come stampare sul diplay lcd un intero o qualsia numero con segno oppure senza .Quindi come convertire un intero a unsigned char il fatto di aver preso i secondi era solo un prova per vedere se funzionava.
Tecno
ah ok...
hai il tuo intero, ok?
il resto della divisione per 10 è la cifra più a sinistra.
questa cifra + il valore dello '0' char ti da il valore del char corrispondente a quel numero.
salvi il valore nella prima cella dell'array.
ora fai che il tuo numero è uguale a se stesso diviso 10, ciò vuol dire che elimini la cifra che hai letto prima.
ricomincia
quando l'intero è <=0 hai finito. aggiungi il simbolo - in coda all'array di char(se serve), lo ribalti e voilà
ok ti ringrazio domani vedo come fare