Convert float to int

Buona sera ragazzi, da qualche giorno sto inpazzendo nella conversione di un float in un int, cioè funziona ma se provo a scrivere nella epprom il numero convertito non viene memorizzato...

float decimale = 21.5;
int numeroIntero = (int) decimale * 10;
EEPROM.write(10, numeroIntero);
Serial.println(“il numero intero è: “ + String(numeroIntero); // funziona scrive in console
Serial.println(“il numero intero è: “ + String(EEPROM.read(10))); // non funziona!

Non funziona! Non scrive sulla eprom! Ho provato anche così:

float decimale = 21.5;
int numeroIntero = int(decimale * 10);
EEPROM.write(10, numeroIntero);
Serial.println(“il numero intero è: “ + String(numeroIntero); // funziona scrive in console
Serial.println(“il numero intero è: “ + String(EEPROM.read(10)));// non funziona!

Niente non funziona! Ho provato una pazzia:

float decimale = 21.5;
String stringa = String(decimale * 10).subString(0,3);
int numeroIntero = Stringa.toInt();
EEPROM.write(10, numeroIntero);
Serial.println(“il numero intero è: “ + String(numeroIntero); // funziona scrive in console
Serial.println(“il numero intero è: “ + String(EEPROM.read(10))); // non funziona!

Non so più che pesci prendere! Potete aiutarmi? Grazie a tutti

Benvenuto. Essendo il tuo primo post, nel rispetto del regolamento, ti chiediamo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO... Grazie.
Qui una serie di link utili, non inerenti al tuo problema:

Il codice DEVI racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Scusate!

Secondo me non hai letto bene il reference della libreria eeprom.
La write e la read accettano come dato un byte. Tu passi un int... I conti non tornano.
Ci sono 2 possibilità:

  • dividi l'int in byte e li salvi separatamente
  • usi put (e get)

A parte questo CREDO che puoi togliere il cast manuale di "decimale" a int. Penso che basti il fatto che lo deve salvare in un int a troncare eventuali decimali del valore.
Inoltre sconsiglio le String. Che comunque cosa farebbe String ("del testo");? Converte una stringa non salvata in un oggetto String non jdentificato? Non ti basta scriverlo in eeprom come int (con put), estrarlo come int (con get) salvandolo in un int, e far convertire quest'ultimo in caratteri con .print?

ciao grazie per la risposta! si è vero quello che dici, ma se guardiamo l'esempio riportato...

#include <EEPROM.h>

void setup()
{
  for (int i = 0; i < 255; i++)
    EEPROM.write(i, i);
}

void loop()
{
}

comunque ho sempre utilizzato un int è non ho mai avuto problemi, credo sia un problema di troncatura… non so

Cioè tu da 21.5 ti aspetti 215 ?
Presumo il problema sia qui:
int numeroIntero = (int) decimale * 10;
Mettiti nei panni del compilatore. Tutto int anche il 10 costante e solo decimale è float. Come deve comportarsi ? Di base considera tutto int. Anche 21.5 di cui poi addirittura fai un cast e quindi è 21 senza .5
Perciò io farei così e per sicurezza pure il 10 ci metto un .0 per forzare il compilatore a fare moltiplicazione tra float, poi converto in int
int numeroIntero = (int) (decimale * 10.0) ;

si esatto mi aspetto 215... in effetti avevo intuito una cosa del genere infatti ho provato anche cosi':

decimale = decimale * 10;
int numeroIntero = int(decimale);

ma non funziona! ho provato anche come da te suggerito ma niente!

Così sembra che int sia una funzione. Le parentesi vanno attorno a int, e non al nome di variabile. Ma poi é veramente necessario il cast manuale?

Grande!!! grazie ho risolto! il problema era che quando prelevavo il numero dalla eeprom dividevo il numero per 10, (per tornare al decimale) e non funzionava! invece grazie al tuo consiglio ho provato a dividere per 10.0 e indovina un po'? funziona! sei un drago! grazie grazie!

Attento che funziona fino a che é sotto 256, perché la write e la read leggono e scrivono un byte

Si lo so grazie! Ma per quello che devo fare basta e avanza! Grazie a tutti per il vostro tempo!