Skip to Content

Tutorial del sensor de temperatura Si7021 con Arduino

Tutorial del sensor de temperatura Si7021 con Arduino

En este tutorial aprenderás cómo medir la temperatura y la humedad relativa usando el sensor Si7021 y un Arduino.

El sensor Si7021 es una opción muy popular para medir temperatura y humedad en proyectos DIY. Es un sensor fiable y preciso que se comunica mediante I2C, lo que facilita su integración con microcontroladores como Arduino y ESP32. Gracias a su amplio rango de funcionamiento y bajo consumo de energía, el Si7021 es adecuado para aplicaciones como estaciones meteorológicas, dispositivos de domótica y sistemas de monitorización ambiental. Su tamaño compacto y su interfaz sencilla lo hacen ideal tanto para principiantes como para makers experimentados que quieran añadir capacidades de medición ambiental a sus proyectos.

Vamos a empezar con las piezas necesarias.

Piezas necesarias

Obviamente, necesitarás un sensor de temperatura y humedad Si7021. Normalmente, no compras el sensor en bruto, sino una placa breakout que incluye algunos componentes extra que facilitan la conexión del sensor.

Además, necesitarás un microcontrolador. Yo utilicé un Arduino Uno para este proyecto, pero cualquier otro Arduino o cualquier ESP32/ESP8266 funcionará perfectamente.

Por último, queremos mostrar los datos de temperatura y humedad medidos. Yo elegí una pantalla OLED, pero también podrías usar una LCD display .

Sensor de Temperatura y Humedad Si7021

Arduino

Arduino Uno

USB Data Sync cable Arduino

Cable USB para Arduino UNO

Dupont wire set

Juego de cables Dupont

Half_breadboard56a

Breadboard

OLED display

Pantalla OLED

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

El sensor de temperatura y humedad Si7021

El Si7021 es un sensor muy pequeño y de bajo consumo, que mide humedad y temperatura e integra la electrónica necesaria. Viene calibrado de fábrica para ofrecer mediciones precisas y se comunica mediante una interfaz I2C. La imagen de abajo muestra el diagrama de bloques funcional del Si7021:

Functional Block Diagram of Si7021
Diagrama de bloques funcional del Si7021 ( source )

Como puedes ver, contiene los elementos sensores de humedad y temperatura, un convertidor analógico a digital (ADC), la lógica de control con memoria para almacenar los factores de calibración y la electrónica para la interfaz I2C.

Especificaciones técnicas

El sensor de temperatura del Si7021 puede medir temperaturas en el rango de –10 a 85 °C con una precisión de ±0,4 °C. El sensor de humedad mide la humedad relativa en el rango de 0 a 80% RH con una precisión de ±3% RH.

El sensor funciona con un voltaje de 1,9 a 3,6 V y el consumo durante el funcionamiento es de 150μA (60nA en modo standby).

Una característica única del sensor es el elemento calefactor integrado, que puede usarse para aumentar la temperatura del sensor y eliminar la condensación, o para realizar mediciones de punto de rocío. Ten en cuenta que al activar el calefactor, el consumo de energía puede subir hasta 94,20mA (a 3,3V). Para más detalles consulta la hoja de datos:

Circuito típico de aplicación

Para usar el Si7021 en una aplicación real, normalmente necesitas añadir resistencias pull-up para la interfaz I2C y un condensador para estabilizar la alimentación. La imagen de abajo muestra el circuito típico de aplicación:

Typical Application Circuit of Si7021
Circuito típico de aplicación del Si7021 ( source )

Sin embargo, en la mayoría de los casos, lo más práctico es usar una placa breakout que ya incluye estos componentes.

Placa breakout para SI7021

La imagen de abajo muestra una placa breakout típica para el SI7021. Añade las resistencias pull-up mencionadas y un regulador de voltaje, lo que permite alimentar la placa con 3,3V o 5V.

Front & Back of Si7021 breakout board
Frontal y trasera de la placa breakout Si7021

Ten en cuenta que muchas placas breakout están etiquetadas como «SI7021» pero en realidad contienen un sensor diferente, aunque comparable. En el ejemplo anterior, puedes ver la etiqueta «SI7021» en la placa y las etiquetas «HTU21» y «SHT21» justo debajo del sensor.

El SI7021, HTU21 y SHT21 son intercambiables en cuanto a especificaciones y protocolos de comunicación, e incluso tienen la misma dirección I2C ( 0x40 ). Sin embargo, almacenan sus números de serie en un formato diferente, lo que puede causar un pequeño problema al usar las bibliotecas Adafruit_Si7021 o SparkFun_Si7021 . Más sobre esto más adelante.

Por último, ten en cuenta que el SHT21, HTU21 y Si7021 están disponibles con o sin una membrana protectora de PTFE sobre el elemento sensor. Mira la siguiente imagen para ver los dos tipos:

Si7021 Sensor with or without a protective membrane
Sensor Si7021 con o sin membrana protectora

Conectando el Si7021 a Arduino

Gracias a la interfaz I2C, conectar el sensor Si7021 a un Arduino es muy sencillo. Primero, conecta los pines SCL y SDA de la placa breakout Si7021 a los pines correspondientes del Arduino, como se muestra abajo. Después, conecta GND y VIN.

Wiring of Si7021sensor with Arduino
Cableado del sensor Si7021 con Arduino

La placa breakout funciona con 5V o 3,3V y puedes usar cualquiera de los dos para VIN. En el esquema de arriba, estoy usando 3,3V para VIN.

A continuación, vamos a escribir un código sencillo para probar el funcionamiento del sensor Si7021.

Código para leer datos del Si7021

Antes de poder leer los datos de temperatura y humedad del sensor Si7021, necesitamos instalar una biblioteca. Dos opciones habituales son la Adafruit_Si7021 o la SparkFun_Si7021 . Yo voy a usar la Adafruit_Si7021 .

Abre el Library Manager, busca «Si7021» y install la Adafruit_Si7021 como se muestra abajo.

Adafruit_Si7021 library installed in  Library Manager
Biblioteca Adafruit_Si7021 instalada en el Library Manager

Ahora podemos escribir un código de prueba sencillo. Empezamos incluyendo la biblioteca Adafruit_Si7021 y creando el objeto del sensor. En la función setup() inicializamos el sensor mediante sensor.begin() , y en la función loop leemos e imprimimos la humedad y temperatura medidas.

#include "Adafruit_Si7021.h"

Adafruit_Si7021 sensor = Adafruit_Si7021();

void setup() {
  Serial.begin(9600);
  sensor.begin();
}

void loop() {
  Serial.print("Hum:");
  Serial.println(sensor.readHumidity(), 2);
  Serial.print("Temp:");
  Serial.println(sensor.readTemperature(), 2);
  delay(1000);
}

Si subes y ejecutas este código deberías ver la siguiente salida en tu Serial Monitor. Asegúrate de que la velocidad está configurada correctamente a 9600 baudios.

Output of Si7021 measurements on Serial Monitor
Salida de las mediciones del Si7021 en el Serial Monitor

También puedes abrir el Serial Plotter y soplar sobre el sensor. Deberías ver un aumento en la humedad y temperatura medidas. En la imagen de abajo, la línea azul muestra la humedad al máximo (100%) y un ligero aumento de temperatura (línea roja).

Output of Si7021 measurements on Serial Plotter
Salida de las mediciones del Si7021 en el Serial Plotter

Si el sensor no funciona, asegúrate de que está correctamente cableado y que puede ser detectado como un dispositivo I2C. Puedes comprobarlo ejecutando un escáner I2C.

#include "I2CScanner.h"

I2CScanner scanner;

void setup() {
  Serial.begin(9600);
  while (!Serial) {};

  scanner.Init();
}

void loop() {
  scanner.Scan();
  delay(5000);
}

Si subes y ejecutas el código anterior, debería mostrar la siguiente salida en el Serial Monitor

--- Scan started ---
I2C device found at address 0x40  !

donde 0x40 es la dirección I2C por defecto del sensor Si7021. Si no ves esto, o el cableado no es correcto, o tu sensor está dañado, o tiene una dirección I2C diferente, lo cual no debería ocurrir.

Did not find Si7021 sensor

Si pruebas a ejecutar el código de ejemplo si7021.ino que viene con la biblioteca Adafruit_Si7021 , puede que veas el mensaje de error «Did not find Si7021 sensor!». El error lo genera el siguiente fragmento de código en la función setup() :

void setup() {  
  ...
  if (!sensor.begin()) {
    Serial.println("Did not find Si7021 sensor!");
    while (true)
      ;
  }
  ...
}

Verás este mensaje incluso cuando el escaneo I2C confirma que el sensor Si7021 está detectado en la dirección 0x40 y realmente está funcionando bien.

He investigado un poco más sobre la inicialización code del sensor y el error lo causa la llamada a la función _readRegister8() en el código de abajo.

bool Adafruit_Si7021::begin() {
  if (!i2c_dev->begin())
    return false;

  reset();
  if (_readRegister8(SI7021_READRHT_REG_CMD) != 0x3A)
    return false;

  readSerialNumber();
  _readRevision();

  return true;
}

La razón es que muchas placas breakout etiquetadas como «Si7021» en realidad usan un sensor SHT21 o HTU21. Estos sensores son comparables al Si7021 pero aparentemente almacenan el número de serie en un formato/dirección diferente, lo que provoca este error.

La forma más sencilla de evitar esto es llamar a la función begin() pero ignorar el valor de retorno, como he hecho en el código de ejemplo anterior. El sensor y el resto del código funcionan perfectamente, pero no podrás imprimir el número de serie ni la versión del sensor.

También probé la biblioteca SparkFun_Si7021 y tenía el mismo problema. Si no quieres usar ninguna de estas dos bibliotecas y quieres solucionar este problema, puedes implementar la funcionalidad tú mismo. No es difícil. La entrada de blog Bare Si7021 temperature/relative humidity sensor , muestra cómo hacerlo.

Para cualquier aplicación práctica, probablemente querrás mostrar los datos de temperatura y humedad en una pantalla y no solo imprimirlos en el Serial Monitor. Eso es lo que vamos a hacer en la siguiente sección. Vamos a añadir una pantalla OLED y mostrar los datos del sensor ahí.

Añadiendo una OLED para mostrar los datos del Si7021

Como la OLED también es un dispositivo I2C, conectarla es muy sencillo. Simplemente conecta SDA y SCL a los mismos pines a los que está conectado el sensor Si7021. Como la OLED funciona a 3,3V, también podemos compartir las líneas de alimentación. La imagen de abajo muestra el cableado completo.

Connecting OLED and Si7021 with Arduino
Conexión de OLED y Si7021 con Arduino

Si tienes alguna dificultad con la OLED, échale un vistazo al tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino . La imagen de abajo muestra el cableado completo en una breadboard real:

Wiring of OLED and Si7021 with Arduino
Cableado de OLED y Si7021 con Arduino

Código para mostrar los datos del Si7021 en la OLED

En esta sección escribimos el código para mostrar la temperatura y la humedad medidas por el sensor Si7021 en una pantalla OLED. Para escribir en la OLED usaremos la biblioteca Adafruit_SSD1306 . Puedes install it via the Library Manager como siempre:

Adafruit_SSD1306 library installed in Library Manager
Biblioteca Adafruit_SSD1306 instalada en el Library Manager

El siguiente código lee las mediciones del sensor Si7021 y muestra los valores de temperatura y humedad en la OLED. Échale un vistazo al código completo primero, y luego veremos los detalles.

#include "Adafruit_Si7021.h"
#include "Adafruit_SSD1306.h"

Adafruit_Si7021 sensor = Adafruit_Si7021();
Adafruit_SSD1306 oled(128, 64, &Wire, -1);

void oled_init() {
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  oled.clearDisplay();
  oled.setTextSize(2);
  oled.setTextColor(WHITE);
}

void centered(const char* text, int y) {
  int16_t x1, y1;
  uint16_t w, h;
  oled.getTextBounds(text, 0, 0, &x1, &y1, &w, &h);
  oled.setCursor(64 - w / 2, y);
  oled.print(text);
}

void display() {
  static char text[30];
  float temp = sensor.readTemperature();
  float hum = sensor.readHumidity();

  oled.clearDisplay();
  sprintf(text, "%.1f c", temp);
  centered(text, 12);
  sprintf(text, "%.1f %%", hum);
  centered(text, 38);
  oled.display();
}

void setup() {
  oled_init();
  sensor.begin();
}

void loop() {
  display();
  delay(1000);
}

Librerías e inicialización de la pantalla

Empezamos incluyendo las librerías necesarias para el sensor Si7021 y la pantalla OLED Adafruit SSD1306. Luego inicializamos la pantalla OLED en la función oled_init() . Esta función configura la pantalla, la limpia, ajusta el tamaño del texto y el color del texto.

#include "Adafruit_Si7021.h"
#include "Adafruit_SSD1306.h"

Adafruit_Si7021 sensor = Adafruit_Si7021();
Adafruit_SSD1306 oled(128, 64, &Wire, -1);

void oled_init() {
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  oled.clearDisplay();
  oled.setTextSize(2);
  oled.setTextColor(WHITE);
}

Ten en cuenta que la dirección I2C de la pantalla OLED está configurada en 0x3C en oled.begin() . La mayoría de estas pequeñas OLED usan esta dirección, pero la tuya podría ser diferente. Si no ves nada en la OLED, probablemente tenga una dirección I2C diferente y tendrás que cambiar la dirección que pasas a oled.begin() . Si no sabes la dirección I2C, consulta el tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino .

Funciones de visualización

La función centered() se usa para imprimir texto centrado en la pantalla OLED en una coordenada y específica. La función display() lee los datos de temperatura y humedad del sensor y los muestra en la pantalla OLED.

void centered(const char* text, int y) {
  // Function to center text on OLED
}

void display() {
  // Function to display temperature and humidity on OLED
}

Función setup

En la función setup() inicializamos la comunicación serie para depuración, inicializamos la pantalla OLED y comenzamos la comunicación con el sensor Si7021. Como mencionamos antes, si el sensor Si7021 no es detectado, revisa el cableado, la dirección I2C e ignora el valor de retorno de sensor.begin() .

void setup() {
  oled_init();
  sensor.begin();
}

Función loop

La función loop() llama continuamente a la función display() para actualizar y mostrar los valores en la pantalla OLED. Luego espera 1 segundo (1000ms) antes de la siguiente actualización.

void loop() {
  display();
  delay(1000);
}

Salida en la OLED

Si subes y ejecutas el código, deberías ver la temperatura en grados Celsius y la humedad relativa en porcentaje en la pantalla OLED.

Si7021Output on OLED
Salida del Si7021 en la OLED

¡Y ahí tienes un pequeño y práctico sensor ambiental!

Conclusiones

En este tutorial has aprendido a usar el sensor de temperatura y humedad Si7021, una pantalla OLED y un Arduino Uno para construir un sensor ambiental.

Como el Si7021 tiene un modo de bajo consumo y funciona a 3,3V, también sería adecuado para construir un sensor ambiental alimentado por batería usando un ESP32. Échale un vistazo a Simple ESP32 Internet Weather Station , donde usamos un ESP32 alimentado por batería, por ejemplo. Si quieres reducir aún más el consumo, te recomiendo una pantalla e-Paper en vez de una OLED. El tutorial Weather Station on e-Paper Display puede serte útil aquí.

Ten en cuenta que hay muchísimos sensores alternativos de temperatura (y humedad) que puedes usar. Aquí tienes una lista de tutoriales donde usamos algunos de estos sensores.

El más comparable, en cuanto a consumo, facilidad de uso y precisión, probablemente sea el sensor BME280 . Hay un comparison of Temperature/Humidity sensors muy bueno que merece la pena leer.

Por último, si prefieres el ESP32 en vez de Arduino, échale un vistazo a los siguientes tutoriales.

Espero que te hayas divertido montando y experimentando con este proyecto. Si tienes alguna pregunta, no dudes en dejarla en los comentarios.

¡Feliz cacharreo ; )