[0:00]Mi hermano necesitaba conocer desde su computadora o celular el nivel de agua en el tanque de agua de su casa. Y claro, yo fui el encargado de hacerlo. Así que veamos cómo lo hice, siendo este mi primer proyecto con SP32 y MQTT. Empecemos con el sensor. En Amazon encontré un sensor muy similar a este, con salida 4 a 20 miliamperios. Eso quiere decir que la corriente que pasará a través de él es proporcional al nivel del agua. 4 miliamperios para tanque vacío y 20 miliamperios para tanque lleno, y yo elegí la versión con rango de 0 a 1 metro de altura de agua, eso dependerá del tanque. Si conecto el sensor a una fuente de 24 VDC, la corriente que pasará por él me da la información que necesito. Pero para que el microcontrolador pueda leerla, añado un resistor de 150 ohmios en serie. La corriente seguirá siendo la misma, pero ahora para 4 miliamperios caerán 0.6 V y para 20 miliamperios 3 V. Que es un rango correcto, considerando que el microcontrolador será alimentado con 3.3 V. Hablando de él, solo me queda elegirlo. Yo escogí la ESPWROOM-32. Pero como no quiero desperdiciar toda la placa de desarrollo, usaré solo el microcontrolador, es decir, esta partecita de aquí. Aclarado eso, les presento el diagrama esquemático, lo encuentran en la carpeta del proyecto, ubicada en la descripción del video, junto con todos los archivos de fabricación por si quieren replicarlo. A pesar de que 24 V es la tensión estándar para alimentar este tipo de sensores, según el fabricante pueden usarse fuentes desde 12 hasta 36 V. Y opté por una de 12 V, son más económicas y fáciles de encontrar en el mercado. Para alimentar el microcontrolador debo reducir la tensión hasta 3.3 V y utilicé una opción muy popular para hacerlo. En el que el salto de tensión más grande se hace con una fuente conmutada hasta una tensión muy cercana a la requerida, en este caso 5 V. Y luego se pone un regulador lineal para llegar finalmente a 3.3 V. Los reguladores lineales son de muy bajo ruido, perfecto para microcontroladores, pero mientras más grande sea la caída de tensión entre su entrada y su salida, más potencia se desperdicia. Como por ejemplo, pasar de 12 a 3.3 V directamente, y por eso usamos primero la fuente conmutada para reducir la tensión muy eficientemente hasta 5 V a costa de ruido. Que luego el regulador lineal mitiga. El circuito integrado de la fuente conmutada que utilicé puede detectar cuando la tensión a la entrada es menor a 11 V y apaga la fuente, indicando que algo anda mal. Y se reactiva al sobrepasar los 11.7 V. Luego tenemos el microcontrolador, al que añadí su clásico pulsador para reiniciarlo, capacitores muy cerca de las líneas de alimentación, y los pines necesarios para programarlo. Que de hecho aquí hay una regleta que me permitirá hacerlo más adelante. Ahora sigue el sensor, que se conecta entre +12V y el resistor de 150 ohmios a tierra, al cual le añadí un filtro pasa bajas con frecuencia de corte de 5.9 Hz. Que mitigará el ruido de la fuente de 12 V y algo de ruido de 50 o 60 Hz que tal vez pueda meterse por ahí, asegurando así mediciones mucho más estables y limpias. Pueden elegir una frecuencia de corte mucho más baja, total el nivel de agua de un tanque cambia muy lentamente. Yo usé esos valores de componentes para reutilizar otros que ya hay en el circuito. Por último, tenemos tres LEDs, uno verde que indica alimentación, otro amarillo y uno bicolor entre rojo y verde. Esos dos últimos ayudarán a visualizar la información que yo quiera directamente desde el circuito. Como puede ser si se estableció la conexión por WiFi, si la señal es débil, si el nivel de agua está en cierto valor, lo que se me ocurra. Y también tenemos diferentes puntos de prueba a lo largo del circuito para diagnosticar, y con eso terminamos de analizarlo, bastante sencillo, ¿verdad? Ahora sigue diseñar la PCB, y si aún no dominan bien este tema en términos de cálculos, normativa, experiencia, etc., podrían probar esta herramienta de JLCPCB. Con el link que está en la descripción del video pueden acceder al servicio de PCB Layout. Donde podemos cargar un pequeño archivo con algunas especificaciones y el diagrama esquemático de nuestro proyecto. Y con eso ellos nos diseñarán nuestra PCB a medida. Dentro de ese documento es importante escribir la tensión y corriente que estarán presentes en ciertas zonas del circuito. Y luego regresamos a la página principal a llenar las otras casillas con la misma información que siempre llenamos al ordenar PCBs, como lo son el tipo de PCB, la cantidad de capas, las dimensiones y una que otra más específica. Como el programa en el que diseñamos el diagrama, el número de pads, que eso lo podemos averiguar en nuestro programa de diseño, en qué cara o caras queremos los componentes, qué archivos queremos que ellos nos entreguen y toda la información que consideremos importante. Si tienen dudas del servicio, déjenme un comentario y podría considerar hacer un video completo sobre él. Este fue el diseño que yo realicé, que también lo encuentran en la carpeta del proyecto. Y aquí lo tienen llevado a la realidad, pero como lo habrán notado, solo estos componentes están soldados. Ya que utilicé el servicio de ensamblaje de JLCPCB para los componentes más pequeños y yo me encargo de soldar los más grandes. Después de soldar los componentes faltantes, así se ve el circuito, bastante compacto y organizadito. Y aquí abajo van los cables al programador, el cual por cierto, no se los había mostrado, pero es este de aquí, que en futuros videos les mostraré cómo lo diseñé, pero pueden usar uno propio. Lo importante ahora es que para programar todos los códigos que verán de ahora en adelante, usé una regleta macho en la regleta hembra del programador. Y luego de forma provisional, la PCB haciendo leve presión inclinándola mientras se programa. Dejando el microcontrolador corriendo un código que prende y apaga LEDs a lo tonto por un rato, voy a mostrarles formas de onda de las fuentes de alimentación en vacío, por así decirlo. Empezamos con la tensión de rizado de la fuente de 12 V, que llega a unos 160 mV pico a pico. Ahora vamos con la de la fuente de 5 V, que es significativamente menor, de unos 35 mV pico a pico, que ya es bastante bajo, sinceramente. Pero ahora va la fuente de 3.3 V y tenemos unos 12 mV pico a pico, está muy bien. Ahora sí, empecemos con los códigos de verdad, empezando por uno muy simple. Inicio definiendo los nombres de los pines del micro según a lo que van conectados. Luego declaro tres variables flotantes para almacenar la tensión y corriente medidos sobre el resistor de 150 ohmios y el porcentaje de llenado del tanque. Porque la idea es mostrarlo de 0 a 100%, aunque en este primer código no lo vamos a utilizar. Luego inició la comunicación serial y defino que el sensor es entrada y los LEDs son salida. Ahora, en el loop, mido la tensión sobre el resistor, la convierto a formato de 0 a 3.3 V y uso ley de Ohm para calcular la corriente en miliamperios, por eso utilizo 0.15 y no 150. Finalmente, imprimo el valor de la corriente y un cero constantemente para fijar la escala de visualización, espero 100 milisegundos con la función de delay y cargo el código, utilizando la placa ESP32 WROOM DA Module y dejando todas las configuraciones por defecto. Pero esto es lo que se ve con el sensor totalmente fuera del agua, porque la versión del circuito que usé no es la misma que ustedes tienen. Inicialmente se me fueron las luces y olvidé poner el filtro RC al resistor de 150 ohmios en el primer diseño. Corté la pista entre el resistor y el micro y añadí un resistor de 27 kiloomnios con un capacitor de 1 microfaradio, que da la misma frecuencia de corte que tiene el del circuito que les mostré al inicio del video. Hecho eso, ahora sí, tenemos algo trabajable, pero hay que solucionar otro problema. Si mido la tensión sobre el resistor de 150 ohmios, obtengo 667 mV, que por ley de Ohm debería darme 4.44 mA, asumiendo que el resistor es de 150 ohmios exactos. Pero en cambio en la SP estoy viendo 3.7 mA. ¿Habrá algún error en el código? Pues no, resulta que la ADC de las SP es una basura y es algo que yo no sabía, pero sí, muchos usuarios reportan que la ADC de las SP suele ser ruidoso, no lineal en ciertas zonas. Y además tiene una atenuación integrada que limita el rango de medición. En la descripción del video les dejo el link de este hilo. Usando mi fuente variable, un multímetro y la lectura dada por el micro, hice una tabla entre las tensiones de entrada reales y medidas para lo que significaría 4 y 20 mA. Y obtuve esta gráfica: en azul la entrada real y en naranja lo medido por el micro. Y como se ve existe un desplazamiento constante en todos los valores, salvo en los cuatro últimos, que terminó calculando aquí al lado y resultó ser de 0.11 V aproximadamente. Para mitigar un poco ese efecto, en un nuevo código voy a sumar esos 0.11 V a la tensión medida. No es exactamente lo mejor, considerando que al final del rango eso no se cumple porque ahí es donde hay no linealidad, pero prefiero que las mediciones sean más correctas cuando el tanque está por vaciarse que cuando está por llenarse. Además, creo cuatro variables más, que será la corriente medida cuando el tanque está vacío y cuando está lleno. Y una pendiente M y desplazamiento B que hacen referencia a los parámetros de la ecuación de una recta, ampliamente utilizada en acondicionamiento de señales. En este caso será utilizada para convertir miliamperios a porcentaje. Perdón, olvidé grabar esta parte del audio, así que lo hago ahora. Se calcula la pendiente con la fórmula típica, resta de salida sobre resta de entradas. Yo elegí 100% y 0% que aquí no aparece, que serían generados por 20 y 4 mA respectivamente, de forma ideal. Para calcular el desplazamiento también aplicamos la fórmula típica. Yo elegí 4 mA porque obtengo 0% y eso hace más fácil el cálculo. Eso sí, la corriente mínima y máxima se medirán durante la instalación del sensor y después se reemplazarán los valores y se carga nuevamente el código. Finalmente se aplica la fórmula de la recta para convertir corriente a porcentaje, se cambia la variable de la comunicación serial y eso es todo por ahora. Ahora sí, regresemos al audio original. Mientras ideaba esas cosas en el código, en paralelo diseñaba e imprimía en 3D una cajita para este proyecto, a la que le añadí con el cautín cuatro insertos roscados de métrica 3 o como sea que se llamen en español porque no tengo idea. Y esto con el fin de poder poner separadores más adelante, que no solo aseguran la PCB a la caja, sino que además permitirán ajustar los tornillos de la tapa, tal que así, uno a cada esquina. Y así quedó la cajita, con un agujerito para poder meter un pin y reiniciar el micro si es necesario, pero bueno, también tienen el modelo 3D en la carpeta del proyecto. El tanque se encuentra aquí arriba, vamos a ver cómo está eso. Hola.
[11:35]Te va a salir en el video. Comiendo, no sé qué es eso. Manzana. Ah, las manzanas. Y con esa información manzanal totalmente indispensable, este es el tanque. Vamos a perforar el tanque en un lateral para pasar el cable, y sí, yo sé que lo ideal es ponerlo en el centro de la tapa, pero este tanque se va a cambiar pronto. Solo hay que evitar que las virutas caigan dentro del tanque, y así queda por ahora. Y creo que ya entienden por qué este tanque se va a cambiar o limpiar o lo que sea, yo no les entendí. Con cinta aislante incluida para que no se mueva, todo super profesional. Hablando del código, como mi lenguaje de programación favorito es la soldadura y mi hermano es el ingeniero de sistemas, él desarrolló la parte del MQTT y yo todo lo demás, resultando en el siguiente código final. Como no tengo idea de MQTT, mi explicación puede ser un poco burda, pero haré lo mejor que pueda. Además, ustedes sí saben sobre eso y entenderán qué es lo que hizo mi hermano. Primero se incluyen las librerías necesarias para usar el WiFi y el MQTT, y se define un tamaño del buffer que supongo se utilizará para almacenar los datos que serán transmitidos. Y también unas variables para medir el promedio de las mediciones y la cantidad de mediciones, ya que este código tiene un filtro promediador de seis muestras para filtrar un poco más la señal. Aquí se debe escribir el nombre y contraseña de la red WiFi a la que se conectará la SP, y asegúrense de que no sea una red 5G, debe ser una 4G. Ahora se ingresan los datos del MQTT, como lo son la dirección del broker, el tópico, el nombre de usuario y contraseña y finalmente el puerto. En el setup se puede inicializar o no la comunicación serial para imprimir información útil. Y luego se realiza la conexión a la red WiFi, que si no es exitosa, se intenta reconectar cada medio segundo hasta que se realice. Cuando la conexión es exitosa y sale del while, el LED amarillo se enciende y se intenta hacer la comunicación con el broker. Si se realiza correctamente, el LED verde se enciende, de lo contrario, lo hará el LED rojo. Ahora pasamos al loop, donde se evalúa si seguimos conectados al broker y si no lo estamos se intenta reconectar. Luego se ejecuta client.loop, que no tengo idea de qué hace, y medimos el tiempo que ha transcurrido con la función típica, millis. Si han transcurrido más de 5 segundos, se hace la medición del valor del tanque, se opera para llevarlo a porcentaje y se va acumulando una medición. De tal forma que cuando pasen más de 30 segundos, se promedian las seis muestras acumuladas anteriormente, y eso es lo que se envía usando client.publish, incluyendo además la corriente medida en ese momento. Justamente para hacer la calibración del mínimo y máximo. Y finalmente se reinician las variables de promedio y cantidad de mediciones. Cargado el código, si conecto la fuente de 12 V, observen que se prende primero el LED verde, luego el amarillo y luego el otro verde. Indicando que todas las conexiones se realizaron correctamente. Ahora aquí en el computador, pueden ver el porcentaje de llenado, 61.1%, genial. Y solo queda leer la corriente para el nivel mínimo y máximo del tanque cuando ocurran esos casos, reemplazar las variables en el código, que aquí ya están reemplazadas para el caso de mi tanque, cargarlo nuevamente y con eso estaría calibrado. Lamento si no fui muy claro con la parte del MQTT, pero espero les haya sido útil. Y si fue así, no olviden dar un like, escribir un comentario, suscribirse, etcétera. Por ahora me despido, gracias por ver este video, les habló Juan de Mundo Electrónica y los invito a seguirme en todas mis redes sociales para aprender más electrónica. Chavito.



