Conversão de valor de sensor através de formula matematica

Ola pessoal.

Preciso converter um valor lido por um sensor em um outro dado usando a expresso matematica abaixo, contudo nao sei escrever esta equação no sketch do Arduíno.

Alguém ai poderia me dar uma força? 

int sensorPin = A0;
int x; // na sei se uso int ou float?
int y;
void setup() {
Serial.begin(9600);
}

void loop() {

x = analogRead(sensorPin);
y = (4E-63*(x elevado a potencia (24,079))); // isso e igual a 0,000000000000000000000000000000000000000000000000000000000000004 * x elevado a potencia de 24,079//

Serial.println(y);
delay(1000);
}

desde ja agradeço.

Exibições: 1536

Anexos

Responder esta

Respostas a este tópico

//Acho que isso deve bastar (fiz varios castings so para garantir, mas acho que nao eh totalmente necessario)

#include <math.h>

//[...]

y = (int) (  (unsigned double) pow(x, 24.079) / (unsigned double) 4e63 );

 Faltou o sinal negativo do 4e-63.  ^^

  E... não era uma multiplicação entre a potência e a constante? ^^

Mas concordo com o Jucelei, esse tipo de conta é estressante para o microcontrolador, ainda mais quando se trata de um microcontrolador de 8 bits. E justamente por isto você pode ter erros demais de arredondamento e conversão de tipos.

 Pode ser que para determinados valores de entrada você obtenha o valor esperado, mas teste a função antes de confiar nos resultados. Coloque a fórmula acima dentro de uma função, recebendo como parametro o "x". E como o valor provém de uma leitura analógica de 10 bits, você precisa apenas varrer a função entre os valores 0 a 1023. E para cada um dos valores verifique se o resultado é o esperado.

 Para verificar os valores, jogue os mesmos em uma planilha e verifique se ele está próximo da curva esperada.

 Podemos saber o que sua fórmula está calculando e o que seria o sensor de entrada? Talvez exista outra forma de modelar para chegar à grandeza ou valor que deseja.

Espero ter ajudado.

 T++.

O sinal de negativo virou uma divisao, me pareceu melhor.

 Acho que entendi o que você fez. Mas dai você teria que multiplicar a potência pelo 4 inteiro não é? Algo do tipo:

y=(int)(((unsigned double) pow(x,20.079)/(unsigned double) 1e63)) * 4.0);

//(o ponto "." é para não fazer cast). 

Será que assim funciona?

Mas foi bom ter pensado nisto, a precedência das coisas (para não estourar) se torna um problema se não tomarmos cuidado.

Legal. ^^

 T+.

Acho que fiz errado, depois apelo para a calculadora. rs

Só te falo uma coisa, jamais deve fazer uma cálculos desses em uC...  Tem como contornar isso numa maneira mais elegante, só dar uma pesquisada. Um numero tão pequeno elevado numa potencias dessas, deve dar zero..

Melhor seria utilizar alguma unidade de medida própria para a escala que está trabalhando.

Como a menor unidade é o Fentometro (10^(-15)), melhor seria você "inventar" uma unidade pra essa escala (funciona, se for bom matemático).

4E-63*(x elevado a potencia (24,079) -> Isso tá estranho, não seria 24.079?

É 24 mil e 79? Ou 24 virgula zero sete nove?

Lembre-se que em português, o separador de milhar é o ponto, o divisor de milhar é a vírgula, e nos computadores utiliza-se a lingua inglesa, onde vale a regra contrária.

Em programação, o ponto é o divisor decimal. Para milhar não se utiliza nada, então 1/10=0.1 e mil=1000.

Também a notação científica 4E-63, aprendi que é 4*(10^(-63)), então ficaria a equação:

(4*(10^(-63)))*(x^24079)

O resto é sintaxe de programação, que o Gabriel já colocou e pode variar, dependendo do programador.

Eu me sentiria mais a vontade colocando na forma algébrica:

float y = (4*(10^(-63)))*(x^24079);

Alexandre, em C o operador "^" realiza um OU EXCLUSIVO bit a bit, essa sintaxe fica errada, a menos que voce sobrecarregue utilizando C++.

Estritamente falando, nao existe divisor de milhar, nem em ingles, nem em portugues. Na imagem da para notar que a virgula eh usada como separador decimal (ou 0,9999 nao teria sentido)

A sintaxe 4e-63 eh uma representacao valida em C, nao precisa reescrever.

Wolfram Alpha - Plotagem [0 ; 1023]

mostra que:
x entre 0 e 400, y ~= 0;
x entre 400 e 600, y cresce pouco;
x entre 600 e 1023, y cresce rapidamente

Realmente errei, o valor maximo no dominio 0 a 1023 eh aproximadamente 7.45*10^8, nao cabe em um int 16bit, precisa ser long (isso que quiser jogar a parte fracionaria fora).

Deu pra perceber que eu sei mais de matemática q de C, né?

kkkkkkk

Se você vai enviar a leitura via serial.

Faça o calculo no dispositivo (PC?)  que receberá o dado ....

Outra sugestão :

tensão medida = entre 0 e 5V 

memória do Arduino = 2 K Bytes.

Faça um tabela com excel dos seus calculos e depois use essa tabela (gravada na memoria do Arduino) para fazer referencia aos valores de medidos.

Obrigado a todos, vcs não tem ideia de como me ajudaram, todos os comentários foram validos.

Realmente o Jose Gustavo tem razão, nao vou fazer esta conta no arduino, as vezes a resposta esta na nossa frente mas necessitamos da ajuda de outras pessoas para clarear as ideias.

Como vou enviar estes dados para excel via plx-daq, vou fazer a conta no excel ora bolas..

Estou montando na minha empresa um monitoramento das soluções nutritivas que jogamos nas plantas, através da medição da condutividade eletrica (EC), Isso nos auxiliará no monitoramento, ja que nem sempre os funcionários estão seguindo as recomendações passadas. Tenho inúmeros trabalhos que estou desenvolvendo com arduino. E futuramente compartilharei com todos, um deles e uma maquina para selecionar automaticamente minhas mudas, já esta quase pronta, so estou com um pouco de dificuldade para acelerar o motor de passo. depois peço ajuda de vcs. rsrsrs

Mais uma vez agradeço.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço