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.

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® y utilice el protocolo UART.

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

  1. Conectores JST compatibles con Qwiic®

  2. Sensor SFH 7779 de OSRAM®

  3. Controlador en hardware

  4. Puertos de comunicación UART <> I2C

  5. Modelo de X-NODE

  6. Tipo de X-NODE

  7. Conectores estándar mikroBUS™

  8. Versión de hardware: R1

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

Compatibilidad

Estándar mikroBUS™ y estándar Qwiic®

Tamaño

41 x 25.4 x 20.5 mm

Voltaje

3.3 V

Para la información técnica completa, puedes descargar las especificaciones de cada fabricante en los siguientes enlaces: SHT40 - SFH 7779

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

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® y utilice el protocolo UART.

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

Código de ejemplo para el XC01 - R4, revisa el manual para utilizar nuestro XC01 - R4 en Arduino IDE/PlatformIO

#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

Puedes descargar la documentación técnica de cada fabricante en los siguientes enlaces: SHT40 - SFH 7779

Ejemplo I2C Arduino Framework

Código de ejemplo para el XC01 - R4, revisa el manual para utilizar nuestro XC01 - R4 en Arduino IDE/PlatformIO

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?