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

El Internet de las cosas ha llevado muchas aplicaciones de dispositivos que antes eran complejas a los hogares de muchos cerveceros y enólogos 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 el sector industrial como el bricolaje pueden controlar el volumen de cualquier tanque, barril o recipiente.

Los sensores disponibles en el mercado pueden detectar casi cualquier cosa y están clasificados en consecuencia. El sensor utilizado para medir la humedad se denomina sensor de humedad, el de presión se denomina sensor de presión , el de distancia se denomina sensores de posición, etc. De manera similar, el sensor utilizado para medir los niveles de fluidos se llama sensor de nivel .

Los sensores de nivel se utilizan para medir el nivel de sustancias que fluyen libremente . Dichas sustancias incluyen líquidos como agua, aceite, lodos, etc., así como sólidos en forma granular/en polvo (sólidos que pueden fluir). Estas sustancias tienden a sedimentarse en los tanques contenedores debido a la gravedad y mantener su nivel en estado de reposo.

En esta guía aprenderás a construir tu propio sensor de nivel, temperatura y . También se incluyen instrucciones para que los datos recién recopilados se utilicen a través de Ubidots , una plataforma de habilitación de aplicaciones.

Requisitos

Cableado y carcasa

El sensor HC-SR04 (Sensor Ultrasónico) funciona con lógica de 5V. 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 a escala para mostrar las funciones del sensor, pero un prototipo final con su carcasa debería verse así:

Como veis el sensor ultrasónico debe estar en la parte superior del tanque, así que 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 comenzar con el ESP32, configura tu placa con el IDE de Arduino. Si no está familiarizado con la configuración de un tablero, consulte el artículo siguiente y siga paso a paso hasta que haya compilado el tablero:

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

  1. Vaya a Sketch/Program -> Incluir biblioteca -> Administrador de biblioteca e instale la PubSubClient . Para encontrar simplemente la biblioteca correcta, busque PubSubClient en la barra de búsqueda.
  2. Vaya al repositorio de la biblioteca para descargar la biblioteca DHT . Para descargar la biblioteca haga clic en el botón verde llamado “ 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

Cierra el IDE de Arduino y ábrelo nuevamente. Es necesario reiniciar; por favor no te saltes 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 Wi-Fi, además de su TOKEN exclusivo Ubidots . Si no sabe cómo localizar su TOKEN Ubidots , consulte este artículo a continuación.

/*************************************************** ************************************************ * Este El 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 será administrado en * Ubidots para calcular el volumen de un tanque con las características de su tanque. * * Este ejemplo se proporciona TAL CUAL ESTÁ sin garantía alguna. * *Realizado por María Carlina Hernández. ************************************************** ***********************************************/ /* ************************************** * Incluir bibliotecas ******** ********************************/ #incluir<WiFi.h> #incluir<PubSubClient.h> #incluir<DHT.h> /****************************************** * Definir constantes ****** ********************************/ espacio de nombres { const char * WIFISSID = "Assign_your_wifi_SSID_here"; // Pon tu WifiSSID aquí const char * PASSWORD = "Assign_your_wifi_SSID_here"; // Pon tu contraseña wifi aquí const char * TOKEN = "Assign_your_ Ubidots _token_here"; // Pon tu TOKEN de Ubidots const 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"; // Evaluación de la etiqueta de variable const char * VARIABLE_LABEL_2 = "humidity"; // Asignando la etiqueta de variable const char * VARIABLE_LABEL_3 = "temperatura"; // Asignando la etiqueta de variable const char * DEVICE_LABEL = "esp32"; // Asigna la etiqueta del dispositivo const char * MQTT_BROKER = " ubidots .com"; constante int DHTPIN = 33; // Pin donde está conectado el DHT11 const int DHTTYPE = DHT11; // Tipo de DHT const int trigPin = 16; // Pin de activación del HC-SR04 const int echoPin = 17; // Pin de eco del HC-SR04 } /* Declaraciones del sensor */ larga duración; distancia de flotación; /* Espacio para almacenar la solicitud */ char payload[300]; tema de conversación[150]; /* Espacio para almacenar valores a enviar */ char str_sensor[10]; char str_TempSensor[10]; char str_HumSensor[10]; /**************************************** * Funciones auxiliares ****** ********************************/ WiFiClient ubidots ; Cliente PubSubClient ( ubidots ); DHT dht(DHTPIN, DHTTYPE); devolución de llamada vacía (tema char*, carga útil byte*, longitud int sin signo) { char p[longitud + 1]; memcpy(p, carga útil, longitud); p[longitud] = NULO; Mensaje de cadena (p); Serial.write(carga útil, longitud); Serial.println(tema); } void reconnect() { // Bucle hasta que nos volvamos a conectar while (!client.connected()) { Serial.println("Intentando conexión MQTT..."); // Intenta conectar if (client.connect(MQTT_CLIENT_NAME, TOKEN, "")) { Serial.println("Conectado"); } else { Serial.print("Error, rc="); Serial.print(cliente.estado()); Serial.println("inténtalo de nuevo en 2 segundos"); // Espere 2 segundos antes de volver a intentarlo delay(2000); } } } /****************************************** * Funciones del sensor *** ***********************************/ float readDistance() { digitalWrite(trigPin, ALTA); retrasoMicrosegundos(10); escritura digital (trigPin, BAJO); duración = (pulseIn(echoPin, ALTA)); distancia = flotador(duración/29/2); distancia de retorno; } /****************************************** * Funciones principales ***** ***********************************/ void setup() { Serial.begin(115200); WiFi.begin(WIFISSID, CONTRASEÑA); /* Inicializando el DHT11 */ dht.begin(); /* Asigna los PINS como ENTRADA/SALIDA */ pinMode(trigPin, OUTPUT); pinMode(echoPin, ENTRADA); Serie.println(); Serial.print("Espera WiFi..."); mientras (WiFi.status() != WL_CONNECTED) { Serial.print("."); retraso(500); } Serial.println(""); Serial.println("WiFi conectado"); Serial.println("Dirección IP: "); Serial.println(WiFi.localIP()); cliente.setServer(MQTT_BROKER, 1883); client.setCallback(devolución de llamada); } bucle vacío() { if (!client.connected()) { reconectar(); } /* Lectura de temperatura y humedad */ float humedad = dht.readHumidity(); temperatura flotante = dht.readTemperature(); /* llamar a la función readDistance() */ distancia = readDistance(); /* 4 es ancho mínimo, 2 es precisión; el valor flotante se copia en str_sensor*/ dtostrf(distance, 4, 2, str_sensor); dtostrf(humedad, 4, 2, str_HumSensor); dtostrf(temperatura, 4, 2, str_TempSensor); /* Construyendo la solicitud Ubidots */ sprintf(topic, "%s%s", "/v1.6/devices/", DEVICE_LABEL); sprintf(carga útil, "%s", ""); // Limpia la carga útil sprintf(payload, "{"%s": %s,", VARIABLE_LABEL_1, str_sensor); // Agrega la etiqueta de variable sprintf(payload, "%s"%s": %s,", payload, VARIABLE_LABEL_2, str_HumSensor); // Agrega la etiqueta de 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 monitor serie */ Serial.println("Publicación de valores en Ubidots Cloud"); Serial.print("Distancia = "); Serial.println(distancia); Serial.print("Humedad = "); Serial.println(humedad); Serial.print("Temperatura = "); Serial.println(temperatura); /* Publicar la solicitud en Ubidots */ client.publish(topic, payload); cliente.loop(); retraso(1000); }

Una vez que haya pegado su código y asignado el wifi apropiado, verifique en el IDE de Arduino. Para verificar, en la esquina superior izquierda de nuestro IDE de Arduino verá los siguientes íconos. Elija el ícono de marca de verificación para verificar cualquier código.

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

Luego, cargue el código en su ESP32. Elija el ícono de flecha hacia la derecha al lado del ícono de marca de verificación para cargar.

Una vez cargado, recibirá un mensaje " Listo para cargar " en el IDE de Arduino.

¡Con esto, el sensor ahora envía los datos al Ubidots Could!

Gestión de los datos en Ubidots

Si su dispositivo está conectado correctamente, verá un nuevo dispositivo creado dentro de la sección de su dispositivo en su Ubidots . El nombre del dispositivo será “ esp32 ”, además dentro del dispositivo verás las variables distancia, humedad y temperatura:

Si desea cambiar su dispositivo y los nombres de las variables por uno más amigable, 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 usando las variables por defecto, por lo que en este caso vamos a aplicar la de 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 tienes que 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 su fórmula ingresada, su volumen comenzará a leerse en su aplicación Ubidots .

Resultados

¡Ahora su sensor está listo para comenzar a funcionar! A continuación puedes ver el funcionamiento del sensor de nivel en diferentes volúmenes:

Para obtener más información sobre Ubidots , consulte estos tutoriales en vídeo .

Feliz piratería 🙂