Un termómetro

Llevaba un cierto tiempo sin publicar nada pero no estaba parado. Estaba explorando las posibilidades de un Arduino UNO. Lo cierto es que es divertido pasar un rato conectando cables y programando el cacharrito.

Ayer me puse y construí un termómetro digital. Desde luego, no es un prodigio de la tecnología y no supone ningún avance rompedor para la humanidad pero le hago un hueco aquí, más que nada, porque parte de la información necesaria no fue fácil de conseguir.

El objetivo a cubrir era sencillo: leer la temperatura ambiente a través de un sensor de temperatura y presentarla en un display LCD. Los materiales que he empleado son:

  • En primer lugar, he empleado una placa Arduino UNO de Kuman que venía en un kit que compré en Amazon.
  • He usado una placa de pruebas (breadboard) que venía en el mismo kit que el Arduino.
  • Para obtener la temperatura he empleado un sensor de temperatura LM35 (hoja de especificaciones en pdf), como el de la imagen siguiente:

LM35TempSensor

  • Para presentar la temperatura he empleado un display LED de cuatro dígitos con ocho segmentos cada uno 3641BS (hoja de especificaciones en pdf), como el de la imagen siguiente (bueno, el que yo tengo es de ánodo común en lugar del de la imagen que es de cátodo común):

7seg-pinout-annotated_1500

  • Cuatro resistencias de 220 Ohmios para proteger el display LED.
  • Cables y otra parafernalia para conectarlo todo.

El esquema de conexionado es el siguiente:

temp_sensor_2_bb

temp_sensor_2_schem

La identificación de los distintos segmentos de cada uno de los dígitos del display es como se ve en la imagen siguiente:

digitos

En la tabla siguiente detallo las conexiones realizadas:

Pin Arduino

Pin 3641BS

Descripción

2 11 Segmento A del dígito.
3 7 Segmento B del dígito
4 4 Segmento C del dígito
5 2 Segmento D del dígito
6 1 Segmento E del dígito
7 10 Segmento F del dígito.
8 5 Segmento G del dígito.
9 3 Segmento de punto decimal (DP) del dígito.
10 12 Dígito 1 del display.
11 9 Dígito 2 del display.
12 8 Dígito 3 del display.
13 6 Dígito 4 del display.

Finalmente, la pata de voltaje de salida del sensor de temperatura la conecté al Pin A0 del Arduino. El lío montado es el siguiente:

Imagen3

Ahora llega el momento de tirar código, voy a ir pegando las porciones de código (como imágenes) para irlas comentando. El código actualizado del sketch está aquí.

En primer lugar, declaro una serie de constantes:

code_1

code_2

Señalar que la constante SYMBOLS empareja el estado de los segmentos de los dígitos del display (de la A a la G) con los símbolos que se van a representar en ese display (los 10 números y la letra C). Ojo, el valor 0 indica que el segmento debe estar encendido y el 1 que el segmento debe estar apagado (cosas de trabajar con ánodo común).

La función setup, que realiza la inicialización del Arduino es sencilla, se inicializan los pins para los segmentos y los dígitos del display LED.

code_3

La función loop, característica de los sketches de Arduino, hace dos cosas:

  1. Obtiene la temperatura.
  2. Presenta la lectura de la temperatura.

code_4

getTemperature lee el sensor y convierte la lectura (un valor entre 0 y 1023) en voltios (en un rango de 0 a 5). La tensión de salida es, de acuerdo a las especificaciones del sensor, una función lineal de la temperatura (en concreto 10mv por ºC). La función devuelve el valor de la temperatura como un valor float:

code_5

displayTemperature presenta la lectura de la temperatura en el display LCD.

En el display voy a emplear los tres primeros dígitos para presentar, respectivamente, decenas de grados, unidades de grados y décimas de grados separadas de las unidades por un punto decimal. El cuarto dígito lo voy a emplear para presentar la letra C. Por ejemplo, la lectura de temperatura se presentaría como 25.4C.

El proceso para presentar la temperatura es el siguiente:

  • Determino los tres dígitos de la temperatura. Para ello tengo que convertir el número en coma flotante a dos enteros (uno para la parte entera y otro para los dos primeros dígitos de la parte decimal). A continuación aproximo si fuera necesario.
  • Una vez que tengo los tres dígitos a presentar voy activando los dígitos del display LED en secuencia introduciendo un delay entre cada dígito. Esto lo hago en un bucle. Los dígitos deben presentarse en secuencia porque las líneas de los segmentos están multiplexados. Si no lo hiciera así todos los dígitos del LED presentarían un mismo número.
  • Este bucle se ejecuta en aproximadamente en un segundo y una vez finalizado se vuelve a leer la temperatura.

code_6

code_7

Por último vamos a ver la función displaySymbol que presenta un símbolo (número o letra C) en un determinado dígito del display. La función displaySymbol admite tres argumentos, el primero es el dígito en el que vamos a presentar el número (0 a 3), el segundo es el símbolo a presentar y el tercero indica si se va a presentar el punto decimal que está a la derecha del dígito.

Tras unas comprobaciones de rango, lo que hacemos es poner a LOW todos los pines de dígitos (apagando los LEDs) de los dígitos que no son el que queremos presentar. El dígito que se va a presentar se establece a HIGH. A continuación encendemos los segmentos correspondientes al número a presentar de acuerdo a la plantilla establecida en la variable global SYMBOLS. Por último, encendemos o apagamos el punto decimal.

code_8

code_9

El resultado final es: