Descripción

Termómetro sin contacto por infrarrojo  MLX90614 muestra la temperatura en display de 4 dígitos de 7 segmentos TM1637 controlado por arduino Nano. Detecta presencia con sensor IR (15cm) y alerta de fiebre mediante panel luminoso y alarma acústica.

Al final de esta entrada, encontrarás los ficheros descargables necesarios, tanto de la programación de Arduino y las librerías empleadas, los esquemas electrónicos de conexión y los ficheros STL necesarios para imprimir la caja en tu impresora 3D.

Materiales:

  • Termómetro por infrarrojos GY-906 3-5V IIC MLX90614ESF-BCC.
  • Display de 4 dígitos de 7 segmentos TM1637.
  • Sensor de presencia por IR.
  • Interruptor (on-off)
  • USB tipo B. (para programar arduino).
  • Arduino Nano.
  • Amplificador de audio PAM8403
  • Bocina sonora
  • Un par de transistores 2n2222
  • Leds RGB.
  • Resistencias
  • Tornillos 2.5mm.
Idea inicial del proyecto.
Esquema personal que me ayuda a imaginar y plantear el proyecto al principio a modo de orientación.

Fundamentos

Termómetro

El sensor elegido es un termómetro por infrarrojos de precio muy asequible. Está montado sobre una placa GY-906, lo que permite que sea alimentado a 5V, pues incorpora un regulador de corriente. El MLX90614ESF-BCC es ideal para medir temperaturas corporales con precisión.

La emisión de radiación infrarroja de los objetos es percibida por este sensor de solo entrada, pues no emite ningún tipo de radiación, tan solo recibe la emitida de forma natural por el cuerpo analizado.

El rango de sensibilidad de este sensor es de -40 a 85 °C para la temperatura ambiente y -70 a 382 °C para la de objetos. Posee una resolución de +-0.02ºC mediante conexión I2C.

Punto a tener en cuenta es el ángulo de actuación que no es demasiado amplio, por lo que no permite una gran distancia de medición del objeto( 20 cm aprox.).

Las conexiones son simples pues usa el protocolo de comunicación I2C  que tan solo emplea 4 cables. Dos para la alimentación a 5V y dos para el intercambio de datos. 

Conectaremos:

  • SCL al pin A5 de arduino
  • SDA al pin A4 de arduino
  • VIN a 5V o menor
  • GND a GND
Conexión del termómetro. Se pueden usar 3.3V
Conexiones para el termómetro.

El manejo del sensor en arduino es muy cómodo y se simplifica muchísimo usando la librería  <Adafruit_MLX90614.h>. Además, se necesita la librería <Wire.h> para el control de la comunicación I2C con el termómetro.

#include <Wire.h>

#include <Adafruit_MLX90614.h>

Tan solo se necesita estas funciones para obtener la temperatura del ambiente

readAmbientTempC()
readObjectTempC()

o del objeto cercano. Devolviendo la temperatura en grados centígrados.

Sensor de infrarrojos

De uso frecuente en el mundo de arduino, este tipo de sensores contienen básicamente un comparador, un led emisor de infrarrojos (transparente) y una fotoresistencia (el otro led negro) además de un potenciómetro de permite ajustar el nivel de detección del conjunto.

Para este proyecto y por cuestión de diseño, hemos de separar estos elementos para poder integrarlos en la carcaza.

Este sensor se integra, con el fin de reducir el consumo del artefacto, pues detectará la presencia del obstáculo y desencadenará el funcionamiento de todos los demás elementos, ahorrando así calentamiento innecesario y consumo.

No se trata de un elemento fundamental para el proyecto, pues el termómetro podría estar midiendo constantemente la temperatura o incluso, el mismo termómetro podría servir para detectar la presencia del obstáculo. Pero como he dicho antes, pienso que es un gasto de energía, calentamiento y fatiga de los elementos innecesario (además, queda más profesional).

Modificación del módulo infrarrojo.
Modificación del módulo.

Se han separado el led y la fotorresistencia que van sobre una pequeña placa. El led emisor de IR (transparente) cuenta con una pequeña resistencia de protección de 100 ohms.

El led emisor IR estará conectado al pin D12 y no a Vcc, de esta forma podremos apagarlo entre el momento de la detección de obstáculo y la medida de la temperatura del cuerpo evitando así que se produzcan interferencias de lectura.

Por su parte, la fotoresistencia irá conectada al módulo comparador del que formaba parte y éste lo alimentaremos a 5V por Vcc y GND. La señal digital de este módulo digital la recibiremos en el pin D3. (No soy de usar interrupciones, pero puedes usarlas tú).

Detalle de la ubicación del termómetro, led infrarrojo y fotoresistencia.

Leds indicadores de paso y bocina

Tras la detección de presencia y la medición de temperatura, es el momento de avisar si se tiene fiebre o no. Para ello usaremos un indicador LED, compuesto por 5 leds RGB (de 4 pines) y una bocina sonora conectada a un pequeño amplificador de sonido, pues arduino no suministra suficiente intensidad a la bobina por sí mismo.

Este conjunto se colocará en una placa de prototipado de 5×7 cm ya que el diseño de la carcaza se ha procurado para esta en especial. Los leds serán comandados por dos transistores 2N2222 y cada uno con sus dos resistencias de protección (calcula tus resistencias), pues usaremos sólo los colores rojo y verde, para permitir el paso o para prohibirlo.

Estos transistores llevarán en su base una resistencia y se conectarán en los pines D7 para el color rojo y D8 para el color verde. Además deben ser alimentados con Vcc y Gnd.

Cuando la temperatura supere un umbral (depende de tus intenciones, digamos unos 36,5ºC) se encenderán los leds en rojo. Si es inferior a ese umbral, se encenderán los verdes. Y si hay error de lectura se encenderán los dos a la vez, lo que se percibirá como color amarillo.

Puedes usar si quieres leds rojos y leds verdes, pero usa solo la mitad de la PBC, pues corresponde con la zona de iluminación designada en la carcaza.

Por su parte la bocina se conectará al amplificador que veremos más adelante. Esta irá colocada en la otra mitad de la PCB para que coincida con su zona (agujeros) en la carcaza.

Los sonidos emitidos por la bocina dependerán al igual que con comportamiento de los leds. 

Esquema de conexión y resultado final de leds RGB (le ve la bocina).
Pequeño esquema que no es muy científico, pero a mí me sirve para orientarme.

Amplificador de audio

No es necesario incluir este elemento, pues arduino permite conectar la bocina sonora directamente al pin de salida correspondiente, pero la potencia del sonido es muy limitada. En mi caso prefiero añadir este pequeño amplificador de 3W. Lo colocaré por su reducido tamaño en la placa central donde estará el arduino nano. (ver fotografía más abajo (placa de color verde).

Para conectarlo usaremos la alimentación de 5V en los pines destinados para ello y la entrada de sonido se conectará al pin D2. En mi caso solo usaré unos de los canales (canal L). Así que la salida hacia la bocina debe salir de ese mismo canal (L) marcada en el módulo como OUT, además de GND. En mi caso he añadido el conector en la misma placa del módulo, para ahorrar espacio.

Display

Usaremos un display de cuatro dígitos de 7 segmentos. De muy fácil conexión pues usa tan solo 4 pines.

  • CLK conectado al pin D4 del arduino
  • DIO conectado al pin D5 del arduino
  • 5V a la alimentación.
  • GND a GND

Incluiremos la librería TM1637.h para simplificar su manejo.

#include <TM1637.h>

Y la función para mostrar la temperatura detectada

pantalla.display(maxima);

Placa central para microcontrolador y conexiones.

Para finalizar la parte electrónica, colocamos el interruptor de alimentación al jack de entrada y si  otro extremo al VIN del sistema. No olvidar conectar también GND al sistema. Recordar que arduino Nano funciona a 5V pero dispone de un regulador de voltaje que permite alimentarlo con más. No recomiendo superar los 9V.

Por otro lado coloco la entrada de USB tipo B que uso en todos mis proyectos a fin de poder reprogramar arduino una vez esté todo montado sin tener que abrir de nuevo la caja y además me ofrece la posibilidad de alimentarlo por aquí siempre que use 5V. Este conector USB va conectado a la entrada USB mini de arduino. (Este elemento no es necesario).

En la imagen inferior observamos los conectores para los distintos elementos cuyos pines de conexión ya hemos descrito anteriormente. Recordar que los agujeros de carcaza están dispuestos para una placa de 5×7 cm, del mismo tamaño que la anterior (leds RGB y bocina) y usaremos tornillos de 2,5mm.  


Programación

Sketch

En esencia el funcionamiento es el siguiente:

En el Setup se realiza un test para garantizar el funcionamiento de todos los actuadores.

Se espera a una detección de obstáculo. Se evalúa la temperatura el objeto hasta ser retirado y se muestra la temperatura más elevada de las mediciones realizadas en ese tiempo. durante ese periodo de medición mantendremos apagado el led de IR para no afectar a la medición de la temperatura.

Si la temperatura es inferior a la variable fiebre, se actúa con leds verdes y pitido de aceptación.

Si por el contrario, la temperatura obtenida supera el valor de la variable fiebre, se actúa con leds rojos y pitido de reprobación.

Y si el rango de temperaturas es incomprensible, se actúa con los dos leds a la vez (amarillo) y su correspondiente alarma sonora.

/**********************************
   Juan Carlos Pedrajas del Molino
   20/02/2021

   Termómetro de pared
/**********************************

*/

#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include <TM1637.h>
TM1637 pantalla(4, 5);

Adafruit_MLX90614 termometro = Adafruit_MLX90614();

int rojo = 7;
int verde = 8;
int buzz = 2;
int ir = 12;
int pinpresencia = 3;

int brillo = 4;
float tempe;
float ambiente;
boolean presencia = 0;
boolean activado = 0;

float maxima;
float errormaximo = 43;
float errorminimo = 32.5;
float fiebre = 36.7;

void setup() {
  pinMode (rojo, OUTPUT);
  pinMode (verde, OUTPUT);
  pinMode (buzz, OUTPUT);
  pinMode (ir, OUTPUT);
  pinMode (pinpresencia, INPUT);
  Serial.begin(9600);
  delay (1500);
  termometro.begin();
  Serial.println("Inicio");               //Serial
  Serial.println("Testeando...");
  delay (150);
  tone (buzz, 1500);                      // sonido
  delay (100);
  noTone (buzz);
  pantalla.begin();                       //Pantalla 7 segmentos
  pantalla.setBrightness(brillo);
  pantalla.display("HOLA");
  delay(1500);
  pantalla.clearScreen();
  digitalWrite (verde, HIGH);             // Luces indicadoras
  digitalWrite (rojo, LOW);
  delay(200);
  digitalWrite (verde, LOW);
  digitalWrite (rojo, HIGH);
  delay (200);
  digitalWrite (rojo, LOW);
  digitalWrite (ir, HIGH);
  pantalla.display(00.00);
  tone (buzz, 1500);                      // sonido
  delay (100);
  noTone (buzz);
}

void loop() {
  //   ambiente = termometro.readAmbientTempC();
  // tempe = termometro.readObjectTempC();
  presencia = digitalRead (pinpresencia);
  while (presencia == 0) {
    activado = 1;
    digitalWrite (ir, LOW);
    delay (200);
    tempe = termometro.readObjectTempC();
    pantalla.display(tempe);
    if (tempe > maxima) {
      maxima = tempe;
    }
    digitalWrite (ir, HIGH);
    delay (500);
    presencia = digitalRead (pinpresencia);
  }
  if (presencia == 1 && activado == 1) {
    activado = 0;
    //   Serial.println("maxima:");
    //   Serial.println(maxima);
    pantalla.display(maxima);
    delay (200);
    if (maxima <= errorminimo || maxima >= errormaximo) {     // cuando la medida sea demasiado baja o demasiado alta
      tone (buzz, 250);
      delay (400);
      noTone (buzz);
      digitalWrite (verde, HIGH);
      digitalWrite (rojo, HIGH);
      delay(150);
      digitalWrite (verde, LOW);
      digitalWrite (rojo, LOW);
      delay (150);
      digitalWrite (verde, HIGH);
      digitalWrite (rojo, HIGH);
      delay(150);
      digitalWrite (verde, LOW);
      digitalWrite (rojo, LOW);
      delay (150);
      digitalWrite (verde, HIGH);
      digitalWrite (rojo, HIGH);
      tone (buzz, 250);
      delay (1000);
      noTone (buzz);
      digitalWrite (rojo, LOW);
      digitalWrite (verde, LOW);
      pantalla.clearScreen();
    }
    if (maxima <= fiebre && maxima > errorminimo) {  //cuando la medida sea correcta
      digitalWrite (verde, HIGH);
      tone (buzz, 1250);
      delay (100);
      noTone (buzz);
      delay (1500);
      digitalWrite (verde, LOW);
      pantalla.clearScreen();
    }

    if (maxima <= errormaximo && maxima > fiebre) {  //cuando la medida sea de fiebre
      digitalWrite (rojo, HIGH);
      tone (buzz, 250);
      delay (150);
      noTone (buzz);
      delay (150);
      digitalWrite (rojo, LOW);
      delay (150);
      digitalWrite (rojo, HIGH);
      tone (buzz, 250);
      delay (150);
      noTone (buzz);
      delay (150);
      digitalWrite (rojo, LOW);
      delay (150);
      digitalWrite (rojo, HIGH);
      tone (buzz, 250);
      delay (1000);
      noTone (buzz);
      delay (550);
      digitalWrite (rojo, LOW);
      pantalla.clearScreen();
    }
    maxima = 0;
  }
} 

En este enlace puedes descargar el archivo de código para el IDE de arduino, además se incluyen las librerías necesarias para que puedas compilarlo sin problemas.


Impresión de la caja en 3D

Por último imprimir los modelos STL que se adjuntan al final de la entrada y atornillar con tornillos de 2.5mm de 10mm de largo máximo. El cuerpo posee un anclaje en la parte trasera para facilitar su emplazamiento en la pared con una alcayata. 

Termómetro de pared con arduino. Caja en STL.
Termómetro de pared con arduino. Trasera e interior de la caja.

Recomiendo el ABS a la hora de imprimir por su mayor resistencia, pero al no ser un objeto que esté sometido a stress de presiones el PLA es una opción muy aceptable.

Los anclajes son sobradamente robustos y no es necesario emplear pegamentos. 

Termómetro de pared con arduino. Caja en STL.
Termómetro de pared con arduino. Frontal e interior de la caja.

Proyecto finalizado