El Internet de las Cosas ha traído muchas aplicaciones de dispositivos que antes eran complejas a los hogares de muchos cerveceros artesanales y vinicultores. 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 la industria como los aficionados pueden monitorear el volumen de cualquier tanque, barril o recipiente.
Los sensores disponibles en el mercado abierto pueden detectar casi cualquier cosa y se clasifican en consecuencia. Los sensores utilizados para medir la humedad se denominan sensor de humedad, los de presión se llaman sensor de presión, los de distancia se llaman sensores de posición, y así sucesivamente. 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 de flujo libre. Tales sustancias incluyen líquidos como agua, aceite, lodos, etc., así como sólidos en forma granular/polvo (sólidos que pueden fluir). Estas sustancias tienden a asentarse en los tanques del contenedor debido a la gravedad y mantienen su nivel en estado de reposo.
En esta guía aprenderás cómo construir tu propio sensor de nivel, temperatura y humedad casero. También se incluyen instrucciones para que los datos que recolectes se utilicen a través de Ubidots, una plataforma de habilitación de aplicaciones.
Requisitos
Caja de protección de plástico
Cables
Cable Micro USB
Cuenta de Ubidots - para Licencias Educativas
Cuenta de Ubidots - para Licencias Empresariales/Industriales
Cableado y Caja
El sensor HC-SR04 (Sensor Ultrasonido) funciona con lógica de 5V. Por favor, sigue la tabla y el diagrama a continuación para hacer las conexiones correctas entre el ESP32 y el sensor ultrasonido:
Por favor, sigue la tabla a continuación para hacer 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 caja debería verse así:
Como puedes ver, el sensor ultrasonido debería estar en la parte superior del tanque, así que con él podremos medir la distancia entre la parte superior del tanque y el punto final de la sustancia:
Coloca los sensores de temperatura y humedad para monitorear el ambiente.
Para programar tu dispositivo conectado, conéctate con el Arduino IDE.
Antes de comenzar con el ESP32, configura tu placa con el Arduino IDE. Si no estás familiarizado con la configuración de una placa, consulta el artículo a continuación y sigue paso a paso hasta que hayas compilado la placa:
Una vez que tu placa esté compilada, instala las bibliotecas necesarias para ejecutar los sensores: "PubSubClient" y "DHT:"
Ve a Sketch/Programa -> Incluir Biblioteca -> Administrador de Bibliotecas e instala la biblioteca PubSubClient. Para encontrar la biblioteca correcta, busca PubSubClient en la barra de búsqueda.
2. Ve al repositorio de la biblioteca para descargar la biblioteca DHT. Para descargar la biblioteca, haz clic en el botón verde llamado "Clonar o descargar" y selecciona "Descargar ZIP".
3. Ahora, de vuelta en el Arduino IDE, haz clic en Sketch -> Incluir Biblioteca -> Agregar Biblioteca .ZIP
4. Selecciona el archivo .ZIP de DHT y luego “Aceptar” o “Elegir”
Si es exitoso, recibirás el mensaje a continuación en el Arduino IDE:
5. Cierra el Arduino IDE y ábrelo nuevamente. El reinicio es necesario; por favor no omitas este paso.
Ahora es momento de comenzar a codificar :)
Copia el código a continuación y pégalo en el Arduino IDE.
A continuación, asigna los parámetros: nombre y contraseña de Wi-Fi, además de tu TOKEN único de Ubidots. 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. El código envía un valor de distancia * entre un dispositivo y su punto final opuesto a Ubidots, luego el valor será gestionado en * Ubidots para calcular el volumen de un tanque con las características de tu tanque. * * Este ejemplo se da TAL CUAL sin ninguna garantía. * * Hecho por María Carlina Hernandez. *************************************************************************************************//**************************************** * Incluir Bibliotecas ****************************************/#include <WiFi.h>#include <PubSubClient.h>#include <DHT.h>/**************************************** * Definir Constantes ****************************************/namespace { const char * WIFISSID = "Asigna_tu_SSID_wifi_aquí"; // Pon tu WifiSSID aquí const char * PASSWORD = "Asigna_tu_contraseña_wifi_aquí"; // Pon tu contraseña wifi aquí const char * TOKEN = "Asigna_tu_token_Ubidots_aquí"; // Pon tu TOKEN de Ubidots const char * MQTT_CLIENT_NAME = "Asigna_nombre_MQTT_aquí"; // Nombre del cliente MQTT, por favor ingresa tu propia cadena ASCII de 8-12 caracteres alfanuméricos; const char * VARIABLE_LABEL_1 = "distancia"; // Asigna la etiqueta de la variable const char * VARIABLE_LABEL_2 = "humedad"; // Asigna la etiqueta de la variable const char * VARIABLE_LABEL_3 = "temperatura"; // Asigna la etiqueta de la variable const char * DEVICE_LABEL = "esp32"; // Asigna la etiqueta del dispositivo const char * MQTT_BROKER = "industrial.api.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 activación del HC-SR04 const int echoPin = 17; // Pin de eco del HC-SR04 }/* Declaraciones del sensor */long duration;float distance;/* Espacio para almacenar la solicitud */char payload[300];char topic[150];/* Espacio para almacenar 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() { // 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 ****************************************/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("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(); } /* Leyendo temperatura y humedad */ float humidity = dht.readHumidity(); float temperature = dht.readTemperature(); /* llama a la función readDistance() */ distance = readDistance(); /* 4 es el ancho mínimo, 2 es la 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 de Ubidots */ sprintf(topic, "%s%s", "/v1.6/devices/", DEVICE_LABEL); sprintf(payload, "%s", ""); // Limpia el payload 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); /* Imprimir la lectura del sensor en el Monitor Serial */ Serial.println("Publicando valores en la Nube de Ubidots"); Serial.print("Distancia = "); Serial.println(distance); Serial.print("Humedad = "); Serial.println(humidity); Serial.print("Temperatura = "); Serial.println(temperature); /* Publicar la solicitud en Ubidots */ client.publish(topic, payload); client.loop(); delay(1000);}
ver rawUbidots_LevelSensor_ESP32_MQTT.ino alojado con ❤ por GitHub
Una vez que hayas pegado tu código y asignado el wifi apropiado, verifica en el Arduino IDE. Para verificar, en la esquina superior izquierda de nuestro Arduino IDE verás los íconos a continuación. Elige el ícono de la Marca de Verificación para verificar cualquier código.
Una vez verificado, recibirás un mensaje "Compilación completada" en el Arduino IDE.
A continuación, sube el código a tu ESP32. Elige el ícono de la flecha hacia la derecha al lado del ícono de la marca de verificación para subir.
Una vez subido, recibirás un mensaje "Subida completada" en el Arduino IDE.
Con esto, ¡tu sensor ahora está enviando los datos a la Nube de Ubidots!
Gestión de los datos en Ubidots
Si tu dispositivo está correctamente conectado, verás un nuevo dispositivo creado dentro de tu sección de dispositivos en tu aplicación de Ubidots. El nombre del dispositivo será "esp32", también dentro del dispositivo verás las variables distancia, humedad y temperatura:
Si deseas cambiar los nombres de tu dispositivo y variables a uno más amigable, consulta este artículo:
A continuación, para calcular el volumen de sustancias de flujo libre en el tanque, necesitamos crear una variable derivada para calcular un valor de volumen.
La Variable Derivada nos permite construir operaciones utilizando las variables predeterminadas, así que en este caso vamos a aplicar la fórmula de volumen con las características de un tanque cilíndrico donde:
Pi = La relación de la circunferencia de un círculo a su diámetro (constante)
r = El radio del tanque
h = La altura del tanque
Haz clic en "Agregar variable" y selecciona "Sintética":
Adjunta la fórmula en el siguiente campo y selecciona la variable "distancia."
Con tu fórmula ingresada, tu volumen comenzará a leerse en tu aplicación de Ubidots.
Resultados
¡Ahora tu sensor está listo para comenzar a trabajar! A continuación puedes ver la función del sensor de nivel a diferentes volúmenes:
Para aprender más sobre los widgets y eventos de Ubidots, consulta estos tutoriales en video.
Este tutorial fue publicado originalmente en el Blog de Ubidots el 7 de junio de 2017