Boa tarde,
Estou criando um programa que escreve algumas informações em um display de cristal líquido I2C.
A questão é que não estou conseguindo escrever as casas decimais no display da forma que quero.
Não vou colocar o código todo porque está muito grande, mas a parte que importa é essas três
Quando faço desta forma o valor é escrito no display corretamente com 2 casas decimais, perfeito.
#define M_Tensao 0.00001211146910945530
.
.
.
Tensao = (H_Byte<<16)|(M_Byte<<8)|(L_Byte);
.
.
.
lcd.print(Tensao*M_Tensao);
porém como preciso trabalhar com o valor final da variável "Tensão", alterei o código da seguinte forma
#define M_Tensao 0.00001211146910945530
.
.
.
Tensao = ((H_Byte<<16)|(M_Byte<<8)|(L_Byte))*(M_Tensao);
.
.
.
lcd.print(Tensao);
Só que desta forma não exibe mais as 2 casas decimais no display.
Se alguém puder me dar uma dica de como resolver isso agradeceria a ajuda.
Isso é normal. Verifique se o tipo da variável Tensão é float. Se não for isso nunca funcionará como quer.
Como o cálculo é feito com números inteiros, após o cálculo, esse valor não irá conter a parte fraccionária.
Se for mesmo importante ter esse valor para utilizar em outros locais do programa, terá que criar outra variável, do tipo float, para conter esse valor.
Acho que tens alguns problemas...
O primeiro seria como o luis falou do tipo da variável... poderás talvez fazer um cast para float e ver no que dá.
Outro problema tem a ver com a precisão do Arduino no que toca a floats... um valor como 0.00001211146910945530 poderá ser algo preciso em demasia para o arduino calcular.
Depois tens que a função print faz default para 2 casas decimais... daí que não possas ver mais do que isso.
Para resolver, experimenta:
lcd.print(Tensao, 4)
O mesmo se aplicará à porta série.
OK, obrigado pela ajuda, consegui resolver e ainda diminui a quantidade de memória utilizada para variáveis globais. Fiz assim, criei uma variável unsigned long dentro da função que faz as leituras e
#define M_Tensao 0.00001211146910945530
.
.
.
int leituras(){ //função que realiza as leituras das grandezas
unsigned long Leitura;
.
.
.
Leitura = ((H_Byte<<16)|(M_Byte<<8)|(L_Byte))*(M_Tensao);
Tensão = Leitura*M_Tensão;
.
.
.
lcd.print(Tensao);
Não sei se é a melhor opção mas funcionou.
Agora estou com outro problema no projeto, postei em outro tópico por ser assunto diferente Problema para gravar txt no cartão SD - Português - Arduino Forum