Ir al contenido principal

Termómetro sentimental con DHT11 y MAX7219

Admitámoslo, los LEDs molan, y una matriz de LEDs de 8x8 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.

Termómetro sentimental

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 8x8 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

Comentarios

Entradas populares de este blog

Creando firmas de virus para ClamAV

ClamAv es un antivirus opensource y multiplataforma creado por Tomasz Kojm muy utilizado en los servidores de correo Linux. Este antivirus es desarrollado por la comunidad, y su utilidad práctica depende de que su base de datos de firmas sea lo suficientemente grande y actualizado. Para ello es necesario que voluntarios contribuyan activamente aportando firmas. El presente artículo pretende describir de manera sencilla cómo crear firmas de virus para ClamAV y contribuir con ellas a la comunidad.

Ingeniería inversa de un parche de Microsoft Windows

A estas alturas ya hemos asumido que la seguridad total en Internet es, cuanto menos, un mito. Ningún software está libre de vulnerabilidades, y por mucha auditoría, test de intrusión o pruebas de fuzzing que nos empeñemos en hacer, ninguna metodología puede demostrar sin lugar a dudas que un software es 100% seguro. Ante este panorama, hay dos tendencias mayoritarias a la hora de hacer públicas las vulnerabilidades. Por un lado, están los que piensan que cuando se descubre un fallo ha de hacerse público de forma inmediata. En este escenario, la publicación de una vulnerabilidad es el pistoletazo de salida para una carrera entre el desarrollador para sacar el parche y los "malos" para lograr explotarla. Esta política es conocida como full disclosure . Por otro lado, tenemos a los siguen una política responsible disclosure , que abogan por mantener la vulnerabilidad en secreto hasta la salida del parche por parte del desarrollador. Sin entrar en cuestiones filosóficas que no...

Manejo de grafos con NetworkX en Python

El aprendizaje computacional es un área de investigación que en los últimos años ha tenido un auge importante, sobre todo gracias al aprendizaje profundo (Deep Learning). Pero no todo son redes neuronales. Paralelamente a estas técnicas, más bien basadas en el aprendizaje de patrones, también hay un auge de otras técnicas, digamos, más basadas en el aprendizaje simbólico. Si echamos la vista algunos años atrás, podemos considerar que quizá, la promesa de la web semántica como gran base de conocimiento ha fracasado, pero no es tan así. Ha ido transmutándose y evolucionando hacia bases de conocimiento basadas en ontologías a partir de las cuales es posible obtener nuevo conocimiento. Es lo que llamamos razonamiento automático y empresas como Google ya lo utilizan para ofrecerte información adicional sobre tus búsquedas. Ellos lo llaman Grafos de Conocimiento o Knowledge Graphs . Gracias a estos grafos de conocimiento, Google puede ofrecerte información adicional sobre tu búsqueda, ad...