Come utilizzare alcuni operatori e funzioni matematiche nei progetti
Nei nostri sketch, quando utilizziamo variabili numeriche, impieghiamo, solitamente, degli operatori matematici per manipolare questi dati. I più semplici, come sappiamo bene, sono l’addizione, la sottrazione, la moltiplicazione e la divisione. Fortunatamente esistono anche altri metodi che ci permettono di velocizzare e di risolvere diverse situazioni che si presentano durante la scrittura degli sketch.
In questo articolo volevo analizzare alcune funzioni particolari come constrain, min, max, floor e ceil
Come limitare un valore entro un limite minimo e massimo
Quando si ha la necessità di ottenere sempre dei valori compresi in un intervallo definito, possiamo usare la funzione constrain(value, min, max). Il codice seguente mostra come impiegarla
[c]
int Var = 10;
int Result = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
//il valore Result sarà uguale a 50
Var = 50;
Result = constrain(Var, 10, 100);
Serial.println(Result);
//il valore Result sarà uguale a 10
Var = 5;
Result = constrain(Var, 10, 100);
Serial.println(Result);
//il valore Result sarà uguale a 100
Var = 500;
Result = constrain(Var, 10, 100);
Serial.println(Result);
//non fa nulla
while(true)
;
}
[/c]
Se la variabile Valore è minore di 10 il risultato sarà 10 se il valore è maggiore di 90 il risultato sarà 90, negli altri casi il risultato sarà uguale alla variabile Valore.
Come trovare il minimo ed il massimo tra due numeri
la funzione per calcolare il valore minimo tra due numeri è min(val1, val2); e viene impiegata in questo modo
[c]
int Var1 = 10;
int Var2 = 50;
int Result = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
//il valore Result sarà uguale a 10
Result = min(Var1, Var2);
Serial.print(Result);
//non fa nulla
while(true)
;
}
[/c]
mentre la funzione per calcolare il valore massimo tra due numeri è max(val1, val2); e viene utilizzata in questo modo
[c]
int Var1 = 10;
int Var2 = 50;
int Result = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
//il valore Result sarà uguale a 50
Result = max(Var1, Var2);
Serial.print(Result);
//non fa nulla
while(true)
;
}
[/c]
Come arrotondare un numero per difetto o per eccesso
Le funzioni floor(val) e ceil(val) permettono di arrotondare rispettivamente per difetto e per eccesso un numero in virgola mobile. L’esempio seguente mostra come utilizzarle
[c]
float Var = 10.6598;
int Result = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
//arrotonda per difetto
Result = floor(Var);
Serial.println(Result);
//arrotonda per accesso
Result = ceil(Var);
Serial.println(Result);
//non fa nulla
while(true)
;
}
[/c]
Come rimappare un intervallo di valori con un altro
Quando si rende necessario scalare un intervallo di valori con un altro ci viene incontro la funzione map. Ad esempio i valori che possiamo ottenere dalla lettura di un segnale applicato ad un pin analogico di Arduino sono compresi tra 0 e 1023, se volessimo ottenere un intervallo diverso ma equivalente potremmo utilizzare la funzione map(data,x1,y1,x2,y2); in questo modo:
[c]
int DataAN0 = 0;
int ValEqu = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
//leggo dal pin analogico zero
DataAN0 = analogRead(0);
//i valoridi Result possono andare da 0 a 1024
//voglio rimappare questi valori per
//ottenere un intervallo equivalente che va
//da 0 a 255
ValEqu = map(DataAN0, 0, 1023, 0, 255);
Serial.print("Valore Originale ");
Serial.println(DataAN0);
Serial.print("Valore rimmapato ");
Serial.println(ValEqu);
Serial.println();
delay(1000);
}
[/c]
Ulteriori informazioni sono presenti nel sito ufficiale Arduino.cc, dove vengono illustrate ulteriori funzioni interessanti.
[facebook_ilike]