La temperatura es la magnitud física más medida con dispositivos electrónicos. En esta ocasión usaremos el sensor SI7021 digital para obtener la lectura.

Aunque en ocasiones no lo parezca estamos rodeados de sensores en casi todos los dispositivos electrónicos (y algunos mecánicos) que tenemos a nuestro alrededor. Solo tienes que pensar en un smartphone ¿cuantos sensores electrónicos tiene? Luz, acelerómetro, cámaras, giroscopio, magnetómetro, termómetros, voltímetro, amperímetro, etc. Y es que un dispositivo puede tomar decisiones incorrectas si no le dotamos de los sensores que necesite para que pueda saber que ocurre a su alrededor. Piensa sino en cualquiera de nosotros, que ocurre si perdemos todos los sentidos, vista, gusto, olfato, tacto, oído, pues a simple vista lo tenemos muy complicado para entender que ocurre a nuestro alrededor.

Existen sensores para medir cualquier parámetro físico que se te ocurra y muchas tecnologías y protocolos con los que comunicarnos con ellos. Cada uno tendrá el suyo. La temperatura la podemos medir usando sensores analógicos o digitales como el sensor SI721. Un ejemplo de analógico podría ser un termistor NTC.

Diagrama bloques SI7021 Fuente: Silicon Labs
Diagrama bloques SI7021 Fuente: Silicon Labs

En este caso analizamos el sensor SI7021 de humedad y temperatura de la mano de IcStation. Este sensor será capaz de leer ambas magnitudes físicas, transformarlas en valores digitales y almacenarlas en su banco de memoria, de tal forma que cuando le pidamos por medio de I2C uno de los dos parámetros, el módulo nos devolverá 2 bytes que corresponderán al valor que le estamos pidiendo.

Tal y como vemos en el diagrama de bloques que nos proporciona el fabricante del circuito integrado SI7021, el circuito integra un ADC que leerá los valores de ambos sensores y mandará la lectura al bloque lógico que se encarga de calibrar y almacenar las lecturas para posteriormente cuando le pidamos un valor, la interfaz I2C acceda al módulo lógico, recupere el valor y lo devuelva a través de I2C.

Como ya habrás podido averiguar nos comunicaremos con el integrado a través de I2C para obtener los diferentes Bytes que contienen los valores de temperatura y humedad. Si analizamos con detenimiento el datasheet del sensor SI7021 veremos como cada valor está formado por 2 bytes es decir por 16 bits. A través de I2C solo podemos transmitir 8 bits en una sola respuesta y por tanto para transmitir el valor completo tendremos que recibir 2 respuestas.

Al ataque

En esta ocasión, para no variar usamos Arduino para comunicarnos con el integrado SI7021 y por tanto tendremos que contar con la librería wire.h sobre la cual ya hemos hablado con anterioridad, el flujo de trabajo para obtener, por ejemplo, la temperatura será:

1.- Iniciar la transmisión con el dispositivo slave (SI7021)
2.- Enviar el byte 0xE3 con el cual indicamos al sensor que queremos el valor de temperatura
3.- Finalizar transmisión
4.- Pedir al sensor SI7021 los 2 bytes que conforman el valor de temperatura
5.- Recibir y combinar los 2 bytes en una palabra de 16 bits
6.- Calcular el valor de temperatura con la ecuación:

 Temperatura = \frac{175.72 \ \cdot \ TempCcode}{65536} - 46.85

Donde Temperatura está en °C y TempCode es la palabra de 16 bits

 Humedad = \frac{125 \ \cdot \ RHCode}{65536} - 6

Donde Humedad está en % y RHCode es la palabra de 16 bits. Para obtener RHCode usaremos el byte 0xE5 en lugar de 0xE3 en el paso 2.

Evidentemente el integrado dispone de más comandos I2C que podemos enviar para obtener o modificar distintos valores y todos ellos los puedes ver en esta tabla que nos proporciona el fabricante en el datasheet del componente.

I2C Tabla comandos Fuente: Silicon Labs
I2C Tabla comandos Fuente: Silicon Labs

Sensor SI7021 y comunicación I2C

Como ves el uso es bastante fácil y se basa en pedir y recibir bytes a través de I2C, así que si entiendes el concepto es bastante probable que entiendas el código que usaremos en Arduino.

PlacaSCLSDA
Arduino UnoA5A4
Arduino Mega2120
Arduino Leonardo32
Arduino Due2120

Recuerda que estamos hablando de un dispositivo I2C por tanto tendremos que usar los correspondientes pines de nuestro microcontrolador y en el caso de que el módulo que estemos usando no disponga de resistencias PullUp tendremos que ponerlas.

Si miramos el módulo de IcStation con detenimiento veremos que ya tiene incluidas en la placa las dos resistencias, por lo que no será necesario incluirlas por nuestra cuenta y además también incluye el condensador de 0.1 μF que necesita el integrado entre Vcc y GND para estabilizar su alimentación.

sensor SI7021
sensor SI7021

Un dato bastante importante y que debes tener en cuenta a la hora de conectar el integrado es que trabaja a 3.3v NO a 5v


Humedad y temperatura con Arduino y SI7021

Código de SI7021 y Arduino

IMPORTANTE

Puede ser que tengas la tentación de retirar el protector blanco que el integrado tiene en su parte superior, pero tal y como nos indica el fabricante, esta no es una buena decisión, por tanto no lo hagas.

Precisión

Hablemos de la precisión de las lecturas y es que ningún sensor es perfecto y siempre se comete un error que en este caso será normalmente de 0.4°C para la temperatura y de entre 2 y 3% para la humedad sin embargo estos valores se ven afectados con la progresión de las lecturas y esta variación la podemos ver gracias a los gráficos que nos proporciona el fabricante.

RH Accuaracy Fuente: Silicon Labs
RH Accuaracy Fuente: Silicon Labs
Temperature Accuaracy Fuente: Silicon Labs

En ambos gráficos vemos que cuando llegamos a los valores extremos de temperatura y humedad el error de la lectura aumenta, pero aun así es bastante bueno para las aplicaciones que vamos a llegar a realizar con este sensor.

Enrique Gómez

Ingeniero Electrónico Industrial y Automático, amante de la comunicación audiovisual y de la divulgación ingenieril y científica. Friki de Star Wars, cuenta más de lo que parece. Puedes saber más sobre mi y sobre mis trabajos en www.enriquegomez.me