Medir com precisão a temperatura com o Arduino

10

Estou tentando construir termostato com Arduino. Quero ligá-lo usando a bateria / carregador de celular, o que torna a tensão do sistema bastante variável. No momento, eu uso o Arduino Uno, mas, uma vez concluído, eu o portarei para o Lilypad.

Primeiro, tentei usar o sensor de temperatura TMP36 . Até agora, foi um fracasso completo. Embora o próprio sensor pareça muito estável, não consigo descobrir uma maneira de medir com precisão sua tensão.

Usar a referência 5v incorporada para sensores analógicos não está funcionando - mesmo alimentado a partir de + 5V do USB arduino são realmente + 4,8V (que muda a temperatura medida em alguns graus). Quando a placa é alimentada a partir da bateria, a voltagem cai para cerca de 4V e a temperatura medida dispara. Eu também tentei usar + 3.3V da placa como referência. Parece ser mais estável quando a placa é alimentada por USB, mas sua voltagem diminui ao ficar sem bateria.

Existe outra maneira de medir de forma confiável a tensão de saída do sensor?

Para o segundo estágio, planejo usar termistores. Acabei de encomendar alguns desses termistores de 20K .

Pelo que entendi, seria mais fácil medir com precisão se eu construir um divisor de tensão e usar V_in como tensão de referência para o ADC.

Algumas perguntas sobre eles:

  • Faz sentido usar poucos divisores de tensão com resistores fixos diferentes para aumentar a precisão?
  • Posso usar pinos programáveis ​​como V_in e medir a temperatura usando alguns níveis de tensão diferentes. Embora não esteja claro para mim se isso realmente aumentará a precisão.
Usov
fonte
Por favor, poste seu código de conversão de temperatura.
geometrikal.
Por favor, defina o que você quer dizer com "precisão". Que tipo de resolução de temperatura e precisão absoluta você está tentando alcançar?
precisa
Espero obter resolução de cerca de 1-2 graus. O erro absoluto de calibração de 1-2 graus também deve estar bom. Pelo que entendi, é relativamente fácil obter um ponto de referência a 0 ° C e acho que posso obter o segundo ponto (muito mais aproximado) à temperatura ambiente através de sensores de calibração cruzada.
Usov
1-2 graus para temperaturas na faixa de 5-25C.
Usov
@geometrikal Eu não tenho isso em mãos agora, mas é basicamente o mesmo que todo mundo: solte a primeira amostra, aguarde alguns milhões, experimente mais algumas vezes e faça a média das amostras. Em seguida, redimensione com o que você acredita ser a sua tensão de referência.
Usov

Respostas:

2

Parece que você está ciente do problema com a alteração da tensão de referência e, se você usar um dispositivo como o TMP36 (10mV / degC fixo), nada poderá fazer senão usar uma referência de tensão de um chip para estabilizar as coisas.

No entanto, se você estiver usando um RTD ou um termistor, o problema não surgirá. O ADC está fazendo uma medição ratiométrica - ele compara a entrada do ADC com a tensão de referência, MAS, se você alimentar o RTD ou o termistor (através de um resistor adequado) da mesma tensão de referência, isso não afetará as leituras. Se a ref sobe 10%, o mesmo ocorre com a tensão no ADC.

Andy aka
fonte
4

Eu acho que você deve considerar o uso de um sensor de temperatura digital como DS18B20 / DS18S20 porque ele não depende da precisão do seu ATmega ADC para medir um sinal de falha, ele usa o protocolo digital de 1 fio para relatar a temperatura.

Consulte os seguintes tutoriais
http://playground.arduino.cc/Learning/OneWire
http://www.hobbytronics.co.uk/ds18b20-arduino

alexan_e
fonte
2
Esta resposta não é muito útil, a menos que você explique por que o OP deve mudar para um sensor diferente e você não deu justificativa para isso. Apenas fornecer links em uma resposta não é uma boa ideia, porque eles geralmente ficam inoperantes e o conteúdo da resposta é perdido.
Joe Hass
Em vez de escrever minha própria resposta nas mesmas linhas, editei este A para abordar a preocupação levantada por Joe.
RedGrittyBrick
@JoeHass A única alternativa do que vincular a artigos externos é anexar o código na resposta, mas eu não tenho meu próprio código para anexar e não seria justo anexar o código de outra pessoa sem o seu consentimento. Mesmo que os links se esgotem, é possível encontrar facilmente uma biblioteca para o Arduino usando google e DS18B20 como palavra-chave. Quanto à explicação, foi um erro meu, pensei que mencionar que o sensor é digital teria explicado meu argumento.
23413 alexan_e
Obrigado pelo comentário. Por alguma razão, os sensores digitais são bastante difíceis de encontrar. Nem os fornecedores locais (Maplin) nem os caras on-line mais baratos (usei Spiraltronics) não vendem nenhum. £ 3 por entrega pop + ainda a torna uma opção relativamente cara.
Usov
@Usov A julgar pelos links que você forneceu, presumo que você mora no Reino Unido. Eu costumo comprar esses componentes baratos da China, mas também os encontrei no ebay.uk por 1,49 €, talvez eles sejam adequados para você #
alexan_e
3

Sua medição será tão boa quanto a tensão de referência para o ADC é boa. O Arduino, por padrão, usa a tensão de alimentação como tensão de referência, mas no seu caso, a maneira correta de fazer isso seria usar o pino Aref do arduino. Você precisa obter um chip especial chamado "Referência de tensão" e conectá-lo ao pino Aref, depois configurar o ADC para usar a referência externa no código do Arduino ( analogReference(EXTERNAL))

A tensão da referência deve ser selecionada para que o giro completo do seu sensor de temperatura caiba na tensão de referência. O TMP36 produzirá ~ 1.5V a 100C, então você teria que usar referência acima de 1.5V para medir temperatura de até 100C. Você deseja que sua referência seja o mais próximo possível da tensão máxima medida para obter a maior resolução possível.

O Atmega328p possui duas referências internas que podem ser usadas sem nenhum componente externo. Um é 1.1V, outro 2.56V. Eles geralmente têm uma precisão um pouco pior do que a que você obteria usando um componente dedicado externo. Consulte a documentação do Arduino para obter a folha de dados analogReference e Atmega328p para obter a precisão da referência interna.

Se você realmente deseja enlouquecer com intervalos diferentes, pode usar várias referências externas e alterná-las usando um comutador analógico como 74hc4051. Ou você pode alternar entre duas referências internas.

Com termistores, você obtém melhores resultados se configurar uma fonte de corrente constante em vez de usar um resistor estéreo. Por outro lado - um resistor estúpido alimentado por uma referência de tensão estável funcionaria bem.

Ao escolher uma referência externa, verifique se você tem voltagem suficiente para acomodar a voltagem de queda quando a alimentação é feita com pilhas e as pilhas estão gastas. Vref + Vdropout <Vbat-min.

miceuz
fonte
Obrigado por seu comentário. Este é basicamente o mesmo comentário que recebi hoje - crie minha própria tensão ref no diodo zener ou obtenha um regulador de baixa tensão dedicado para a AREF.
Usov
Por que melhores resultados com corrente constante e termistor?
geometrikal.
2

Não ter uma referência ADC estável é na verdade um sintoma de outro problema no seu circuito: você não está fornecendo uma tensão suficientemente alta para a placa. Isso é indicado pela fonte de 5V caindo para 4V e pela queda de 3,3V também.

O regulador de tensão (MC33269D-5.0 IIRC) na placa Arduino tem uma tensão de abandono de ~ 1,0V, portanto, você precisa fornecer pelo menos 6V para obter uma saída estável de 5V. As pilhas AA começam em 1,5-1,6V e estão quase descarregadas em 1,1V, portanto, você deve alimentar a placa com pelo menos 6 pilhas AA para obter uma saída estável durante toda a vida útil da bateria.

Alimentado corretamente, você pode usar a referência ADC interna ou as linhas de 5V ou 3.3V. Como o sensor de temperatura varia em torno de 10 mV por grau Celsius, você pode usar um divisor de tensão para definir a tensão de referência equivalente à tensão de saída máxima esperada do sensor (por exemplo, para 50 graus C). Isso fornecerá uma medida mais precisa.

Se você deseja usar menos de 6 pilhas AA, tente um conversor de impulso DC-DC, por exemplo, https://www.sparkfun.com/products/10968 . O exemplo vinculado leva 1V - 4V e produz 5V. A saída seria alimentada diretamente no pino de 5V do Arduino, ignorando seu regulador.

Para que a placa funcione por mais tempo com baterias, coloque o MCU em repouso entre as leituras do sensor. A biblioteca de baixa potência do rocketscream é ótima para esse fim. Mas isso só é realmente útil ao usar um regulador / conversor DC-DC eficiente, pois o regulador padrão do Arduino usa 10mA sozinho!

geometrikal
fonte
1

Resposta para a pergunta Existe outra maneira de medir com confiabilidade a tensão de saída do sensor?

O ADC usa a tensão de referência para a conversão de analógico para digital. Portanto, se houver uma alteração na tensão de referência, os valores convertidos (ou seja, valor digital) serão alterados. O valor digital será diferente para a mesma entrada analógica se a tensão de referência mudar.

Uma opção fácil é usar a tensão de referência interna dentro do Arduino (ou seja, controlador Atmega).

Consulte o link abaixo, onde é fornecido um código de amostra para usar o ADC interno (nome da função do Arduino - analogReference (DEFAULT))

http://tronixstuff.com/2013/12/12/arduino-tutorials-chapter-22-aref-pin/

Penso que isto resolverá o seu problema e não há necessidade de mudar para termistores.

Robomon
fonte
Não tenho certeza de como o "localizador de hackers Wifi" é relevante - não consigo encontrar nada de relevante. Em relação à referência interna da ADC - eu escrevi sobre isso. Não está funcionando mesmo quando o Arduino é alimentado por USB. E quando a placa é alimentada por bateria de celular (3,7 - 4,5V), é ainda pior.
Usov
Desculpe, é um erro de copiar / colar. Corrigirá o link em breve!
robomon
Corrigido o link @Usov!
robomon
O 1,1V interno pode flutuar em mais de 10%, de acordo com a especificação atmega328. Esta também não parece ser uma referência muito confiável.
Usov