Mini estación meteorológica

Después del éxito del termómetro me he venido arriba y he decidido montar una mini estación meteorológica que me de lecturas de temperatura, presión barométrica y humedad relativa.

Además quiero que me dé las máximas y mínimas de estos parámetros y que presente la información en un display LED de 16 columnas y 2 filas (casi ná).

En principio, parece sencillo, conectar el display y los sensores, leer los valores de los sensores y presentar esos valores, con el formato apropiado, en el display.

Adicionalmente, por medio de un botón, mi  estación deberá poder ir cambiando la presentación de valores actuales a valores máximos y de aquí a valores mínimos.

Empecemos por la lista de materiales:

  • Un Arduino UNO.
  • Una placa de prototipo.
  • Un display LED de 16 columnas y dos filas (TC1602A-09T):

Imagen1

  • Un potenciómetro de 10K Ohmios para controlar el contraste del display:

potentiometer-10k-chiosz-robots-3

  • Un sensor de temperatura y presión barométrica BMP180:

bmp180-barometric-pressure-temperaturealtitude-sensor

  • Un sensor de humedad DHT11:

DHT11

  • Un botón para el cambio de modo de display:

00097-03-L

  • Cables, etc.

La siguiente tabla recoge las conexiones realizadas:

Origen

Destino

VSS display GND
VDD display +5V
V0 display Pin central potenciómetro
RS display Pin 7 Arduino
RW display GND
E display Pin 8 Arduino
D4 display Pin 9 Arduino
D5 display Pin 10 Arduino
D6 display Pin 11 Arduino
D7 display Pin 12 Arduino
A display +5V
K display GND
Pin izda. potenciómetro GND
Pin dcha. potenciómetro +5V
Botón +5V
Botón Pin 4 Arduino
SCL BMP180 Pin A5 Arduino
SDA BMP180 Pin A4 Arduino
VCC BMP180 +3.3V
GND BMP180 GND
SIG DHT11 Pin 5 Arduino
VCC DHT11 +3.3V
GND DHT11 GND

El esquema de conexionado es como se representa en los siguientes diagramas:

meteo_bb

meteo_schem

Y el aspecto que tiene es el de la imagen siguiente:

SL270261

El código está en GitHub junto con las hojas de especificaciones de los componentes empleados.

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: