Subido por wendy consta

31032022 proyecto integradora II (3)

Anuncio
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
Descargar