Termómetro digital con Arduino.

Categoría: Arduino Creado: Lunes, 29 Mayo 2017 Publicado: Miércoles, 31 Mayo 2017 Escrito por Francisco Javier Sánchez Gragera

Para dar un poco de variedad al blog, en este artículo vamos a ver un proyecto con sensores y arduino. Concretamente construiremos un termómetro digital, con indicador de humedad, y que además nos mostrará los datos en una pantalla LCD, la cual se apagará cuando no estemos en la habitación para ahorrar energía.

Termometro digital con arduino

Los componentes necesarios son los siguientes:

  • Arduino Nano: Es la base del proyecto, se trata de una pequeña placa con microcontrolador a la que conectaremos los sensores y LCD. Usamos esta versión de Arduino por ser mucho mas compacto que el Arduino Uno R3. Es además muy económico. Estas son sus carcterísticas:
    • Microcontrolador ATmega328.
    • Entrada mini-usb que sirve para enviar la programación y como entrada de alimentación eléctrica
    • 14 puertos digitales de entrada/salida y 8 analógicos
    • Memoria interna de 16 KBytes para almacenar el programa, 1 KByte de memoria SRAM y 512 bytes de EPROM para almacenar valores y que permanezcan aunque quitemos la alimentación.
    • Velocidad funcionamiento del reloj de 16 mhz.
    • Posibilidad de alimentar a través de Vin, con un voltaje comprendido entre 7 y 12 voltios.

  • Pantalla LCD 2x16 I2C: Usaremos la pantalla para mostrar la temperatura y la humedad al usuario:
    • Muestra dos líneas de texto, de 16 caracteres cada una.
    • Cuenta con una placa conversora a protocolo serie I2C. Reducimos de ésa forma la conexión a cuatro cables. Dos de los cables son de datos (SDA o datos serie, y SCL o reloj de sincronismo serie), conectaremos SDA al pin analógico 4, y SCL al pin analógico 5. Los otros dos cables son de alimentación (VCC y GND), que conectaremos en la placa arduino a 5v y gnd respectivamente.
    • Esta versión de pantalla LCD tiene además un potenciómetro para ajustar el contraste.
    • Para controlar este componente, programaremos el código usando la librería i2cLCD.

  • Sensor de temperatura y humedad DTH11: Se trata de un pequeño sensor, muy económico que nos informa al mismo tiempo de la humedad y temperatura ambiente.
    • Entrega una salida de datos digital, siendo su uso mucho mas sencillo que los sensores analógicos.
    • Proporciona valores enteros para valores de humedad y temperatura, es decir, que la temperatura aumenta o disminuye de grado en grado, al igual que la humedad. Existe otro sensor con el mismo funcionamiento y precisión decimal, el DTH22.
    • Tiene tres conexiones: Dos son para la alimentación (5v y Gnd), la tercera conexión es la de datos, y la llevaremos en nuestro caso a la entrada digital 2 de Arduino Nano.
    • Para su programación usaremos la librería dth11.h que simplifica enormemente la labor, puesto que pasándole dos variables a una función les asigna el valor de la temperatura y humedad

  • Sensor PIR: También llamado detector de presencia, es un dispositivo para detectar el movimiento.
    • Usan la medición de la radiación infrarroja que emitimos los seres vivos debido a nuestro calor corporal. Esta radiación se capta mediante un sensor piezo-eléctrico y su ángulo de detección se amplía gracias a una lente fresnel.
    • Encontramos tres conexiones. Nuevamente tenemos dos patillas para la alimentación, conectadas a 5v y GND en arduino, y una tercera patilla que emite una señal digital y que conectaremos a la entrada digital 4 de nuestro Arduino Nano.
    • No necesitaremos librerías para este sensor, su funcionamiento es muy sencillo. La salida de datos del sensor se pondrá en HIGH ( valor lógico TRUE, 5v de señal ) cuando haya presencia, y en LOW ( valor lógico FALSE o 0v de señal) cuando no se detecte movimiento.
    • El sensor de presencia cuenta con dos potenciómetros con los cuales podremos ajustar manualmente la sensibilidad del sensor, y el tiempo que se mantendrá la señal de datos en HIGH tras detectar movimiento.

Resumiento, el esquema del cableado sería el siguiente, que podemos realizar sobre una protoboard para realizar la prueba.

Esquema Prototipado

Si quisiéramos darle un uso posterior, tras tener claro cuáles son las conexiones, podemos fijar los componentes a una placa PCB taladrada, soldando las patillas y cableado.

Componentes PCB

Para programar el arduino usaremos Arduino IDE. Seguidamente incluyo el código que dicta al microcontrolador cómo debe actuar, y qué debe leer y escribir de las entradas/salidas digitales.

// Incluimos librerías. Agregamos las mencionadas anteriormente.
// Otras se agregan automáticamente por ser dependientes.
#include <Wire.h> // LCD
#include <FastIO.h>
#include <I2CIO.h> // Bus I2C
#include <LCD.h> // LCD
#include <LiquidCrystal.h> // LCD
#include <LiquidCrystal_I2C.h> // LCD
#include <LiquidCrystal_SR.h> // LCD
#include <LiquidCrystal_SR2W.h> // LCD
#include <LiquidCrystal_SR3W.h> // LCD

#include <DHT11.h> // Temp y Humedad
#include <LCD.h> // LCD

byte dir = 0x27; // Dirección Memoria Pantalla LCD
LiquidCrystal_I2C lcd(dir, 2, 1, 0, 4, 5, 6, 7); // Inicializar la pantalla

int cont = 0; // Contador para controlar la duración del bucle
const int pinTemp = 2; // Definimos el pin digital para el sensor de DTH11
const int pinMov = 4; // Definimos el pin digital para el sensor PIR
int err; // Variable para almacenar posible error DTH11
float temp, hum; // Variables que recibirán valores de funciones DTH11

DHT11 dht11(pinTemp); // Vinculamos el pin definido antes a librería DTH11

void setup() { 
  // Código de inicialización programa arduino. 
  // Se ejecuta una vez al principio
  
  lcd.begin(16, 2); // Inicializamos LCD, con el ancho y alto en nº caracteres
  lcd.setBacklightPin(3, POSITIVE); // Para nuestro LCD con placa bus I2C
  lcd.setBacklight(HIGH); // Encendemos luz de fondo del LCD
  pinMode (pinMov , INPUT); // Definimos que el pin que define la constante pinMov es de entrada.
}

void loop() {
  // Código de bucle
  // Se ejecuta de principio a fin, y se repite ilimitadamente.
  
  // Para espaciar la ejecución del código incrementamos en cada bucle, y ponemos a 0 cuando llega a 100.
  // De esta forma hacemos que el código dentro de if se ejecute cada segundo, aproximadamente.
  if (cont == 0) // cont es cero, entramos en esta parte de código.
  {
    if (digitalRead( pinMov)) // Si hay movimiento
          lcd.setBacklight(HIGH); // Encendemos luz del LCD
      else // Si no hay movimiento
          lcd.setBacklight(LOW); // Apagamos luz del LCD
    
    if ((err = dht11.read(hum, temp)) == 0)   // Si devuelve 0 es que DTH11 ha leido bien
    {                                                         // la temperatura y la humedad
      // Para depuración, escribe en la ventana COM de Arduino IDE la temperatura y humedad
      Serial.print("Temperatura: ");  
      Serial.print(temp); 
      Serial.print(" Humedad: ");
      Serial.print(hum);
      Serial.println();
      TempLCD(); // Función que imprime la información Temp y Humedad en LCD
    }
    else // Si hay error
    {
       // Para depuración, escribe en la ventana COM el error obtenido
      Serial.println();
      Serial.print("Error Num :");
      Serial.print(err);
      Serial.println();
      ErrorLCD(); // Función que imprime por LCD el error.
    }
    
  }
  delay(10); //espera 10 milisegundos 
  cont++; //
  if (cont >= 100)  // Si llega a 100, habrán pasado 100 x10 milisegundos (1 segundo)
    cont = 0; // Ponemos a 0, para que entre en el código el próximo bucle
}
void TempLCD() // Función que imprime en LCD la temperatura, con formato.
{
  lcd.clear();
  lcd.home();
  lcd.print("Temp:    ");
  lcd.print((int)temp);
  lcd.print(" C");
  lcd.setCursor(0, 1);
  lcd.print("Humedad: ");
  lcd.print((int)hum);
  lcd.print(" %");
}
void ErrorLCD() // Función que imprime en LCD el error.
{
  lcd.clear();
  lcd.home();
  lcd.print("Error Nº: ");
  lcd.setCursor(0, 1);
  lcd.print(err);
}

La explicación del código la podéis encontrar a la derecha de cada linea, en forma de comentario tras "//". Espero que os haya resultado interesante. ¡Hasta la próxima!

Visto: 706

Escribir un comentario


Código de seguridad
Refescar