# X-NODE / XN21 – BME690 Sensor Ambiental con IA

<figure><img src="https://177299348-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FojSH2DnVes9Lsw9JznW7%2FX-NODE%20Environmental%20AI%20BME690%20XN21%20XIDE%20MICROSIDE%2001%20.webp?alt=media&#x26;token=a4372409-da05-496d-b48b-056c61dd44a7" alt=""><figcaption></figcaption></figure>

El **X-NODE Environmental AI (BME690)** es un módulo que integra el sensor de gas con inteligencia artificial [**BME690** ](https://www.bosch-sensortec.com/products/environmental-sensors/gas-sensors/bme690/)de [**Bosch®**](https://www.bosch-sensortec.com/), capaz de medir compuestos orgánicos volátiles (VOCs), compuestos volátiles de azufre (VSCs), presión barométrica, humedad relativa y temperatura ambiental con un consumo de corriente de hasta 50 µA en modo ultra bajo. Es ideal para integración en dispositivos móviles portátiles o el monitoreo de calidad del aire en interiores y exteriores, sistemas automáticos de intercambio, sistemas de ventilación inteligente y similares.

### **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)
   * [**Protocolo I2C & SPI**](#protocolo-i2c-and-spi)&#x20;
6. [**Descargas**](#vi.-descargas)
   * [**Esquemático**](https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FfYXGnidJAkR6T5umuum7%2Fxn21-r1-schematic.pdf?alt=media\&token=ac4c7fc5-1691-4404-bade-b607176fd507)
   * [**Dimensiones**](https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FcGJ7OxC1y4GMGbJJcYzH%2Fxn21-r1-dimensions.pdf?alt=media\&token=614f0216-b810-43e5-95e3-a3a7a456f70e)

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

El módulo **X-NODE Environmental AI (BME690)** posee un controlador en hardware integrado con el cual es posible obtener la lectura de diversas variables que proporciona el sensor sin tener conocimientos avanzados de hardware, ya que solo es necesario enviar una serie de comandos en formato ASCII por medio del protocolo de comunicación serial **UART,** el protocolo **I2C** o el protocolo **SPI**, esto permite que el X-NODE sea compatible con cualquier sistema basado en un microcontrolador, microprocesador o equipos industriales. El sensor es capaz de medir presión barométrica, humedad relativa, temperatura ambiental y resistencia del gas, esta información puede utilizarse\* medir la calidad del aire interior (IAQ) y para detectar compuestos orgánicos volátiles (VOCs), compuestos volátiles de azufre (VSCs) y gases como monóxido de carbono e hidrogeno.

El **X-NODE Environmental AI (BME690)** 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.

{% hint style="warning" %}
**\*NOTA**: Las funciones de IAQ, VOC, VSC y detección de gases requiere el uso de la librería BSEC (***B**osch **S**ensortec **E**nvironmental **C**luster*). [Consulte la página del fabricante para obtener más información](https://www.bosch-sensortec.com/zh/software-tools/software/bme688-and-bme690-software/).
{% endhint %}

## **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%2FAVR2baHUBY9foSnZEriq%2FX-NODE%20XN21%20BME690%20Sensor%20IA_Bosch_Descripcion%20del%20hardware_XIDE_Microside.webp?alt=media&#x26;token=bee6096d-5fa7-4e20-9fe7-f14e99b9528d" alt=""><figcaption></figcaption></figure>

1. Sensor [**BME690**](https://www.bosch-sensortec.com/products/environmental-sensors/gas-sensors/bme690/) de [**Bosch®**](https://www.bosch-sensortec.com/)
2. Conectores JST compatibles con [**Qwiic®**](https://www.sparkfun.com/qwiic)
3. Controlador en hardware
4. Puertos de comunicación UART <> I2C <> SPI\*.
5. Modelo de X-NODE
6. Tipo de X-NODE
7. Jumper de selección para la dirección I2C (Cuando está abierto el Address es 0x77 y cuando está cerrado es 0x76)
8. Jumpers de selección entre protocolo I2C y SPI (Al usar SPI no será posible utilizar el controlador en hardware)
9. Jumper de habilitación para el pin SPI Chip Select (CS1 <> CS2)
10. Conectores estándar [**mikroBUS™**](https://www.mikroe.com/mikrobus)
11. Jumper habilitador para programación del microcontrolador por UPDI
12. Versión de hardware: R1
13. Componente principal en el X-NODE

{% hint style="danger" %}
**\*NOTA**: El controlador en hardware utiliza el protocolo **I2C**, modificar los jumpers soldables para utilizar el protocolo **SPI** resultará en inhabilitar el protocolo **UART**.
{% endhint %}

## **III. Especificaciones**

<table data-header-hidden><thead><tr><th width="171"></th><th></th></tr></thead><tbody><tr><td><strong>Tipo</strong></td><td>Sensor de gas, medio ambiente, calidad de aire</td></tr><tr><td><strong>Aplicaciones</strong></td><td>Monitoreo de calidad del aire en interiores y exteriores, sistemas automáticos de intercambio, sistemas de ventilación inteligente, integración en dispositivos móviles portátiles alimentados por baterías, así como proyectos de Internet de las Cosas (IoT), Industria 4.0 y casas inteligentes (Smart Home).</td></tr><tr><td><strong>Módulo</strong></td><td><a href="https://www.bosch-sensortec.com/products/environmental-sensors/gas-sensors/bme690/">BME690</a></td></tr><tr><td><strong>Fabricante</strong></td><td><a href="https://www.bosch-sensortec.com/">Bosch®</a></td></tr><tr><td><strong>Características</strong></td><td>Medición de compuestos orgánicos volátiles (VOCs), compuestos volátiles de azufre (VSCs), presión barométrica de 300 - 1100 hPa, humedad relativa de 0 - 100%, temperatura ambiental de -40 a 85 °C y modo de consumo ultra bajo de 50 µA.</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 del fabricante en el siguiente link: [**Datos Técnicos**](https://www.bosch-sensortec.com/products/environmental-sensors/gas-sensors/bme688/)
{% endhint %}

## **IV. Pinout**

La siguiente tabla muestra el pinout del **X-NODE Environmental AI (BME690)** 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%2FoWpBaMt6iDvFcTQ8PTaR%2FX-NODE%20XN09%20BME688%20Sensor%20IA_Bosch_Pinour_XIDE_Microside.webp?alt=media&#x26;token=c51f8869-dd90-4ced-b1ea-8050ca9fba2f" 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 nativa a través de protocolo I2C y SPI.

{% hint style="warning" %}
Al usar el protocolo **SPI** se deshabilita el controlador en hardware por lo que no funcionará con comandos ASCII a través de comunicación **UART**.&#x20;
{% endhint %}

### Protocolo UART

#### 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 ](#ii.-descripcion-del-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**.

{% hint style="warning" %}
El protocolo **UART** utiliza la interfaz **I2C** del sensor, por lo que no puede conectar más de un **X-NODE Environmental AI (BME690)** en el mismo bus, también deberá evitar conectar dispositivos que utilicen la misma dirección (0x77 o 0x76), recuerde que puede modificar la dirección del dispositivo con el jumper **ADD.**

Si desea utilizar más de un mismo nodo **X-NODE Environmental AI (BME690)** con el protocolo **UART** deberá aislar los pines **SDA** y **SCL** entre los nodos y asignar un índice único a cada nodo.

También puede hacer uso de la interfaz **SPI** del sensor, lo que **deshabilitará** el protocolo **UART**, utilizando los pines **CS1** o **CS2** para seleccionar el dispositivo en uso. Para hacer uso de este protocolo deberá portar el API del sensor ([disponible en GitHub](https://github.com/boschsensortec/BME690_SensorAPI)) al lenguaje de programación que utilice su sistema.
{% endhint %}

<figure><img src="https://177299348-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FXd7OX7GqKWlz4fdJedqy%2Fxn21-r1-uart-protocol-index-rule.png?alt=media&#x26;token=55c2630f-4ca6-461c-aaba-c8d1d826e12f" alt="XN04_X-NODE"><figcaption></figcaption></figure>

{% hint style="warning" %}
**Nota:** A partir de este punto se usará el índice predeterminado del **X-NODE Environmental AI (BME690)** para el resto del manual: **XN21A**.
{% endhint %}

#### Lista de comandos

<table data-header-hidden data-full-width="false"><thead><tr><th width="159"></th><th></th><th data-hidden></th></tr></thead><tbody><tr><td><strong>XN21A?</strong></td><td><p>Verifica si se estableció una comunicación con éxito.</p><p></p><p><strong>Respuesta:</strong> OK</p></td><td></td></tr><tr><td><strong>XN21A+V</strong></td><td><p>Obtiene la versión del firmware actual que integra el X-NODE.</p><p></p><p><strong>Respuesta:</strong> XN21A=Versión_FW.Revision_HW</p><p>        <strong>Ejemplo:</strong> XN21A=0.1.0.R01</p></td><td></td></tr><tr><td><strong>XN21A+ID=(A-Z)</strong></td><td><p>Cambia el index 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 index.</p><p></p><p><strong>Respuesta:</strong> OK</p><p>       <strong>Ejemplo de envío:</strong> XN21C+ID=H</p></td><td></td></tr><tr><td><strong>XN21A+GT</strong></td><td><p>Obtiene el valor de Temperatura del sensor. Retorna con el valor final en °C con dos decimales.</p><p></p><p><strong>Respuesta:</strong> XN21A=VAL</p><p>       <strong>Ejemplo:</strong> XN21A=24.36</p></td><td></td></tr><tr><td><strong>XN21A+GH</strong></td><td><p>Obtiene el valor de Humedad del sensor. Retorna con un valor relativo (%) de humedad.</p><p></p><p><strong>Respuesta:</strong> XN21A=VAL</p><p>       <strong>Ejemplo:</strong> XN21A=68.14</p></td><td></td></tr><tr><td><strong>XN21A+GP</strong></td><td><p>Obtiene el valor de Presión barométrica del sensor. Retorna con el valor final en hPa con dos decimales.</p><p></p><p><strong>Respuesta:</strong> XN21A=VAL</p><p>       <strong>Ejemplo:</strong> XN21A=778.40</p></td><td></td></tr><tr><td><strong>XN21A+GR</strong></td><td><p>Obtiene el valor de la resistencia asociada al gas (H2S) del sensor*. Retorna con el valor de la resistencia ambiental en kOhms.</p><p></p><p><strong>Respuesta:</strong> XN21A=VAL</p><p>       <strong>Ejemplo:</strong> XN21A=38.72</p></td><td></td></tr></tbody></table>

{% hint style="warning" %}
**\*Nota**: Las mediciones de resistencia asociada al gas (H2S) utilizan una placa calefactora embebida en el dispositivo. Después de encendido el dispositivo el usuario deberá realizar la lectura de al menos una variable en un intervalo de 1 a 2 segundos hasta que se estabilice el valor de resistencia del gas para obtener mediciones precisas.&#x20;
{% endhint %}

#### **Comandos avanzados**

<table data-header-hidden data-full-width="false"><thead><tr><th width="159"></th><th></th><th data-hidden></th></tr></thead><tbody><tr><td><strong>XN21A+SLP</strong></td><td><p>Habilita el modo de descanso profundo del dispositivo para reducir el consumo de energía y deshabilitar el driver <strong>UART.</strong> Si el jumper <strong>UPDI</strong> está habilitado puede salir del modo de descanso profundo escriba un lógico bajo (0) al pin <strong>CS1</strong>.</p><p><strong>Respuesta:</strong> OK</p><p><strong>Ejemplo de envío:</strong> XN21A+SLP</p></td><td></td></tr><tr><td><strong>XN21A+RST</strong></td><td><p>Reinicia el dispositivo, el sensor se reconfigurará bajo los siguientes parámetros:</p><p>Oversampling THP = 16X</p><p>Calefactor (°C/ms) = 350 / 150</p><p><strong>Respuesta:</strong> OK<br><strong>Ejemplo de envío:</strong> XN21A+RST</p></td><td></td></tr></tbody></table>

### 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/x-nodes/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("XN21A=")) {
    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("XN21A+GT\r\n");

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

  // Envía el comando para obtener la presión
  float press = getVariable("XN21A+GP\r\n");
  
  // Envía el comando para obtener la resistencia
  float res = getVariable("XN21A+GR\r\n");

  Serial.print("Temp: ");
  Serial.print(temp);
  Serial.println(" °C");
  Serial.print("Hum: ");
  Serial.print(hum);
  Serial.println(" %");
  Serial.print("Press: ");
  Serial.print(press);
  Serial.println(" hPa");
  Serial.print("Gas: ");
  Serial.print(res);
  Serial.println(" kOhm");

  delay(1000);
}
```

### Protocolo I2C & SPI

Para poder establecer comunicación con el **X-NODE Environmental AI (BME690)** es necesario hacerlo de forma nativa con el sensor integrado y con apoyo de la documentación técnica del fabricante, podrás localizar el número de parte al reverso del X-NODE (Punto 13 del apartado “Descripción de Hardware”) además de jumpers para cambiar el address I2C, el pin Chip Select para SPI y seleccionar entre el protocolo I2C y SPI.

{% hint style="info" %}
Puedes descargar la documentación técnica del fabricante en el siguiente link: [**Datos Técnicos**](https://www.bosch-sensortec.com/products/environmental-sensors/gas-sensors/bme690/)
{% endhint %}

## **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%2FfYXGnidJAkR6T5umuum7%2Fxn21-r1-schematic.pdf?alt=media&#x26;token=ac4c7fc5-1691-4404-bade-b607176fd507">https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FfYXGnidJAkR6T5umuum7%2Fxn21-r1-schematic.pdf?alt=media&#x26;token=ac4c7fc5-1691-4404-bade-b607176fd507</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%2FcGJ7OxC1y4GMGbJJcYzH%2Fxn21-r1-dimensions.pdf?alt=media&#x26;token=614f0216-b810-43e5-95e3-a3a7a456f70e">https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FcGJ7OxC1y4GMGbJJcYzH%2Fxn21-r1-dimensions.pdf?alt=media&#x26;token=614f0216-b810-43e5-95e3-a3a7a456f70e</a></td></tr></tbody></table>
