Admitámoslo, los LEDs molan, y una matriz de LEDs de 8×8 mucho más. En esta ocasión os presento un pequeño proyecto donde volvemos a usar el sensor de temperatura/humedad DHT11 y, por supuesto, una matriz LED controlada por un MAX7219. Se trata de un termómetro sentimental. Esto quiere decir que según la sensación térmica, la matriz mostrará una carita sonriente, normal o triste.
Para el prototipo de este proyecto he usado un Arduino Nano montado sobre una protoboard. El conexionado completo de todo el sistema es el siguiente.
No voy a volver a hablaros del funcionamiento del DHT11 porque ya lo vimos en un artículo anterior. Sin embargo, el MAX7219 sí es nuevo para nosotros.
El MAX7219 es un chip que nos permite controlar de forma sencilla juegos de LEDs de varios tipos, como pueden ser de siete segmentos normales o matrices de LEDs como la que vamos a usar aquí. Lo bueno es que este chip nos permite encadenar elementos usando un bus SPI, de forma que podríamos controlar varios de estos módulos usando un mismo bus. Salvando las diferencias, es algo parecido a lo que ocurre con el bus I2C. En este caso, el Arduino Nano no me ofrecía la intensidad de corriente suficiente para encender la matriz, así que he optado por usar alimentación externa de 5V. Es por eso que he añadido el condensador, para filtrar un poco la entrada de alimentación.
El control del módulo desde Arduino es sencillo. Se utiliza la librería LedControl (hay que instalarla en el entorno de desarrollo de Arduino). El siguiente código de ejemplo muestra como usarla para controlar una matriz de LEDs de 8×8 en la que se muestran tres caritas (sonriente, normal y triste) que van cambiando cada segundo.
#include "LedControl.h" // Parámetros: pines DIN, CLK, CS y 1 (un sólo display) LedControl lc=LedControl(8,10,9,1); // carita contenta byte contento[] = { B00000000, B00100000, B01000100, B01000000, B01000000, B01000100, B00100000, B00000000}; // carita normal byte normal[] = { B00000000, B01000000, B01000100, B01000000, B01000000, B01000100, B01000000, B00000000}; // carita triste byte triste[] = { B00000000, B10000000, B01000100, B01000000, B01000000, B01000100, B10000000, B00000000}; void carita(byte cara[]) { for (int i = 0; i < 8; i++) { lc.setRow(0,i,cara[i]); } } void setup() { lc.shutdown(0,false); // Iniciamos la matriz led lc.setIntensity(0,5); // Intensidad de los leds lc.clearDisplay(0); // Apagamos los leds } void loop() { carita(contento); delay(1000); carita(normal); delay(1000); carita(triste); delay(1000); }
En el siguiente vídeo podemos ver el resultado del código anterior sobre el circuito descrito al principio del artículo.
Ahora hay que añadir el código para leer el sensor DHT11. Lo que hacemos es obtener la temperatura y la humedad, y con esto calculamos la temperatura de bochorno con la función computeHeatIndex() de la librería DHT.h. Como referencia he tomado los valores siguientes:
- Temperatura de bochorno <= 31 : carita sonriente.
- Temperatura de bochorno entre 32 y 38 : carita normal.
- Temperatura de bochorno >= 39 : carita triste.
El código definitivo queda así:
#include "DHT.h" #include "LedControl.h" #define DHTPIN 6 // Pin DHT11 // Tipo de sensor #define DHTTYPE DHT11 // DHT11 // Inicializar sensor DHT dht(DHTPIN, DHTTYPE); // Inicializar max7219 (matriz de leds) LedControl lc=LedControl(8,10,9,1); // Datos para control de la matriz de leds // carita contenta byte contento[] = { B00000000, B00100000, B01000100, B01000000, B01000000, B01000100, B00100000, B00000000}; // carita normal byte normal[] = { B00000000, B01000000, B01000100, B01000000, B01000000, B01000100, B01000000, B00000000}; // carita triste byte triste[] = { B00000000, B10000000, B01000100, B01000000, B01000000, B01000100, B10000000, B00000000}; // muestra un array en la matriz de leds void carita(byte cara[]) { for (int i = 0; i < 8; i++) { lc.setRow(0,i,cara[i]); } } void setup() { Serial.begin(9600); // usamos serial para depurar dht.begin(); // Iniciamos sensor DHT11 lc.shutdown(0,false); // Iniciamos la matriz led lc.setIntensity(0,5); // Intensidad de los leds lc.clearDisplay(0); // Apagamos los leds } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); // Comprobar si hay error if (isnan(h) || isnan(t) ) { Serial.println("Error de lectura en el sensor"); return; } // Calculo de la sensación térmica float ic = dht.computeHeatIndex(t, h, false); // para depurar via serial Serial.print("ic: "); Serial.println(ic); // selección de la cara según sensación térmica if (ic <= 31) { carita(contento); } else if (ic >=39) { carita(triste); } else { carita(normal); } delay(10000); }
El montaje completo y funcionando podemos verlo en la siguiente imagen.
Sé el primero en comentar en «Termómetro sentimental con DHT11 y MAX7219»