Como estabilizar a leitura de um valor instável? [RESOLVIDO]

1. Como estabilizar a leitura de um valor instável? [RESOLVIDO]

Wilker Azevedo
cytron

(usa Slackware)

Enviado em 26/07/2015 - 22:53h

Blz!?!

Estou enfrentando um problema simples e complicado hehehe. Faço a leitura da temperatura usando um termistor no arduino através da lib Thermistor. Até aí tudo bem. Só que devido a algumas interferências geradas na região de leitura, o valor fica um pouco instável mas não chega a atrapalhar a leitura correta da temperatura.

Não tem como eliminar as interferências devido a questões físicas e de funcionamento. Ou seja, preciso de um algorítimo para estabilizar o valor lido do sensor.

Exemplo:

A temperatura inicia em 10 e vai caindo até 0:

10...9...8...7...6...5...4...3...2...1...0

Porém, devido a interferência, vai caindo assim:

10...11...9...8...10...7...9...8...6...5...8...6...7...4...5...7...3...2....6...2...5...1...3...5...2...1...4...0...1...0...4...0...1...0...

Perceberam? Apesar de cair realmente de 10 até 0, oscila muito a cada valor decrescente. Isso gera um problemão, pois preciso ativar e desativar coisas conforme a temperatura, como no valor 5 por exemplo, se for igual ou menor que 5 liga um led, daí o led fica piscando feito louco, pois quando chega no 5 ele pula pra 6, depois 4, depois 7, depois 5, depois 3, depois 7 kkkkkkkkk

Imagino eu, que se aplicar um algorítimo de "amortecimento" kkkkk, vai resolver, mas eita algorítimo difícil heheheh. Não sou bom matemático, sei que existe fórmula matemática pra isso, mas não sei como fazer. Usando lógica de programação dá pra fazer, mas vai ficar tão grande e complexo que vai acabar virando um kernel linux kkkkkkk.

Alguém tem um jeito menos doloroso pra fazer este algorítimo?


  


2. Re: Como estabilizar a leitura de um valor instável? [RESOLVIDO]

Jeferson Coli
jcoli

(usa Debian)

Enviado em 27/07/2015 - 08:37h

Já tive esse problema, mas com PT100 e cp.

Já tentou usar cabo blindado, ou outras coisas semelhantes?

Qual a velocidade de variação de temperatura?


Jeferson Coli
---------------------
www.tecnocoli.com.br


3. Re: Como estabilizar a leitura de um valor instável? [RESOLVIDO]

Antonio Thomacelli
tonnytg

(usa Outra)

Enviado em 27/07/2015 - 10:10h

Boa tarde,
nunca passei por essa interferência, para leituras de nenhum sensor,
seu sensor pode estar danificado, recomendo trocar de porta ou testar outro aparelho.

Enfim, você pode contornar a situação dessa forma.

Uma variável recebe o valor inicial :
 VALOR_ORIGINAL = SENSOR  


depois que o código começar a reduzir até zero, você apenas compara se o valor original é maior que o novo,
se for, você reduz ele.

 
if ( VALOR_ORIGINAL < SENSOR )
{
VALOR_ORIGINAL = SENSOR
}



Bom não tenho como simular o erro aqui, então tentei só te ajudar imaginando o cenário.
Boa sorte.
Att. Antonio Thomacelli Gomes
http://www.tonnytg.com.br


4. Re: Como estabilizar a leitura de um valor instável? [RESOLVIDO]

Wilker Azevedo
cytron

(usa Slackware)

Enviado em 27/07/2015 - 12:46h

Olá jcoli,

Um cabo blindado não resolve o caso, pois o sensor deve fazer a leitura em um local específico dentro de uma câmara onde é o "único" lugar gerador de interferência, tipo... tenho que ler a temperatura do "gerador de interferências" kkkk.

A queda e subida da temperatura não é muito rápida, tipo 1 grau a cada 10 segundos.
Já a oscilação causada pela interferência é cerca de 5 variações por segundo, quando chega no ponto onde o led tem que acender ou apagar, ele dispara feito metralhadora.

Olá tonnytg,

O sensor que estou utilizando é apenas um NTC 10k polarizado corretamente, inclusive "fora" da câmara a leitura fica muito boa, já testei em copo de gelo e ferro de solda. A leitura sobe e desce sem oscilação. O problema está na interferência que não posso isolar ou evitar.

Mas gostei da ideia sua para acalmar a oscilação, eu já tinha pensado neste formato, mas é "tão simples" que duvidei da eficácia kkkk. Vou arriscar par ver se dá certo, é claro que o algoritmo ficará um pouco maior, pois tem que prever tanto subida quanto descida.

Na verdade acho que não é tão simples assim kkkk, enquanto escrevo aqui estive pensando no algoritmo e começou a dar kernel panic na minha cabeça:

Ex:

Tenho que comparar a nova leitura com a leitura anterior para saber se ela oscilou, porém não posso confundir com a queda ou subida real. Pensei em temporizador de 1s para permitir alterar a temperatura...

ms = millis();
new_t = ntc.getTemp();
if (new_t <> t && ms > sec + 10000) // Considerar somente a variação após 10 segundos
{
t = new_t;
sec = ms; // Renova os milisegundos para iniciar a contagem
}


Ou seja, só considero como nova leitura a variação depois de 10 segundos, onde a leitura real tem uma variação mais significativa que a gerada pela interferência.

O que acham?



5. Re: Como estabilizar a leitura de um valor instável? [RESOLVIDO]

Antonio Thomacelli
tonnytg

(usa Outra)

Enviado em 27/07/2015 - 17:02h

Seu código :

ms = millis();
new_t = ntc.getTemp();
if (new_t <> t && ms > sec + 10000) // Considerar somente a variação após 10 segundos
{
t = new_t;
sec = ms; // Renova os milissegundos para iniciar a contagem
}


Se você mandou a sequencia correta da oscilação no primeiro post,
da para se notar que a ocilação é sempre um valor acima do orignal.

Então basta você sempre verificar se é menor do que o valor exibido,
caso sim, armazene o novo.

Sobre adicionar no if o tempo a ser aguardado de 10 segundos,
não terá nenhum impacto já que a oscilação irá ocorrer independente do tempo.
corre o risco de você perder o retorno do valor original e começar a alimentar a variavel final com o valor bagunçado.

Att. Antonio Thomacelli Gomes
http://www.tonnytg.com.br


6. Re: Como estabilizar a leitura de um valor instável? [RESOLVIDO]

Wilker Azevedo
cytron

(usa Slackware)

Enviado em 27/07/2015 - 18:16h

Entendi.

No entanto, a sequencia que citei é apenas um exemplo. As oscilações são totalmente aleatórias, mas não ultrapassam 5 graus (acima ou abaixo). Só se eu calcular a média hehe.

Testei um termômetro digital retirado de freezer, ele também usa um NTC 10k, e para minha surpresa, ficou estável! Ou seja, o arduino é que está MUITO sensível kkkk. Mas pelo jeito tem como não sofrer ação da interferência e nem vou precisar de código pra fazer milagre.

Já cheguei aterramento do ntc, está tudo nos conformes. Já usei malha de proteção, mas como eu disse antes, a interferência vem do local onde o ntc precisa ficar. Pelo pouco que conheço de eletrônica, é preciso anular / aterrar a interferência, seja com filtro no pé do ntc ou na porta do arduino. Caso alguém pergunte: já testei o arduino na bateria para isolar a fonte para eliminar a suspeita de interferência pela alimentação.


7. Re: Como estabilizar a leitura de um valor instável? [RESOLVIDO]

Jeferson Coli
jcoli

(usa Debian)

Enviado em 28/07/2015 - 06:36h

cytron escreveu:

Entendi.

No entanto, a sequencia que citei é apenas um exemplo. As oscilações são totalmente aleatórias, mas não ultrapassam 5 graus (acima ou abaixo). Só se eu calcular a média hehe.

Testei um termômetro digital retirado de freezer, ele também usa um NTC 10k, e para minha surpresa, ficou estável! Ou seja, o arduino é que está MUITO sensível kkkk. Mas pelo jeito tem como não sofrer ação da interferência e nem vou precisar de código pra fazer milagre.

Já cheguei aterramento do ntc, está tudo nos conformes. Já usei malha de proteção, mas como eu disse antes, a interferência vem do local onde o ntc precisa ficar. Pelo pouco que conheço de eletrônica, é preciso anular / aterrar a interferência, seja com filtro no pé do ntc ou na porta do arduino. Caso alguém pergunte: já testei o arduino na bateria para isolar a fonte para eliminar a suspeita de interferência pela alimentação.


Quando você testou com o termometro de freezer usou o mesmo NTC com o mesmo cabo?
Qual a frequencia de você esta fazendo as leituras no Arduino?
Tem como enviar o circuito que você esta utilizando?
Pode ver a possibilidade de um circuito com ampop antes do arduino.

Jeferson Coli
---------------------
www.tecnocoli.com.br


8. Re: Como estabilizar a leitura de um valor instável?

Antonio Thomacelli
tonnytg

(usa Outra)

Enviado em 28/07/2015 - 10:59h

Bom, se você disse que há oscilação tanto subindo, quanto descendo, isso descarta até a ideia de média...

Partir, então agora para outra lógica, qual peça usar, para bloquear o ruído.

Digamos que você usa o pino 10 para receber a leitura,
tente colocar um resistor de baixa resistência junto com a entrada de dados do termômetro.


+----< Resitor 100ohms >---- GND
Pino 10 -------+
+---< Entrada termômetro dados>



Achei um PDF falando sobre ocilação,
não tenho tempo para ler,
mas parece interessante.
http://www.peb.ufrj.br/cursos/eel710/EEL710_Modulo06.pdf




Att. Antonio Thomacelli Gomes
http://www.tonnytg.com.br


9. Re: Como estabilizar a leitura de um valor instável? [RESOLVIDO]

Lisandro Guerra
Lisandro

(usa Arch Linux)

Enviado em 28/07/2015 - 15:00h

Prezado cytron,
para eliminar este efeito costuma-se utilizar a técnica da janela de histerese.
O efeito pode ser conseguido comparando os valores com percentuais, é melhor que a solução de tempo.
Abraço




10. Re: Como estabilizar a leitura de um valor instável? [RESOLVIDO]

Wilker Azevedo
cytron

(usa Slackware)

Enviado em 29/07/2015 - 01:04h

Histerese parece ser realmente o que preciso, mas vai por mim, no meu caso não vale a pena kkkkk, é um tanto complexo para que eu entenda e ainda aplique ao projeto.

Tentei ver a questão da interferência, consegui reduzir, mas não anulei por completo. Então fiz um algorítimo interessante que resolveu a situação:

A interferência gera valores baixo e acima da temperatura real, logo:
pego a primeira leitura da temperatura como referência, conto quantas incidências de valor abaixo ocorrem e também acima (da referência) e armazeno em variáveis separadas. Quem chegar a 150 incidências primeiro, faço a média e assumo como nova temperatura real.

A precisão ficou ótima, apenas em alguns raros instantes erra por 1 grau, porém rapidamente se iguala a temperatura real.

Vou marcar como RESOLVIDO, porém continuarei de olho aqui, caso alguém apresente outra solução, ou até mesmo com alguma dúvida sobre o assunto.

Muito obrigado a vocês!


11. Re: Como estabilizar a leitura de um valor instável? [RESOLVIDO]

Wilker Azevedo
cytron

(usa Slackware)

Enviado em 10/08/2015 - 01:01h

Agora resolvi de vez!

O valor real da temperatura é sempre o que mais aparece na oscilação, então, fiz um algorítimo que conta as ocorrências e elege o que mais se repetiu durante 1s. Consegui estabilidade 100%. Está rodando a alguns dias e nunca deu uma variação maluca se quer.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts