🔧 Módulo GY-21 (I²C) con sensor HTU21D para lectura de temperatura y humedad relativa
Comparto librería desarrollada para trabajar con el módulo GY-21, basado en el sensor digital HTU21D, para lectura de temperatura y humedad relativa mediante bus I²C.
Se incluyen:
✅ Librerías de soporte
✅ Ejemplos de prueba
✅ Lectura en modo Hold Master y No Hold Master
Versión probada con:
• Microcontrolador: PIC18F46K22 @ 64 MHz
• Tarjeta entrenadora: HL-K18
• Entorno de desarrollo: PIC18 Basic Compiler v6.10
📌 Sobre el sensor HTU21D
El HTU21D es un sensor digital calibrado en fábrica, de bajo consumo y buena precisión, muy utilizado en aplicaciones embebidas.
Rango de medida
Temperatura:
• -40°C a +125°C (±0.3).
Humedad relativa:
• 0 a 100 %RH (±3%).
📡 Dirección I²C
Dirección base de 7 bits:
0x40
Direcciones equivalentes de 8 bits:
Escritura: 0x80 ' (0x40 << 1) + 0
Lectura : 0x81 ' (0x40 << 1) + 1
⚙️ Modos de funcionamiento
El HTU21D permite trabajar en dos modos:
1️⃣ Hold Master Mode
Comandos:
Temperatura: 0xE3
Humedad : 0xE5
En este modo:
• El maestro envía el comando de medición.
• El sensor puede mantener la línea SCL a nivel bajo mientras realiza la conversión interna.
• El bus I²C queda temporalmente bloqueado.
• Cuando finaliza la conversión, el sensor libera la línea SCL y la lectura continúa.
Este mecanismo se conoce como:
Clock Stretching (estiramiento de reloj)
⚠️ Para usar este modo, la librería I²C debe soportar clock stretching.
2️⃣ No Hold Master Mode
Comandos:
Temperatura: 0xF3
Humedad : 0xF5
En este modo:
• El maestro envía el comando de medición.
• El sensor realiza la conversión internamente.
• El bus I²C permanece libre.
• El maestro debe esperar el tiempo de conversión o realizar ACK polling antes de leer.
Tiempos máximos de conversión (máxima resolución)
• Temperatura (14 bits): ~50 ms
• Humedad (12 bits): ~16 ms
📦 Formato de los datos
El sensor devuelve:
• 2 bytes de datos
• 1 byte CRC opcional
Los dos bits menos significativos contienen bits de estado y deben ponerse a cero antes de aplicar las fórmulas:
rawValue = rawValue And 0xFFFC
Donde rawValue contiene inicialmente el valor sin procesar entregado por el sensor.
🧮 Fórmulas de conversión
Temperatura
T = -46.85 + (175.72 * rawValue / 65536)
Humedad relativa
RH = -6 + (125 * rawValue / 65536)
🔌 Conexión usada
Módulo GY-21 con PIC18F46K22
VCC → 3.3V/5V*
GND → GND
SDA → RC4 (MSSP)
SCL → RC3 (MSSP)
⚠️ El chip HTU21D trabaja hasta 3.6V máximo.
Si se alimenta el módulo a 5V, conviene verificar que el módulo usado incorpora regulación y adaptación de niveles.
📚 Librerías necesarias
_I2CLib.bas → Librería I²C hardware para el módulo MSSP del PIC.
_HTU21DLib.bas → Librería específica para el sensor HTU21D.
Funciones principales:
Inicialización
HTU21D_Init()
Lectura en No Hold Master
HTU21D_RequestMeasurement(cmd)
temperature = HTU21D_ReadTemp(...)
humidity = HTU21D_ReadHum(...)
Lectura en Hold Master
Clock_Stretch_I2C(timeout)
temperature = HTU21D_ReadTemp(...)
Clock_Stretch_I2C(timeout)
humidity = HTU21D_ReadHum(...)
Clock_Stretch_I2C(0)
⚠️ Clock_Stretch_I2C() pertenece a la librería I²C.
💻 Ejemplo de uso
No Hold Master
HTU21D_RequestMeasurement(HTU21D_CMD_TEMP)
WaitMs 50
temperature = HTU21D_ReadTemp(HTU21D_CMD_TEMP)
HTU21D_RequestMeasurement(HTU21D_CMD_HUM)
WaitMs 16
humidity = HTU21D_ReadHum(HTU21D_CMD_HUM)
Hold Master
Clock_Stretch_I2C(50) ' The slave can lock the clock for up to 50 ms.
temperature = HTU21D_ReadTemp(HTU21D_CMD_TEMP_HM)
Clock_Stretch_I2C(16) ' The slave can lock the clock for up to 16 ms.
humidity = HTU21D_ReadHum(HTU21D_CMD_HUM_HM)
Clock_Stretch_I2C(0) ' Disable
📂 Archivos incluidos
• Test_HTU21D.bas → Programa principal de prueba
• _Pic18F46K22Lib.bas → Configuración del PIC
• _I2CLib.bas → Librería I²C hardware
• _HTU21DLib.bas → Librería específica del sensor
Los resultados se muestran por UART.
Diagrama de conexiones: