UNIVERSIDAD TECNOLÓGICA DE NEZAHUALCÓYOTL organismo público descentralizado del gobierno del estado de México DIVISIÓN DE TELEMÁTICA POR UN MEXICO RESPONSABLE NETWORKING ONE PROYECTO DE INTEGRADORA QUE PARA OBTENER LA CALIFICACION CORRESPONDIENTE AL QUINTO CUATRIMESTRE EN INFRAESTRUCTURA DE REDES IRD-2022-1765 DIGITALES P R E S E N T A: JAIME DAVID GOMEZ NOXPANKO 203243088 JUAN CARLOS HERNANDEZ GARCIA 203243030 GABRIELA PERALTA SANTIAGO 203243047 GUSTAVO SANCHEZ HERNANDEZ 203243054 Asesor Académico: RAFAEL GOMEZ FLORES VERDAD GENERACIÓN: SEP-2020 MARZO, 2022 CD. NEZAHUALCÓYOTL autorización del empastado aquí debes anexar el formato de autorización de publicación y edición que se te proporcionó, es el documento que te autoriza el asesor empresarial, profesor asesor y el profesor de inglés (abstract) Dedicatoria Juan Carlos Hernández García Dedico este proyecto a mi esposa a quien fue un gran apoyo emocional durante el tiempo en que estuve estudiando la carrera y quien me apoyo y alentó para continuar, cuando parecía que me iba a rendir. A mis padres quienes me apoyaron todo el tiempo. A mis maestros quienes nunca desistieron al enseñarme, aun sin importar que muchas veces no ponía atención en clase, a ellos que continuaron depositando su esperanza en mí. A todos los que me apoyaron para escribir y concluir este proyecto. Así como también dedico este proyecto a todos aquellos que no creyeron en mí, a aquellos que esperaban mi fracaso en cada paso que daba hacia la culminación de mis estudios, a aquellos que nunca esperaban que lograra terminar la carrera, a todos aquellos que aposaban a que me rendiría a medio camino, a todos los que supusieron que no lo lograría, a todos ellos les dedico esta tesis. Dedicatoria Jaime David Gómez Noxpanko Dedico este proyecto a mis padres, que siempre estuvieron apoyándome para seguir con mi preparación personal y profesional, especialmente a mi madre que cada día está apoyándome en todos los sentidos y siempre atenta tanto con mis estudios y con mis asuntos personales. También agradezco a mi esposa quien es la persona que ha estado a lo largo de este periodo de preparación, apoyándome moralmente en todo momento, sacrificando tiempo con ella quien y que me comprenda que este tiempo es una inversión para poder tener un mejor futuro con ella. Le dedico también este trabajo a mis asesores, tanto académico como empresarial por supuesto que sin ayuda de ellos esto no sería posible. Dedicatoria Gabriela Peralta Santiago. Dedico esta parte de mi vida mis agradecimientos mi más profundo amor a mi madre quien nunca dejó de creer en mí, apoyándome e impulsándome a llegar a donde estoy y aun lo que falta, a mi abuela que siempre se preocupa por mi bienestar a mis hermanas que, aunque no estemos en contacto seguido es parte fundamental de mi vida y a mi novio quien me desafía cada día a hacer las cosas bien gracias por tu compañía y tanto amor. Dedicatoria Gustavo Sánchez Hernández Dedico este proyecto para terminar el quinto cuatrimestre de TSU a mis padres Lucrecia Hernández Ramírez y Agustín Sánchez Sánchez, que siempre estuvieron apoyándome para seguir con mi preparación personal, profesional y laboral, especialmente a mi madre que cada día está apoyándome en todos los sentidos y siempre atenta tanto con mis estudios y con mis asuntos personales. Agradezco a mi esposa Yesica Castillo quien es la persona que ha estado a lo largo de este periodo de preparación, apoyándome moralmente desvelándose conmigo en todo momento, sacrificando tiempo con ella y con mis pequeñas hijas Yamilet y Yaritza a quienes pido me comprendan que este tiempo es una inversión para poder tener un mejor futuro con ustedes. Le dedico también este trabajo a mis asesores, tanto académico como empresarial por supuesto que sin ayuda de ellos esto no sería posible. Agradecimientos Juan Carlos Hernández García Y un agradecimiento especial a la Universidad Tecnológica de Nezahualcóyotl quien fue la casa de estudios que me abrió sus puertas para poder seguir estudiando y superarme en la vida teniendo así una carrera como profesional. Jaime David Gómez Noxpanko Agradezco a la UTN, especialmente a los buenos profesores que siempre tenían una respuesta para cada pregunta que yo tenía en mis asignaturas ayudándome siempre a mejorar cada día con cada clase y práctica. Gabriela Peralta Santiago Agradezco a la Universidad Tecnológica de Nezahualcóyotl, donde tantas buenas experiencias he tenido doy gracias a mis profesores por ser parte fundamental de mi crecimiento profesional y ético. Gustavo Sánchez Hernández Doy un agradecimiento a esta casa de estudios que es la UTN por permitirme continuar mis estudios para poder formarme como un profesional a nivel TSU, agradezco a mi profesor Rafael Gómez Flores Verdad quien es el que estuvo en todo momento para llevar a cabo este proyecto. ABSTRACT For a responsible Mexico Introduction The water supply in Mexico faces different problems that range from the overexploitation of aquifers, problems in the water distribution network, contamination, and the lack of control over concessions, including the agricultural part. But urban areas lose about 40% of their drinking water due to leaks in distribution networks, leading to lack of supply in some areas. This same phenomenon affects the water destined for agriculture, where a loss of 50% is calculated. Mexico has faced in 2021 one of the most severe and extended droughts in decades. More than 50 million people experience shortage, according to scientific researchers inside and outside of Mexico. Experts agree that the situation, fueled by climate change, is likely to get worse. Here, a review of 10 figures to know the water situation in Mexico viii RESUMEN Por un México responsable El agua es uno de los recursos naturales más importantes para los seres humanos, por lo que la sensibilización y concientización medioambiental es imprescindible dentro del contexto social mexicano, educar y respetar el agua trasmitiendo conocimiento ecológico, actitudes y valores nos permitirá tomar un compromiso de acciones y responsabilidades que tengan por fin el uso racional de los recursos y lograr un desarrollo adecuado y sostenible. ix índice INTRODUCCIÓN 12 acerca del proyecto .................................................................................. 13 objetivos del proyecto ............................................................................... 13 general ............................................................................................. 13 particulares ....................................................................................... 13 justificación ............................................................................................... 14 programa y cronograma ........................................................................... 16 autorización del empastado ....................................................................... ii MARCO TEÓRICO 17 se ve reflejada la problemática en el consumo desmedido del recurso de agua en cd nezahualcóyotl según el censo del la comisión del agua del estado de méxico.Ошибка! Закладка не определена. instalar en los hogares de los habitantes de cd nezahualcóyotl una serie de equipamiento tecnológico conectado directamente al suministro del agua, y en conjunto con la aplicación regular el consumo de agua. Ошибка! Закладка не определена. cada vez es más el desperdicio de agua en los hogares por lo que se implementaran los equipos de medición tecnológicos y la aplicación de iot para evitar el desperdicio de esta. x 22 DESARROLLO DE LA ESTANCIA capítulo 1: el sensor de nivel de agua con arduino nano. ОШИБКА! ЗАКЛАДКА НЕ ОПРЕДЕЛЕНА. capítulo 2: control del suministro de bombas de agua 73 capítulo 3: actuadores para el paso del agua: 76 3.1 placa basada en microcontrolador: doit esp32 devkit v1Ошибка! Закладка не опре 3.2 sensor ultrasónico impermeable: jsn sr04t. Ошибка! Закладка не определена. módulo relé de un canal, sensor de flujo: yf-s201. CAPÍTULO 4: ARDUINO NANO 99 CAPÍTULO 5: LOS MÓDULOS HC-05 Y HC-06 SON MÓDULOS DE 102 BLUETOOTH CONCLUSIONES 104 BIBLIOGRAFÍA 105 ANEXOS 105 xi INTRODUCCIÓN El abastecimiento del agua en México afronta diferentes problemáticas que van desde la sobre explotación de los mantos acuíferos, los problemas en la red de distribución del agua, la contaminación y la falta de un control sobre las concesiones, incluyendo la parte agrícola. pero las zonas urbanas pierden cerca del 40% de su agua potable debido a fugas en las redes de distribución, lo que ocasiona la falta de abastecimiento en algunas zonas. este mismo fenómeno afecta al agua destinada a la agricultura, donde se calcula una pérdida de 50%. México ha enfrentado en 2021 una de las sequías más severas y extendidas en décadas. más de 50 millones de personas experimentan algún tipo de escasez, según investigadores científicos de dentro y fuera de México. Los expertos coinciden en que la situación, alimentada por el cambio climático, probablemente empeorará. aquí, un repaso de 10 cifras para conocer la situación del agua en México. Entre 12,5 y 15 millones de habitantes no tienen acceso a agua potable en México, según la universidad nacional autónoma de México, lo que representa a aproximadamente el 10% de la población. entre quienes sí acceden, casi un 30% no cuenta con la cantidad ni la calidad suficiente. ACERCA DEL PROYECTO Este proyecto desea generar una aplicación que se conecte a un módulo (medidor de agua) que nos indique si hay posibles fugas y a su vez a base del consumo diario y también esta aplicación podría regular la cantidad de agua que saldría de la toma de agua del baño y de la regadera con llaves con wifi para así evitar que se dejen las llaves abiertas y se desperdicie el agua, otra medida sería que se comunicara, regulara el llenado de la cisterna para de igual manera evitar esta se desborde y tirando esta agua a la coladera; así podríamos desde el teléfono regular la cantidad de agua que se va a ocupar y de esta manera evitar el desperdicio del agua, de este proyecto su principal causa es garantizar agua para el futuro. Objetivos del proyecto GENERAL Implementar una aplicación de IoT para hogares en cd Nezahualcóyotl para tener controles del uso de suministro de esta manera hay desperdicio de esta Reducir que se tire el agua por descuidos. La detención oportuna de fugas de agua implementación de la tecnología PARTICULARES Reducir el desperdicio de este vital liquido ara todos los seres humanos. JUSTIFICACIÓN Es importante cuidar el agua porque de ella depende nuestro presente y futuro. Con el cuidado del agua salvamos vidas. algunos somos afortunados por vivir en regiones donde el agua llega a los hogares, sin embargo, alrededor del mundo existen familias enteras que no reciben agua potable para beber. al cuidar el agua nos aseguramos de que haya más líquido potable para otras personas, que la deshidratación disminuya y que el agua se reparta equitativamente. la mayor de las ventajas de cuidar el agua es la estabilidad de los ecosistemas. si para los seres humanos es importante el agua, para los animales y la vegetación también lo es. si cuidamos el agua y no la contaminamos, lograremos que muchos seres vivos continúen satisfactoriamente con su ciclo de vida. por ejemplo, como cuidar el agua no sólo tiene que ver con evitar su desperdicio, cuando esquivamos la contaminación en ríos, lagos o mares, apoyamos a que la vida marina no enfrente grandes catástrofes. Beber agua contaminada puede ser peor que no tener agua, por ello, entre las ventajas de cuidar el agua se encuentra la disminución de enfermedades intestinales. si una persona enferma por beber agua sucia es muy probable que contagie a más de una. ¿Cómo cuidar el agua en casa? Toma un baño cuando sea necesario y haz lo que esté en tus manos para que dure no más de 10 minutos. Si vas a esperar a que salga agua caliente de la regadera, coloca una o dos cubetas para contener el agua que no vas a usar. tira la basura en su lugar y, si tu papel higiénico no es apto para tirarlo en el inodoro, mejor tíralo en el cesto de basura. hay papeles de baño que aún no son biodegradables. Programa tu lavadora con un ciclo de lavado rápido. con esta acción puedes ahorrar más de 40 litros de agua. es importante que riegues tus plantas a últimas horas del día para que aprovechen bien el agua y esta no se evapore con el calor. Utiliza detergentes libres de fosfatos. la mayoría de los jabones con fosfatos aumentan la eutrofización del agua. evita el uso de antiinflamatorios que no recete tu médico. si estos medicamentos caducan y los desechas, pueden desintegrarse en el agua. Las concentraciones de antibióticos y medicamentos en el agua pueden causar efectos nocivos en organismos acuáticos. no tires comida al fregadero. Esto incluye al aceite de cocina, un litro de este producto comestible tiene la capacidad de contaminar hasta 40 mil litros de agua. PROGRAMA Y CRONOGRAMA MARCO TEÓRICO Se ve reflejada la problemática en el consumo desmedido del recurso de agua en cd Nezahualcóyotl según el censo de la comisión del agua del estado de México. Desde julio de 2010, la asamblea general de las naciones unidas reconoció como derecho humano el acceso al agua. la resolución establece que cada persona debe tener acceso a una cantidad de entre los 50 y los 100 litros por día para cubrir sus necesidades domésticas y personales. sin embargo, a pesar de ser reconocido como un derecho y un recurso clave en el desarrollo sostenible, la salud, la educación, el crecimiento económico y el medio ambiente, la organización mundial de salud señala que la escasez de agua afecta a cuatro de cada diez personas a nivel internacional. “en México, el agua destinada al abastecimiento público no ha logrado una cobertura en el país, porque no toda la población tiene agua o no dispone de ella diariamente”. en 2015, de acuerdo con inegi, de un total de 29 048 251 hogares: 21.2 millones recibía agua diariamente 4.4 millones cada 1.6 millones dos veces 1.08 millones una vez a la semana tercer por día semana El abastecimiento del agua en México afronta diferentes problemáticas que van desde la sobreexplotación de los mantos acuíferos, los problemas en la red de distribución del agua, la contaminación y la falta de un control sobre las concesiones, incluyendo la parte agrícola. ¿qué factores económicos intervienen en este servicio? señala la también coordinadora académica del seminario sobre economía del agua y desarrollo sustentable. “del agua que tenemos, 77% está concesionada a la agricultura, 14% es para abastecimiento público como uso doméstico y negocios, 5% es para la generación de energía y el 4% restante es para la industria.” Distribución del recurso en 2015, Conagua reportó una cobertura de agua potable en el país del 92.5%. de este porcentaje, el 95% estaba destinado a zonas urbanas, mientras que el resto a las zonas rurales, pero las zonas urbanas pierden cerca del 40% de su agua potable debido a fugas en las redes de distribución, lo que ocasiona la falta de abastecimiento en algunas zonas. este mismo fenómeno afecta al agua destinada a la agricultura, donde se calcula una pérdida de 50%. por su parte, los industriales usan agua de pozo para sus procesos y los permisos de concesión que les otorgan están sobre estimados sin que exista una limitación sobre el volumen que solicitan. de acuerdo con la Conagua, México cuenta con 653 acuíferos. en 2014, 106 estaban reportados como sobre explotados, es decir, ya no tenían agua, 15 presentaban intrusión de agua marina salada y 31 tenían suelos salinos o con agua salobre. instalar en los hogares de los habitantes de cd Nezahualcóyotl una serie de equipamiento tecnológico conectado directamente al suministro del agua, y en conjunto con la aplicación regular el consumo de agua. cada vez es más el desperdicio de agua en los hogares por lo que se implementaran los equipos de medición tecnológicos y la aplicación de iot para evitar el desperdicio de esta. la falta de recursos hídricos disponibles y suficientes para satisfacer las demandas de consumo de agua dentro de una región siguen al alza. según el programa de las naciones unidas para el desarrollo, se debe principalmente a una gestión deficiente de esos recursos, que afecta a alrededor de mil 200 millones de personas en todo el mundo. para ello ahora llega el internet de las cosas (iot) para volver inteligente el ahorro del agua. en cada parte del ciclo del agua, el iot puede utilizarse para administrar mejor los recursos hídricos y alcanzar resultados eficientes y óptimos. el iot como tecnología tiene un gran potencial para resolver problemas que amenazan la vida en varios ángulos de nuestra vida cotidiana, de los cuales se encuentra la escasez de agua a través de una gestión inteligente, instantánea y predecible en cada parte del ciclo del agua, el iot puede utilizarse para administrar mejor los recursos hídricos y alcanzar resultados eficientes y óptimos. función de las autoridades, el trabajo de las autoridades actuales hacia la gestión del líquido de alguna manera carece de las herramientas tecnológicas adecuadas para analizar las tendencias y el comportamiento de las personas que se traduce en programas y planes malos de distribución de agua. Por otro lado, el consumidor carece de las herramientas adecuadas para mantenerse sintonizado y alertado sobre el uso y consumo de agua, así como la capacidad restante de almacenamiento, factores que se suman al consumo inadecuado de líquido. ¿cómo el internet de las cosas vuelve inteligente el agua y su demanda en una ciudad? uno de los desafíos cruciales de su gestión, así como la conservación, es determinar la cantidad de líquido que utilizará cualquier ciudad en particular durante el día siguiente. esto se puede calcular a la precisión con el uso de análisis predictivo. esto se hace manteniendo un seguimiento de la historia del consumo de agua en un día determinado. sobre la base de los datos históricos recopilados y analizados por software predictivo y combinado con la consideración de eventos especiales, días festivos y el clima en una ciudad, las autoridades pueden determinar la cantidad de agua que consumirá toda la población en un día. Óptimo abastecimiento Cuando sabemos la cantidad de líquido que se requiere para el consumo general en una ciudad en un día determinado, a las autoridades les resulta fácil mantener el nivel de agua en un depósito/tanque y luego bombear el suministro a los tanques elevados según sea necesario. actualmente, todos podemos presenciar el desperdicio de agua en el proceso de irrigación que tiene lugar donde se basa en patrones de programación automatizados. esto significa que el proceso de irrigación se llevará a cabo en un momento determinado y por una duración fija, independientemente de las condiciones climáticas y la humedad del suelo. El internet de las cosas puede usarse para obtener la cantidad correcta de agua en el destino correcto por el tiempo correcto y sólo cuando sea necesario. este será el trabajo de sensores especiales de suelo y sensores meteorológicos que comunicarán sus lecturas a un servidor en particular que, a su vez, puede leer los pronósticos meteorológicos en la ciudad para determinar la decisión correcta de irrigación que resultará en ordenar a la válvula de riego que se abra y cerrar. Mantenimiento predictivo la tecnología del iot también ayuda a programar el mantenimiento, así como el apagado de las bombas de forma regular. existen técnicas de optimización que se pueden transmitir de antemano a los residentes de una ciudad con respecto a la falta de disponibilidad de agua durante cualquier momento en particular. esto ayuda a las autoridades de regulación del agua no solo a satisfacer las demandas de agua adecuadas en una ciudad; sino que también ayuda en la conservación de los recursos y la energía. otra ventaja en la gestión inteligente del agua es la reducción de los precios y el consumo de energía. el análisis predictivo se puede utilizar para calcular el precio de la energía durante diferentes horas en un día. esta información se puede usar para programar las bombas a lo largo de un día de tal manera que no haya pérdida de energía o recursos adicionales. este es solo el comienzo para descubrir los beneficios potenciales en nuestra vida diaria con esta tecnología revolucionaria y disruptiva que es el IoT. páginas de apoyo http://ciencia.unam.mx/leer/775/problematicas-economicas-delagua-en-mexico https://www.telcel.com/empresas/tendencias/notas/iot-vuelveinteligente-al-agua.html DESARROLLO DE LA ESTANCIA CAPÍTULO 1: EL SENSOR DE NIVEL DE AGUA CON ARDUINO NANO. índice de contenidos 1 el sensor de nivel de agua con arduino nos permite medir cualquier líquido gracias al sensor de ultrasonidos. 2 componentes necesarios para el sensor de nivel de agua con arduino 3 circuito eléctrico 4 montando el sensor en la cubeta 5 calibrando el sensor de nivel de agua con arduino 6 mostrando los datos en el lcd 7 conclusiones El sensor de nivel de agua con arduino nos permite medir cualquier líquido gracias al sensor de ultrasonidos. La pieza más importante en este proyecto será el arduino. en este caso podemos utilizar cualquier modelo que tenga como mínimo 8 entradas digitales. en este tutorial trabajaré con la placa más famosa de arduino, la uno. El proyecto va a constar de diferentes fases donde iremos avanzando para conseguir nuestro objetivo. circuito eléctrico, conectando los componentes probar todos los componentes y conexiones montando el sensor en la cubeta calibrando el sensor de nivel de agua con arduino mostrando los datos en el lcd Componentes necesarios para el sensor de nivel de agua con arduino Lo primero que debemos hacer si queremos crear un sensor de nivel de agua con arduino, es conocer los componentes que vamos a utilizar. por supuesto que esto es solo una idea, de todos los componentes que voy a detallar a continuación, alguno es prescindible. Arduino uno será el cerebro de la aplicación y el encargado de gestionar todos los sensores a través de las entradas y salidas digitales. en la programación reside su potencia. veremos que código debemos implementar para poder medir el nivel en un recipiente. Sensor ultrasonidos hc-sr04 Este tipo de sensores se basan en medir cuanto tiempo tarda en viajar una onda ultrasónica desde que sale del sensor hasta que regresa. Gracias a este tiempo y sabiendo la velocidad del sonido, es fácil calcular la distancia aplicando la famosa fórmula. pantalla lcd 16×2 Este componente mostrando texto en también lo hemos visto movimiento y mostrando en la varios artículos. temperatura de un sensor. consiste en una pantalla de cristal líquido de 16 columnas y 2 filas. en ella iremos escribiendo los resultados obtenidos de las mediciones, así como alguna otra información útil en este proyecto. Además, componentes electrónicos además de los componentes esenciales para el sensor de nivel de agua con arduino, vamos a necesitar los típicos componentes que se suelen utilizar en muchos circuitos. te los detallo a continuación. Circuito eléctrico con todos los componentes en nuestro poder, ya podemos empezar a montar el circuito. como ya he comentado al principio del artículo, vamos a necesitar 8 entradas y salidas digitales. además, utilizaremos el pin de 5v y el gnd (toma de tierra). el circuito sería el siguiente. Probar todos los componentes y conexiones Antes de meternos en faena y empezar a programar el sensor de nivel de agua con arduino, vamos a probar los diferentes componentes del circuito eléctrico. es importante asegurarnos de que todo está bien conectado. lo más sencillo es probar cada componente por separado y así es como lo haremos. Sensor de ultrasonidos hc-sr04 Para probar este sensor vamos a cargar un sketch que no servirá más adelante a la hora de medir el nivel. las conexiones echo y trigger van a los pines 6 y 7 respectivamente. carga el siguiente sketch en tu placa de arduino y comprueba el monitor serie. 1 // configuramos los pines del sensor trigger y echo 2 const int pintrig = 7; 3 const int pinecho = 6; 4 5 // constante velocidad sonido en cm/s 6 const float velson = 34000.0; 7 8 float distancia; 9 10void setup() 11{ 12// iniciamos el monitor serie para mostrar el resultado 13serial.begin(9600); 14// ponemos el pin trig en modo salida 15pinmode(pintrig, output); 16// ponemos el pin echo en modo entrada 17pinmode(pinecho, input); 18} 19void loop() 20{ 21iniciartrigger(); 22 23// la función pulsein obtiene el tiempo que tarda en cambiar entre estados, en este caso a high 24 unsigned long tiempo = pulsein(pinecho, high); 25 26// obtenemos la distancia en cm, hay que convertir el tiempo en segudos ya que está en microsegundos 27 // por eso se multiplica por 0.000001 28 distancia = tiempo * 0.000001 * velson / 2.0; 29 serial.print(distancia); 30 serial.print("cm"); 31 serial.println(); 32 delay(500); 33 } 34 35 // método que inicia la secuencia del trigger para comenzar a medir 36 void iniciartrigger() 37{ 38// ponemos el triiger en estado bajo y esperamos 2 ms 39digitalwrite(pintrig, low); 40delaymicroseconds(2); 41 42// ponemos el pin trigger a estado alto y esperamos 10 ms 43digitalwrite(pintrig, high); 44delaymicroseconds(10); 45 46// comenzamos poniendo el pin trigger en estado bajo 47digitalwrite(pintrig, low); 48} en el monitor serie debe aparecer algo parecido a lo siguiente. Si el resultado es siempre 0 cm, debes comprobar las conexiones que estén todas correctas según el esquema que hemos visto antes. Pantalla lcd 16x2 Como su nombre indica, se trata de una pantalla de 16 columnas y 2 filas. esto nos va a permitir escribir un total de 32 caracteres a la vez. ahora lo que haremos es escribir un simple texto para comprobar que todo está bien conectado. carga el siguiente sketch en tu placa. 1 // incluímos la libreria externa para poder utilizarla 2 #include <liquidcrystal.h> // entre los símbolos <> buscará en la carpeta de librerías configurada 3 4 // lo primero is inicializar la librería indicando los pins de la interfaz 5 liquidcrystal lcd(12, 11, 5, 4, 3, 2); 6 7 // definimos las constantes 8 #define cols 16 // columnas del lcd 9 #define rows 2 // filas del lcd 10 11void setup() { 12// configuramos las filas y las columnas del lcd en este caso 16 columnas y 2 filas 13 lcd.begin(cols, rows); 14 } 15 16 void loop() { 17 18 lcd.setcursor(0,0); 19 lcd.print("hola mundo!!!!!!"); 20 lcd.setcursor(0,1); 21 lcd.print("probando el lcd."); 22} Por lo tanto, el resultado que debemos obtener es el texto «hola mundo!!!!!!» en la primera fila y en la segunda fila «probando el lcd.». debes obtener algo parecido a esto. Montando el sensor en la cubeta Ya hemos montado todo el circuito, hemos comprobado que todo funciona correctamente y ahora vamos a montar el sensor encima del recipiente o cubeta donde vamos a tener el líquido. lo podemos hacer de muchas formas, yo te voy a mostrar una muy sencilla utilizando dos palos de madera que se utilizan para cocinar. son los típicos para saber si el bizcocho está hecho o para hacer brochetas. Además, he utilizado dos alambres de los típicos que vienen en cualquier embalaje para sujetar cables. suelo recolectar este tipo de agarres ya que son muy útiles en muchas ocasiones. el resultado lo puedes ver en las siguientes imagenes. Gracias a estos dos palos podemos situar el ultrasonido baca abajo encima de cualquier recipiente o cubeta. en la siguiente imagen te muestro un ejemplo de cómo quedaría. Esto también nos puede servir de sujeción con alguna goma elástica u otro método para que no se mueva. Calibrando el sensor de nivel de agua con arduino Ha llegado la hora de empezar a programar. lo primero que debemos hacer es calibrar el sensor de nivel de agua con arduino. para ello voy a utilizar un vaso medidor, es decir, un vaso que tiene marcadas las medidas. así podremos asignar una medida del sensor de ultrasonidos a una cantidad de líquido. esto nos permitirá saber que cantidad de líquido tenemos en el recipiente. El sensor de ultrasonidos mide la cantidad de espacio vacío en el recipiente. por lo tanto, si conocemos la capacidad total del recipiente, al restar la cantidad de espacio vacío sabremos cuánto líquido hay. mira el esquema general. Según este esquema general debemos conocer que valor obtenemos con el sensor de ultrasonidos cuando está vacío, cuando está lleno y una medida conocida. esta última medida la haremos con vaso medidor calculando el valor para 100 ml. Antes de comenzar con las medidas, debemos de tener en cuenta que el vaso debe ser cilíndrico, es decir, la base debe ser del mismo diámetro que la parte de arriba. Sí intentamos medir en un recipiente que no es cilíndrico, en forma de cono, las medidas no serán proporcionales. Calcular la media para eliminar el ruido En todos los sistemas electrónicos se genera un ruido debido al movimiento de los electrones, al propio sensor, la placa de arduino, etc.… esto se traduce en una variación o fluctuación en las medidas que vamos obteniendo a través del sensor. para eliminar este tipo de ruido se suele aplicar un filtro paso bajo que elimina las frecuencias bajas, justo donde se encuentra el ruido. la forma más sencilla de aplicarlo a través de la programación es hacer una media de los valores que se van obteniendo. Pero no solo para eliminar el ruido, calculando la media podemos eliminar las fluctuaciones debidas al movimiento del recipiente. imagínate un depósito de gasolina de un coche. cuando va en marcha el combustible no está quieto, se va moviendo. si se quiere medir con un sensor de ultrasonidos sería complicado si no se utiliza alguna técnica como esta. Dependiendo del número de muestras que utilicemos para obtener la media, podremos tener un valor más preciso o menos preciso. pero esto también influye en cuánto tarda en estabilizarse la medida cuando se produce un cambio. por lo tanto, si cogemos un número alto de muestras, la media será más precisa, pero tardará más tiempo en reflejar los cambios. por el contrario, si cogemos un número bajo de muestras, la media será menos precisa, pero veremos reflejados más rápidos los cambios. elegir uno u otro dependerá de lo que queramos conseguir, rapidez o precisión. Otro factor a tener en cuenta es el tamaño del tipo de dato que vamos a almacenar. debemos de tener mucho ojo ya que podemos provocar un desbordamiento. todas las muestras se irán almacenando en una variable para luego calcular la media, por lo tanto si elegimos un número alto de muestras debemos asegurarnos que no nos saldremos de rango. en este caso se va a elegir precisión, se va a recoger un rango de muestras de 100. El código es muy parecido al que hemos utilizado para probar el sensor de ultrasonidos al que he añadido el cálculo de la media cada 100 valores. no voy a profundizar más en esta técnica, si quieres aprender todo lo que hay detrás te aconsejo que veas la lección donde muestro como estabilizar el sensor de temperatura lm35. El código que debes cargar en la placa es el siguiente 1 // configuramos los pines del sensor trigger y echo 2 const int pintrig = 7; 3 const int pinecho = 6; 4 5 // constante velocidad sonido en cm/s 6 const float velson = 34000.0; 7 8 // número de muestras 9 const int numlecturas = 100; 10 11float lecturas[numlecturas]; // array para almacenar lecturas 12int lecturaactual = 0; // lectura por la que vamos 13float total = 0; // total de las que llevamos 14float media = 0; // media de las medidas 15bool primeramedia = false; // para saber que ya hemos calculado por lo menos una 16 17 void setup() 18 { 19 // iniciamos el monitor serie para mostrar el resultado 20 serial.begin(9600); 21 // ponemos el pin trig en modo salida 22 pinmode(pintrig, output); 23 // ponemos el pin echo en modo entrada 24 pinmode(pinecho, input); 25 26// inicializamos el array 27for (int i = 0; i < numlecturas; i++) 28{ 29lecturas[i] = 0; 30} 31} 32void loop() 33{ 34// eliminamos la última medida 35total = total - lecturas[lecturaactual]; 36 37iniciartrigger(); 38 39// la función pulsein obtiene el tiempo que tarda en cambiar entre estados, en este caso a high 40 unsigned long tiempo = pulsein(pinecho, high); 41 42 // obtenemos la distancia en cm, hay que convertir el tiempo en 43segudos ya que está en microsegundos 44// por eso se multiplica por 0.000001 45float distancia = tiempo * 0.000001 * velson / 2.0; 46 47// almacenamos la distancia en el array 48lecturas[lecturaactual] = distancia; 49 50// añadimos la lectura al total 51total = total + lecturas[lecturaactual]; 52 53// avanzamos a la siguiente posición del array 54lecturaactual = lecturaactual + 1; 55 56// comprobamos si hemos llegado al final del array 57if (lecturaactual >= numlecturas) 58{ 59primeramedia = true; 60lecturaactual = 0; 61} 62 63// calculamos la media 64media = total / numlecturas; 65 66// solo mostramos si hemso calculado por lo menos una media 67if (primeramedia) 68{ 69serial.print(media); 70serial.println("cm"); 71} 72 73delay(500); 74} 75 76// método que inicia la secuencia del trigger para comenzar a medir 77void iniciartrigger() 78{ 79// ponemos el triiger en estado bajo y esperamos 2 ms 80digitalwrite(pintrig, low); 81delaymicroseconds(2); 82 83// ponemos el pin trigger a estado alto y esperamos 10 ms 84digitalwrite(pintrig, high); 85delaymicroseconds(10); 86 87// comenzamos poniendo el pin trigger en estado bajo 88digitalwrite(pintrig, low); } estos son los datos que yo he obtenido, seguramente tu hayas obtenido otros valores, dependerá del recipiente y de la cantidad de líquido que entre en dicho recipiente. vacío lleno 11,41 cm 2,20 cm Calculando el nivel de líquido Con los datos obtenidos en la fase anterior, con el recipiente en vacío, lleno y con 100 ml, ya podemos obtener una fórmula para el sensor de nivel de agua con arduino. las medidas obtenidas nos indican la cantidad de espacio vacío que hay en el recipiente. Vamos a comenzar cambiando el rango para llevarlo a 0 eliminando el offset de 2,20 cm. es como si el líquido estuviera a 0 cm cuando el recipiente está cero. vacío lleno 11,41 cm 2,20 cm 9,21 cm 0 cm El siguiente paso es calcular cuanto ocupa 100 ml de líquido en nuestro recipiente. esto se hace restando la distancia cuando está vacío menos la distancia cuando tiene 100 ml. Esta medida nos dice que cada 2,15 cm hay 100 ml de líquido. Con esto ya es sencillo calcular cuánto líquido hay dentro del recipiente. vamos a hacerlo con un ejemplo. supongamos que el sensor de ultrasonidos nos da una distancia de 7,11 cm. Ese sería el espacio vacío, pero nosotros queremos saber cuánto espacio queda lleno. lo calculamos restando la distancia en vacío menos la distancia obtenida. Como sabemos que cada 2,15 cm hay 100 ml, aplicando una simple regla de 3 sabremos la cantidad de líquido que tenemos. Ya tenemos la base matemática para calcular el nivel de líquido en nuestro recipiente, ahora solo nos queda aplicar dichos cálculos en nuestro sketch. Programando el sketch para calcular el nivel tPodo esto tenemos que plasmarlo en un sketch para subirlo a nuestro arduino. a continuación, el código. 1 // configuramos los pines del sensor trigger y echo 2 const int pintrig = 7; 3 const int pinecho = 6; 4 5 // constante velocidad sonido en cm/s 6 const float velson = 34000.0; 7 8 // número de muestras 9 const int numlecturas = 100; 10 11// distancia a los 100 ml y vacío 12const float distancia100 = 2.15; 13const float distanciavacio = 11.41; 14 15float lecturas[numlecturas]; // array para almacenar lecturas 16int lecturaactual = 0; // lectura por la que vamos 17float total = 0; // total de las que llevamos 18float media = 0; // media de las medidas bool primeramedia = false; // para saber que ya hemos calculado por lo menos una 19 20 void setup() 21 { 22 // iniciamos el monitor serie para mostrar el resultado 23 serial.begin(9600); 24 // ponemos el pin trig en modo salida 25 pinmode(pintrig, output); 26 // ponemos el pin echo en modo entrada 27 pinmode(pinecho, input); 28 29 // inicializamos el array 30 for (int i = 0; i < numlecturas; i++) 31{ 32lecturas[i] = 0; 33} 34} 35void loop() 36{ 37// eliminamos la última medida 38total = total - lecturas[lecturaactual]; 39 40iniciartrigger(); 41 42// la función pulsein obtiene el tiempo que tarda en cambiar entre estados, en este caso a high 43unsigned long tiempo = pulsein(pinecho, high); 44 45// obtenemos la distancia en cm, hay que convertir el tiempo en segudos ya que está en microsegundos 46 // por eso se multiplica por 0.000001 47 float distancia = tiempo * 0.000001 * velson / 2.0; 48 49 // almacenamos la distancia en el array 50 lecturas[lecturaactual] = distancia; 51 52 // añadimos la lectura al total 53 total = total + lecturas[lecturaactual]; 54 55// avanzamos a la siguiente posición del array 56lecturaactual = lecturaactual + 1; 57 58// comprobamos si hemos llegado al final del array 59if (lecturaactual >= numlecturas) 60{ 61primeramedia = true; 62lecturaactual = 0; 63} 64 65// calculamos la media 66media = total / numlecturas; 67 68// solo mostramos si hemos calculado por lo menos una media 69if (primeramedia) 70{ 71float distancialleno = distanciavacio - media; 72float cantidadliquido = distancialleno * 100 / distancia100; 73 74serial.print(media); 75serial.println(" cm"); 76 77serial.print(cantidadliquido); 78serial.println(" ml"); 79} 80 81delay(500); 82} 83 84// método que inicia la secuencia del trigger para comenzar a medir 85void iniciartrigger() 86{ 87// ponemos el triiger en estado bajo y esperamos 2 ms 88digitalwrite(pintrig, low); 89delaymicroseconds(2); 90 91// ponemos el pin trigger a estado alto y esperamos 10 ms 92digitalwrite(pintrig, high); 93delaymicroseconds(10); 94 95// comenzamos poniendo el pin trigger en estado bajo 96digitalwrite(pintrig, low); 97} 98 mostrando los datos en el lcd Por último y, aunque no es necesario, vamos a mostrar la información en una pantalla lcd de 16×2. la información que vamos a mostrar es la cantidad de líquido en ml y el porcentaje de llenado. estos datos son fundamentales en el sensor de nivel de agua con arduino. El siguiente código lo único que hago es mezclar el código anterior donde obtenemos la cantidad de líquido y el código con el que hemos probado el lcd. 1 // incluímos la libreria externa para poder utilizarla 2 #include <liquidcrystal.h> // entre los símbolos <> buscará en la carpeta de librerías configurada 3 4 // lo primero is inicializar la librería indicando los pins de la interfaz 5 liquidcrystal lcd(12, 11, 5, 4, 3, 2); 6 7 // definimos las constantes 8 #define cols 16 // columnas del lcd 9 #define rows 2 // filas del lcd 10 11 12 // configuramos los pines del sensor trigger y echo 13 const int pintrig = 7; 14 const int pinecho = 6; 15 16 // constante velocidad sonido en cm/s 17 const float velson = 34000.0; 18 19 // número de muestras 20 const int numlecturas = 100; 21 22 // distancia a los 100 ml y vacío 23 const float distancia100 = 2.15; 24 const float distanciavacio = 11.41; 25 26 float lecturas[numlecturas]; // array para almacenar lecturas 27 int lecturaactual = 0; // lectura por la que vamos 28 float total = 0; // total de las que llevamos 29 float media = 0; // media de las medidas 30 bool primeramedia = false; // para saber que ya hemos calculado por lo menos una 31 32 void setup() 33 { 34 // iniciamos el monitor serie para mostrar el resultado 35 serial.begin(9600); 36 // ponemos el pin trig en modo salida 37 pinmode(pintrig, output); 38 // ponemos el pin echo en modo entrada 39 pinmode(pinecho, input); 40 41 // inicializamos el array 42 for (int i = 0; i < numlecturas; i++) 43 { 44 lecturas[i] = 0; 45 } 46 47 // configuramos las filas y las columnas del lcd en este caso 16 columnas y 2 filas 48 lcd.begin(cols, rows); 49 } 50 void loop() 51 { 52 // eliminamos la última medida 53 total = total - lecturas[lecturaactual]; 54 55 iniciartrigger(); 56 57 // la función pulsein obtiene el tiempo que tarda en cambiar entre estados, en este caso a high 58 unsigned long tiempo = pulsein(pinecho, high); 59 60 // obtenemos la distancia en cm, hay que convertir el tiempo en segudos ya que está en microsegundos 61 // por eso se multiplica por 0.000001 62 float distancia = tiempo * 0.000001 * velson / 2.0; 63 64 // almacenamos la distancia en el array 65 lecturas[lecturaactual] = distancia; 66 67 // añadimos la lectura al total 68 total = total + lecturas[lecturaactual]; 69 70 // avanzamos a la siguiente posición del array 71 lecturaactual = lecturaactual + 1; 72 73 // comprobamos si hemos llegado al final del array 74 if (lecturaactual >= numlecturas) 75 { 76 primeramedia = true; 77 lecturaactual = 0; 78 } 79 80 // calculamos la media 81 media = total / numlecturas; 82 83 // solo mostramos si hemos calculado por lo menos una media 84 if (primeramedia) 85 { 86 float distancialleno = distanciavacio - media; 87 float cantidadliquido = distancialleno * 100 / distancia100; 88 int porcentaje = (int) (distancialleno * 100 / distanciavacio); 89 90 // mostramos en la pantalla lcd 91 lcd.clear(); 92 // cantidada de líquido 93 lcd.setcursor(0, 0); 94 lcd.print(string(cantidadliquido) + " ml"); 95 96 // porcentaje 97 lcd.setcursor(0, 1); 98 lcd.print(string(porcentaje) + " %"); 99 100serial.print(media); 101serial.println(" cm"); 102 103serial.print(cantidadliquido); 104serial.println(" ml"); 105} 106else 107{ 108lcd.setcursor(0, 0); 109lcd.print("calculando: " + string(lecturaactual)); 110} 111 112delay(500); 113} 114 115// método que inicia la secuencia del trigger para comenzar a medir 116void iniciartrigger() 117{ 118// ponemos el triiger en estado bajo y esperamos 2 ms 119digitalwrite(pintrig, low); 120delaymicroseconds(2); 121 122// ponemos el pin trigger a estado alto y esperamos 10 ms 123digitalwrite(pintrig, high); 124delaymicroseconds(10); 125 126// comenzamos poniendo el pin trigger en estado bajo 127digitalwrite(pintrig, low); } CAPÍTULO 2: CONTROL DEL SUMINISTRO DE BOMBAS DE AGUA Una bomba de agua consta de un accionamiento, en la mayoría de los casos un motor eléctrico, acoplado a un elemento rotativo denominado rodete. El rodete está formado por alambres que, al girar, transmiten parte de la energía al fluido que lo atraviesa. normalmente los álabes están curvados formando una guía para las partículas, y su forma determina la cantidad de energía que se transmite al fluido y el grado en que esta se reparte entre velocidad o presión. Sin embargo, en algunas bombas de muy pequeña potencia los álabes son rectos, formando una simple aspa. En las bombas axiales, el agua entra en la bomba por el centro del rodete, incrementa su energía a medida que lo atraviesa girando con el mismo, y finalmente abandona la bomba en sentido tangencial. Existen bombas que emplean otro tipo de fluidos, en lugar de agua. por ejemplo, existen bombas para mover hidrocarburos, aceites, o disoluciones. sin embargo, aunque la teoría dice que cualquier máquina hidráulica puede funcionar al cambiar el fluido que impulsa, en el mundo real deberemos comprobar en las especificaciones que la bomba está preparada para el tipo de fluido que vamos a emplear. arduino-bomba-agua-funcionamiento También podemos clasificar las bombas entre sumergibles y bombas no sumergibles. Las bombas sumergibles el motor se encuentra sellado en un encapsulado, por lo que toda la bomba se introduce en el fluido, lo que evita tener una tubería de aspiración. En las bombas no sumergibles el motor no está impermeabilizado, por lo que no puede ser introducido dentro del fluido. por tanto, necesitan una tubería de admisión, que debe cumplir unas determinadas de condiciones para que la bomba funcione correctamente (diferencia de altura con la cota del fluido, mecanismo de cebado, diámetro de la tubería de admisión...) En general es más sencillo manejar las bombas sumergibles por lo que, salvo que estéis seguros de lo que hacéis, seleccionar bombas sumergibles siempre que sea posible. Prestar atención al tipo de bomba que empleéis, y nunca introduzcáis en el fluido una bomba no sumergible. dañaréis la bomba, y podéis causar un cortocircuito. Esquema de montaje El esquema de montaje es sencillo, simplemente vamos a usar un mosfet como el irf520n como interruptor para controlar el encendido de la bomba. Por un lado, alimentamos el módulo con la tensión nominal de la bomba, mediante gnd y vin. Por otro lado, conectamos la carga mediante la clema de conexión. una bomba, salvo que esté internamente compensada, es una carga inductiva. por tanto, deberemos añadir un diodo de protección flyback, como vimos en la entrada sobre mosfet. Finalmente, alimentamos la electrónica del módulo conectando vcc y gnd a 5v y gnd en arduino, y conectamos el pin sig a cualquiera de las salidas digitales de arduino. arduino-bomba-agua-esquema la conexión, vista desde arduino, sería la siguiente. arduino-bomba-agua-conexión Debemos tener en cuenta la tensión de alimentación y la corriente nominal de la bomba de agua. en caso de consumir más de 1a, deberemos añadir un disipador de calor al irf520n, o usar otro modelo de mosfet o incluso una salida por relé. Ejemplos de código El código necesario es sencillo, ya que para a controlar la bomba de agua únicamente necesitamos emplear una salida digital, tal y como vimos en la entrada salidas digitales. Por ejemplo, el siguiente código simplemente encendería y apagaría la bomba de agua cada 10 segundos. const int pin = 9; void setup() { pinmode(pin, output); //definir pin como salida } void loop() { digitalwrite(pin, high); delay(10000); digitalwrite(pin, low); delay(10000); } // poner el pin en high // esperar 10 segundos // poner el pin en low // esperar 10 segundos controlador de nivel de agua en tanque con sensor ultrasonico y arduino. CAPÍTULO 3: ACTUADORES PARA EL PASO DEL AGUA: En el presente se muestra cómo implementar un sistema de control de nivel para tanque elevado basado en esp32. como elemento sensor de nivel se escogió un sensor ultrasónico impermeable. el sistema es capaz de detectar si la bomba hidráulica está funcionando correctamente gracias a un flujómetro. la información del nivel y del flujo a la salida de la bomba es mostrada por una pantalla lcd. un buzzer sirve como interfaz sonora para conocer de posibles eventos en el sistema. listado de materiales para el proyecto: placa basada en microcontrolador: doit esp32 devkit v1 (cantidad x1) sensor ultrasónico impermeable: jsn sr04t (cantidad x1) módulo relé de un canal : (cantidad x1) sensor de flujo: yf-s201 (cantidad x1) pantalla lcd 16×2: (cantidad x1) placa para prototipo de bakelita (perfboard): (cantidad x1) buzzer: (cantidad x1) fuente de alimentación de 5v a 500ma (cantidad x1) diagrama de conexiones: ¿Cómo funciona el sistema? El sistema va a medir el nivel del tanque y a partir de dos parámetros prefijados para el nivel alto y el nivel bajo, va a tomar la decisión de encender o apagar la bomba. en otras palabras, si por ejemplo, se toma como nivel bajo el 40% del total de la capacidad del tanque y como nivel alto el 90%, el sistema va a mandar a encender la bomba (por medio del relé) cuando el nivel sea inferior a 40% hasta que llegue al 90% donde será apagada. paralelamente a este proceso, mientras esté encendida la bomba, el sistema va a chequear que exista flujo a su salida (que la bomba esté “halando” agua) y en caso de que no exista flujo a la salida de la bomba, la va a mandar a parar, esto es para evitar que se queme, pues una bomba encendida sin bombear agua un tiempo relativamente corto se quema, pues se basa en el agua para su propia lubricación y enfriamiento. adicionado a todo esto, en la pantalla lcd se mostrará todo el tiempo los datos del % de agua existente en el tanque, el flujo de agua y notificará en caso de algún error como cuando la bomba no bombea. Como un apoyo a la pantalla, el sistema contará con un buzzer a forma de señal sonora, el que producirá sonidos ante la ocurrencia de eventos como: encendido de la bomba, parada de la bomba y error. a continuación se presentan un número de pasos que servirán de guía para la realización de este proyecto: Paso 1: instalación del sensor ultrasónico. el sistema se basa principalmente en medir el nivel del tanque por medio del sensor ultrasónico impermeable jsn sr-04t el cual va a estar ubicado en la tapa del tanque apuntando hacia el agua. en la figura que se muestra se aprecia cómo se logra medir el nivel de agua (n) con este sensor, a partir de tener la altura del tanque (h) (que es constante) y la distancia medida por el sensor (s), el nivel de agua sería la resta de la altura del tanque menos la distancia medida por el sensor: n = h – s. entonces con esa sencilla ecuación es posible conocer el nivel existente en nuestro tanque. este debería ser el primer paso, colocar el sensor en el tanque y visualizar por la pantalla lcd el nivel de agua existente en el tanque. Si la distancia existente entre la placa de control del sensor y el microcontrolador es grande no se preocupe, el sistema que monté tiene 13m de cable entre ambos y solo hay una pérdida de 0.1v en tal distancia. para el cableado de los sensores se empleó cable utp (conocido también como cable de red o par trenzado). en la imagen que sigue se muestra como quedaría conectado el cable utp. Durante estas pruebas con solo el sensor ultrasónico conectado tuve que emplear filtrado digital pues las lecturas del sensor esporádicamente se hacían cero (esto pasa cuando se dan lecturas fuera de rango, sospecho que se deba al eco que se puede producir en el interior del tanque pues es una estructura cerrada). además, las lecturas se volvían muy ruidosas cuando se encendía la bomba, seguro porque el cable que alimenta a la bomba pasaba junto al del sensor. con un filtro promedio se resolvió el problema este y las lecturas del sensor se ven en la lcd con estabilidad. como el sensor ultrasónico trae separado el sensor de la electrónica es necesario idear alguna forma de que la placa de control quede bien aislada del medio ambiente. en la imagen siguiente se muestra una cajita que se desarrolló para proteger a la placa electrónica que controla al sensor. Luego de probar tal sensor por unos días y comprobar que todo funcione correctamente se procede al siguiente paso: Paso 2: instalación del sensor de flujo y comprobación de su correcto funcionamiento. Si se quiere que este sensor posea buena precisión es requerida su calibración, como en este caso especial no nos interesa conocer con exactitud la cuantía de flujo, sino su existencia, no se cubrirá tal aspecto. en la imagen se muestra cómo queda el sensor instalado en la tubería. En la imagen siguiente se muestra el display lcd mostrando los datos de las lecturas del flujómetro. para comprobar el correcto funcionamiento de tal sensor se simuló como si la bomba hubiese dejado de funcionar, quitándole la alimentación, en todos los casos el sensor se comportó correctamente. Paso 3: empleo del módulo relé para controlar el encendido y apagado de la bomba. en la imagen anterior también ya se estaba haciendo uso del módulo relé, pues se mandaba a encender la bomba un tiempo predeterminado el cual se muestra en la lcd en la primera fila. por otro lado en estos experimentos el sistema tomaba la decisión de apagar la bomba si el flujómetro no detectaba caudal por la tubería y si todo marchaba bien al terminarse el tiempo programado se apagaba la bomba. Paso 4: unión de todo para conformar el sistema completo. En la siguiente figura se muestra todo el sistema en una caja plástica. como fuente de alimentación (esquina derecha superior dentro de la caja) se escogió una fuente de un dvd que se encontraba obsoleto, pero se puede emplear cualquier fuente de cargador de teléfono móvil que de una salida de corriente mayor que 250ma. La pantalla lcd mostrando los datos de los sensores. la flecha indica que se está bombeando, si estuviese hacia abajo indica lo contrario. Programación del microcontrolador Para programar el microcontrolador se emplea el ide de arduino, dado que se empleará una placa esp32, hay que instalarla en el ide, segui para ello. una vez instalada la placa esp32 en el ide de arduino se selecciona el modelo de la placa y el puerto al cual se encuentra conectada: aquí esta el código del proyecto: 1 //##############################pantalla de cristal 2 liquido############################# 3 #include<liquidcrystal.h> 4 const int rs = 13, en = 12, d4 = 14, d5 = 27, d6 = 26, d7 = 25; 5 liquidcrystal lcd(rs, en, d4, d5, d6, d7); 6 7 byte bombaon[8] = { 8 0b00100, 9 0b01110, 10 0b11111, 11 0b00100, 12 0b00100, 13 0b00100, 14 0b00100, 15 0b11111 16 }; 17 byte bombaoff[8] = { 18 0b11111, 19 0b00100, 20 0b00100, 21 0b00100, 22 0b00100, 23 0b11111, 24 0b01110, 25 0b00100 26 }; 27 28 //#########################buzzer 29 control############################################################# 30 #define buzzer_pin 4 //buzzer buzzer_pin 31 32 double demora = 0; 33 34 void buzzer_warning() { 35 for (int i = 0; i < 2; i++) { 36 demora = 200; 37 for (int i = 0; i < 1000; i++) { 38 digitalwrite(buzzer_pin, high); 39 delaymicroseconds(demora); 40 digitalwrite(buzzer_pin, low); 41 delaymicroseconds(demora); 42 } 43 44 digitalwrite(buzzer_pin, low); 45 delay(50); 46 } 47 } 48 void buzzer_finish() { 49 // put your main code here, to run repeatedly: 50 for (int i = 0; i < 2; i++) { 51 demora = 200; 52 for (int i = 0; i < 1000; i++) { 53 digitalwrite(buzzer_pin, high); 54 delaymicroseconds(demora); 55 digitalwrite(buzzer_pin, low); 56 delaymicroseconds(demora); 57 } 58 59 digitalwrite(buzzer_pin, low); 60 delay(50); 61 62 demora = 300; 63 for (int i = 0; i < 1000; i++) { 64 digitalwrite(buzzer_pin, high); 65 delaymicroseconds(demora); 66 digitalwrite(buzzer_pin, low); 67 delaymicroseconds(demora); 68 } 69 70 digitalwrite(buzzer_pin, low); 71 delay(50); 72 73 demora = 600; 74 for (int i = 0; i < 1000; i++) { 75 digitalwrite(buzzer_pin, high); 76 delaymicroseconds(demora); 77 digitalwrite(buzzer_pin, low); 78 delaymicroseconds(demora); 79 } 80 digitalwrite(buzzer_pin, low); 81 delay(100); 82 83 } 84 } 85 86 #define ctrol_relay_gpio 23 //gpio destinado a conrtrolar el relay que govierna la 87 bomba 88 89 //#################filtro promedio################################### 90 const int numreadings = 20; 91 92 double readings[numreadings]; // the readings from the analog input 93 int readindex = 0; // the index of the current reading 94 double total = 0; // the running total 95 double average = 0; // the average 96 97 double filtroprom(double entrada) { 98 // subtract the last reading: 99 total = total - readings[readindex]; 100 // read from the sensor: 101 readings[readindex] = entrada; 102 // add the reading to the total: 103 total = total + readings[readindex]; 104 // advance to the next position in the array: 105 readindex++; 106 107 // if we're at the end of the array... 108 if (readindex >= numreadings) { 109 // ...wrap around to the beginning: 110 readindex = 0; 111 } 112 113 // calculate the average: 114 average = total / numreadings; 115 return average; 116} 117 118//#############medicion con el sensor 119ultrasonico######################### 120#define dist_tope 120// nivel maximo, medida con el tanque vacio en cm 121const int trigpin = 2; 122const int echopin = 5; 123 124float distancia = 0; 125int nivel = 0; //nivel en porciento 126 127long duration = 0; 128float distance = 0; 129float distanciapromedio = 0; 130 131float get_dist() { 132 // clears the trigpin 133 digitalwrite(trigpin, low); 134 delaymicroseconds(2); 135 136 // sets the trigpin on high state for 10 micro seconds 137 digitalwrite(trigpin, high); 138 delaymicroseconds(10); 139 digitalwrite(trigpin, low); 140 141 // reads the echopin, returns the sound wave travel time in microseconds 142 duration = pulsein(echopin, high, 200000);//timeout de 200000 microsegundos 143que es 200ms 144 145 // calculating the distance 146 //distance = (float)(duration * 0.03432 )/ 2; 147 return (float)(duration * 0.03432 ) / 2; 148} 149 150//#############obtencion del nivel en porciento########################### 151int ultrasonic_fail = 0;//contador para determinar fallo del sensor ultrasonico 152 153void get_level() { 154 distance = get_dist(); 155 if (distance == 0)ultrasonic_fail++; //se incrementa el contador 156 157 if (ultrasonic_fail == 5) { //si llega a 5 veces concecutivas con lecturas a cero es 158que algo anda mal con el sensor 159 digitalwrite(ctrol_relay_gpio, low); 160 lcd.clear(); 161 lcd.print("error de sensor"); 162 while (1) { 163 } 164 } 165 166 if (distance > 0) {//descarta errores del sensor 167 168 ultrasonic_fail = 0; //se resetea el contador 169 170 distanciapromedio = filtroprom(distance); 171 172 serial.print(distance); serial.print(" ; "); 173 serial.println(distanciapromedio); 174 175 nivel = dist_tope - distanciapromedio; 176 nivel = map(nivel, 0, dist_tope - 30, 0, 100);//90 seria el nivel maximo por 177seguridad que del sensor (30cm) 178 // serial.println(" nivel " + string(nivel)); 179 180 lcd.setcursor(8, 1); 181 lcd.print(" "); 182 lcd.setcursor(8, 1); 183 lcd.print(nivel); 184 lcd.display(); 185 } 186} 187 188//#####################algoritmo para control automatico de 189bomba################# 190boolean llenando = true; 191int bombafail_counter = 0; 192//ojo estos niveles estan en porciento 193#define nivel_bajo 70 //nivel bajo porcentual a partir del cual enciende la bomba 194#define nivel_alto 100//nivel alto porcentual a partir del cual apaga la bomba 195 196bool aviso = true; 197bool pump_on = false; 198 199void control_pump(unsigned int controlpin) { 200 201 if (nivel <= nivel_bajo && llenando == true) { 202 digitalwrite(controlpin, high); 203 lcd.setcursor(6, 1); 204 lcd.write(byte(1));//bomba encendida 205 pump_on = true; 206 } 207 if (nivel <= nivel_alto && llenando == true) { 208 digitalwrite(controlpin, high); 209 lcd.setcursor(6, 1); 210 lcd.write(byte(1));//bomba encendida 211 pump_on = true; 212 } 213 214 if (nivel >= nivel_alto) { 215 digitalwrite(controlpin, low); 216 llenando = false; 217 lcd.setcursor(6, 1); 218 lcd.write(byte(0));//bomba apagada 219 pump_on = false; 220 221 if (aviso) { //bandera para que suene una sola vez 222 buzzer_finish();//solo hace falta que suene una sola vez 223 aviso = false; 224 } 225 bombafail_counter = 0;//se resetea 226 } 227 if (nivel <= nivel_bajo && llenando == false) { 228 digitalwrite(controlpin, high); 229 lcd.setcursor(6, 1); 230 lcd.write(byte(1));//bomba encendida 231 pump_on = true; 232 aviso = true; 233 } 234} 235//##############sensor de flujo 236################################################################# 237byte sensorpin = 18; 238float calibrationfactor = 7;//7.5; 239volatile byte pulsecount; 240 241float flowrate = 0; 242 243unsigned long oldtime = 0; 244/* 245 insterrupt service routine 246*/ 247void iram_attr pulsecounter() 248{ 249 // increment the pulse counter 250 pulsecount++; 251} 252 253void check_flujo() { 254 255 if (pump_on) { 256 if ((millis() - oldtime) > 1000) // only process counters once per second 257 { 258 259 detachinterrupt(sensorpin); 260 flowrate = ((1000.0 / (millis() - oldtime)) * pulsecount) / calibrationfactor;//flujo 261en litros por minuto 262 oldtime = millis(); 263 264 // unsigned int frac; 265 266 // print the flow rate for this second in litres / minute 267 serial.print("flow rate: "); 268 serial.print(int(flowrate)); // print the integer part of the variable 269 serial.println("l/min"); 270 271 lcd.setcursor(6, 0); 272 lcd.print(" "); 273 lcd.setcursor(6, 0); 274 lcd.print(flowrate, 0); 275 276 // reset the pulse counter so we can start incrementing again 277 pulsecount = 0; 278 279 // enable the interrupt again now that we've finished sending output 280 attachinterrupt(sensorpin, pulsecounter, falling); 281 } 282 // se chequea que el flujo no sea menor que 5 283 if (int(flowrate) <= 5) { //no esta bombeando eficientemente o no lo esta haciendo 284 buzzer_warning(); 285 bombafail_counter ++; 286 if (bombafail_counter > 5) { 287 digitalwrite(ctrol_relay_gpio, low); 288 lcd.clear(); 289 lcd.print("error de bomba"); 290 lcd.display(); 291 while (1) {} 292 } 293 294 } 295 } 296 else { //si la bomba esta apagada 297 lcd.setcursor(6, 0); 298 lcd.print(" "); 299 lcd.setcursor(6, 0); 300 lcd.print("0");//no hay flujo, esta apagada la bomba 301 } 302} 303 304//####################----setup---305############################################### 306void setup() { 307 308 serial.begin(115200); // starts the serial communication 309 pinmode(ctrol_relay_gpio, output);//salida bomba 310 digitalwrite(ctrol_relay_gpio, low); 311 pinmode(buzzer_pin, output);//salida del buzzer 312 pinmode(sensorpin, input_pullup); 313 attachinterrupt(sensorpin, pulsecounter, falling); 314 315 lcd.begin(16, 2); 316 // create a new character 317 lcd.createchar(0, bombaoff); 318 // create a new character 319 lcd.createchar(1, bombaon); 320 321 lcd.setcursor(0, 0); 322 lcd.print("tank system"); 323 lcd.setcursor(0, 1); 324 lcd.print("inicializando"); 325 lcd.display(); 326 327 328 pinmode(trigpin, output); // sets the trigpin as an output 329 pinmode(echopin, input); // sets the echopin as an input 330 331 //inicializando el arreglo para el filtro promedidiador 332 for (int thisreading = 0; thisreading < numreadings; thisreading++) { 333 readings[thisreading] = 0; 334 } 335 //para evitar la demora que adiciona el filtro al inicio 336 for (int i = 0; i < 20; ) { 337 distance = get_dist(); 338 if (distance > 0) { 339 filtroprom(distance); 340 i++; 341 } 342 343 delay(50); 344 } 345 lcd.clear(); 346 lcd.setcursor(0, 0); 347 lcd.print("flujo:"); 348 lcd.setcursor(9, 0); 349 lcd.print("l/min"); 350 lcd.setcursor(0, 1); 351 lcd.print("nivel:"); 352 lcd.setcursor(11, 1); 353 lcd.print("%"); 354 355} void loop() { //se obtiene el nivel get_level(); // a partir de las lecturas de nivel se decide si encender o apagar la bomba control_pump(ctrol_relay_gpio); //delay para estabilidad de las medidas de los sensores delay(1000); check_flujo(); //si la bomba esta encendida revisar que exista flujo a su salida } CAPÍTULO 4: ARDUINO NANO. Básicamente, arduino nano se definen como una placa pequeña basada en el atmega328 que consiste en una versión reducida de arduino uno, debido a que sus funcionalidades son similares. Sumado a esto, se caracteriza por ser una placa 100% compatible con todo tipo de componentes electrónicos que funciona con un cable usb mini-b en lugar de un cable estándar y, por naturaleza, no cuenta con un conector para alimentación externa. ahora bien, aunque no tiene una toma de alimentación dc como otras placas arduino, ciertamente, posee un puerto mini usb. el cual, es usado para la monitorización en serie, al igual que para la programación. Tomando en cuenta además que, para la arduino nano no se requiere cargador para compilar y grabar los programas, gracias a que posee un cargador de arranque incorporado. por su parte, al tratarse de una versión similar y reducida de arduino uno, la arduino nano sirve para minimizar la demanda de energía que consume y también optimiza el espacio para alojar la placa, en vista de que es más pequeña. por consiguiente, se destaca como una placa ideal para todos aquellos proyectos en donde el tamaño es relevante. ¿cuáles son las características técnicas de las placas de desarrollo arduino nano? Antes de comenzar a emplear una placa de desarrollo arduino nano, es sumamente esencial conocer cuáles son sus características técnicas. dado que, por medio de ellas, podrás evaluar y asegurarte de que cumple con tus expectativas para llevar a cabo tu proyecto o no. por ende, a continuación, mencionamos cada una de estas particularidades: está basado en el microcontrolador o mcu atmel atmega328p en versiones 3.x y en atmega168 en otras anteriores. para cualquier caso, la placa arduino nano opera a una frecuencia de 16 mhz. se caracteriza por ser una placa microcontroladora pequeña, fácil de usar y muy flexible. tiene un peso total de 7 gramos. posee 14 pines digitales, 8 pines analógicos, 6 pines de potencia (vcc y gnd) y 2 pines de reinicio. valorando que, de los pines digitales y analógicos, tienen pautadas varias funciones extra. su memoria está compuesta por 32 kb o 16 kb flash, según cada versión. por lo general, los 2 kb son utilizados para el cargador de arranque. cuenta con una tensión de alimentación de 5v. mientras que, su tensión de entrada puede variar de 7 a 12v. para su conexión con el ordenador a fin de alimentarla o programarla, la arduino nano emplea un miniusb estándar. el consumo de energía que revela, en la mayoría de los casos, es de 19ma. posee un oscilador de cristal de frecuencia 16 mhz que corresponde a la velocidad del reloj. el cual, se usa para generar un reloj de frecuencia determinada empleando voltaje constante. respecto al tamaño de la placa de circuito impreso, se conoce que es de 18 x 45 mm. la placa, por defecto, se encuentra programada utilizando arduino ide que es un entorno de desarrollo integrado que funciona de manera online y offline. ¿Cuántas entradas y pines tiene la placa de desarrollo de arduino nano? Dado que los pines digitales del nano pueden ser utilizados como entrada o salida, se conoce que esta placa de desarrollo cuenta con un total de 14 entradas que son proporcionales a los pines digitales. los cuales, generalmente, trabajan a 5 voltios y cada uno de ellos, presentan la capacidad de entregar o recibir un total de 40ma, además de que cuentan con una resistencia de pull-up de 20 a 50 kohms. sumado a esto, las arduino nano cuentan con 8 entradas analógicas que, por supuesto, son la cantidad de pines analógicos que poseen y cada una de ellas provee de 10 bits de resolución (1024 valores diferentes). CAPÍTULO 5: LOS MÓDULOS HC-05 Y HC-06 SON MÓDULOS DE BLUETOOTH. Los módulos bluetooth hc-05 y hc-06 son elementos que te permitirán comunicar tu microcontrolador por protocolos bluetooth con cualquier otro elemento que cuente con el mismo protocolo, desde un celular hasta un portátil o incluso otro módulo bluetooth conectado a otro microcontrolador. La principal diferencia entre estos dos módulos reside en que el hc-05 puede ser configurado para ser usado como dispositivo maestro o esclavo, mientras que el hc-06 sólo puede ser usado como esclavo. ambos dispositivos pueden ser configurados para cambiar el nombre del dispositivo, cambiar su clave de apareamiento, el nombre por defecto es hc 05 (ó hc 06) y la clave por defecto es: 1234. se debe mencionar que toda configuración a lo dispositivos debe ser hecha por comandos at y que ambos módulos pueden alimentarse con 5 o 3.3 v. Una vez apareado el dispositivo con, por ejemplo, tu celular android (a la fecha no hay una aplicación ios compatible con estos módulos) podrás enviar comandos como letras o caracteres desde tu celular para controlar funciones en tu programa. existen muchas aplicaciones en la playstore de google que pueden servirte para este fin, sólo basta con ingresar "bluetooth arduino" en el buscador y buscar la que necesites, algunas incluso son modificables de forma que puedes adaptar los botones en la aplicación de acuerdo a tu programa para tener un control totalmente personalizado. Estos módulos se comunican con arduino por medio del puerto serial, por lo tanto para programar tu placa, el módulo debe estar desconectado en primera instancia. luego, la comunicación por puerto serial nos facilita en gran manera obtener datos desde el módulo, ni necesitamos siquiera instalar librería alguna, sólo basta con verificar si hay datos entrando al buffer del puerto serial, si los hay, es porque el módulo está recibiendo información, por lo cual leemos la información leyendo los datos en el buffer. A continuación, un ejemplo bastante simple, donde verificamos constantemente si se han recibido datos, si recibimos entonces la letra "a" activamos el led conectado al pin 13 de nuestra placa arduino uno y si recibimos la letra "d", lo apagamos. esquema de conexión con arduino uno (las conexiones para el hc 06 son exactamente iguales) codigo arduino int ledpin = 13; // pin del led int estado = 'd'; // inicia apagado void setup() { serial.begin(9600); // inicia el puerto serial para comunicacion con el módulo bluetooth pinmode(ledpin, output); } void loop() { if(serial.available()>0){ // lee el bluetooth y almacena en estado estado = serial.read(); // aquí se almacena lo que llegue } if(estado=='a'){ //encender led digitalwrite(ledpin,high); } if(estado=='d'){ //apagar led digitalwrite(ledpin,low); } } una vez subido el código, sólo debes asegurarte que envíes la letra correcta con tu app android y verás al led realizar la acción que le mandes. CONCLUSIONES al ser el agua el bien más importante de la naturaleza, y ser destinada para uso de todos como un bien común, debemos darle la importancia que realmente tiene en nuestra sociedad, por lo que autoridades y ciudadanos tenemos la obligación de trabajar con la finalidad de crear un mejor modelo en nuestro proyecto de agua y con ello lograr la calidad y frenar la continuidad del desperdicio de esta. el agua es el elemento más importante para la vida. es de una importancia vital para el ser humano, así como para el resto de los animales y seres vivos que nos acompañan en el planeta tierra. el ser humano tiende a abusar de este rico elemento en perjuicio de su propia especie y en perjuicio de su propia existencia, así como la del resto de habitantes de la tierra. se dice que el ser humano puede llegar a necesitar hasta 500 litros de agua potable al día, lo que supone un derroche extremadamente excesivo. de ahí que le estemos dando tanta importancia al agua para el desarrollo de la vida en el planeta. la aplicación va a estar diseñada con el fin de frenar el abuso en el consumo de nuestro vital líquido, recordando a los usuarios la importancia del agua en nuestro futuro próximo. bibliografía 0. sensor de nivel de agua con arduino utilizando ultrasonidos (programarfacil.com) 1. installing esp32 in arduino ide (windows, mac os x, linux) | random nerd tutorials. 2. http://aldf.gob.mx/archivo027a57875ea54db65fb86646226b9611.pdf 3. https://www.arcaelectronica.com/blogs/tutoriales/modulo-bluethoothc-05-y-hc-06arduino#:~:text=los%20m%c3%b3dulos%20bluetooth%20hc%2d05 ,bluetooth%20conectado%20a%20otro%20microcontrolador. 4. 10 marzo, 2020 alexander rivas alpizar arduino 21 5. anexos