Convertire Float in Intero

Ho la necessità di convertire la lettura in "Float" di un dispositivo in "Intero".
La formula della conversione l'ho trovata sulla rete.
Per il mio scopo non mi servono i decimali.
Non mi funziona l'istruzione di conversione.
Utilizzo un Arduino NANO v3.

Ho scritto questo sketch:

int IR_SENSORE = 0; // Sensore connesso su A0
int Lettura = 0; 
float Distanza = 0; 

void setup(){
  Serial.begin(9600); 
}

void loop(){
  Lettura = analogRead(IR_SENSORE);
  Distanza = (6787.0 / (Lettura - 3.0)) - 4.0; // Calcola distanza in cm
  Distanza = (int)Distanza;
  Serial.print(Distanza);
  Serial.println(" cm"); 
  delay(500)

Saluti

Lello

L'istruzione Distanza = (int)Distanza; è corretta.
Però Distanza rimane un float e se lo stampi con Serial.print() comunque ti stampa i decimali a 0
E' solo una questione di visualizzazione.

Sarebbe meglio avere un'altra variabile int e poi stampi quella

Distanza = (6787.0 / (Lettura - 3.0)) - 4.0; // Calcola distanza in cm
int iDistanza = Distanza;         // (int)Distanza   inutile il cast tra parentesi
Serial.print(iDistanza);

Se invece la formula "Calcola distanza in cm" è sbagliata, non sò che dirti

Che sensore è? Perché non ti funziona? Valori errati? Sempre zero? fai una prova con queste modifiche e poi metti qui i risultati e più dettagli che puoi:

void loop(){
  Lettura = analogRead(IR_SENSORE);
  Serial.print("Lettura: ");
  Serial.println(Lettura);
  Distanza = (6787.0 / (Lettura - 3.0)) - 4.0; // Calcola distanza in cm
  Serial.print("Distanza in cm float: ");
  Serial.println(Distanza);
  Distanza = (int)Distanza;
  Serial.print(Distanza);
  Serial.println(" cm");
  delay(500)

LelloGi:
float Distanza = 0;
//...
Distanza = (int)Distanza;

In questo modo stai facendo due conversioni di tipo:

(int)Distanza -> converte float in int troncando la parte decimale
Distanza = (int)Distanza -> riconverte l'int in float

risultato, se lo stampi vengono aggiunti gli zero.

Se il problema è solo la visualizzazione, puoi usare Serial.println(Distanza, 0); che arrotonda all'intero, oppure usa una variale di tipo int

int Distanza = (int)((6787.0 / ((float)Lettura - 3.0)) - 4.0);

Federico

fabpolli:
Che sensore è? Perché non ti funziona? Valori errati? Sempre zero? fai una prova con queste modifiche e poi metti qui i risultati e più dettagli che puoi:

I dati che legge il sensore sono corretti, è solo che io ho bisogno di un intero per poi eseguire una certa operazione.
I decimali non mi servono, ecco perchè ho pensato agli interi.
Il sensore è il Sharp GY0A21.
Saluti

Lello

allora applica uno dei suggerimenti ricevuti qua sopra e dovresti giungere al tuo scopo.
Se poi la certa operazione è la verifica di un uguaglianza, a mio modo di vedere la cosa, è meglio un confronto con un maggiore o un minore (stretto o meno che sia)

Infatti!

Distanza = (6787.0 / (Lettura - 3.0)) - 4.0; // Calcola distanza in cm
int iDistanza = Distanza;         // (int)Distanza   inutile il cast tra parentesi
Serial.print(iDistanza);

Con questa formula mi stampa solo gli interi e funziona benissimo.
A me serve captare la presenza dell'oggetto (la mia gatta) da 0 a 20centimetri.
Saluti

Lello

E allora dell’intero te ne fai poco

if(Distanza<=20)

è lecito anche con un float, vale anche fare:

if(Distanza<=20.0)

fabpolli:
E allora dell'intero te ne fai poco

Concordo, anche se, in un'ottica di risparmio, visto che il float non serve, io partirei direttamente con un int, se non addirittura un byte.

Federico

Potresti anche moltiplicare tutto per 100 eliminando i decimali e usare un long…

uint32_t Distanza = ((678700 / (Lettura*100 -300)) -400) /100; // Calcola distanza in cm

Sono 4 byte, ma non ci sono i calcoli in virgola mobile.

A questo punto se vogliamo portare l'ottimizzazione al massimo, visto che se il gatto s'avvicina vuole erogare cibo o acqua se il sensore restituisce una lettura analogica sotto i 20cm si può eliminare anche Arduino e fare tutto con elettronica analogica :smiley:

E adesso arriva un mod e mi asfalta :slight_smile:

A parte le battute eliminare i calcoli in virgola mobile molto spesso velocizza di molto e aiuta. Sinceramente penso però che per questo progetto non vi siano criticità tali da voler spingere l'acceleratore sull'ottimizzazione, credo sia una delle tante mangiatoie automatiche

fabpolli:
A questo punto se vogliamo portare l'ottimizzazione al massimo...

Di solito i gatti (al contrario dei cani), sono loro stessi degli ottimizzatori, hanno la ciotola sempre piena e mangiano quando hanno fame :smiley: :smiley:

fabpolli:
Sinceramente penso però che per questo progetto non vi siano criticità tali da voler spingere l'acceleratore sull'ottimizzazione...

Concordo, ma sono dell'idea, che se ci si abitua ad utilizzare "correttamente" i tipi dati, poi viene naturale scrivere senza sprechi :slight_smile:

Federico

fabpolli:
E adesso arriva un mod e mi asfalta :slight_smile:

... hai in mente un nome ? ? ? :smiling_imp: :smiling_imp: :smiling_imp:

Guglielmo

I gatti... I due precedenti no, ma Teo se gli lascio la ciotola piena esagera un po'... Gli devo pesare 60g al giorno e dividerli fra i pasti!

Non pnsavo di scatenare così tanti aiuti e tante soluzioni.
Semplicemente il sistema mi serve per attivare, per un minuto, una fontanella per abbeverare la mia gatta che ha preso l’abitudine di bere “solo” con l’acqua corrente.
Non aveva senso tenere sempre attiva, 24 ore su 24, l’erogazione dell’acqua.
Avrei potuto usare anche un NE555 ma avendo in casa un “NANO” a fare niente o optato per questa soluzione.
Intanto imparo anche un po di programmazione con Arduino.
Saluti

Lello

Federico66:
Concordo, ma sono dell'idea, che se ci si abitua ad utilizzare "correttamente" i tipi dati, poi viene naturale scrivere senza sprechi :slight_smile:

E concordo con te in linea generale. In questo caso avevo avuto la sensazione che l'OP stia imparando le basi o comunque non ha ancora molta esperienza (e imparare bene ottimizzando sono di nuovo d'accordo è importante) vista la domanda e i dubbi che ha esperesso ho preferito indicare che i confronti possono essere esguiti con ogni tipo di dato (o quasi), anziché dirottarlo in conversioni implicite del compilatore e cose del genere.
Detto ciò tengo a precisare che ritengo che ogni aiuto è stato, a mio modesto modo di vedere, efficace perché appunto serve per approfondire l'argomento a chi si trova a leggere il topic.

Nel caso specifico, una soluzione molto semplice è mettere un trimmer su un altro ingresso analogico e confrontare i due valori, senza coinvolgere variabili float né fare alcun calcolo: if(analogRead(A1)<analogRead(A0)) {accendi();}. Tra ogni ingresso e massa è bene mettere un condensatore da 100nF…1uF. Regolando il trimmer, si regola la distanza a cui deve iniziare a essere erogata l’acqua. Sì, certo, basterebbe un operazionale… :slight_smile:

fabpolli:
Detto ciò tengo a precisare che ritengo che ogni aiuto è stato, a mio modesto modo di vedere, efficace perché appunto serve per approfondire l'argomento a chi si trova a leggere il topic.

Dobbiamo smetterla di concorda-rci :smiley: :smiley:

Federico