Go Down

Topic: Ajuda com código para escrever em display (Read 1 time) previous topic - next topic

alan_lima

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.


Code: [Select]
#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

Code: [Select]
#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.

luisilva

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.

bubulindo

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:

Code: [Select]

lcd.print(Tensao, 4)


O mesmo se aplicará à porta série.
This... is a hobby.

alan_lima

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

Code: [Select]
#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 https://forum.arduino.cc/index.php?topic=419963.new#new

Go Up