Go Down

Topic: problema conversione valori (Read 1 time) previous topic - next topic

alessanddrob

Jan 07, 2013, 06:52 pm Last Edit: Jan 07, 2013, 07:31 pm by alessanddrob Reason: 1
ho un buco di memoria
come lo converto il valore di

Code: [Select]
void temp()
{
tempC = analogRead(0);           //lettura valore del sensore
tempC = (5.0 * tempC * 100.0)/1024.0;  //conversione del dato analogico in temperatura
delay(1000);                           //aspetta 1 secondo prima di ripetere
}


qui viene usato dalla scheda ethernet

Code: [Select]
e.print(temp);

questo è l'errore

webserver_state_mod.cpp: In function 'void loop()':
webserver_state_mod:85: error: invalid conversion from 'void (*)()' to 'int'
webserver_state_mod:85: error: initializing argument 1 of 'void ETHER_28J60::print(int)'

sicuramente e un problema di conversione di valori ma non mi ricordo come si fa , gia bestemmiai un po di tempo fa ma non mi ricordo piu
grazie

Michele Menniti

non capisco, perché al comando e.print stai fornendo il nome della void invece di quello della variabile?
Non dovrebbe essere

e.print(tempC);
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

alessanddrob

non vorrei scrivere una boiata , ma scrivendo il nome della funzione non passo il risultato della funzione ?

Michele Menniti

Non credo sia così immediata la cosa, non sono un softwarista ma ricordo che le () accanto al nome della void servono proprio per il passaggio di parametri; una funzione potrebbe avere più risultati, no? come farebbe la funzione a sapere quale vuoi?
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

alessanddrob

io sono un ardwarista :D
Le () servono di solito a passare un valore a una funzione
ma dato che qui il valore con cui deve lavorare è interno ..... analogread(0)
chiamando la funzione gia elabora il risultato ........void temp ()= elaborazione di tempC
magari sta' funzione mi genera una variabile  float e non lo posso usare in e.print :(
spero di non aver scritto una mega caXXata
che ne sa di piu' puo' anche maltrattarmi :D
grazie

alessanddrob

forse ho risolto .....forse perche' non posso provare niente

Code: [Select]
e.print((int)temp);

cosi converto il valore di temp in int (SPERO)
gia cosi il compilatore non da errori e gia è un passo avanti :)

chissa' se mi scrive quando lo visualizzo ..........IMBECILLE CHE SPERAVI PURE CHE FUNZIONAVA ?  :D

Michele Menniti

beh, aspettiamo un softwarista :D ma intanto perché non provi:
temp();
e.print(tempC);
esegui la funzione e poi stampi il risultato.....
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

alessanddrob

basterebbe fare cosi

e.print(tempC = (5.0 * tempC * 100.0)/1024.0);  senza chiamare funzioni

ma piu' sa' piu pulito tenere tutto fuori da ....void loop()

si aspettiamo uno esperto :D
ciao

Michele Menniti

dipende da ciò che devi fare, se ti serve SOLO in questa occasione ovvio che conviene scrivere la formula per intero, ma se devi richiamarla più volte la funzione ti evita le ridondanze
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

alessanddrob

usare tutte funzioni serve per poter lavorare piu velocemete quando si scrive
se domani devo fare un altro progetto basta che apro il mio file di testo (funzioni) e me le trovo tutte li dentro belle e pronte
ciao

Michele Menniti

va bene, ho capito, sembriamo (come si dice dalle mie parti) "u ciuncu e ru cecatu ca vonu iocari a palloni" :smiley-yell: :smiley-yell:
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

Dario Gogliandolo



Code: [Select]
void temp()
{
tempC = analogRead(0);           //lettura valore del sensore
tempC = (5.0 * tempC * 100.0)/1024.0;  //conversione del dato analogico in temperatura
delay(1000);                           //aspetta 1 secondo prima di ripetere
}




Per fare quello che dici tu è necessario che la funzione ritorni un valore... Per fare questo devi dichiarare la funzione come int in modo che il valore ritornato sia di questo tipo ed infine dici quale valore vuoi che venga ritornato:

Code: [Select]
int temp()
{
tempC = analogRead(0);           //lettura valore del sensore
tempC = (5.0 * tempC * 100.0)/1024.0;  //conversione del dato analogico in temperatura
delay(1000);                           //aspetta 1 secondo prima di ripetere
return tempC;
}
Video demonstration of my Dashboard OBDII -> http://goo.gl/m8Pqp

alessanddrob

santo subito :)
Hai ragione mi era sfuggito questo piccolo particolare
non mi ricordavo proprio del ......dichiarare una funzione int
e return  valore

PS io ho compilato quello che ho scritto  e non ha dato errori
possibile che possa funzionare lo stesso ?

domani provo sia il mio che il tuo ......... e se funzionano tutti e due ?  :( cambio hobby e mi do' al giardinaggio ?
ciao e grazie

Dario Gogliandolo

se ti riferisci a questo

Code: [Select]

e.print((int)temp);


non credo che funzioni in quanto tu cosi non hai fatto altro che convertire il valore ritornato dalla funzione temp in intero e questo va bene per la funzione print ma resta comunque il fatto che quella funzione in realtà non restituisce niente (non c'è il return)... in poche parole il compilatore si accontenta di sapere che quello è un valore intero ma (ovviamente) non riesce a sapere se viene realmente passato un valore utile...
non so se sono stato chiaro  :smiley-sweat: :smiley-sweat: :smiley-sweat:
Video demonstration of my Dashboard OBDII -> http://goo.gl/m8Pqp

alessanddrob

si si chiarissimo sia prima che adesso
quello che hai scritto e giusto
ma il compilatore non doveva accorgersi che quello che sto passando  alla funzione e.print() non è un dato valido , oltretutto glielo converto pure in (int)
gli passo una funzione void :D
ciao

Go Up