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

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.
TABLA DE CONTENIDO
I. ¿Cómo funciona?
El X-NODE Temp-Hum / Prox-Lum es un módulo que combina 2 sensores: un SHT40 de Sensirion® para medir temperatura/humedad ambiental y un SFH 7779 de OSRAM® 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™ de Mikroe® 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® de SparkFun® 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

Sensor SHT40 de Sensirion®
Conectores JST compatibles con Qwiic®
Controlador en hardware
Puertos de comunicación UART <> I2C
Modelo de X-NODE
Tipo de X-NODE
Conectores estándar mikroBUS™
Versión de hardware: R1
Componentes principales en el X-NODE
III. Especificaciones
Tipo
Sensor de temperatura, humedad, proximidad y luz ambiental
Aplicaciones
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.
Módulo 1
Fabricante
Módulo 2
Fabricante
Características
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.
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.
Sensor de proximidad con detección de hasta 160 mm y corriente de pulso programable de hasta 200 mA.
Interfaz
UART, I2C
Tamaño
41 x 25.4 x 20.5 mm
Voltaje
3.3 V
IV. Pinout
La siguiente tabla muestra el pinout del X-NODE Temp-Hum / Prox-Lum con respecto al estándar mikroBUS™ (este último se encuentra en las dos columnas del centro).

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*.

Nota: A partir de este punto se usará el índice predeterminado del X-NODE - Temp-Hum Prox-Lum para el resto del manual: XN04A.
Lista de comandosCommentShare feedback on the editor
XN04A?
Verifica si se estableció una comunicación con éxito. Respuesta: OK
XN04A+V
Obtiene la versión del firmware actual que integra el X-NODE. Respuesta: XN04A=Versión Ejemplo: XN04A=0.1
XN04A+ID=(A-Z)
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. Respuesta: OK Ejemplo de envío: XN04C+ID=H
XN04A+GT
Obtiene el valor de Temperatura del sensor. Retorna con el valor final en °C con dos decimales. Respuesta: XN04A=VAL Ejemplo: XN04A=27.81
XN04A+GH
Obtiene el valor de Humedad del sensor. Retorna con un valor relativo (%) de humedad. Respuesta: XN04A=VAL Ejemplo: XN04A=80
XN04A+GP
Obtiene el valor de Luminosidad ambiental del sensor. Retorna con un valor final en Luxes. Respuesta: XN04A=VAL Ejemplo: XN04A=316
XN04A+GL
Obtiene el valor de Proximidad del sensor. Retorna con un valor relativo de proximidad. Respuesta: XN04A=VAL Ejemplo: XN04A=198
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
#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
Ejemplo I2C Arduino Framework
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 el fabricante Sensirion® ofrece una librería para Arduino.
#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
Esquemático
Dimensiones
Última actualización
¿Te fue útil?