float to int16

Ciao a tutti

Recentemente sto utilizzando la mkr1200 (sigfox) e mi sto imbattendo in alcuni piccoli problemi circa la rappresentazione dei numeri per ridurre il payload da inviare al cloud sigfox.

In particolare, in uno degli sketch di esempio viene inclusa una piccola libreria composta dal codice a fine post.

Non ho ben capito cosa fa di preciso... riduce un float in un int16 / uint16? e come?
Non riesco ad uscirne a capo. Potreste aiutarmi?

Se da codice scrivo questo:

float a = 22.582;
Serial.println(a,4);
Serial.println(short(a));
//value - max - min
Serial.println((short)convertoFloatToInt16(a, 60, -60));
Serial.println((short)convertoFloatToInt16(a, 60, -60),HEX);

ottengo:
22.5820
22
6166
1816

conversions.h

#define UINT16_t_MAX 65536
#define INT16_t_MAX UINT16_t_MAX/2

int16_t convertoFloatToInt16(float value, long max, long min) {
float conversionFactor = (float) (INT16_t_MAX) / (float)(max - min);
return (int16_t)(value * conversionFactor);
}

uint16_t convertoFloatToUInt16(float value, long max, long min = 0) {
float conversionFactor = (float) (UINT16_t_MAX) / (float)(max - min);
return (uint16_t)(value * conversionFactor);
}

Io lascerei stare funzioni fatte da altri e non documentate. Sinceramente non si capisce bene quel che cerca di fare.

gli int su arduino sono a 16 bit, short su arduino sempre a 16 bit
Ma se a te serve da float a int, perdi il decimale. Lo vuoi arrotondare per eccesso ?
Basta che sommi 0.5 e poi fai shot() o int()
se hai 22.1 ottieni 22.6 e intero=22
se hai 22.6 ottieni 23.1 e intero=23

Lui usa una mkr1200.

Vale quello detto per un Arduino??

Ciao Uwe

Se è questa, SAMD21 Cortex-M0+ è a 32 bit, probabilmente int a 32 bit e short a 16.
Vale quel che ho detto, usa però cast a short e non a int per avere un short a 16 bit.
Ma in generale per avere un numero senza decimali può usare short o int, su quella MCU cambia solo la dimensione massima del numero convertito.

Ciao

Si sto usando la mkr1200 che è un cortex m0.

In particolare ponevo l'accento sulle due funzioni convertoFloatToInt16 e convertoFloatToUInt16

Utilizzando questo link ho capito come ricavare nuovamente il valore float nel backend: MKR FOX 1200 Weather Monitor - Arduino Project Hub

Ma ho necessità di approfondire il metodo di conversione.

Grazie