Termómetro sentimental con DHT11 y MAX7219

Setalle DHT11 y MAX7219

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.

 

Esquema sensor sentimental

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.

DHT11 y MAX7219

 

 

CompartirShare on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn

Sé el primero en comentar en "Termómetro sentimental con DHT11 y MAX7219"

Deja un comentario.

Tu dirección de correo no será publicada.


*