/* UD9.LAB5 - Interpolazione Lineare a Tratti */
// MACRO per la determinazione della dimensione dei un Array Dinamico
#define ARRAYSIZE(x) (sizeof(x) / sizeof(x[0]))
// fmap: funzione equivalente alla funzione map con valori float
float fmap(float x, float in_min, float in_max, float out_min, float out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
void setup() {
Serial.begin(9600);
}
void loop() {
/* Lettura ingresso */
int in = analogRead(A0);
/* Mappatura valore 0-1023 in 0-10 float */
//float x = (float)map(in,0,1023,0,1000)/100;
float x = fmap(in,0,1023,0,10);
Serial.print("x: "); Serial.print(x);
float y = interpola(x);
Serial.print(" y: "); Serial.print(y);
Serial.println();
delay (200);
}
/* IMPLEMENTAZIONE FUNZIONE DI INTERPOLAZIONE LINEARE A TRATTI */
//float x[] = { 1.0, 3.0, 5.0, 7.0, 9.0}; // Valori X dei punti di interpolazione
//float y[] = {10.7, 15.1, 23.5, 35.9, 52.3}; // Valori Y dei punti di interpolazione
float x[] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0}; // Valori X dei punti di interpolazione
float y[] = {10.0, 10.7, 12.4, 15.1, 18.8, 23.5, 29.2, 35.9, 43.6, 52.3, 62.0}; // Valori Y dei punti di interpolazione
int index_sx = 0; // Indice sinistro del Tratto (da portare all'interno della funzione)
float interpola(float x_in){
// Ricerca dell'estremo sinistro del Tratto
for(int index=0; index<ARRAYSIZE(x); index++){
if(x[index]<x_in){
index_sx = index;
}
}
// Verifica di sforamento a destra del punto X
if(index_sx>=ARRAYSIZE(x))
index_sx = ARRAYSIZE(x)-1;
// DEBUG
Serial.print(" index_sx: "); Serial.print(index_sx);
// Interpolazione sul Tratto
float y_out = fmap(x_in, x[index_sx], x[index_sx + 1], y[index_sx], y[index_sx + 1]); // Risultato dell'interpolazione lineare a tratti
return y_out;
};