# X-NODE / XN04 – Sensores Temperatura/Humedad/Luminosidad

<figure><img src="https://177299348-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FxC8gXjNba3Sn4kr3jy75%2FMODULO%20SENSOR%20X-NODE%20Temperatura%20Humedad%20Luminosidad%20XN04%20XIDE%20MICROSIDE%2001.webp?alt=media&#x26;token=791c44ea-e72e-4eb7-8f4c-265e4bdc451c" alt=""><figcaption></figcaption></figure>

<table data-card-size="large" data-view="cards"><thead><tr><th align="center"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td align="center"><mark style="color:green;"><strong>Comprar</strong></mark></td><td><a href="https://www.microside.com/shop/x-node-temperatura-humedad-luminosidad-32">https://www.microside.com/shop/x-node-temperatura-humedad-luminosidad-32</a></td></tr></tbody></table>

El **X-NODE Temp-Hum / Lum** es un módulo que permite realizar mediciones de 3 variables ambientales: **Temperatura, Humedad y Luz Ambiental**. Ideal para proyectos IoT que requieren control y monitoreo de sistemas cerrados, como aire acondicionado, cámaras de refrigeración, o ajustes automáticos de iluminación. Este módulo simplifica los diseños al reducir la necesidad de múltiples dispositivos, ofreciendo una solución compacta y eficiente para aplicaciones de monitoreo.

### **TABLA DE CONTENIDO**

1. [**¿Cómo funciona?**](#i.-como-funciona)
2. [**Descripción del hardware**](#ii.-descripcion-del-hardware)
3. [**Especificaciones**](#iii.-especificaciones)
4. [**Pinout**](#iv.-pinout)
5. [**Modo de uso**](#v.-modo-de-uso)
   * [**Protocolo UART**](#protocolo-uart)
   * [**Ejemplo UART Arduino Framework**](#ejemplo-uart-arduino-framework)
   * [**Protocolo I2C**](#protocolo-i2c)
   * [**Ejemplo I2C Arduino Framework**](#ejemplo-i2c-arduino-framework)
6. [**Descargas**](#vi.-descargas)
   * [**Esquemático**](https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FcFaznEDQxatEy6prNwMl%2Fschematic.pdf?alt=media\&token=bff01aea-d514-49e9-8d7b-c41ae9a939ef)
   * [**Dimensiones**](https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FEAvXcjTy4yVAr0qRZMzF%2Fdimensions.pdf?alt=media\&token=0d1a1c2b-f723-4763-bdcd-eb254c8511f1)

## **I. ¿Cómo funciona?**

El **X-NODE Temp-Hum / Lum** es un módulo que combina 2 sensores: un [SHT40](https://sensirion.com/resource/datasheet/sht4x) de [Sensirion®](https://sensirion.com/) para medir temperatura/humedad ambiental y un [LTR-329ALS](https://optoelectronics.liteon.com/upload/download/DS86-2014-0006/LTR-329ALS-01_DS_V1.pdf) de [LITEON®](https://www.liteon.com/en) para medir luminosidad en interiores; con un controlador integrado permite obtener estas variables utilizando una serie de comandos *ASCII*.

**X-NODE Temp-Hum / Lum** es compatible con el estándar [mikroBUS™](https://www.mikroe.com/mikrobus) de [Mikroe®](https://www.mikroe.com/) para un uso fácil con un gran ecosistema de kits para desarrollo de hardware, también posee conectores JST compatibles con el estándar [Qwiic®](https://www.sparkfun.com/qwiic) de [SparkFun®](https://www.sparkfun.com/) para una comunicación entre diversos módulos y tarjetas de desarrollo por medio del protocolo I2C de manera rápida y sencilla.

## **II. Descripción del hardware**

<figure><img src="https://177299348-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2Fp5l4BaQ1xYzos4ogJPiQ%2Fuser-manual-hardware-description.webp?alt=media&#x26;token=087e85bf-ee99-4d51-9c1c-c39ce08ac6de" alt=""><figcaption></figcaption></figure>

1. Sensor [SHT40](https://sensirion.com/resource/datasheet/sht4x) de [Sensirion®](https://sensirion.com/)
2. Conectores JST compatibles con [Qwiic®](https://www.sparkfun.com/qwiic)
3. Sensor [LTR-329ALS](https://optoelectronics.liteon.com/upload/download/DS86-2014-0006/LTR-329ALS-01_DS_V1.pdf) de [LITEON®](https://www.liteon.com/en)
4. Controlador en hardware
5. Puertos de comunicación UART <> I2C
6. Modelo de X-NODE
7. Tipo de X-NODE
8. Conectores estándar [mikroBUS™](https://www.mikroe.com/mikrobus)
9. Jumper pad para habilitar la comunicación I2C nativa\* de los sensores.
10. Versión de hardware: R2
11. Componentes principales en el X-NODE

{% hint style="info" %}
**Nota:** El **X-NODE Temp-Hum / Lum** incluye un controlador en hardware para simplificar la implementación, sin embargo, si desea utilizar el protocolo nativo I2C de los sensores deberá enviar el comando para apagar el controlador por hardware y soldar los pads I2C-EN (9).
{% endhint %}

## **III. Especificaciones**

<table data-header-hidden><thead><tr><th width="148.60003662109375"></th><th></th></tr></thead><tbody><tr><td><strong>Tipo</strong></td><td>Sensor de temperatura, humedad y luz ambiental</td></tr><tr><td><strong>Aplicaciones</strong></td><td>Desarrollo de sistemas de IoT que requieran control y monitoreo dentro de sistemas cerrados, como aire acondicionado, cámaras de refrigeración, o ajustes automáticos de iluminación.</td></tr><tr><td><strong>Módulo</strong> 1</td><td><a href="https://sensirion.com/resource/datasheet/sht4x">SHT40</a></td></tr><tr><td><strong>Fabricante</strong></td><td><a href="https://sensirion.com/">Sensirion®</a></td></tr><tr><td><strong>Módulo</strong> 2</td><td><a href="https://optoelectronics.liteon.com/upload/download/DS86-2014-0006/LTR-329ALS-01_DS_V1.pdf">LTR-329ALS</a></td></tr><tr><td><strong>Fabricante</strong></td><td><a href="https://www.liteon.com/en">LITEON®</a></td></tr><tr><td><strong>Características</strong></td><td>* Sensor de temperatura y humedad con detección de 0 °C a 85 °C con una precisión típica de +/- 0.2 °C y +/- 1.8% RH, calibración automática, consumo de 0.5 mA y alta relación señal/ruido.<br>* Sensor de luz ambiental con detección de 0.01 a 64 klx, supresión de ruido a 50 Hz/60 Hz y consumo típico de 90µA.</td></tr><tr><td><strong>Interfaz</strong></td><td>UART, I2C</td></tr><tr><td><strong>Compatibilidad</strong></td><td>Estándar mikroBUS™ y estándar Qwiic®</td></tr><tr><td><strong>Tamaño</strong></td><td>41 x 25.4 x 20.5 mm</td></tr><tr><td><strong>Voltaje</strong></td><td>3.3 V</td></tr></tbody></table>

{% hint style="info" %}
Para la información técnica completa, puedes descargar las especificaciones de cada fabricante en los siguientes enlaces: [SHT40](https://sensirion.com/resource/datasheet/sht4x) - [LTR-329ALS](https://optoelectronics.liteon.com/upload/download/DS86-2014-0006/LTR-329ALS-01_DS_V1.pdf)
{% endhint %}

## **IV. Pinout**

La siguiente tabla muestra el pinout del **X-NODE Temp-Hum / Lum** con respecto al estándar  [**mikroBUS™**](https://www.mikroe.com/mikrobus) (este último se encuentra en las dos columnas del centro).

<figure><img src="https://177299348-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FJo1oZSK1hQRwkYoRQILz%2Fuser-manual-mikrobus-pinout-table.jpg?alt=media&#x26;token=658ae120-a66c-401f-8bd0-e8a7e97a22e6" alt=""><figcaption></figcaption></figure>

## **V. Modo de uso**

Para un uso fácil y rápido del X-NODE se puede hacer a través de los comandos en formato ASCII que proporciona el controlador en hardware integrado mediante una comunicación serial UART o de forma más avanzada a través del protocolo I2C.

### Protocolo UART

#### Configuración

La comunicación UART utiliza la siguiente configuración:

* Velocidad de comunicación: 115,200 bps
* Paridad: Ninguna
* Bits de datos: 8
* Bits de paro: 1

#### Sintaxis

El protocolo UART permite enviar instrucciones en texto plano *ASCII*. Cada instrucción se compone del identificador del X-NODE, un comando y un final de línea.

**Identificador**

El identificador **ID**, se conforma por el modelo del X-NODE, que puede localizar en el punto 6 del apartado Descripción de hardware y se complementa con un índice, que puede ser una letra del abecedario, por defecto es la letra **A**, siendo posible configurarlo hasta la letra **Z**. Para poder conectar más de un módulo del mismo modelo en un sistema, deberá configurar un identificador único para cada módulo, brindando la posibilidad de conectar hasta 26 módulos del mismo modelo a través del protocolo UART\*.

<figure><img src="https://177299348-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FIjr3y7cWi5zJoJcwQNbS%2Fuser-manual-uart-protocol-index-rule.png?alt=media&#x26;token=182df19b-583f-48d4-8408-f1060fb8266e" alt="XN04_X-NODE"><figcaption></figcaption></figure>

{% hint style="warning" %}
**Nota:** A partir de este punto se usará el índice predeterminado del **X-NODE Temp-Hum / Lum** para el resto del manual: **XN04A**.
{% endhint %}

**Lista de comandos**

<table data-header-hidden><thead><tr><th width="188"></th><th></th></tr></thead><tbody><tr><td><strong>XN04A?</strong></td><td>Verifica si se estableció una comunicación con éxito.<br><strong>Respuesta si la comunicación fue exitosa:</strong> OK<br><strong>Respuesta si ocurrió un error en la comunicación</strong> XN04A=Error<br><strong>Ejemplo:</strong> XN04A=3<br><strong>Códigos de error:</strong><br><strong>1:</strong> Error con el sensor de temperatura/humedad<br><strong>2:</strong> Error con el sensor de luminosidad<br><strong>3:</strong> Error con ambos sensores</td></tr><tr><td><strong>XN04A+V</strong></td><td>Obtiene la versión del firmware actual que integra el X-NODE.<br><strong>Respuesta:</strong> XN04A=Versión<br><strong>Ejemplo:</strong> XN04A=2.0.0</td></tr><tr><td><strong>XN04A+ID=(A-Z)</strong></td><td>Cambia el índice del ID por una letra diferente del abecedario de la A a la Z, la nueva letra debe ser en mayúscula. Una vez modificado, para volver a cambiarlo es necesario colocar el ID con el nuevo índice.<br><strong>Respuesta:</strong> OK<br><strong>Ejemplo de envío:</strong> XN04C+ID=H</td></tr><tr><td><strong>XN04A+TW=(1-126)</strong></td><td>Cambia la dirección I2C que viene de fábrica por uno diferente, esta configuración solo tiene efecto si no se ha deshabilitado el driver en hardware. La nueva dirección se escribe en decimal seleccionando un valor de 1 a 126.<br><strong>Respuesta:</strong> OK<br><strong>Ejemplo de envío:</strong> XN04A+TW=28</td></tr><tr><td><strong>XN04A+GT</strong></td><td>Obtiene el valor de Temperatura del sensor. Retorna con el valor final en °C con dos decimales.<br><strong>Respuesta:</strong> XN04A=VAL<br><strong>Ejemplo:</strong> XN04A=27.81</td></tr><tr><td><strong>XN04A+GH</strong></td><td>Obtiene el valor de Humedad del sensor. Retorna con un valor relativo (%) de humedad.<br><strong>Respuesta:</strong> XN04A=VAL<br><strong>Ejemplo:</strong> XN04A=80</td></tr><tr><td><strong>XN04A+GL</strong></td><td>Obtiene el valor de Luminosidad del sensor. Retorna con un valor de luminosidad ambiental en Luxes.<br><strong>Respuesta:</strong> XN04A=VAL<br><strong>Ejemplo:</strong> XN04A=198</td></tr></tbody></table>

#### Comandos avanzados

<table data-header-hidden><thead><tr><th width="176.5999755859375"></th><th></th></tr></thead><tbody><tr><td><strong>XN04A+ETW=(0-1)</strong></td><td>Habilita (1) o deshabilita (0) la interfaz I2C del dispositivo.<br><strong>Nota</strong>: Esta configuración es volátil, desconectar el dispositivo del suministro de energía o enviar el comando de reinicio restaurará la interfaz I2C.<br><strong>Respuesta:</strong> OK<br><strong>Ejemplo de envío:</strong> XN04A+ETW=0</td></tr><tr><td><strong>XN04A+SLP</strong></td><td>Habilita el modo de descanso profundo del dispositivo para reducir el consumo de energía, durante el descanso profundo el dispositivo no responderá a comandos UART, para despertar el dispositivo envíe un lógico bajo (0) al pin WAKEUP/UPDI<br><strong>Respuesta:</strong> OK<br><strong>Ejemplo de envío:</strong> XN04A+SLP</td></tr><tr><td><strong>XN04A+RST</strong></td><td>Reinicia el dispositivo, los valores no volátiles (ej. ID, address I2C) se conservarán y los valores volátiles volverán a su configuración por defecto.<br><strong>Respuesta:</strong> OK</td></tr><tr><td><strong>XN04A+SP</strong></td><td>Permite configurar la precisión del sensor de temperatura/humedad en alta (H)* (valor por defecto), media (M) o baja (L), precisiones más bajas permiten capturar información nueva con mayor frecuencia.<br><strong>Respuesta:</strong> OK<br><strong>Ejemplo de envío:</strong> XN04A+SP=L</td></tr><tr><td><strong>XN04A+SH</strong></td><td>Permite encender (1) o apagar (0) el calefactor del sensor de humedad. Utilice este comando cuando las mediciones de humedad sean incorrectas, habilite el calefactor al menos durante 2 horas para garantizar la reparación del sensor de humedad<br><strong>Respuesta:</strong> OK<br><strong>Ejemplo de envío:</strong> XN04A+SH=0</td></tr><tr><td><strong>XN04A+SG</strong></td><td>Permite configurar la ganancia del sensor de luminosidad en 1 (1-64k lux) (valor por defecto), 2 (1-32k lux), 4 (1-16k lux), 8 (1-8k lux), 48 (1-1.3k lux) y 96 (1-600 lux), ganancias más altas tiene rangos menores con una mayor precisión<br><strong>Respuesta:</strong> OK<br><strong>Ejemplo de envío:</strong> XN04A+SG=96</td></tr><tr><td><strong>XN04A+SD</strong></td><td>Permite encender (1) o apagar (0) el controlador por hardware de los sensores<br><strong>Respuesta:</strong> OK<br><strong>Ejemplo de envío:</strong> XN04A+SD=1</td></tr><tr><td><strong>XN04A+SN</strong></td><td>Permite leer el número de serie del sensor de temperatura y humedad<br><strong>Respuesta:</strong> XN04A=&#x3C;SERIE><br><strong>Ejemplo:</strong> XN04A=4294900000</td></tr></tbody></table>

En la lectura de temperatura, humedad, luminosidad existen respuestas para la detección de errores:

* **ERROR:** El sensor presentó un error de comunicación.
* **OL:** El valor de luminosidad desbordó el registro, configure un valor de ganancia más pequeño si es posible.
* **MEASURING:** No ha finalizado la lectura del sensor, espere al menos 20 milisegundos mientras el sensor se inicializa.
* **HW\_DRIVER\_OFF:** El controlador en hardware no está habilitado.

#### Final de línea

El X-NODE solo responderá a un comando cuando se envíe un conjunto de caracteres finalizadores de línea, cada comando debe terminar con estos caracteres: **\<CR+LF>**

* CR significa retorno de carro (carriage return), este carácter se utiliza para indicar a un sistema que la entrada de texto debe moverse al principio.
* LF significa alimentación de línea (line feed), este carácter le indica a un sistema que la entrada de texto corresponde a una nueva línea.

La combinación de ambos caracteres es una manera común con el que las computadoras representan una nueva línea, por ejemplo, en un procesador de texto para separar párrafos.

En el caso del X-NODE los caracteres **\<CR+LF>**, se utilizan para identificar cuando se ha terminado de enviar un comando. Si el identificador corresponde al nodo, el comando existe y se finaliza con los caracteres **\<CR+LF>**, entonces el nodo enviará una respuesta.

Dependiendo del sistema, deberá configurar el envío de estos caracteres de maneras diferentes.

#### Ejemplo UART Arduino Framework

{% hint style="info" %}
Código de ejemplo para el [**XC01 - R5**](https://docs.microside.com/plataforma-xide-iot/x-nodes/xc01-controlador-wifi-and-bluetooth/r5/x-node-xc01-esp32-s3-controlador-wifi-and-bluetooth), revisa el manual para utilizar nuestro [XC01 - R5 en **Arduino IDE/PlatformIO**](https://docs.microside.com/plataforma-xide-iot/xc01-controlador-wifi-and-bluetooth/r5/x-node-xc01-esp32-s3-controlador-wifi-and-bluetooth#configuracion-para-platformio-en-vs-code)
{% endhint %}

```cpp

#include "Arduino.h"

float getVariable( const char * command ){
  // Limpiamos el buffer
  if (Serial2.available()) {
    Serial2.read();
  }

  // Envía el comando
  Serial2.print(command);
  Serial2.println();

  // Espera hasta recibir una respuesta
  String variable_value = Serial2.readStringUntil('\n');

  // Si la respuesta comienza por el ID
  // entonces la comunicación fue exitosa
  if (!variable_value.startsWith("XN04A=")) {
    Serial.println("Error");
    return NAN;
  }

  // Convierte el valor en ASCII a un valor decimal
  return variable_value.substring(variable_value.indexOf('=') + 1).toFloat();
}

void setup() {
  // Inicializa el monitor serial
  Serial.begin(115200);

  // Inicializa la comunicación UART en el puerto MikroBUS
  Serial2.begin(115200, SERIAL_8N1, 9, 10);
}

void loop() {
  // Obtiene los valores de variables ambientales

  // Envía el comando para obtener la temperatura
  // Los caracteres \r\n representan los caracteres
  // <CR+LF> en el lenguaje de programación C/C++
  float temp = getVariable("XN04A+GT\r\n");

  // Envía el comando para obtener la humedad
  float hum = getVariable("XN04A+GH\r\n");

  // Envía el comando para obtener la luminosidad
  float lum = getVariable("XN04A+GL\r\n");

  Serial.print("Temp: ");
  Serial.print(temp);
  Serial.println(" °C");
  Serial.print("Hum: ");
  Serial.print(hum);
  Serial.println(" %");
  Serial.print("Lum: ");
  Serial.print(lum);
  Serial.println(" lx");

  delay(1000);
}

```

### Protocolo I2C

Para poder establecer comunicación se debe conocer la dirección I2C del X-NODE, el valor de fábrica es 0x04. Las direcciones I2C suelen representarse en sistema **hexadecimal**, asegúrese de utilizar el sistema numérico adecuado.

#### Configuración

* Velocidad de comunicación: 100 kHz - 400 kHz
* Address: 7 bits

{% hint style="info" %}
**Nota:** Verifica que no cuentes con otro dispositivo con la misma dirección (Address) en el BUS I2C, de ser así recuerda que el X-NODE puede cambiar su dirección I2C con el comando **XN04A+TW=(1-126)**.
{% endhint %}

#### Escritura

Para escribir en un registro del **X-NODE Temp-Hum / Lum** el maestro I2C debe generar las siguientes operaciones:

1. Enviar una **condición de inicio**: El maestro genera un lógico bajo (0) en el pin SDA, mientras SCL permanece en alto (1).
2. Enviar la dirección del **X-NODE**: El maestro envía la dirección de 7 bits.
3. Enviar el **tipo de operación**: El maestro indica si la operación es de lectura (0) o de escritura (1).
4. Esperar una señal de **reconocimiento (ACK)**: El maestro espera a recibir un lógico bajo (0), como confirmación (Acknowledgment) que exista un dispositivo con la dirección enviada previamente en el BUS I2C. Si no se recibe respuesta (1), significa que hubo un error en la comunicación o la dirección es incorrecta.
5. Escribir **n bytes** de datos: El maestro escribirá en secuencias de 8 bits (1 byte) y en orden del bit más significativo primero (MSB) n cantidad de bytes que desea escribir en el registro, el dispositivo enviará una señal de **reconocimiento (ACK)** por cada byte escrito.
6. Enviar una **condición de paro**: El maestro debe liberar el BUS I2C generando un lógico alto (1) en el pin SDA mientras que SCL se encuentra en un lógico alto (1).

#### Lectura

Para leer en un registro del **X-NODE Temp-Hum / Lum** el maestro I2C debe generar las siguientes operaciones:

1. Enviar una **condición de inicio**: El maestro genera un lógico bajo (0) en el pin SDA, mientras SCL permanece en alto (1).
2. Enviar la dirección del **X-NODE**: El maestro envía la dirección de 7 bits.
3. Enviar el **tipo de operación**: El maestro indica si la operación es de lectura (0) o de escritura (1).
4. Esperar una señal de **reconocimiento (ACK)**: El maestro espera a recibir un lógico bajo (0), como confirmación (Acknowledgment) que exista un dispositivo con la dirección enviada previamente en el BUS I2C. Si no se recibe respuesta (1), significa que hubo un error en la comunicación o la dirección es incorrecta.
5. Leer **n bytes** de datos: El dispositivo enviará secuencias de 8 bits (1 byte) y en orden del bit más significativo primero (MSB) n cantidad de bytes, al recibir un byte, el maestro deberá generar una señal de **reconocimiento (ACK)** para solicitar 1 byte más, o una señal de **no reconocimiento (NACK)** para indicar que ha finalizado la transmisión y solicitar el dispositivo que libere el BUS.
6. Enviar una **condición de paro**: El maestro debe liberar el BUS I2C generando un lógico alto (1) en el pin SDA mientras que SCL se encuentra en un lógico alto (1).

#### Lista de registros

En un dispositivo I2C los registros son direcciones de memoria que permiten configurar u obtener datos del dispositivo. Existen dos tipos de operaciones: de lectura (R) y de escritura (W).

<table><thead><tr><th>Registro</th><th width="88" align="center">Dirección</th><th width="65" align="center">Tipo</th><th width="77.59991455078125" align="center">No. Bytes</th><th width="366.60015869140625">Descripción</th></tr></thead><tbody><tr><td>TEMP</td><td align="center">0x01</td><td align="center">R</td><td align="center">2</td><td>Permite obtener el valor de temperatura en grados °C*100, dividir este valor por 100 obtiene la medición en °C</td></tr><tr><td>HUM</td><td align="center">0x02</td><td align="center">R</td><td align="center">2</td><td>Permite obtener el valor de humedad relativa * 100, dividir este valor por 100 obtiene la medición en humedad relativa porcentual (0-100%)</td></tr><tr><td>LUM</td><td align="center">0x03</td><td align="center">R</td><td align="center">2</td><td>Permite obtener el valor de luminosidad ambiental (ALS) en Luxes</td></tr><tr><td>HEATER</td><td align="center">0x04</td><td align="center">R/W</td><td align="center">1</td><td>Permite encender (1) o apagar (0) el calefactor del sensor de humedad. Utilice este comando cuando las mediciones de humedad sean incorrectas, habilite el calefactor al menos durante 2 horas para garantizar la reparación del sensor de humedad</td></tr><tr><td>PRECISION</td><td align="center">0x05</td><td align="center">R/W - NV</td><td align="center">1</td><td>Permite configurar la precisión del sensor de temperatura/humedad en alta (3)* (valor por defecto), media (2) o baja (1), precisiones más bajas permiten capturar información nueva con mayor frecuencia</td></tr><tr><td>GAIN</td><td align="center">0x06</td><td align="center">R/W - NV</td><td align="center">1</td><td>Permite configurar la ganancia del sensor de luminosidad en 1 (1-64k lux) (valor por defecto), 2 (1-32k lux), 4 (1-16k lux), 8 (1-8k lux), 48 (1-1.3k lux) y 96 (1-600 lux), ganancias más altas tiene rangos menores con una mayor precisión</td></tr><tr><td>SERIAL_NUM</td><td align="center">0x07</td><td align="center">R</td><td align="center">4</td><td>Permite leer el número de serie del sensor de temperatura y humedad</td></tr><tr><td>DRIVER</td><td align="center">0x36</td><td align="center">R/W - NV</td><td align="center">1</td><td>Permite encender (1) o apagar (0) el controlador por hardware de los sensores</td></tr><tr><td>STAT</td><td align="center">0x37</td><td align="center">R</td><td align="center">1</td><td>Estado del XNODE, 0x00 si no hay errores, cualquier otro valor significa error en la comunicación.<br><strong>Códigos de error:</strong><br><strong>1:</strong> Error con el sensor de temperatura/humedad<br><strong>2:</strong> Error con el sensor de luminosidad<br><strong>3:</strong> Error con ambos sensores</td></tr><tr><td>FW</td><td align="center">0x38</td><td align="center">R</td><td align="center">3</td><td>Versión de firmware, en versión mayor, menor y parche: 0x02.0x00.0x00</td></tr><tr><td>UART_ID</td><td align="center">0x39</td><td align="center">R/W - NV</td><td align="center">1</td><td>Permite leer y escribir el índice del ID por una letra diferente del abecedario de la A (0x41) a la Z (0x5A)</td></tr><tr><td>TW_ADD</td><td align="center">0x3A</td><td align="center">R/W - NV</td><td align="center">1</td><td>Permite leer y escribir la dirección I2C del dispositivo por uno diferente de 1 (0x01) a 126 (0x7D)</td></tr><tr><td>UART_EN</td><td align="center">0x3B</td><td align="center">W</td><td align="center">1</td><td>Habilita (0x01) o deshabilita (0x00) la interfaz UART del dispositivo</td></tr><tr><td>SLEEP</td><td align="center">0x3C</td><td align="center">W</td><td align="center">1</td><td>Habilita (0x01) o deshabilita (0x00) el descanso profundo del dispositivo, el dispositivo despertará si el maestro escribe la dirección I2C del dispositivo en el BUS</td></tr><tr><td>RESET</td><td align="center">0x3D</td><td align="center">W</td><td align="center">1</td><td>Si se escribe un 0x01 reinicia el dispositivo</td></tr><tr><td>WHO_AM_I</td><td align="center">0x3E</td><td align="center">R</td><td align="center">2</td><td>El primer byte es el modelo del XNODE, el segundo byte es la revisión de hardware</td></tr></tbody></table>

**Registros No volatiles (NV)**

Los registros no volatiles se guardan en la memoria EEPROM del dispositivo, lo que significa que conservarán los valores escritos en ellos incluso si el dispositivo se apaga.

**Estructura del registro TEMP, HUM, LUM:**

En la lectura de temperatura, humedad, luminosidad existen valores reservados para la detección de errores:

* **0xFFFF:** El sensor presentó un error de comunicación.
* **0xFFFE:** El valor de luminosidad desbordó el registro, configure un valor de ganancia más pequeño si es posible.
* **0xFFFD:** No ha finalizado la lectura del sensor, espere al menos 20 milisegundos mientras el sensor se inicializa.
* **0xFFFC:** El controlador en hardware no está habilitado.

<figure><img src="https://177299348-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FhG1B892ucnZeJ10FJ2UX%2Fuser-manual-i2c-protocol-register-outputs.png?alt=media&#x26;token=d2291cd6-27c8-4a22-b9d1-7a3a15b5e530" alt=""><figcaption></figcaption></figure>

#### Ejemplo I2C Arduino Framework

{% hint style="info" %}
Código de ejemplo para el [**XC01 - R5**](https://docs.microside.com/plataforma-xide-iot/x-nodes/xc01-controlador-wifi-and-bluetooth/r5/x-node-xc01-esp32-s3-controlador-wifi-and-bluetooth), revisa el manual para utilizar nuestro [XC01 - R5 en **Arduino IDE/PlatformIO**](https://docs.microside.com/plataforma-xide-iot/xc01-controlador-wifi-and-bluetooth/r5/x-node-xc01-esp32-s3-controlador-wifi-and-bluetooth#configuracion-para-platformio-en-vs-code)
{% endhint %}

```cpp
#include <Arduino.h>
#include <Wire.h>

void setup() {
  // Inicializa el monitor serial
  Serial.begin(115200);

  // Configura los pines de la comunicación I2C
  Wire.setPins( 12, 13 );
  // Inicializa la comunicación I2C
  Wire.begin();
}

void loop() {
  // Obtiene los valores de variables ambientales
  float temperature;
  float humidity;
  int lum;

  Wire.beginTransmission(0x04);
  Wire.write(0x01);
  if ( Wire.endTransmission() != 0) {
    delay(1000);
    return;
  }

  if (Wire.requestFrom(0x04, 2) != 2) {
    delay(1000);
    return;
  }

  // Dividir entre 100 para obtener el valor en grados Celsius
  temperature = ( (Wire.read() << 8) | Wire.read() )/100.0f;
  
  Wire.beginTransmission(0x04);
  Wire.write(0x02);
  if ( Wire.endTransmission() != 0) {
    delay(1000);
    return;
  }

  if (Wire.requestFrom(0x04, 2) != 2) {
    delay(1000);
    return;
  }

  // Dividir entre 100 para obtener el valor en humedad relativa porcentual
  humidity = ( (Wire.read() << 8) | Wire.read() )/100.0f;

  Wire.beginTransmission(0x04);
  Wire.write(0x03);
  if ( Wire.endTransmission() != 0) {
    delay(1000);
    return;
  }

  if (Wire.requestFrom(0x04, 2) != 2) {
    delay(1000);
    return;
  }

  lum = ((Wire.read() << 8) | Wire.read());

  Serial.print("Temperatura:");
  Serial.print(temperature);
  Serial.println(" C");
  Serial.print("Humedad:");
  Serial.print(humidity);
  Serial.println(" %");

  Serial.print("Luminosidad: ");
  Serial.print(lum);
  Serial.println(" lx");

  delay(1000);
}
```

## **VI. Descargas**

<table data-card-size="large" data-view="cards"><thead><tr><th align="center"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td align="center"><mark style="color:green;"><strong>Esquemático</strong></mark></td><td><a href="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FcFaznEDQxatEy6prNwMl%2Fschematic.pdf?alt=media&#x26;token=bff01aea-d514-49e9-8d7b-c41ae9a939ef">https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FcFaznEDQxatEy6prNwMl%2Fschematic.pdf?alt=media&#x26;token=bff01aea-d514-49e9-8d7b-c41ae9a939ef</a></td></tr><tr><td align="center"><mark style="color:green;"><strong>Dimensiones</strong></mark></td><td><a href="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FEAvXcjTy4yVAr0qRZMzF%2Fdimensions.pdf?alt=media&#x26;token=0d1a1c2b-f723-4763-bdcd-eb254c8511f1">https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FEAvXcjTy4yVAr0qRZMzF%2Fdimensions.pdf?alt=media&#x26;token=0d1a1c2b-f723-4763-bdcd-eb254c8511f1</a></td></tr></tbody></table>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.microside.com/plataforma-xide-iot/x-nodes/xn04-sensores-temperatura-humedad-luminosidad/r2/x-node-xn04-sensores-temperatura-humedad-luminosidad.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
