Termómetro con Arduino y diodo 1N4007 como sensor

Por

Una de las características que tienen los diodos, es que su umbral de voltaje de polarización directa cambia de acuerdo con la corriente que lo atraviesa y con la temperatura de su unión (p-n). Aprovechando esta característica, es posible hacer uso de un diodo para implementar un sensor de temperatura muy sencillo y económico.

El proyecto aquí descrito, consiste en un termómetro basado en el diodo de silicio 1N4007, utilizado como sensor de temperatura, y una placa Arduino (Nano) para realizar los cálculos y mediciones. El circuito transductor que detecta la temperatura, está basado en el "Sensor de temperatura con un diodo" de Instructables, mientras que el programa que realiza las mediciones, se ha modificado para adaptarlo al proyecto de esta publicación.

Lista de componentes

Para ensamblar el circuito publicado en este artículo, es necesario contar con los siguientes materiales y recursos:

  • Un diodo 1N4007
  • Un resistor de 1KΩ
  • Una placa Arduino
  • Una pantalla OLED SSD1306
  • Una protoboard (si utiliza Arduino NANO)
  • Varios cables de conexión
  • Y el código del programa para Arduino

Teoría de funcionamiento

Prácticamente cualquier diodo se puede utilizar como transductor de medición de temperatura, pues el umbral de voltaje directo (Vf) del diodo disminuye a medida que aumenta la temperatura (observe la figura 1). Para los diodos de silicio, el coeficiente de temperatura lineal es aproximadamente de –2 mV/°C; esto significa que por cada 1°C que aumente la temperatura, la caída de voltaje directo en el diodo se reduciría en 2mV.

Curva característica del diodo 1N400x
Figura 1. Curvas características de un diodo, en polarización directa, a dos temperaturas diferentes.

A una temperatura de unión (Tj) de 25 °C, con una corriente de prueba constante, los diodos de silicio mantienen una tensión de polarización directa de 700mV, aproximadamente. Bajo estas condiciones, su tensión de polarización solo debería variar según la temperatura circundante en el diodo. Aplicando las ecuaciones adecuadas, las variaciones de tensión podrán usarse para calcular la temperatura percibida por el diodo

Con una corriente Id constante, el voltaje de polarización de un diodo varía con la temperatura de acuerdo a las siguientes expresiones:

ΔVf = (T1 – T0)*K
ΔVf = Vf1 – Vf0

Donde:

ΔVf representa la variación de tensión directa del diodo,
T0 es la temperatura ambiente a 25 °C,
Vf0 es la tensión de 700mV a la temperatura ambiente T0,
K es el coeficiente de temperatura de -2mV/°C.
Mientras que, Vf1 es la tensión directa del diodo a una temperatura desconocida T1.

Igualando los términos derechos de las expresiones, y despejando las temperaturas, obtendremos la siguiente ecuación:

T1 – T0 = (Vf1 – Vf0) / K

Ahora bien, si una temperatura Tc, circundante en el diodo, hace que la temperatura de éste cambie de T0 a T1; entonces, podríamos hallar un voltaje de referencia para Vf0 a 0°C, para calibrar el sensor, y así deducimos que Tc = T1 – 0°C. Para el diodo 1N4007, un voltaje de referencia estimado podría ser 683mV; por lo tanto,

Tc = (Vf1 – 683mV) / K

Para implementar un sistema sencillo de medición de temperatura con un diodo sensor, bastara medir el voltaje en los terminales del diodo. Aplicando el voltaje de dichos terminales a la entrada de un convertidor A/D, de un módulo microprocesador como Arduino, y aplicando la ecuación anterior, se puede calcular la temperatura detectada por el diodo.

Diagrama de conexiones

Diagrama de conexiones del termómetro.
Figura 2. Diagrama de conexiones de eléctricas del termómetro con Arduino y Diodo 1N4007.

El termómetro a implementar es muy simple; en la figura 2, se muestra su diagrama de conexiones. El transductor de medición de temperatura está compuesto por el diodo D1 y el resistor R1 (conectados en serie); siendo el diodo, el componente que detecta la temperatura, y el resistor, el que limita la corriente en el diodo.

Id = Vcc / (R1 + Rd)

El transductor se alimenta con el mismo voltaje del Arduino, a través del pin +5V. Puesto que este voltaje es estable, podemos obtener una fuente de corriente casi constante, por lo que el voltaje medido en el diodo solo variará por efectos de la temperatura.

La salida del transductor se toma desde el terminal de ánodo del diodo; a su vez, dicho terminal se conecta al Arduino mediante el pin de entrada análoga A0. Este pin corresponde a uno de los canales de entradas del convertidor A/D de 10 bits.

El arduino se encargará de medir la tensión del sensor, aplicada a su pin A0, y calculará la temperatura mediante las ecuaciones presentadas en el apartado anterior; y luego, enviará los resultados hacia la pantalla LCD1 (Módulo Display OLED SSD1306). Para detalles de conexiones entre esta pantalla y Arduino, observe el diagrama de la Figura 2.

Código del programa

Para que la aplicación de termómetro funcione, cargue el código a continuación en una placa Arduino, y podrá ver en pantalla la temperatura detectada por el diodo.

/*
THERMOMETER USING A 1N4005 DIODE LIKE A TEMPERATURE SENSOR
By Favio Lucas from blogtronika.blogspot.com

The thermometer is based on the diode characteristic that the increase of the temperature
its forward voltage (Vf) is lowered by -2mV/°C. Since the forward diode voltage varies 
with temperature according the expression: 

ΔVf = Vf1 – Vf0 = (T1 – T0)*K

Then, the ΔT value is calculated with the following equation:

ΔT = T1 – T0 = (Vf1 – Vf0)/K

where,

K = -2 °C/mV. 
A very stable Vf is obtained by averaging as many samples.
*/

// Directives
// OLED I2C dispaly libraries and definitions:
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <gfxfont.h>
#include <Wire.h>

#define OLED_RESET 4
#define OLED_ADDR 0x3C

Adafruit_SSD1306 oled (128, 64, &Wire, OLED_RESET);

// Constant values:
const float Vf0 = 683; // Forward voltage at 0 °C with a 4 mA test current
const float K = -2; // Temperature coefficient (-2 mV/°C for Si diodes)

const int PSensor = A0; // Used to the sensor diode input (PA0 for STM32F103C8 Board)
const float adcSample = 5020; // Voltage for AD Converter (Vcc * 1000)
const float error = 13;

const float weight = 0.1;  // Smoothing factor, in range [0,1]
  // Higher the value, less smoothing and higher the latest reading impact

// Variable values:
double Tx; // Room temperature calculated 
double Vf; // Forward voltage measured at room temperature with a test current at 4mA

float smoothValue;
float prevSmoothValue;
int lightValue;

void setup() {
  
  // OLED I2C display setup:
  Wire.begin();
  oled.begin (SSD1306_SWITCHCAPVCC, OLED_ADDR);
  oled.clearDisplay();
  oled.setTextColor(WHITE);
  oled.setCursor(31, 13);
  oled.setTextSize(1);
  oled.print ("BLOGTRONIKA");
  oled.setCursor(22, 28);
  oled.setTextSize(1);
  oled.print ("By Favio Lucas");
  oled.display();

  // Measurements and other initial settings:
  prevSmoothValue = analogRead(PSensor) * (adcSample/1023) + error; // divide by 4095 if case of a 12-bit ADC
  delay (2000);

}

void loop() {

  // Measurement and filtering:
  lightValue = analogRead(PSensor) * (adcSample/1023) + error; // divide by 4095 if case of a 12-bit ADC
  smoothValue = filter(lightValue, weight, prevSmoothValue);
  prevSmoothValue = smoothValue;

  // Temperature calculations:
  Vf = smoothValue; 
  Tx = (Vf - Vf0)/K;

  // Data display outputs:
  oled.clearDisplay();
  oled.setCursor (0,0);
  oled.setTextSize (1);
  oled.print ("TEMPERATURA:");
  oled.setTextSize (2);
  oled.setCursor (0,16);
  oled.print (Tx); oled.print (" C");
  oled.setTextSize (1);
  oled.setCursor (0,37);
  oled.print ("Vf: "); oled.print (Vf); oled.print (" mV");
  oled.display ();
  
  delay (1000);

}

// Exponential moving average filter:
float filter (float sensorValue, float w, float prevValue) {

  float result = w * sensorValue + (1.0 - w) * prevValue;
  return result;

}

Observaciones finales

Aunque un termómetro basado en un diodo sensor no es muy preciso, resulta ser una buena alternativa en aplicaciones donde solo se requiera una medida aproximada de la temperatura. No obstante, si se quiere obtener mejores resultados en las mediciones, se deben realizar algunos ajustes, y tener en cuenta ciertos detalles de diseño.

Para lograr mediciones más aproximadas, se debe tener en cuenta que los diodos no son perfectamente idénticos; siempre difieren unos de otros, aunque sean iguales en apariencia. Por tal motivo, se deben modificar las siguientes constantes del código Arduino:

  1. adcSample: es el voltaje máximo de muestreo de Conversión A/D. Para hallar un valor exacto, mida con un multímetro la tensión de alimentación (Vcc) de su placa Arduino. Luego, multiplique el valor de la medición por 1000, para expresarlo en miliamperios.
  2. Vf0: es el voltaje directo del diodo usado como referencia para la temperatura de 0°C, y se utiliza para calibrar el termómetro

Para poner a prueba nuestro termómetro, también es necesario tener un termómetro confiable adicional para comparar resultados. Si observa errores notables en las mediciones, proceda a los pasos siguientes:

  1. Es posible que el voltaje real del diodo sensor, no coincida con el voltaje medido por Arduino. Con un multímetro, y con el Arduino en funcionamiento, mida el voltaje entre las terminales del diodo sensor. Compárelo con el voltaje Vf (mostrado en la pantalla OLED) y calcule la diferencia.
  2. En el código del programa, localice la constante error y asígnele la diferencia de voltajes obtenida en el paso anterior.

La resolución de conversión análogo/digital de Arduino (aprox. 4,88mV/lectura) no es suficiente para detectar con precisión las pequeñas variaciones de voltaje en un diodo normal. Implementar un termómetro más preciso requerirá de etapas previas de compensación, amplificación y filtrado de señal. Si desea más detalles sobre circuitos de detección y medición de temperatura, consulte el informe de aplicación de TI en este link.