salve, sto continuando con il mio progetto di gestione acquario, e completata la parte di gestione illuminazione sono passato alla parte di gestione della temperatura.
ho collegato una sonda tipo lm35 e fin qui tutto bene a parte che leggo valori che vanno dai 28 ai 31 ad ogni refresh di 1500ms, ma questo credo che sia il problema minore perché l'ho collegata senza condensatori come ho potuto vedere da internet.
veniamo al dunque, al momento il mio acquario è gestito da una centralina stc1000 e vorrei replicare la funzione di aggiustamento temperatura, in pratica in base al valore letto si può aggiungere un valore che va da i -10 ai +10.
essendo che vorrei conservare questo valore di aggiustamento nell'eeprom ho pensato di mappare una variabile di tipo float avendo in ingresso una variabile di tipo byte(che scriverò nell'eeprom)
andando a testare il codice ho verificato che corr_temp_1 di tipo float che ha in ingresso map_temp1 si incrementa e decrementa di 1.0 e non di 0.1. a seguito il codice della parte al momento interessata.
grazie mille
void correggi_temperatura(){
lcd.setCursor(0, 0);
lcd.print("l:");
lcd.print(temp_1);
lcd.print(" c:");
lcd.print(corr_temp_1);
lcd.setCursor(0, 1);
lcd.print("u:");
lcd.print(uscita_temp_1);
lcd.print(" m:");
lcd.print(map_temp1);
if (ReadKeypad() == 'U') {delay(250);map_temp1=map_temp1+1;};
if (ReadKeypad() == 'D') {delay(250);map_temp1=map_temp1-1;};
if (ReadKeypad() == 'R') {delay(250);map_temp1=map_temp1+10;};
if (ReadKeypad() == 'L') {delay(250);map_temp1=map_temp1-10;};
corr_temp_1=map( map_temp1,0,255,-12.7,12.7);
//if (corr_temp_1>10.0){corr_temp_1=-10.0;}
//if (corr_temp_1<10.0){corr_temp_1=10.0;}
uscita_temp_1=temp_1+corr_temp_1;
if (ReadKeypad() == 'S') {lcd.clear();pagina_attiva=26;}
}
Direi che basta leggere il reference della funzione map()
The map() function uses integer math so will not generate fractions, when the math might indicate that it should do so. Fractional remainders are truncated, and are not rounded or averaged.
... ah, di questa cosa si è già parlato sul forum e si è anche fatto vedere come sia banale scriversi una propria funzione che faccia la stessa cosa ma con il float.
Basta partire sempre dal reference della funzione e guardare come essa è fatta:
long map(long x, long in_min, long in_max, long out_min, long out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
... da qui a farne una che funziona con i float ... direi che è questione di un secondo.
Buon lavoro ...
Guglielmo
P.S.: Ricorda sempre che, su Arduno, i floar sono a 32 bit e che quindi la precisione è solo di 6/7 cifre in tutto (tra prima e dopo la virgola) ...
Floats have only 6-7 decimal digits of precision. That means the total number of digits, not the number to the right of the decimal point. Unlike other platforms, where you can get more precision by using a double (e.g. up to 15 digits), on the Arduino, double is the same size as float.
Claudio_FF:
Se gli estremi sono sempre gli stessi e si vuole velocizzare il calcolo si può anche semplificare la formula precalcolando le parti costanti ...
... che, lavorando con i float (tipi di dati che implicano una grande lentezza di calcolo), non è male