Construya un lector de volumen de tanque por menos de $30 usando ESP32

María Hernández
· 7 minutos de lectura
Enviar por correo electrónico

El Internet de las Cosas ha traído consigo numerosas aplicaciones de dispositivos que antes eran complejas a los hogares de muchos cerveceros y vinicultores artesanales. Las aplicaciones con sensores de nivel se han utilizado durante décadas en grandes refinerías, plantas de tratamiento de agua y plantas químicas. Con la caída de los precios de los sensores, ahora tanto los industriales como los aficionados pueden monitorizar el volumen de cualquier tanque, barril o bidón.

Los sensores disponibles en el mercado pueden detectar prácticamente cualquier cosa y se clasifican según sus características. El sensor utilizado para medir la humedad se denomina sensor de humedad, el sensor de presión , el sensor de distancia, sensor de posición, etc. De forma similar, el sensor utilizado para medir el nivel de fluidos se denomina sensor de nivel .

Los sensores de nivel se utilizan para medir el nivel de sustancias fluidas . Estas sustancias incluyen líquidos como agua, aceite, lodos, etc., así como sólidos en forma de gránulos o polvo (sólidos que pueden fluir). Estas sustancias tienden a sedimentarse en los tanques contenedores por gravedad y mantienen su nivel en reposo.

En esta guía aprenderá a construir su propio de nivel, temperatura y humedad . También incluye instrucciones para utilizar los datos recién recopilados a través de Ubidots , una plataforma de desarrollo de aplicaciones.

Requisitos

Cableado y carcasa

El sensor HC-SR04 (sensor ultrasónico) funciona con una tensión lógica de 5 V. Siga la tabla y el diagrama a continuación para realizar las conexiones correctas entre el ESP32 y el sensor ultrasónico:

Por favor, siga la siguiente tabla para realizar las conexiones correctas entre el ESP32 y el DHT11 (sensor de temperatura y humedad):

Construí un pequeño prototipo con un tanque de tamaño escalable para mostrar las funciones del sensor, pero un prototipo final con su carcasa debería verse así:

Como podéis observar el sensor ultrasónico debe estar en la parte superior del tanque, con él vamos a poder medir la distancia entre la parte superior del tanque y el punto final de la sustancia:

Coloque los sensores de temperatura y humedad para monitorear un ambiente.

Para programar su dispositivo conectado, conéctese con el IDE de Arduino.

Antes de empezar con el ESP32, configure su placa con el IDE de Arduino. Si no está familiarizado con la configuración de una placa, consulte el artículo a continuación y siga paso a paso hasta compilar la placa:

Una vez compilada su placa, instale las bibliotecas necesarias para ejecutar los sensores: “ PubSubClient ” y “ DHT:

  1. Vaya a Sketch/Programa -> Biblioteca de inclusión -> Administrador de bibliotecas e instale la PubSubClient . Para encontrar la biblioteca correcta, busque "PubSubClient" en la barra de búsqueda.
  2. Vaya al repositorio de la biblioteca para descargar la biblioteca DHT . Para descargarla, haga clic en el botón verde " Clonar o descargar " y seleccione " Descargar ZIP ".
  3. Ahora, de vuelta en el IDE de Arduino, haga clic en Sketch -> Incluir biblioteca -> Agregar biblioteca .ZIP
  4. Seleccione el archivo .ZIP de DHT y luego “ Aceptar ” o “ Elegir

Cierre el IDE de Arduino y vuelva a abrirlo. Es necesario reiniciarlo; no omita este paso.

Ahora es el momento de empezar a codificar 🙂

Copie el código a continuación y péguelo en el IDE de Arduino.

A continuación, asigne los parámetros: nombre y contraseña de la red Wi-Fi, además de su token Ubidots . Si no sabe cómo localizar su token Ubidots , consulte este artículo.

/************************************************************************************************* * Este ejemplo envía datos codificados a Ubidots usando un ESP32. El código envía un valor de distancia * entre un dispositivo y su punto final opuesto a Ubidots, luego el valor se administrará en * Ubidots para calcular el volumen de un tanque con las características de su tanque. * * Este ejemplo se proporciona TAL CUAL sin ninguna garantía. * * Hecho por María Carlina Hernandez. ****************************************************************************************************/ /******************************************* * Bibliotecas de inclusión ****************************************/ #include<WiFi.h> #incluir<PubSubClient.h> #incluir<DHT.h> /**************************************** * Definir constantes ****************************************/ namespace { const char * WIFISSID = "Assign_your_wifi_SSID_here"; // Coloque su WifiSSID aquí const char * PASSWORD = "Assign_your_wifi_SSID_here"; // Coloque su contraseña de wifi aquí const char * TOKEN = "Assign_your_Ubidots_token_here"; // Coloque su TOKEN de Ubidotsconst char * MQTT_CLIENT_NAME = "Assign_MQTT_client_here"; // Nombre del cliente MQTT, ingrese su propia cadena ASCII de 8 a 12 caracteres alfanuméricos; const char * VARIABLE_LABEL_1 = "distancia"; // Asignar la etiqueta de la variable const char * VARIABLE_LABEL_2 = "humedad"; // Asignando la etiqueta de la variable const char * VARIABLE_LABEL_3 = "temperature"; // Asignando la etiqueta de la variable const char * DEVICE_LABEL = "esp32"; // Asignando la etiqueta del dispositivo const char * MQTT_BROKER = "things.ubidots.com"; const int DHTPIN = 33; // Pin donde está conectado el DHT11 const int DHTTYPE = DHT11; // Tipo de DHT const int trigPin = 16; // Pin de disparo del HC-SR04 const int echoPin = 17; // Pin de eco del HC-SR04 } /* Declaraciones del sensor */ long duration; float distance; /* Espacio para almacenar la petición */ char payload[300]; char topic[150]; /* Espacio para almacenar los valores a enviar */ char str_sensor[10]; char str_TempSensor[10]; char str_HumSensor[10]; /**************************************** * Funciones auxiliares ****************************************/ WiFiClient ubidots; PubSubClient client(ubidots); DHT dht(DHTPIN, DHTTYPE); 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() { // Repetir hasta que nos volvamos a conectar while (!client.connected()) { Serial.println("Intentando conexión MQTT..."); // Intentar conectar if (client.connect(MQTT_CLIENT_NAME, TOKEN, "")) { Serial.println("Conectado"); } else { Serial.print("Error, rc="); Serial.print(client.state()); Serial.println("inténtalo de nuevo en 2 segundos"); // Espera 2 segundos antes de volver a intentarlo delay(2000); } } } /**************************************** * Funciones del sensor ****************************************/ float readDistance() { digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = (pulseIn(echoPin, HIGH)); distance = float(duration/29/2); return distance; } /**************************************** * Funciones principales *****************************************/ void setup() { Serial.begin(115200); WiFi.begin(WIFISSID, PASSWORD); /* Inicializando el DHT11 */ dht.begin(); /* Asignar los PINS como ENTRADA/SALIDA */ pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); Serial.println(); Serial.print("Esperar 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(); } /* Leyendo temperatura y humedad */ float humidity = dht.readHumidity(); float temperature = dht.readTemperature(); /* llamar a la función readDistance() */ distance = readDistance(); /* 4 es el ancho mínimo, 2 es precisión; el valor float se copia en str_sensor*/ dtostrf(distance, 4, 2, str_sensor); dtostrf(humidity, 4, 2, str_HumSensor); dtostrf(temperature, 4, 2, str_TempSensor); /* Construyendo la solicitud Ubidots */ sprintf(topic, "%s%s", "/v1.6/devices/", DEVICE_LABEL); sprintf(payload, "%s", ""); // Limpia la carga útil sprintf(payload, "{"%s": %s,", VARIABLE_LABEL_1, str_sensor); // Agrega la etiqueta de la variable sprintf(payload, "%s"%s": %s,", payload, VARIABLE_LABEL_2, str_HumSensor); // Agrega la etiqueta de la variable sprintf(payload, "%s"%s": %s}", payload, VARIABLE_LABEL_3, str_TempSensor); // Agrega la etiqueta de la variable //sprintf(payload, "%s {"value": %s}}", payload, str_sensor); /* Imprime la lectura del sensor en el Serial Monitor */ Serial.println("Publicando valores en Ubidots Cloud"); Serial.print("Distancia = "); Serial.println(distancia); Serial.print("Humedad = "); Serial.println(humedad); Serial.print("Temperatura = "); Serial.println(temperatura); /* Publica la solicitud en Ubidots */ client.publish(topic, payload); cliente.loop(); retraso(1000); }

Una vez que hayas pegado tu código y asignado la red wifi adecuada, verifícalo en el IDE de Arduino. Para verificar, en la esquina superior izquierda del IDE de Arduino verás los siguientes iconos. Selecciona el icono de la marca de verificación para verificar cualquier código.

Una vez verificado, recibirás un mensaje de “ Compilación terminada ” en el IDE de Arduino.

A continuación, sube el código a tu ESP32. Selecciona el icono de la flecha derecha junto a la marca de verificación para subirlo.

Una vez cargado, recibirás un mensaje de “ Carga finalizada ” en el IDE de Arduino.

Con esto, el sensor ahora está enviando los datos al Ubidots ¡Podría!

Gestión de datos en Ubidots

Si tu dispositivo está conectado correctamente, verás un nuevo dispositivo creado en la sección de dispositivos de la Ubidots . El nombre del dispositivo será " esp32 ". Dentro del dispositivo, también verás las variables distancia, humedad y temperatura:

Si desea cambiar los nombres de sus dispositivos y variables a unos más amigables, consulte este artículo:

A continuación, para calcular el volumen de sustancias que fluyen libremente en el tanque, necesitamos crear una variable derivada para calcular un valor de volumen.

La Variable Derivada nos permite construir operaciones utilizando las variables por defecto, así en este caso vamos a aplicar la del volumen con la característica de un tanque cilíndrico donde:

  • Pi = La relación entre la circunferencia de un círculo y su diámetro (constante)
  • r = El radio del tanque
  • h = La altura del tanque

Haga clic en “ Agregar variable ” y seleccione “ Sintético ”:

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

Una vez que hayas adjuntado la fórmula con las características de tu tanque, selecciona la variable “ distancia

Con tu fórmula ingresada, tu volumen comenzará a leerse en tu aplicación Ubidots .

Resultados

¡Tu sensor ya está listo para funcionar! A continuación, puedes ver el funcionamiento del sensor de nivel a diferentes volúmenes:

Para obtener más información sobre Ubidots , consulte estos videos tutoriales .

Feliz hackeo 🙂