Ir al contenido principal
Todas las coleccionesTutoriales de proyectos IoT
Construir un Lector de Volumen y Presencia Industrial con Sensor Ultrasonido MaxBotix + ESP32
Construir un Lector de Volumen y Presencia Industrial con Sensor Ultrasonido MaxBotix + ESP32

Aprende a construir un lector de volumen y presencia robusto e impermeable para crear, monitorear y gestionar información desde Ubidots.

Sergio M avatar
Escrito por Sergio M
Actualizado hace más de 3 meses

¿Estás buscando ensamblar un lector de volumen de tanque industrial utilizando la precisión de sensores ultrasónicos, pero también mantener el desarrollo y las pruebas simples? ¡Bueno, tenemos la solución para ti!

MaxBotix Inc ha estado innovando en la industria de sensores ultrasónicos durante más de 10 años, diseñando sensores asequibles para aumentar inteligentemente la calidad y el valor de los contenidos dentro de los tanques industriales. Los beneficios más atractivos de los sensores MaxBotix para los usuarios incluyen:

  • Montaje simple

  • Bajos requisitos de energía

  • Selección de múltiples salidas

  • Alta estabilidad de lectura

  • Patrones de haz calibrados

Los sensores ultrasónicos MaxBotix tienen una amplia variedad de aplicaciones industriales, incluyendo pero no limitándose a:

  • detección de personas y unidades

  • medición remota de contenedores / tanques

  • exhibiciones automatizadas en tiendas, medición de nivel de agua, sensores de estacionamiento y más!

Para obtener información detallada sobre los sensores ultrasónicos MaxBotix disponibles, visita su sitio web oficial.

Para darte una idea general de cómo funcionan los sensores MaxBotix, en esta guía vamos a cubrir cómo construir un lector de volumen de tanque utilizando un sensor MaxBotix conectado a un ESP32-DevKitC, para luego transmitir los datos leídos por el sensor a Ubidots a través de WiFi utilizando MQTT como protocolo de comunicación.

¡Ahora es el momento de empezar a hackear y construir cosas increíbles juntos! :)

Requisitos

1. Configuración de Hardware

Establece la conexión entre el sensor ultrasónico y el ESP32-DevKitC utilizando las instrucciones a continuación.

1. Sigue la tabla de pines a continuación para establecer una conexión entre el ESP32-DevKitC y el sensor MB7389:

2. [OPCIONAL] Para pruebas de PoC y usos en producción, asegúrate de encerrar el hardware en una carcasa adecuada para el clima. Las imágenes a continuación son una buena referencia para carcasas resistentes a líquidos viables.

NOTA IMPORTANTE: Ten en cuenta que hay muchos factores importantes a considerar antes de montar un sensor en un tanque, por lo que te recomendamos encarecidamente consultar esta guía de MaxBotix para evitar cualquier inconveniente/problemas en las lecturas del sensor.

2. Configura el ESP32 con el Arduino IDE

Para comenzar este tutorial, comenzaremos conectando tu ESP32 al puerto USB de tu computadora para programar el dispositivo.

1. Comienza descargando el Arduino IDE, si no lo has hecho ya.

2. A continuación, instala la plataforma ESP32 en tu Arduino IDE. Consulta los siguientes enlaces según tu sistema operativo. Los siguientes enlaces de Espressif te indicarán que instales el ESP32 en tu computadora.

Nota: Si estás utilizando sistemas operativos Linux o Mac, se requiere un paso adicional ya que necesitas instalar la plataforma ESP32 en el Arduino IDE desde la terminal de tu computadora primero. Usa los enlaces a continuación para ejecutar las funciones de terminal requeridas y luego regresa a esta guía para continuar con la integración del ESP32.

Imagen de referencia usando una terminal de MacOS:

3. Después de instalar la plataforma ESP32 utilizando los enlaces de Espressif Systems anteriores, se te pedirá que reinicies el Arduino IDE - asegúrate de hacerlo.

4. Después del reinicio, selecciona tu Módulo Dev ESP32 del menú Herramientas– > Placa.

5. Además, necesitamos poder comunicarnos con el ESP32. Asegurémonos de seleccionar la ubicación de comunicación del puerto. Ve a Herramientas –> Puerto > Selecciona el PUERTO apropiado para tu dispositivo.

NOTA: Si estás utilizando Windows, necesitas establecer una conexión serie entre el ESP32 y tu computadora, consulta este enlace para instalar los controladores necesarios y verificar la conexión. Además, como usuario de MAC o Linux, el enlace describe cómo verificar la comunicación serie si así lo deseas.

6. A continuación, descarga e instala la PubSubClient Biblioteca. Para una explicación detallada de cómo instalar bibliotecas usando el Arduino IDE, consulta esta guía.

3. Configuración del Firmware

Con la placa y la biblioteca ya configuradas en el Arduino IDE, es hora de programar el ESP32-DevKitC.

1. Copia el código a continuación y pégalo en el Arduino IDE; asignando los parámetros correctos requeridos: nombre de Wi-Fi y contraseña, nombre del cliente MQTT más tu TOKEN de Ubidots único. Si no sabes cómo localizar tu TOKEN de Ubidots, consulta este artículo a continuación.

/************************************************************************************************* * Este ejemplo envía datos codificados a Ubidots usando un ESP32-DevKitC. El código envía un valor de distancia  * entre un sensor ultrasónico y la superficie del agua detectada por un sensor MB7389  * HRXL-MaxSonar-WRMT. Luego, el valor será gestionado en Ubidots para calcular el volumen  * de sustancias de flujo libre en el tanque. *  * Este ejemplo se proporciona TAL CUAL sin ninguna garantía. *  * Hecho por María Carlina Hernandez. * 28 de noviembre de 2018. *************************************************************************************************//**************************************** * Incluir bibliotecas ****************************************/#include <WiFi.h>#include <PubSubClient.h>/**************************************** * Definir constantes ****************************************/namespace {  const char * WIFISSID = "xxxxx"; // Pon tu WifiSSID aquí  const char *  PASSWORD = "xxxxx"; // Pon tu contraseña de wifi aquí  const char * TOKEN = "xxxxx"; // Pon tu TOKEN de Ubidots  const char * MQTT_CLIENT_NAME = "xxxxx"; // Nombre del cliente MQTT, asigna una cadena ASCII única de 8-12 caracteres alfanuméricos;   const char * VARIABLE_LABEL = "distance"; // Asigna la etiqueta de la variable  const char * DEVICE_LABEL = "esp32"; // La dirección MAC del dispositivo se asignará como etiqueta del dispositivo  const char * MQTT_BROKER = "industrial.api.ubidots.com";  const int ANALOG_PIN_0 = 36; // ADC1_0 GPIO36  int analog_value, distance_mm, distance_cm;}/* Declaraciones del sensor */int distance;/* Espacio para almacenar la solicitud */char payload[50];char topic[50];/**************************************** * Funciones auxiliares ****************************************/WiFiClient ubidots;PubSubClient client(ubidots);void callback(char* topic, byte* payload, unsigned int length) {  char p[length + 1];  memcpy(p, payload, length);  p[length] = NULL;  String message(p);  Serial.write(payload, length);  Serial.println(topic);}void reconnect() {  // Bucle hasta que estemos reconectados  while (!client.connected()) {    Serial.println("Intentando conexión MQTT...");        // Intentar conectar    if (client.connect(MQTT_CLIENT_NAME, TOKEN, "")) {      Serial.println("Conectado");    } else {      Serial.print("Fallido, rc=");      Serial.print(client.state());      Serial.println(" intenta de nuevo en 2 segundos");      // Espera 2 segundos antes de reintentar      delay(2000);    }  }}/**************************************** * Funciones del sensor ****************************************/int readDistance() {  analog_value = analogRead(ANALOG_PIN_0);  distance_mm = analog_value;  distance_cm = distance_mm / 10;  return distance_cm;}/**************************************** * Funciones principales ****************************************/void setup() {  Serial.begin(115200);  WiFi.begin(WIFISSID, PASSWORD);  Serial.println();  Serial.print("Esperando WiFi...");    while (WiFi.status() != WL_CONNECTED) {    Serial.print(".");    delay(500);  }    Serial.println("");  Serial.println("WiFi Conectado");  Serial.println("Dirección IP: ");  Serial.println(WiFi.localIP());  client.setServer(MQTT_BROKER, 1883);  client.setCallback(callback);  }void loop() {  if (!client.connected()) {    reconnect();  }    /* llama a la función readDistance() */  distance = readDistance();  /* Construyendo la solicitud de Ubidots */  sprintf(topic, "%s%s", "/v1.6/devices/", DEVICE_LABEL);  sprintf(payload, "%s", ""); // Limpia el payload  sprintf(payload, "{\"%s\": %d}", VARIABLE_LABEL, distance); // Agrega la etiqueta de la variable  Serial.println(topic);   /* Imprime la lectura del sensor en el Monitor Serial */  Serial.println("Publicando valores en la nube de Ubidots");  Serial.print("Distancia = ");  Serial.println(distance);    /* Publica la solicitud en Ubidots */  client.publish(topic, payload);  client.loop();  delay(1000);}

2. Después de asignar los parámetros requeridos, verifica el código en el Arduino IDE haciendo clic en el ícono "Marca de verificación" ubicado en la esquina superior izquierda del IDE.

Una vez verificado, recibirás un mensaje de "Compilación completada" en el Arduino IDE.

3. A continuación, sube el código a tu ESP32 haciendo clic en el ícono "flecha derecha" al lado del ícono de marca de verificación para subir.

Una vez subido, recibirás un mensaje de "Subida completada" en el Arduino IDE.

¡Ahora, tu dispositivo está transmitiendo datos a Ubidots!

4. Análisis y gestión de datos en Ubidots

Si tu dispositivo está correctamente conectado, verás un nuevo dispositivo creado automáticamente en la sección Dispositivos de tu cuenta de Ubidots. El nombre del dispositivo será "esp32", y después de hacer clic en el dispositivo, verás una variable llamada "distance" junto con cualquier otra variable que estés enviando a Ubidots:

Si deseas cambiar los nombres de tu dispositivo y variable a uno más amigable, consulta este artículo:

NOTA: Para un despliegue escalable fácil de dispositivos, te recomendamos encarecidamente asignar la dirección MAC del dispositivo como etiqueta del dispositivo. Para una explicación detallada de cómo se gestionan las etiquetas por Ubidots, consulta esta guía.

Ahora, el siguiente paso es calcular el volumen de sustancias de flujo libre en el tanque. Para esto, necesitamos crear una Variable Sintética para calcular un valor de volumen.

Variables Sintéticas es una herramienta que utiliza el Motor de Análisis de Ubidots que soporta cálculos matemáticos complejos. Básicamente, una "Variable Sintética" es una variable que resulta de la computación de otras variables dentro de Ubidots.

En este caso, vamos a aplicar la fórmula de volumen con las características de un tanque cilíndrico donde se va a colocar el sensor. La fórmula es:

Donde:

  • π (Pi) = La relación de la circunferencia de un círculo con su diámetro (constante)

  • r = El radio del tanque

  • h = La altura del tanque

Como resultado, tenemos que restar el valor de distancia (lectura del sensor) a la altura total del tanque, dándonos el siguiente resultado:

Para fines de prueba, vamos a usar un tanque de agua con las siguientes dimensiones:

  • Diámetro = 97 cm

  • Altura = 115 cm

1. Ahora, para crear la variable, ve a los dispositivos creados previamente y haz clic en "Agregar variable", luego selecciona "Sintéticos":

Como puedes ver en la nueva ventana, debes adjuntar la fórmula en el siguiente campo:

Basado en las dimensiones del tanque a utilizar, la fórmula final debería verse así:

pi * (48.5^2) * (115 - {variable})

Una vez que hayas adjuntado la fórmula con las características de tu tanque, selecciona la variable "distance." ¡Asegúrate de que el verificador de expresión de la fórmula esté en verde!

Para finalizar la creación de la variable, presiona "Aceptar" y asigna el nombre deseado a la variable. En mi caso, la llamé "volumen". El valor de la variable debería aparecer automáticamente después de la creación.

Además, puedes asignar las unidades del valor resultante, en este caso, "cm3" como puedes ver a continuación:

2. [OPCIONAL] Si se desea visualizar el valor del volumen en "L" en lugar de "cm3", puedes dividir por 1000 toda la fórmula o simplemente crear una nueva variable sintética para mantener ambos valores dentro de tu dispositivo. Teniendo como resultado algo como esto:

3. Ahora, con las variables creadas y actualizando datos correctamente, es hora de crear un tablero para visualizar los datos de una manera amigable.

NOTA IMPORTANTE: Para una explicación detallada sobre las características y cómo funcionan los Tableros de Ubidots, te recomendamos encarecidamente consultar esta guía.

Para crear un nuevo Tablero, ve a la sección "Datos" de tu cuenta de Ubidots y presiona "Tablero". Luego, selecciona el ícono de más ubicado en la parte superior derecha de la página y selecciona el widget deseado para mostrar tus datos. Luego, debes seleccionar la variable que deseas mostrar y establecer la configuración deseada para el widget.

En mi caso, creé dos widgets, "tanque" y "gráfico". Teniendo como resultado la siguiente visualización:

5. Resumen

Gracias a la variedad de sensores ultrasónicos ofrecidos por MaxBotix, puedes construir aplicaciones que incluyen, pero no se limitan a, detección de personas, medición remota de contenedores, exhibiciones automatizadas en tiendas, medición de nivel de agua, sensores de estacionamiento y más!

¡Ahora es tu momento de comenzar a crear una solución IoT que te mantenga a ti y a quienes necesitan saber informados y a tiempo!

¿Ha quedado contestada tu pregunta?