Está en la página 1de 12

Obtener temperatura y humedad con Arduino

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

Requisitos para proyecto hardware con Arduino y sensor de temperatura y humedad. Conexin de sensor de temperatura y humedad con Arduino UNO. Enviar programa para obtener temperatura y humedad a Arduino y testear resultado. Guardar resultados de temperatura y humedad en EPROM de Arduino. Artculos relacionados. Crditos.

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:

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

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:

En el siguiente artculo explicamos cmo conectar Arduino a un PC, cmo compilar un programa y cmo enviarlo al Arduino. Explicamos tambin cmo instalar el IDE de desarrollo de Arduino: Primer proyecto hardware con Arduino, encender un LED

Conexin de sensor de temperatura y humedad con Arduino UNO


Para realizar la conexin del sensor de temperatura y humedad con el Arduino UNO, en primer lugar insertaremos el conector hembra del cable al zcalo a tal efecto del sensor, como mostramos en la siguiente imagen:
2

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 (alimentacin) 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:

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

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

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"):

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

Por supuesto, podramos haber usado un cable especfico y una placa prototipo para realizar la conexin 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: Instalacin software IDE de desarrollo y controladores para conectar Arduino con un PC con Windows 7 A continuacin 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))); delayMicroseconds(30); if(PINC & _BV(DHT11_PIN)) result |=(1<<(7-i)); while((PINC & _BV(DHT11_PIN)));

// wait for 50us

} return result;

// wait '1' finish

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 cdigo C++ es correcta, para ello pulsaremos el botn "Verify". Si el cdigo es correcto devolver "Done compiling", si hay algn error en el cdigo lo indicar:

Una vez verificado el cdigo pulsaremos en el botn "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"

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

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:

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 informacin a largo plazo. Esta memoria es no voltil, por lo tanto aunque dejemos de alimentar elctricamente Arduino los valores de esta memoria seguirn estando almacenados. En el siguiente artculo mostramos ms informacin sobre el tipo de memorias del chip de Arduino y sobre para qu sirven y cmo 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 //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))); delayMicroseconds(30); if(PINC & _BV(DHT11_PIN)) result |=(1<<(7-i)); while((PINC & _BV(DHT11_PIN))); // ADC0

// wait for 50us

} return result;

// wait '1' finish

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);

10

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 das 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 depuracin Serial.print("Humedad = ");

11

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);

12