Medición precisa de la temperatura con Arduino

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

Primero traté de 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 una referencia de 5v incorporada para los sensores analógicos no funciona en absoluto; incluso los +5V de USB arduino son en realidad +4.8V (lo que cambia la temperatura medida unos pocos grados). Cuando la placa se alimenta con la batería, el voltaje cae a aproximadamente 4 V y la temperatura medida se dispara. También traté de usar +3.3V de la placa como referencia. Parece ser más estable cuando la placa se alimenta desde USB, pero su voltaje cae cuando se queda sin 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 me queda claro si esto realmente aumentará la precisión.
Publique su código de conversión de temperatura.
Por favor, defina lo que quiere decir con "precisamente". ¿Qué tipo de resolución de temperatura y precisión absoluta está tratando de lograr?
Espero obtener una resolución de aproximadamente 1-2 grados. El error de calibración absoluto 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 supongo que puedo obtener un segundo punto (mucho más aproximado) a temperatura ambiente mediante la calibración cruzada de sensores.
1-2 grados para temperaturas en el rango de 5-25C.
@geometrikal No lo tengo a mano en este momento, pero es básicamente lo mismo que todos los demás: coloque la primera muestra, espere unos pocos milisegundos, muestree un par de veces más y promedie las muestras. Luego vuelva a escalar por lo que cree que es su voltaje de referencia.
utilice una referencia interna precisa de 1,1 V para medir el voltaje del termómetro o para medir el voltaje de entrada.
Necesitábamos valores de temperatura y humedad para probar el dispositivo. Disponemos de nuestro propio tablero de horquillas, que ayuda a realizar cualquier prueba. Puede leer la autoevaluación aquí: forktestlab.com/mtah

Respuestas (5)

Parece que está al tanto del 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 más que usar una referencia de voltaje de un chip para estabilizar las cosas.

Sin embargo, si está utilizando un RTD o un termistor, el problema no surgirá. Su ADC está realizando una medición radiométrica: compara la entrada del 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 sube un 10%, también lo hace el voltaje en el ADC.

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 analógica, usa 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

Esta respuesta no es muy útil a menos que explique por qué el OP debería cambiar a un sensor diferente, y no ha justificado 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.
En lugar de escribir mi propia respuesta en la misma línea, edité esta A para abordar la inquietud planteada por Joe.
@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 apagan, se puede encontrar fácilmente una biblioteca para Arduino usando google y DS18B20 como palabra clave. En cuanto a la explicación, fue mi error, pensé que mencionar que el sensor es digital habría explicado mi punto.
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 en línea más baratos (más) (usé Spiraltronics) no venden ninguno. £ 3 por pop + entrega todavía lo convierte en una opción relativamente costosa.
@Usov A juzgar por los enlaces que ha proporcionado, asumo que vive en el Reino Unido. Normalmente compro estos componentes baratos en China, pero también los encontré en ebay.uk por £ 1.49, tal vez te queden bien.

Su medida será tan buena como el voltaje de referencia para ADC. 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 configure ADC para usar la referencia externa en el código Arduino ( analogReference(EXTERNAL))

El voltaje de la referencia debe seleccionarse de manera que la oscilación completa de su sensor de temperatura se ajuste al voltaje de referencia. TMP36 emitirá ~1,5 V a 100 °C, por lo que deberá usar una referencia superior a 1,5 V para medir la temperatura hasta 100 °C. 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 externo dedicado. Consulte la documentación de Arduino para obtener información sobre analogReference y la hoja de datos de Atmega328p para conocer la precisión de la referencia interna.

Si realmente quiere volverse loco 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 desde una referencia de voltaje estable funcionaría bien.

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

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

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

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 suministrarle al menos 6V para obtener una salida estable de 5V. Las baterías AA comienzan con 1,5-1,6 V y están casi agotadas con 1,1 V, por lo que debe alimentar la placa con al menos 6 baterías AA para obtener 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 Celsius, 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 medida más precisa.

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

Para que la placa funcione durante más tiempo con las baterías, ponga la MCU en reposo entre las lecturas del sensor. La biblioteca de bajo consumo Rocketscream es excelente 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 10 mA solo!

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

ADC usa 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 enlace a continuación 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 es necesario cambiar a termistores.

No estoy seguro de qué tan relevante es "Hacking Wifi finder". No puedo encontrar nada relevante allí. Con respecto a la referencia interna de ADC, escribí al respecto. No funciona incluso cuando Arduino se alimenta desde USB. Y cuando la placa se alimenta con la batería del teléfono celular (3.7 - 4.5V) es aún peor.
Lo siento, es un error de copiar/pegar. ¡Corregiré el enlace pronto!
@Usov enlace corregido!
Los dispositivos internos de 1,1 V pueden flotar en más del 10 % según las especificaciones atmega328. Esto tampoco parece ser una referencia muy confiable.