Come utilizzare alcuni operatori e funzioni matematiche nei progetti

Funzioni matematiche con Arduino

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

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)
  ;

}

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


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)
  ;

}

mentre la funzione per calcolare il valore massimo tra due numeri è max(val1, val2); e viene utilizzata in questo modo


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)
  ;

}

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


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)
  ;

}

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:


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);

}

Ulteriori informazioni sono presenti nel sito ufficiale Arduino.cc, dove vengono illustrate ulteriori funzioni interessanti.

[facebook_ilike]