
Na aula de hoje veremos:
Matemática (Math)
- min();
- max();
- abs();
- constrain();
- map();
- pow();
- sqrt();
Assista a vídeo aula:
Artigo
min (x, y)
Descrição
Calcula o mínimo de dois números.
Parâmetros
x: o primeiro número, qualquer tipo de dados
y: o segundo número, qualquer tipo de dados
Devoluções
O menor dos dois números.
Exemplos
sensVal = min(sensVal, 100); // atribui sensVal ao menor de sensVal ou 100 // assegurando que ele nunca fica acima de 100.
Nota
Talvez contra-intuitiva, max () é muitas vezes usado para restringir a extremidade inferior da gama de uma variável, enquanto min () é usada para restringir a extremidade superior da gama.
Aviso
Devido à forma como a função min () é implementado, evitar o uso de outras funções dentro dos colchetes, pode levar a resultados incorretos
min(var++, 100); // evitar isso - rendimentos incorreta resultados min (var, 100); var++; // usar isso - mantenha outro de matemática fora da função
max (x, y)
Descrição
Calcula o máximo de dois números.
Parâmetros
x: o primeiro número, qualquer tipo de dados
y: o segundo número, qualquer tipo de dados
Devoluções
O maior dos dois valores de parâmetros.
Exemplo
sensVal = max(senVal, 20); // atribui sensVal ao maior dos sensVal ou 20 // (efetivamente garantindo que ele é, pelo menos, 20)
Nota
Talvez contra-intuitiva, max () é muitas vezes usado para restringir a extremidade inferior da gama de uma variável, enquanto min () é usada para restringir a extremidade superior da gama.
Aviso
Devido à forma como a função max () é implementado, evitar o uso de outras funções dentro dos colchetes, pode levar a resultados incorretos.
max(a--, 0); // evitar isso - rendimentos incorreta resultados max(a, 0); a--; // usar isso - mantenha outro de matemática fora da função
abs (x)
Descrição
Calcula o valor absoluto de um número.
Parâmetros
x: o número
Devoluções
x: Se x é maior do que ou igual a 0.
-x: se x é menor que 0.
Aviso
Devido à forma como a função abs () é implementado, evitar o uso de outras funções dentro dos colchetes, pode levar a resultados incorretos.
abs(a++); // evitar isso - rendimentos incorreta resultados abs(a); a++; // usar isso - mantenha outro de matemática fora da função
constrain(x, a, b)
Descrição
Restringe um número para estar dentro de um intervalo.
Parâmetros
x: o número para restringir, todos os tipos de dados
a: A extremidade inferior da gama, todos os tipos de dados
b: a extremidade superior da gama, todos os tipos de dados
Devoluções
x: se x é entre um e b
a: se x for menor que a
b: Se x é maior do que b
Exemplo
// Limites variam de valores dos sensores para entre 10 e 150 sensVal = constrain(sensVal, 10, 150);
map(value, fromLow, fromHigh, toLow, toHigh)
Descrição
Re-mapeia um número de um intervalo para o outro. Isto é, um valor de fromLow iria ficar mapeado para toLow, um valor de fromhigh para toHigh, valoriza-nos entre os valores nas entrelinhas, etc.
Não restringe os valores dentro do intervalo, pois os valores de fora-de-gama são por vezes pretendido e útil. A função de constrain() pode ser usado antes ou após esta função, se os limites para as gamas são desejados.
Note-se que os limites inferiores “quer” de gama pode ser maior ou menor do que os limites superiores “” de modo que o map() a função pode ser usada para reverter um intervalo de números, por exemplo
y = map(x, 1, 50, 50, 1);
A função também lida com números negativos bem, de modo que este exemplo
y = map(x, 1, 50, 50, -100);
também é válido e funciona bem.
A função do map
() usa matemática inteiro, portanto, não irá gerar frações, quando a matemática pode indicar que ele deve fazê-lo. Restos fracionários são truncados, e não são arredondados ou média.
Parâmetros
value: o número para mapear
fromLow: o limite inferior da faixa de corrente do valor
fromhigh: o limite superior da faixa de corrente do valor
toLow: o limite inferior do intervalo da meta do valor
toHigh: o limite superior da meta do valor
Devoluções
O valor mapeado.
Exemplo
/* Mapear um valor analógico para 8 bits (0 a 255) */ void setup() {} void loop() { int val = analogRead(0); val = map(val, 0, 1023, 0, 255); analogWrite(9, val); }
Apêndice
Para o matematicamente inclinado, aqui está toda a função
long map(long x, long in_min, long in_max, long out_min, long out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }
pow(base, exponent)
Descrição
Calcula o valor de um número elevado a uma potência. pow() pode ser usado para elevar um número a uma potência fraccionada. Isto é útil para gerar valores de mapeamento exponencial ou curvas.
Parâmetros
Base: o número (float)
expoente: o poder de que a base é aumentada (float)
Devoluções
O resultado da exponenciação (double)
Exemplo
Veja o fscale função na biblioteca de código.
/* fscale Floating Point Autoscale V0.1 Função Paul Badger 2007 Modificado de código por Greg Shakar Esta função irá escalar um conjunto de números de ponto flutuante (intervalo) para um outro conjunto de números de ponto flutuante (intervalo) Ele tem uma "curva" parâmetro de modo que possa ser feita a favorecer tanto a extremidade da saída. (Mapeamento logarítmica) Leva 6 parâmetros originalMin - o valor mínimo do intervalo original - esta deve ser inferior a origninalMax originalMax - o valor máximo da escala original - esta deve ser maior que orginalMin Newbegin - a extremidade do novo gama que mapeia para orginalMin - pode ser menor, ou maior, do que newEnd, para facilitar invertendo as gamas newEnd - a extremidade do novo gama que mapeia para originalMax - que pode ser maior ou menor, do que Newbegin, para facilitar invertendo as gamas ValorEntrada - a variável para a entrada que irá mapeados para os intervalos dados, esta variável é restrito a originaMin <= ValorEntrada <= originalMax curva - curva representa a curva que pode ser feita a favorecer uma ou outra extremidade da escala de saída no mapeamento. Os parâmetros são de -10 a 10, com 0 sendo um mapeamento linear (que basicamente leva curva de fora da equação) Para entender o parâmetro de curva de fazer algo parecido com isto: void loop(){ for ( j=0; j < 200; j++){ scaledResult = fscale( 0, 200, 0, 200, j, -1.5); Serial.print(j, DEC); Serial.print(" "); Serial.println(scaledResult, DEC); } } E experimentar alguns valores diferentes para a função de curva - lembre- 0 é um mapeamento neutro, linearPara entender os intervalos invertendo , fazer algo parecido com isto: void loop(){ for ( j=0; j < 200; j++){ scaledResult = fscale( 0, 200, 200, 0, j, 0); // Linhas como acima Serial.print } }*/ #include <math.h> int j; float scaledResult; void setup() { Serial.begin(9600); } void loop() { for ( j = 0; j < 200; j++) { scaledResult = fscale( 0, 200, 0, 200, j, -1.5); Serial.print(j, DEC); Serial.print(" "); Serial.println(scaledResult , DEC); } } float fscale( float originalMin, float originalMax, float newBegin, float newEnd, float inputValue, float curve) { float OriginalRange = 0; float NewRange = 0; float zeroRefCurVal = 0; float normalizedCurVal = 0; float rangedValue = 0; boolean invFlag = 0; // Curva de parâmetro condição // Gama limite if (curve > 10) curve = 10; if (curve < -10) curve = -10; curve = (curve * -.1) ; // - invert and scale - this seems more intuitive - postive numbers give more weight to high end on output curve = pow(10, curve); // convert linear scale into lograthimic exponent for other pow function /* Serial.println(curve * 100, DEC); // Multply por 100 a preservar resolução Serial.println(); */ // Verifique para fora do alcance inputValues if (inputValue < originalMin) { inputValue = originalMin; } if (inputValue > originalMax) { inputValue = originalMax; } // Zero Refference os valores OriginalRange = originalMax - originalMin; if (newEnd > newBegin) { NewRange = newEnd - newBegin; } else { NewRange = newBegin - newEnd; invFlag = 1; } zeroRefCurVal = inputValue - originalMin; normalizedCurVal = zeroRefCurVal / OriginalRange; // normalize to 0 - 1 float /* Serial.print(OriginalRange, DEC); Serial.print(" "); Serial.print(NewRange, DEC); Serial.print(" "); Serial.println(zeroRefCurVal, DEC); Serial.println(); */ // Verifique para originalMin > originalMax - a matemática para todos os outros casos isto é, números negativos parece funcionar bem if (originalMin > originalMax ) { return 0; } if (invFlag == 0) { rangedValue = (pow(normalizedCurVal, curve) * NewRange) + newBegin; } else // Inverter as gamas { rangedValue = newBegin - (pow(normalizedCurVal, curve) * NewRange); } return rangedValue; }
sqrt (x)
Descrição
Calcula a raiz quadrada de um número.
Parâmetros
x: o número, a qualquer tipo de dados
Devoluções
double, raiz quadrada do número.
Código fonte da aula:
void setup() { //Colocar o seu código de configuração aqui, para executar uma vez: } void loop() { // Colocar o seu código principal aqui, para executar repetidamente: int var1 = idade(1990); int var2 = min(var1, 19); int var3 = max(var1, 18); int var4 = max(var1, 1); double var6 = 2.65; int var7 = abs(var6); int var8 = constrain(var1, 18, 50); int var9 = map(var1, 0, 1023, 0, 255); int var10 = pow(3,2); int var11 = sqrt(9); }
Outro código:
int idade(int ano) { return 2016 - ano; }
Fonte: arduino.cc
Faça um comentário