# X-NODE / XN04 – Sensores Temperatura/Humedad/Luminosidad/Proximidad A-R1

<figure><img src="/files/SeeCMDXnCsJq8ubIgVtu" alt=""><figcaption></figcaption></figure>

El **X-NODE Temp-Hum / Prox-Lum** es un módulo que permite realizar mediciones de 4 variables ambientales: **Temperatura, Humedad, Luz Ambiental y Proximidad**. 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.

{% hint style="info" %}
El **X-NODE Temp-Hum / Prox-Lum**, a diferencia de otros X-NODE, no permite reconfigurar la dirección I2C. Por lo que no se puede utilizar más de un **X-NODE Temp-Hum / Prox-Lum** simultáneamente, a menos que desconecte los pines SCL/SDA, evite el uso del conector [Qwiic®](https://www.sparkfun.com/qwiic) y utilice el protocolo UART.
{% endhint %}

### **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%2FdOqfbpBJxCNIWmBXODqL%2FSCHEMATIC%20XN04%20-%20Temp-Hum%20Prox-Lum.pdf?alt=media\&token=d4f6e73e-182e-47e3-83bb-0a63fa8c8059)
   * [**Dimensiones**](https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FLxcXWmveHWS4V4UIQNlr%2FDIMENSIONS%20XN04%20-%20Temp-Hum%20Prox-Lum.pdf?alt=media\&token=516dd5bc-874b-49db-b0bc-b72ba50ff6cc)

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

El **X-NODE Temp-Hum / Prox-Lum** es un módulo que combina 2 sensores: un [SHT40](https://sensirion.com/products/catalog/SHT40) de [Sensirion®](https://sensirion.com/) para medir temperatura/humedad ambiental y un [SFH 7779](https://look.ams-osram.com/m/414abb523da40e66/original/SFH-7779.pdf) de [OSRAM®](https://www.osram.es/cb/) para medir luminosidad en interiores y la proximidad relativa; con un controlador integrado permite obtener estas variables utilizando una serie de comandos *ASCII*.

**X-NODE Temp-Hum / Prox-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="/files/KP2r0ZDR5iJc3061p1Sf" alt=""><figcaption></figcaption></figure>

1. Sensor[ **SHT40**](https://sensirion.com/products/catalog/SHT40) de [**Sensirion®**](https://sensirion.com/)
2. Conectores JST compatibles con [**Qwiic®**](https://www.sparkfun.com/qwiic)
3. Sensor [**SFH 7779**](https://look.ams-osram.com/m/414abb523da40e66/original/SFH-7779.pdf) de [**OSRAM®**](https://www.osram.es/cb/)
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. Versión de hardware: R1
10. Componentes principales en el X-NODE

## **III. Especificaciones**

<table data-header-hidden><thead><tr><th width="174"></th><th></th></tr></thead><tbody><tr><td><strong>Tipo</strong></td><td>Sensor de temperatura, humedad, proximidad 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 1</strong></td><td><a href="https://sensirion.com/products/catalog/SHT40">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 2</strong></td><td><a href="https://look.ams-osram.com/m/414abb523da40e66/original/SFH-7779.pdf">SFH 7779</a></td></tr><tr><td><strong>Fabricante</strong></td><td><a href="https://www.osram.es/cb/">OSRAM®</a></td></tr><tr><td><strong>Características</strong></td><td><ul><li>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. </li><li>Sensor de luz ambiental con detección de 0.0022 a 73000 lx, supresión de ruido a 50 Hz/60 Hz y consumo típico de 90µA. </li><li>Sensor de proximidad con detección de hasta 160 mm y corriente de pulso programable de hasta 200 mA.</li></ul></td></tr><tr><td><strong>Interfaz</strong></td><td>UART, I2C</td></tr><tr><td><strong>Compatibilidad</strong></td><td>Estándar <a href="https://www.mikroe.com/mikrobus">mikroBUS™</a> y estándar <a href="https://www.sparkfun.com/qwiic">Qwiic®</a> </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/products/catalog/SHT40) - [**SFH 7779**](https://look.ams-osram.com/m/414abb523da40e66/original/SFH-7779.pdf)
{% endhint %}

## **IV. Pinout**

La siguiente tabla muestra el pinout del **X-NODE Temp-Hum / Prox-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="/files/7HcICuWHn2fvqlwQJ7t9" 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\*.

{% hint style="info" %}
El **X-NODE Temp-Hum / Prox-Lum**, a diferencia de otros X-NODE, no permite reconfigurar la configuración de dirección I2C. Por lo que no se puede utilizar más de un **X-NODE Temp-Hum / Prox-Lum** simultáneamente, a menos que desconecte los pines SCL/SDA, evite el uso del conector [Qwiic®](https://www.sparkfun.com/qwiic) y utilice el protocolo UART.
{% endhint %}

<figure><img src="/files/zAx4fd4PnxHIRzY7v9pM" alt=""><figcaption></figcaption></figure>

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

**Lista de comandos**CommentShare feedback on the editor

<table data-header-hidden><thead><tr><th width="167"></th><th></th></tr></thead><tbody><tr><td><strong>XN04A?</strong></td><td>Verifica si se estableció una comunicación con éxito. <strong>Respuesta:</strong> OK</td></tr><tr><td><strong>XN04A+V</strong></td><td>Obtiene la versión del firmware actual que integra el X-NODE. <strong>Respuesta:</strong> XN04A=Versión <strong>Ejemplo:</strong> XN04A=0.1</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. <strong>Respuesta:</strong> OK <strong>Ejemplo de envío:</strong> XN04C+ID=H</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. <strong>Respuesta:</strong> XN04A=VAL <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. <strong>Respuesta:</strong> XN04A=VAL <strong>Ejemplo:</strong> XN04A=80</td></tr><tr><td><strong>XN04A+GL</strong></td><td>Obtiene el valor de Luminosidad ambiental del sensor. Retorna con un valor final en Luxes. <strong>Respuesta:</strong> XN04A=VAL <strong>Ejemplo:</strong> XN04A=316</td></tr><tr><td><strong>XN04A+GP</strong></td><td>Obtiene el valor de Proximidad del sensor. Retorna con un valor relativo de proximidad. <strong>Respuesta:</strong> XN04A=VAL <strong>Ejemplo:</strong> XN04A=198</td></tr></tbody></table>

#### 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 - R4**](/plataforma-xide-iot/x-nodes/xc01-controlador-wifi-and-bluetooth/r4/x-node-xc01-esp32-wroom-controlador-wifi-and-bluetooth-r4.md), revisa el manual para utilizar nuestro [XC01 - R4 en **Arduino IDE/PlatformIO**](https://docs.microside.com/plataforma-xide-iot/x-nodes/xn04-sensores-temperatura-humedad-luminosidad/r1/pages/HcLUnJPVDumIHk6xsEpi#v.-configuracion-para-su-uso)
{% 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, 16, 17);
}

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");

  // Envía el comando para obtener la proximidad
  float prox = getVariable("XN04A+GP\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");
  Serial.print("Prox: ");
  Serial.println(prox);

  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 0x44 para el sensor de temperatura y humedad, 0x39 para el sensor de proximidad y luminosidad. 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" %}
Puedes descargar la documentación técnica de cada fabricante en los siguientes enlaces: [SHT40](https://sensirion.com/products/catalog/?filter_series=0f896bb3-d205-4f45-884b-e3c1fd285b8e) - [SFH 7779](https://look.ams-osram.com/m/414abb523da40e66/original/SFH-7779.pdf)
{% endhint %}

#### Ejemplo I2C Arduino Framework

{% hint style="info" %}
Código de ejemplo para el [**XC01 - R4**](/plataforma-xide-iot/x-nodes/xc01-controlador-wifi-and-bluetooth/r4/x-node-xc01-esp32-wroom-controlador-wifi-and-bluetooth-r4.md), revisa el manual para utilizar nuestro [XC01 - R4 en **Arduino IDE/PlatformIO**](https://docs.microside.com/plataforma-xide-iot/x-nodes/xn04-sensores-temperatura-humedad-luminosidad/r1/pages/HcLUnJPVDumIHk6xsEpi#v.-configuracion-para-su-uso)
{% endhint %}

El protocolo I2C no incluye un controlador en hardware, es necesario revisar la hoja de datos para configurar los sensores y obtener las variables. A continuación, se muestra un ejemplo de código, aunque se recomienda utilizar una librería. Para el caso del [SHT40](https://sensirion.com/products/catalog/?filter_series=0f896bb3-d205-4f45-884b-e3c1fd285b8e) el fabricante [Sensirion® ofrece una librería para Arduino](https://github.com/Sensirion/arduino-i2c-sht4x).

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

#define SFH7779 0x39
#define SHT40 0x44

float Lux_Value(uint16_t VIS, uint16_t IR) {
  float LUX;
  float Div = float(IR) / float(VIS);
  if (Div < 0.109) {
    LUX = (1.534 * VIS) - (3.759 * IR);
  } else if (Div < 0.429) {
    LUX = (1.339 * VIS) - (1.972 * IR);
  } else if (Div < (1.3775)) {
    LUX = (0.701 * VIS) - (0.483 * IR);
  } else if (Div < (2.175)) {
    LUX = (1.402 * VIS) - (.56994 * IR);
  } else if (Div < (3.625)) {
    LUX = (2.804 * VIS) - (.64239 * IR);
  } else {
    LUX = (5.608 * VIS);
  }
  LUX = LUX / 64;
  return (LUX);
}

void getLumProx(float &lum, float &prox) {
  //Buffer para el sensor
  uint8_t SensorValueCatch[6];

  lum = NAN;
  prox = NAN;

  // Envía el comando de consulta
  Wire.beginTransmission(SFH7779);
  Wire.write(0x44);

  // Confirma si la comunicación fue exitosa
  if (Wire.endTransmission() != 0)
    return;
  // Solicita 6 bytes
  if (Wire.requestFrom(SFH7779, 6) != 6)
    return;

  for (int i = 0; i < 6; i++) {
    SensorValueCatch[i] = Wire.read();
  }

  // Calcula los valores
  lum = (float)(Lux_Value((SensorValueCatch[3] << 8) | SensorValueCatch[2], (SensorValueCatch[5] << 8) | SensorValueCatch[4]));
  prox = (uint16_t)((SensorValueCatch[1] << 8) | SensorValueCatch[0]);
  return;
}

void getTempHum(float &temp, float &hum) {
  //Buffer para el sensor
  uint8_t SensorCatch[6] = { 0 };

  temp = NAN;
  hum = NAN;

  Wire.beginTransmission(SHT40);
  Wire.write(0xFD);

  // Confirma si la comunicación fue exitosa
  if (Wire.endTransmission() != 0)
    return;
  // Espera mientras se calculan las variables
  delay(10);
  // Solicita 6 bytes
  if (Wire.requestFrom(SHT40, 6) != 6)
    return;

  for (int i = 0; i < 6; i++) {
    SensorCatch[i] = Wire.read();
  }

  // Calcula los valores
  uint16_t t_ticks = (SensorCatch[0] << 8) | (SensorCatch[1]);
  uint16_t h_ticks = (SensorCatch[3] << 8) | (SensorCatch[4]);

  temp = -45.0f + (175.0f * (t_ticks / 65535.0f));
  hum = -6.0f + (125.0f * (h_ticks / 65535.0f));

  if (hum > 100.0f)
    hum = 100.0f;

  if (hum < 0)
    hum = 0.0f;

  return;
}

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

  // Inicializa la comunicación I2C
  Wire.begin();
}

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

  getTempHum(temperature, humidity);
  getLumProx(lum, prox);

  // Si alguno de los valores es NaN, entonces hubo
  // un error en la comunicación
  if (isnanf(temperature) || isnanf(humidity) || isnanf(lum) || isnanf(prox)) {
    Serial.println("Error");
    delay(1000);
    return;
  }

  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");
  Serial.print("Proximidad: ");
  Serial.println(prox);

  delay(1000);
}

```

## **VI. Descargas**

<table data-card-size="large" data-view="cards"><thead><tr><th align="center"></th><th data-hidden 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%2FdOqfbpBJxCNIWmBXODqL%2FSCHEMATIC%20XN04%20-%20Temp-Hum%20Prox-Lum.pdf?alt=media&#x26;token=d4f6e73e-182e-47e3-83bb-0a63fa8c8059">https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FdOqfbpBJxCNIWmBXODqL%2FSCHEMATIC%20XN04%20-%20Temp-Hum%20Prox-Lum.pdf?alt=media&#x26;token=d4f6e73e-182e-47e3-83bb-0a63fa8c8059</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%2FLxcXWmveHWS4V4UIQNlr%2FDIMENSIONS%20XN04%20-%20Temp-Hum%20Prox-Lum.pdf?alt=media&#x26;token=516dd5bc-874b-49db-b0bc-b72ba50ff6cc">https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FLxcXWmveHWS4V4UIQNlr%2FDIMENSIONS%20XN04%20-%20Temp-Hum%20Prox-Lum.pdf?alt=media&#x26;token=516dd5bc-874b-49db-b0bc-b72ba50ff6cc</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/r1/x-node-xn04-sensores-temperatura-humedad-luminosidad-proximidad-a-r1.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.
