El HDC1080 es un sensor de temperatura y humedad con una precisión excelente y un consumo muy bajo. Es compatible con Arduino y ESP8266 gracias a que utiliza el protocolo de comunicación I2C.
Se trata de un sensor que no es muy conocido sin embargo, gracias a su precisión, bajo coste y bajo consumo es quizás una de las mejores opciones a la hora de utilizar en proyectos del IoT con Arduino y ESP8266.
El HDC1080 es un sensor de temperatura y humedad digital lo que quiere decir que incorpora un conversor analógico digital o ADC. Esto evita tener que utilizar un pin analógico para leer el sensor.
En este tutorial te enseñaré todos los secretos que se esconden detrás del sensor de temperatura y humedad.

Indice de contenidos
Características técnicas del sensor HDC1080
Como siempre sucede cuando tienes un componente nuevo entre manos, lo primero que debes hacer es acudir a la hoja de características técnicas.
El sensor de temperatura y humedad que vamos a ver en este tutorial se llama HDC1080. El nombre es debido al chip que utiliza de la empresa Texas Instruments.

Características más importantes son las siguientes:
Característica | Valor |
---|---|
Precisión humedad relativa | ± 2% |
Precisión temperatura | ± 0,2ºC |
Resolución temperatura (configurable por software) | 11-bit y 14-bit |
Resolución humedad (configurable por software) | 8-bit, 11-bit y 14-bit |
Consumo modo dormido | 100nA |
Consumo modo midiendo | 1,3µA |
Voltaje de alimentación | 2,7V a 5V |
Comunicación | I2C |
Rango de temperaturas | -40ºC a 125ºC |
Es un sensor digital y ya viene calibrado de fábrica así que están listos para conectar y usar.
HDC1080 precisión
La precisión de un sensor determina cuánto se desvía la medida obtenida con el sensor con respecto a la realidad (normalmente se suele decir la variación con respecto a un estándar absoluto).
Más o menos viene a decir que si en un determinado momento en un lugar hay 20ºC ¿cuánto se desvía de esta medida lo que mide el sensor?
Este dato lo podemos obtener de la propia hoja de características técnicas y se suele expresar en términos de ± (más menos). Cuanto menor sea, más preciso será el sensor.
La precisión es diferente para la temperatura y para la humedad.

En el caso del HDC1080, al igual que ocurre con muchos otros sensores, la precisión no es uniforme. Suelen darte una precisión típica pero en realidad varía según la temperatura o la humedad.
Por ejemplo, si tomamos la temperatura, la precisión varía según la siguiente gráfica.

En el eje y se representa la precisión en ± ºC y el eje x representa la temperatura. Por lo tanto, dependiendo de la temperatura el sensor presenta una precisión u otra.
Si te fijas, cuando está en -40 ºC (vamos que estás midiendo la temperatura en Groenlandia) la precisión cae hasta los ± 0,5 ºC. Esto quiere decir que si tienes una temperatura de -40 ºC puede que tengas más o menos medio grado de diferencia.
En el lado opuesto la mayor precisión se obtiene entorno a los 30 ºC, donde se consigue una precisión de ± 0,15 ºC.
Lo mismo ocurre con la humedad. Fíjate en el siguiente gráfico.

No varía tanto la precisión como con la temperatura pero dependiendo de la humedad relativa, obtendrás una precisión u otra.
HDC1080 consumo
Una de las características más interesantes que presenta el sensor de temperatura y humedad es su bajo consumo. Esto hace que sea un dispositivo muy adecuado cuando se requiere un bajo consumo de energía.
Por ejemplo, cuando tu proyecto utiliza pilas o baterías.
Un caso claro lo tenemos en los nodos del proyecto EnigmaIoT de Germán Martín. En este tipo de proyectos se requieren nodos donde se consuma muy poco.
Pero ¿cuál es el secreto para que consuma apenas 100nA?
El secreto está en el modo dormido (en inglés sleep mode).
El HDC1080 tiene dos modos de funcionamiento: modo dormido y modo midiendo.
Cuando el sensor de temperatura y humedad se enciende, automáticamente entra en modo dormido consumiendo una media de 100nA. En este modo, el sensor espera cualquier comando que le llegue por el protocolo I2C para despertar.
Cuando recibe un comando para realizar una medida, pasa del modo dormido al modo midiendo. Una vez completada la medida, el sensor de temperatura y humedad regresa al modo dormido.
Gracias a que todo esto lo hace de forma automática, se consiguen unos consumos muy bajos.
Pero en realidad, el consumo también varía según el voltaje de alimentación y de la temperatura.
En las gráficas que nos facilitan las hojas de características técnicas lo puedes comprobar.

En términos generales, cuanto más voltaje de alimentación y cuanta más temperatura, el consumo es mayor.
Por último y dentro de lo que es el consumo es muy importante fijarse en los tiempos de respuesta que tiene un sensor. Básicamente viene a decirnos cuánto tarda en tomar la medida y volver al modo dormido de bajo consumo.
Los tiempos de respuesta dependen de la resolución con la que esté trabajando el sensor y de los ciclos del reloj del ADC.
En la siguiente tabla puedes ver los tiempos de respuesta del sensor para obtener cada magnitud según la resolución del ADC
Magnitud | Resolución | Tiempo (ms) |
---|---|---|
Humedad | 8-bit | 2,5ms |
Humedad | 11-bit | 3,85ms |
Humedad | 14-bit | 6,5ms |
Temperatura | 11-bit | 3,65ms |
Temperatura | 14-bit | 6,35ms |
Todo esto quiere decir que a mayor tiempo de respuesta del sensor, mayor consumo ya que estará menos tiempo en modo dormido. Debes tenerlo en cuenta si tu proyecto requiere de un bajo consumo.
Para que te hagas una idea. El sensor HDC1080 en modo midiendo temperatura y humedad con una resolución de 11-bit consume unos 1.300nA. Mientras que en modo dormido consume 100nA. El consumo es 10 veces superior.
Otras funciones del HDC1080
A parte de lo ya explicado, el sensor de temperatura y humedad HDC1080 tiene dos características muy interesantes.
La primera es el monitor de voltaje de alimentación. El sensor HDC1080 monitoriza el nivel del voltaje de alimentación y lanza una alarma en el caso de que este voltaje sea inferior a 2,8V.
Recuerda que el voltaje de alimentación del sensor de temperatura y humedad HDC1080 es de entre 2,7V y 5,5V.
Esta información puede ser muy útil para informar de que se debe cambiar la batería del dispositivo porque se está agotando.
Y la segunda característica interesante es que dispone de un calefactor (del inglés heater) que no es más que un elemento resistivo. Se utiliza para probar el sensor o para eliminar la condensación del sensor.
Se activa a través de la programación y es muy útil cuando el sensor se ha expuesto durante un largo periodo de tiempo a unas condiciones de humedad alta y se desea eliminar la condensación para evitar errores en la medición.
Esquema eléctrico HDC1080
Como ya te he comentado, el nombre del HDC1080 es el nombre del propio chip. Luego ese chip puede ir montado en cualquier módulo. De momento, los grandes fabricantes como Sparkfun y Adafruit no se han fijado en el sensor de temperatura y humedad.
Así que lo que vas a encontrar por ahí será más bien chino. Puedes encontrar este sensor por un precio razonable en Amazon.

Sea como sea, el sensor tiene que tener 4 pines:
- GND: referencia 0V
- SCL: señal de reloj I2C
- SDA: señal de datos I2C
- VCC: voltaje de alimentación (entre 2,7V y 5,5V)
Para conectarlo a un Arduino o un ESP8266 es muy sencillo. Lo único que tienes que hacer es conectar GND y VCC a GND y 3,3V o 5V. Luego, los pines SCL y SDA con los pines SCL y SDA de la placa.
A continuación te dejo dos ejemplos con un ESP8266 y con un Arduino UNO.


Y una vez que tenemos claro cómo funciona el hardware y cómo se conecta con Arduino y ESP8266 ¿adivinas qué es lo que toca?
¡A programar!
Programar HDC1080 con Arduino y ESP8266
Siempre que tengas que programar un componente nuevo puedes hacer dos cosas. Una es programar tu propia librería con la información que aparece en el datasheet (hoja de características técnicas) o dos, utilizar una librería que ya esté creada.
La primera opción está bien si quieres saber cómo programar este tipo de dispositivos a bajo nivel. Se aprende mucho de los datasheet.
Pero si quieres ir rápido lo mejor es que acudas a una librería para Arduino. De entre todas las que hay te recomiendo utilizar esta. Es la más completa como veremos ahora.
Puedes instalar esta librería a través del Gestor de librerías. Solo tienes que hacer una búsqueda por HDC1080.

Vamos a empezar por algo sencillo, consultar la temperatura y la humedad del sensor de forma rápida.
Consultar temperatura y humedad del sensor HDC1080
El siguiente código se conecta al sensor HDC1080 para obtener los datos de temperatura y humedad.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#define _DEBUG_ #include <Wire.h> #include "ClosedCube_HDC1080.h" // Instancia a la clase ClosedCube_HDC1080 hdc1080; void setup() { #ifdef _DEBUG_ Serial.begin(9600); #endif // Iniciar sensor al que se pasa la dirección I2C // Por defecto es un número de 7-bit 1000000 que // equivale al 40 en hexadecimal // Por defecto la precisión es de 14-bit para temperatura y humedad hdc1080.begin(0x40); #ifdef _DEBUG_ Serial.println(" "); Serial.println("Inicado sensor HDC1080"); #endif } void loop() { // Leer temperatura y humedad del sensor double temperatura = hdc1080.readTemperature(); double humedad = hdc1080.readHumidity(); #ifdef _DEBUG_ // Mostrar datos en el monitor serie Serial.print("Temperatura = "); Serial.print(temperatura); Serial.print("ºC Humedad = "); Serial.print(humedad); Serial.println("ºC"); #endif delay(3000); } |
Lo primero es importar las librerías. Hacen falta la librería Wire.h y la librería ClosedCube_HDC1080.h.
Luego se declara una instancia de la clase ClosedCube_HDC1080.
En la función setup() se inicia la comunicación con el sensor llamando a la función hdc1080.begin(0x40). Admite un parámetro y es la dirección I2C del sensor.
En la hoja de características técnicas puedes leer que el sensor viene configurado con una dirección I2C de 7-bit. La dirección es 1000000 en binario.

Si traduces este número a hexadecimal el resultado es 40. Por eso a la función hdc1080.begin(…) se pasa como parámetro el número en hexadecimal 0x40.
En C/C++ los números en hexadecimal se representan poniendo antes 0x. Esto indica que lo que viene después es un número hexadecimal. Esto hace que se pueda diferenciar de los números decimales y binarios.
Por último para obtener la temperatura se utiliza la función hdc1080.readTemperature() y hdc1080.readHumidity(). Las dos funciones devuelven datos del tipo double.
Si cargas el código a tu placa (ya sea Arduino o ESP8266) obtendrás un resultado parecido a esto.

Obtener la temperatura y humedad del sensor es bastante sencillo. En el siguiente ejemplo te voy a enseñar cómo puedes cambiar la resolución tanto de la temperatura como de la humedad.
Cambio de resolución sensor temperatura y humedad HDC1080 Arduino
En muchas ocasiones no es necesario utilizar una resolución muy alta. Por ejemplo, si quieres medir la temperatura en tu casa no hace falta que detectes grandes variaciones entre medidas.
Esto te permite ahorrar energía ya que a menos resolución menos tiempo de respuesta tiene y antes entrará en modo dormido consiguiendo así reducir el consumo. Algo muy importante en proyectos alimentados con baterías o pilas.
El sensor de temperatura y humedad HDC1080 te permite cambiar la resolución a través de la librería que estamos utilizando.
En el siguiente código te muestro un ejemplo de cómo hacerlo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#define _DEBUG_ #include <Wire.h> #include "ClosedCube_HDC1080.h" // Instancia a la clase ClosedCube_HDC1080 hdc1080; void setup() { #ifdef _DEBUG_ Serial.begin(9600); #endif // Iniciar sensor al que se pasa la dirección I2C // Por defecto es un número de 7-bit 1000000 que // equivale al 40 en hexadecimal // Por defecto la precisión es de 14-bit para temperatura y humedad hdc1080.begin(0x40); // Cambiar resolución hdc1080.setResolution(HDC1080_RESOLUTION_8BIT, HDC1080_RESOLUTION_11BIT); #ifdef _DEBUG_ Serial.println(" "); Serial.println("Inicado sensor HDC1080"); #endif } void loop() { // Leer temperatura y humedad del sensor double temperatura = hdc1080.readTemperature(); double humedad = hdc1080.readHumidity(); #ifdef _DEBUG_ // Mostrar datos en el monitor serie Serial.print("Temperatura = "); Serial.print(temperatura); Serial.print("ºC Humedad = "); Serial.print(humedad); Serial.println("ºC"); #endif delay(3000); } |
Lo único que he añadido al código es la línea 21 donde pongo hdc1080.setResolution(HDC1080_RESOLUTION_8BIT, HDC1080_RESOLUTION_11BIT);
Esta función cambia la resolución de la humedad y la temperatura que por defecto, es 14-bit.
Ok Luis pero ¿de dónde salen las constantes HDC1080_RESOLUTION_8BIT y HDC1080_RESOLUTION_11BIT.
Estas constantes las puedes ver si abre el archivo ClosedCube_HDC1080.h que se encuentra en la carpeta Libraries.

Puedes abrirlo con el Bloc de notas o cualquier otro editor de texto. Te recomiendo utilizar uno especial para programación como el Sublime Text.
A parte tienes la constante para la resolución de 14-bit, HDC1080_RESOLUTION_14BIT.
El resultado es muy parecido al que se obtiene con el anterior ejemplo.

Por último vamos a ver cómo activar el calefactor que tiene incorporado el sensor de temperatura y humedad.
Activar calefactor del sensor HDC1080
A parte de las funciones que hemos visto, la librería del sensor de temperatura y humedad HDC1080 también permite activar el calefactor durante un tiempo determinado.
El calefactor es muy útil cuando se quiere eliminar la condensación acumulada en el sensor debido a un largo periodo de exposición a humedades altas.
En el siguiente código te muestro cómo hacerlo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#define _DEBUG_ #include <Wire.h> #include "ClosedCube_HDC1080.h" // Instancia a la clase ClosedCube_HDC1080 hdc1080; void setup() { #ifdef _DEBUG_ Serial.begin(9600); #endif // Iniciar sensor al que se pasa la dirección I2C // Por defecto es un número de 7-bit 1000000 que // equivale al 40 en hexadecimal // Por defecto la precisión es de 14-bit para temperatura y humedad hdc1080.begin(0x40); // Cambiar resolución hdc1080.setResolution(HDC1080_RESOLUTION_8BIT, HDC1080_RESOLUTION_11BIT); #ifdef _DEBUG_ Serial.println(" "); Serial.println("Inicado sensor HDC1080"); Serial.println("Calefactor encendido. Por favor espere..."); #endif // Activar calefactor hdc1080.heatUp(10); // activa el calefactor 10 segundos #ifdef _DEBUG_ Serial.println("Calefactor apagado"); #endif } void loop() { // Leer temperatura y humedad del sensor double temperatura = hdc1080.readTemperature(); double humedad = hdc1080.readHumidity(); #ifdef _DEBUG_ // Mostrar datos en el monitor serie Serial.print("Temperatura = "); Serial.print(temperatura); Serial.print("ºC Humedad = "); Serial.print(humedad); Serial.println("ºC"); #endif delay(3000); } |
Lo único que he añadido al código anterior es la línea 30 donde llamo a la función hdc1080.heatUp(10) que activa el calefactor. Esta función admite un único parámetro que indica el número de segundos que se mantendrá activo el calefactor.
Si cargas el código a la placa verás algo parecido a esto.

Y con esto damos por finalizado este tutorial. A continuación te dejo las conclusiones.
Conclusiones sensor de temperatura y humedad HDC1080
A lo largo de este tutorial hemos visto las características técnicas del sensor de temperatura y humedad HDC1080.
Se trata de un sensor cuyas características más importantes son:
- Es un sensor digital y se comunica por I2C.
- Tiene un amplio rango de voltaje de alimentación, entre 2,7V y 5V, haciendo que sea compatible con Arduino (5V) y ESP8266 (3V3).
- El consumo es muy reducido. Esto es ideal para proyectos alimentados con baterías o pilas.
- El tiempo de respuesta es muy rápido lo que implica que estará mucho tiempo en modo dormido.
- Tiene una precisión aceptable y si necesitas mucha resolución, se pueden obtener hasta 14-bit.
- Su bajo coste también hace que sea una buena elección.
- Se puede programar fácilmente con una librería.
Por todos estos motivos, el sensor de temperatura y humedad HDC1080 es una buena elección para cualquier proyecto donde se necesite medir estas magnitudes.
Cualquier duda o comentario, lo puedes dejar aquí abajo. Gracias :)