Conversione dato

Ciao a tutti, da qualche giorno sto girando attorno ad un problema che non riesco a risolvere mi spiego:

Utilizzando la libreria MPU6050 e Ic2dev leggo dei valori da un MPU6050, a questo punto vorrei elaborare il dato facendo si che mi venga restituito il valore diviso per 16384 (così come indicato dalla scala del datasheet) solo che non riesco a fare in modo che il valore non venga approssimato. Credo di fare qualche errore nel valutare il tipo di dato che mi viene fornito e di conseguenza la funzione per dividere e poi scrivere l'eventuale float...

Qualcuno mi da una dritta su come dividere il dato e fare in modo che mi scriva un valore con 3 decimali senza approssimare all'intero?

Grazie mille, questo il codice che uso:

#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h" 
 
MPU6050 mpu;
 
int16_t ax, ay, az;
int16_t gx, gy, gz;
float a_x, a_y, a_z;
 

 
int val;
int prevVal;
 
void setup() 
{
    Wire.begin();
    Serial.begin(38400);
 
    Serial.println("Initialize MPU");
    mpu.initialize();
    Serial.println(mpu.testConnection() ? "Connected" : "Connection failed");
    
}
 
void loop() 
{
    mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
    a_x = ax; //QUI VORREI FARE L'OPERAZIONE!
    a_y = ay;
    a_z = az;
    Serial.print(a_x,5); Serial.print("\t");
    Serial.print(a_y,5); Serial.print("\t");
    Serial.print(a_z,5); Serial.print("\t");
    Serial.print(gx); Serial.print("\t");
    Serial.print(gy); Serial.print("\t");
    Serial.println(gz);
 
    
    
 
    delay(500);
}

Prova con

a_x = (float)ax / 16384.0;

GRAZIE!!! funziona, se non ti rompo troppo mi spieghi un po ' come funziona la cosa? :slight_smile: così non dovrò richiederlo ogni volta che mi capita :slight_smile:

Si chiama casting. E' una conversione forzata da un tipo di dato ad un altro.
Devi sapere che le operazioni matematiche vengono effettuate in modo diverso in base ai tipi di dati su cui si esegue l'operazione stessa.
in particolare la divisione / di solito è una divisione intera. Ovvero 4/2 fa 2 ma anche 5/2 fa 2, i decimali non compaiono.
Quindi 101/2 fa 50 e non 50 virgola qualcosa.
Per effettuare una divisione con decimali devi imporre il tipo di dato float.
Se ax è un intero (nel tuo caso un intero a 16bit) con il comando (float) dici al compilatore di trattarlo come un float e poiché lo dividi per un float (16348**.0** invece di 16348) allora il risultato sara un float, ovvero un numero con decimali.

Diciamo che in linea di massima quando si dividono 2 interi il compilatore assume il risultato essere un intero, ma se uno dei 2 numeri è un float, il compilatore dovrebbe dare un float in automatico.
Quindi
a_x = (float)ax / 16384;

dovrebbe essere equivalente a
a_x = ax / 16384.0;

Nel primo caso si trasforma ax in float mentre nel secondo caso 16384.0 è un float.

Gentilissimi, ora credo di aver capito!!!
Pensavo lui mi stesse dando un char e quindi mi stavo intestardendo nella trasformazione da char a int o float...ma ovviamente mi dava errore, ora ho capito perchè!

Alcune conversioni di tipo non sono possibili.

Ciao a tutti
approfitto di questo spazio per una domanda
La temperatura che leggo sul LCD ha 2 cifra dopo la virgola (es: 25.83 )
come posso fare per visualizzare una sola cifra dopo la virgola (es: 25.8 )?

Saluti e grazie!

Se "stampi" con lcd.print(), puoi specificare il numero di cifre decimali: