Utilizamos cookies propias y de terceros. [Más información sobre las cookies].
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Wiki

Arduino: Obtener temperatura y humedad con Arduino
Hardware


Explicamos en este proyecto hardware cómo conectar un sensor de temperatura y humedad a Arduino UNO. Indicamos cómo visualizar los valores en el propio IDE de desarrollo de Arduino (usando la ventana de Serial Monitor). Mostramos también cómo guardar los valores obtenidos en la memoria EEPROM de Arduino.



 

Requisitos para proyecto hardware con Arduino y sensor de temperatura y humedad

Para realizar un proyecto hardware para obtener la temperatura y humedad usando Arduino UNO necesitaremos los siguientes componentes:

  • Arduino UNO:

Requisitos para proyecto hardware con Arduino y sensor de temperatura y humedad

  • Sensor de temperatura y humedad, en nuestro caso usaremos un Twig Temp&Humi Sensor SEN11301P.

Requisitos para proyecto hardware con Arduino y sensor de temperatura y humedad

  • Cable para conectar sensor con Arduino, en nuestro caso, este cable lo hemos obtenido de un clabe del audio de un lector de CD. El sensor de temperatura y humedad requiere de un cable de cuatro hilos: GND, VCC, NC y SIG. Aunque el hilo del NC no se usa:

Requisitos para proyecto hardware con Arduino y sensor de temperatura y humedad

En el siguiente artículo explicamos cómo conectar Arduino a un PC, cómo compilar un programa y cómo enviarlo al Arduino. Explicamos también cómo instalar el IDE de desarrollo de Arduino:

Primer proyecto hardware con Arduino, encender un LED

 

 

Conexión de sensor de temperatura y humedad con Arduino UNO

Para realizar la conexión del sensor de temperatura y humedad con el Arduino UNO, en primer lugar insertaremos el conector hembra del cable al zócalo a tal efecto del sensor, como mostramos en la siguiente imagen:

Conexión de sensor de temperatura y humedad con Arduino UNO

En la parte del sensor de temperatura, para conectarlo al Arduino, en nuestro caso hemos usado un cable que contiene tres hilos: uno rojo que va al SIG (datos), otro blanco que va al VCC (alimentación) y otro negro que va al GND (masa). El conector NC no se usa por lo que no necesita cable. Es importante tener bien identificado cada hilo para conectarlo en su pin correspondiente del Arduino:

Conexión de sensor de temperatura y humedad con Arduino UNO

En la parte del Arduino UNO conectaremos el cable rojo (SIG) al pin A0 analógico, como se muestra en la imagen:

Conexión de sensor de temperatura y humedad con Arduino UNO

El cable blanco (VCC) lo conectaremos al ping 5V, el de alimentación, como se muestra en la imagen:

Conexión de sensor de temperatura y humedad con Arduino UNO

Y el cable negro (GND) lo conectaremos a cualquier de los pines GND del Arduino (en la imagen el cable del medio, que en su origen era negro y en este extremo está "pelado"):

Conexión de sensor de temperatura y humedad con Arduino UNO

El sensor de temperatura y humedad conectado al Arduino UNO quedará como mostramos en la imagen:

Conexión de sensor de temperatura y humedad con Arduino UNO

Por supuesto, podríamos haber usado un cable específico y una placa prototipo para realizar la conexión del sensor con Arduino, aunque para el ejemplo que nos ocupa no es necesario.

 

Enviar programa para obtener temperatura y humedad a Arduino y testear resultado

Una vez conectado el sensor de temperatura y humedad a Arduino UNO, el siguiente paso será realizar un programa que obtenga los valores de temperatura y humedad y los muestre por el puerto serie, de esta forma podremos testear y verificar que el hardware (sensor y Arduino) funcionan correctamente.

Instalaremos los drivers necesarios, instalaremos el IDE de desarrollo de Arduino y conectaremos Arduino al PC por el puerto USB, como indicamos aquí:

Instalación software IDE de desarrollo y controladores para conectar Arduino con un PC con Windows 7

A continuación escribiremos el siguiente programa:

#define DHT11_PIN 0      // ADC0

byte read_dht11_dat()
{
  byte i = 0;
  byte result=0;
  for(i=0; i< 8; i++)
  {
    while(!(PINC & _BV(DHT11_PIN)));  // wait for 50us
    delayMicroseconds(30);

    if(PINC & _BV(DHT11_PIN)) 
      result |=(1<<(7-i));
    while((PINC & _BV(DHT11_PIN)));  // wait '1' finish
  }
  return result;
}

void setup()
{
  DDRC |= _BV(DHT11_PIN);
  PORTC |= _BV(DHT11_PIN);

  Serial.begin(9600);
  Serial.println("Ready");
}

void loop()
{
  byte dht11_dat[5];
  byte dht11_in;
  byte i;
  // start condition
  // 1. pull-down i/o pin from 18ms
  PORTC &= ~_BV(DHT11_PIN);
  delay(18);
  PORTC |= _BV(DHT11_PIN);
  delayMicroseconds(40);

  DDRC &= ~_BV(DHT11_PIN);
  delayMicroseconds(40);

  dht11_in = PINC & _BV(DHT11_PIN);

  if(dht11_in)
  {
    Serial.println("dht11 start condition 1 not met");
    return;
  }
  delayMicroseconds(80);

  dht11_in = PINC & _BV(DHT11_PIN);

  if(!dht11_in)
  {
    Serial.println("dht11 start condition 2 not met");
    return;
  }
  delayMicroseconds(80);
  // now ready for data reception
  for (i=0; i<5; i++)
    dht11_dat[i] = read_dht11_dat();

  DDRC |= _BV(DHT11_PIN);
  PORTC |= _BV(DHT11_PIN);

  byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];
  // check check_sum
  if(dht11_dat[4]!= dht11_check_sum)
  {
    Serial.println("DHT11 checksum error");
  }

  Serial.print("Humedad = ");
  Serial.print(dht11_dat[0], DEC);
  Serial.print(".");
  Serial.print(dht11_dat[1], DEC);
  Serial.print("%  ");
  Serial.print("Temperatura = ");
  Serial.print(dht11_dat[2], DEC);
  Serial.print(".");
  Serial.print(dht11_dat[3], DEC);
  Serial.println("C  ");

  delay(2000);
}

Lo compilaremos para verificar que la sintaxis del código C++ es correcta, para ello pulsaremos el botón "Verify". Si el código es correcto devolverá "Done compiling", si hay algún error en el código lo indicará:

Enviar programa para obtener temperatura y humedad a Arduino y testear resultado

Una vez verificado el código pulsaremos en el botón "Upload" para enviar el programa a Arduino UNO. Si Arduino está correctamente conectado al PC por el puerto USB, el programa será subido y el IDE de Arduino mostrará "Done uploading"

Enviar programa para obtener temperatura y humedad a Arduino y testear resultado

Para testear el programa que hemos enviado a Arduino, abriremos la ventana de Serial Monitor del IDE de Arduino, pulsando en el botón "Serial Monitor":

Enviar programa para obtener temperatura y humedad a Arduino y testear resultado

Si tenemos correctamente conectado el sensor de temperatura y humedad a Arduino y si el programa enviado es correcto, nos devolverá la humedad y temperatura actuales a la ventana de puerto serie:

Enviar programa para obtener temperatura y humedad a Arduino y testear resultado

 

 

Guardar resultados de temperatura y humedad en EPROM de Arduino

En Arduino el EEPROM es un espacio de memoria que puede ser utilizada por los programadores para almacenar información a largo plazo. Esta memoria es no volátil, por lo tanto aunque dejemos de alimentar eléctricamente Arduino los valores de esta memoria seguirán estando almacenados. En el siguiente artículo mostramos más información sobre el tipo de memorias del chip de Arduino y sobre para qué sirven y cómo usarlas:

Tipos de memoria en el microcontrolador de Arduino, Flash, SRAM y EEPROM

Modificaremos el programa anterior que obtiene la temperatura y humedad usando el sensor Twig Temp&Humi Sensor SEN11301P para guardar los valores obtenidos en la memoria EEPROM interna de Arduino UNO (con capacidad para 1024 valores):

#define DHT11_PIN 0      // ADC0

//Para EEPROM
#include <EEPROM.h> 
int addr = 0;

int repeticiones = 0;

byte read_dht11_dat()
{
  byte i = 0;
  byte result=0;
  for(i=0; i< 8; i++)
  {
    while(!(PINC & _BV(DHT11_PIN)));  // wait for 50us
    delayMicroseconds(30);

    if(PINC & _BV(DHT11_PIN)) 
      result |=(1<<(7-i));
    while((PINC & _BV(DHT11_PIN)));  // wait '1' finish
  }
  return result;
}

void setup()
{
  //para encender el LED de Arduino
  pinMode(13, OUTPUT);
  
  //para el sensor de temperatura y humedad
  DDRC |= _BV(DHT11_PIN);
  PORTC |= _BV(DHT11_PIN);

  //para iniciar el puerto serie, para las comunicaciones
  Serial.begin(9600);
  Serial.println("Iniciando lectura de datos...");
}

void loop()
{
  byte dht11_dat[5];
  byte dht11_in;
  byte i;
  int val = analogRead(0) / 4; //para EEPROM
  
  // start condition
  // 1. pull-down i/o pin from 18ms
  PORTC &= ~_BV(DHT11_PIN);
  delay(18);
  PORTC |= _BV(DHT11_PIN);
  delayMicroseconds(40);

  DDRC &= ~_BV(DHT11_PIN);
  delayMicroseconds(40);

  dht11_in = PINC & _BV(DHT11_PIN);

  if(dht11_in)
  {
    Serial.println("dht11 start condition 1 not met");
    return;
  }
  delayMicroseconds(80);

  dht11_in = PINC & _BV(DHT11_PIN);

  if(!dht11_in)
  {
    Serial.println("dht11 start condition 2 not met");
    return;
  }
  delayMicroseconds(80);
  // now ready for data reception
  for (i=0; i<5; i++)
    dht11_dat[i] = read_dht11_dat();

  DDRC |= _BV(DHT11_PIN);
  PORTC |= _BV(DHT11_PIN);

  byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];
  // check check_sum
  if(dht11_dat[4]!= dht11_check_sum)
  {
    Serial.println("DHT11 checksum error");
  }

  //guardaremos los valores de humedad y temperatura
  //cada 10 minutos aproximadamente
  //Si tenemos 1024 valores y usamos dos por cada captura
  //uno para la humedad y otro para la temperatura
  //tendremos espacio en memoria EEPROM para dos días aproximadamente
  repeticiones = repeticiones + 1;
    
  if (repeticiones == 10)
  {
    //guardar valores en EEPROM
    Serial.print("Guardando valores en EEPROM");
    Serial.println(" ");
    EEPROM.write(addr, dht11_dat[0]); //humedad
    addr = addr + 1;
    EEPROM.write(addr, dht11_dat[2]); //temperatura
    addr = addr + 1;
    repeticiones = 0;
    if (addr == 1024)
    {
      addr = 0;
      Serial.print("EEPROM llena, se reescribirá...");
      Serial.println(" ");
      digitalWrite(13, HIGH);   // encendemos el LED para avisar
      delay(3000);              // esperamos tres segundos
      digitalWrite(13, LOW);    // apagamos el LED
    }  
  }
  
  //enviar valores a puerto serie para depuración
  Serial.print("Humedad = ");
  Serial.print(dht11_dat[0], DEC);
  Serial.print(".");
  Serial.print(dht11_dat[1], DEC);
  Serial.print("%  ");
  Serial.print("Temperatura = ");
  Serial.print(dht11_dat[2], DEC);
  Serial.print(".");
  Serial.print(dht11_dat[3], DEC);
  Serial.println("  ");

  //esperamos un minuto
  delay(60000);
}

 

 

Artículos relacionados

 

Créditos

Artículo realizado íntegramente por Alonsojpd miembro fundador del Proyecto AjpdSoft.

Artículo en inglés.


Anuncios


Enviado el Jueves, 13 octubre a las 22:02:12 por ajpdsoft
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A