Medición precisa de la temperatura con Arduino

10

Estoy tratando de construir un termostato con Arduino. Quiero alimentarlo con una batería / cargador de teléfono móvil que hace que el voltaje del sistema sea bastante variable. En este momento uso Arduino Uno, pero una vez que esté completo lo portaré a Lilypad.

Primero intenté usar el sensor de temperatura TMP36 . Hasta ahora fue un completo fracaso. Si bien el sensor en sí parece ser muy estable, no puedo encontrar una manera de medir con precisión su voltaje.

El uso de la referencia incorporada de 5v para sensores analógicos no funciona en absoluto, incluso alimentados por USB + 5V de arduino son en realidad + 4.8V (que cambia la temperatura medida en unos pocos grados). Cuando la placa se alimenta de la batería, el voltaje cae a aproximadamente 4V y la temperatura medida se dispara. También intenté usar + 3.3V del tablero como referencia. Parece ser más estable cuando la placa está alimentada por USB, pero su voltaje cae cuando se agota la batería.

¿Hay alguna otra forma de medir de manera confiable el voltaje de salida del sensor?

Para la segunda etapa, planeo usar termistores. Acabo de pedir un par de estos termistores de 20K .

Por lo que entiendo, estos deberían ser más fáciles de medir con precisión si construyo un divisor de voltaje y uso V_in como voltaje de referencia para ADC.

Un par de preguntas sobre ellos:

  • ¿Tiene sentido usar pocos divisores de voltaje con diferentes resistencias fijas para aumentar la precisión?
  • Puedo usar un pin programable como V_in, y medir la temperatura usando algunos niveles de voltaje diferentes. Aunque no está claro para mí si esto realmente aumentará la precisión.
Usov
fuente
Por favor, publique su código de conversión de temperatura.
geometrikal
Defina a qué se refiere con "precisión". ¿Qué tipo de resolución de temperatura y precisión absoluta estás tratando de lograr?
Joe Hass el
Espero obtener una resolución de aproximadamente 1-2 grados. El error absoluto de calibración de 1-2 grados también debería estar bien. Por lo que entiendo, es relativamente fácil obtener un punto de referencia a 0 ° C, y creo que puedo obtener un segundo punto (mucho más aproximado) a temperatura ambiente mediante sensores de calibración cruzada.
Usov
1-2 grados para temperaturas en el rango de 5-25C.
Usov
@geometrikal No lo tengo a la mano en este momento, pero es básicamente lo mismo que todos los demás: suelte la primera muestra, espere unos pocos milis, pruebe un par de veces más y las muestras promedio. Luego vuelva a escalar según lo que cree que es su voltaje de referencia.
Usov

Respuestas:

2

Parece que conoce el problema con el cambio de voltaje de referencia y si usa un dispositivo como el TMP36 (10mV / degC fijo) no hay nada que pueda hacer que no sea usar una referencia de voltaje de un chip para estabilizar las cosas.

Sin embargo, si está utilizando un RTD o un termistor, entonces el problema no surgirá. Su ADC está haciendo una medición radiométrica: compara la entrada de ADC con su voltaje de referencia PERO, si alimenta el RTD o el termistor (a través de una resistencia adecuada) desde el mismo voltaje de referencia, no afectará las lecturas. Si la referencia aumenta un 10%, también lo hace el voltaje en el ADC.

Andy alias
fuente
4

Creo que debería considerar usar un sensor de temperatura digital como DS18B20 / DS18S20 porque no depende de la precisión de su ATmega ADC para medir una señal anaolg, utiliza un protocolo digital de 1 cable para informar la temperatura.

Consulte los siguientes tutoriales
http://playground.arduino.cc/Learning/OneWire
http://www.hobbytronics.co.uk/ds18b20-arduino

alexan_e
fuente
2
Esta respuesta no es muy útil a menos que explique por qué el OP debería cambiar a un sensor diferente, y no ha dado ninguna justificación para eso. Simplemente proporcionar enlaces en una respuesta no es una buena idea porque a menudo se cortan y el contenido de la respuesta se pierde.
Joe Hass el
En lugar de escribir mi propia respuesta en la misma línea, he editado esta A para abordar la preocupación planteada por Joe.
RedGrittyBrick
@JoeHass La única alternativa que vincular a artículos externos es adjuntar el código en la respuesta, pero no tengo mi propio código para adjuntar y no sería justo adjuntar el código de otra persona sin su consentimiento. Incluso si los enlaces se cortan, se puede encontrar fácilmente una biblioteca para Arduino usando google y DS18B20 como palabra clave. Con respecto a la explicación, fue mi error, pensé que mencionar que el sensor es digital habría explicado mi punto.
alexan_e
Gracias por el comentario. Por alguna razón, los sensores digitales son bastante difíciles de encontrar. Ni los proveedores locales (Maplin) ni los chicos baratos (er) en línea (usé Spiraltronics) no venden ninguno. £ 3 por pop + entrega aún lo hace una opción relativamente costosa.
Usov
@Usov A juzgar por los enlaces que ha proporcionado, supongo que vive en el Reino Unido. Normalmente compro estos componentes barato de China, pero también me los encontré en ebay.uk de £ 1.49, tal vez su medida
alexan_e
3

Su medida será tan buena como el voltaje de referencia para ADC es bueno. Arduino por defecto usa el voltaje de suministro como voltaje de referencia, pero en su caso la forma correcta de hacerlo sería usar el pin Aref de arduino. Debe obtener un chip especial llamado "Referencia de voltaje" y conectarlo al pin Aref, luego configurar ADC para usar la referencia externa en el código Arduino ( analogReference(EXTERNAL))

El voltaje de la referencia debe seleccionarse de modo que la oscilación completa de su sensor de temperatura se ajuste al voltaje de referencia. TMP36 emitirá ~ 1.5V @ 100C, por lo que tendría que usar una referencia por encima de 1.5V para medir temperaturas de hasta 100C. Desea que su referencia esté lo más cerca posible del voltaje máximo medido para obtener la mayor resolución posible.

Atmega328p tiene dos referencias internas que se pueden usar sin ningún componente externo. Uno es 1.1V, otro 2.56V. Por lo general, tienen una precisión un poco peor que la que obtendría al usar un componente dedicado externo. Consulte la documentación de Arduino para obtener referencias analógicas y la hoja de datos Atmega328p para obtener una precisión de referencia interna.

Si realmente desea obtener tuercas con diferentes rangos, puede usar varias referencias externas y cambiarlas usando un interruptor analógico como 74hc4051. O puede cambiar entre dos referencias internas.

Con los termistores, obtendrá mejores resultados si configura una fuente de corriente constante en lugar de usar una resistencia tonta. Por otro lado, una resistencia tonta alimentada por una referencia de voltaje estable funcionaría bien.

Al elegir una referencia externa, asegúrese de tener suficiente voltaje para acomodar su voltaje de caída cuando se alimenta con baterías y las baterías están agotadas. Vref + Vdropout <Vbat-min.

miceuz
fuente
Gracias por tu comentario. Este es básicamente el mismo comentario que recibí hoy: construir mi propio voltaje de referencia en el diodo zener u obtener un regulador de bajo voltaje dedicado para AREF.
Usov
¿Por qué mejores resultados con corriente constante y un termistor?
geometrikal
2

No tener una referencia ADC estable es en realidad un síntoma de otro problema en su circuito: no está suministrando un voltaje suficientemente alto a la placa. Esto se indica por la caída del suministro de 5V a 4V y la caída de 3.3V también.

El regulador de voltaje (MC33269D-5.0 IIRC) en la placa Arduino tiene un voltaje de caída de ~ 1.0V, por lo tanto, debe suministrarlo con al menos 6V para obtener una salida estable de 5V. Las baterías AA comienzan a 1.5-1.6V y están casi agotadas a 1.1V, por lo que debe alimentar la placa con al menos 6 baterías AA para una salida estable durante toda la vida útil de la batería.

Alimentado correctamente, puede usar la referencia interna de ADC o las líneas de 5V o 3.3V. Dado que el sensor de temperatura varía alrededor de 10 mV por grado Celcius, puede usar un divisor de voltaje para establecer el voltaje de referencia equivalente al voltaje de salida máximo esperado del sensor (por ejemplo, para 50 grados C). Esto le dará una medición más precisa.

Si desea utilizar menos de 6 baterías AA, pruebe con un convertidor de refuerzo CC-CC, por ejemplo, https://www.sparkfun.com/products/10968 . El ejemplo vinculado toma 1V - 4V y hace 5V. La salida se alimentaría directamente al pin de 5V del Arduino, sin pasar por su regulador.

Para que la placa funcione más tiempo con baterías, ponga la MCU en modo inactivo entre lecturas de sensor. La biblioteca Rocketscream de baja potencia es ideal para este propósito. ¡Pero solo es realmente útil cuando se usa un regulador eficiente / convertidor DC-DC ya que el regulador Arduino estándar usa 10mA solo!

Geometrikal
fuente
1

Respuesta a la pregunta ¿Hay alguna otra forma de medir de manera confiable el voltaje de salida del sensor?

ADC utiliza el voltaje de referencia para la conversión de analógico a digital. Entonces, si hay un cambio en el voltaje de referencia, los valores convertidos (es decir, el valor digital) cambiarán. El valor digital será diferente para la misma entrada analógica si cambia el voltaje de referencia.

Una opción fácil es usar el voltaje de referencia interno dentro del Arduino (es decir, el controlador Atmega).

Consulte el siguiente enlace donde se proporciona un código de muestra para usar el ADC interno (nombre de la función Arduino - analogReference (DEFAULT))

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

Creo que esto resolverá su problema y no hay necesidad de cambiar a termistores.

robomon
fuente
No estoy seguro de cómo es relevante "Hacking Wifi Finder": no puedo encontrar nada relevante. Con respecto a la referencia interna de ADC, escribí sobre eso. No funciona incluso cuando Arduino funciona con USB. Y cuando la placa se alimenta de la batería del teléfono celular (3.7 - 4.5V) es aún peor.
Usov
Lo siento, es un error de copiar / pegar. ¡Corregirá el enlace pronto!
robomon
@Usov enlace corregido!
robomon
La capacidad interna de 1.1V puede flotar en más del 10% de acuerdo con la especificación atmega328. Esto tampoco parece ser una referencia muy confiable.
Usov