Alarma para control de fugas de agua

Bueno, lo primero de todo, me presento en este post, que aunque llevo leyendolo unos dias, no me había decidido a escribir. Me llamo Pedro, soy de Las palmas (vease: nueva ubicación), tengo un tropomorfo de años y soy nuevo en Arduino, aunque no en electricidad/electrónica/informática.

Para poner un poco en antecedentes, voy a contar como surgió la idea de esta centralita.
Hace un tiempo, reforme la casa y se quedo de coj***s estooo, de put* **dre en fin, muy bien, pero poco despues, se revento un grifo y gracias a Buda que estaba en casa, por que en 2 minutos que tardé en darme cuenta que no estaba a la orilla de la playa, la casa se inundó con unos 2cm de agua, si llego a estar fuera y vuelvo varias horas despues, ni hablamos. La cosa la solucioné rapido, cerré el agua, 5 horas limpiando y grifo nuevo. Listos.

Unos meses despues (no se cuantos, a lo mejor año y medio, que se yo), mi mujer se dejo sin querer un grifo abierto (o queriendo...), ¿y sabeis lo que paso? 5 horas recogiendo agua, yo cag*me en los mtos de toda la familia de mi mujer yo un poco enojado con mi mujer y bla, bla, bla.

De todo esto saque algo en claro: que tenia que buscar una forma de evitar que volviera a pasar. Así que tiré de lo aprendido en ese sitio que fuí para que me enseñaran a calcular la masa del sol a partir de que pepito tiene 2 naranjas y juanito 2 manzanas.... :stuck_out_tongue:

Bueno, se me ocurrio montar una centralita con sensores de agua distribuidos por puntos clave de la casa. La primera idea fue lo tradicional, usar puertas lógicas, así que ni corto ni perezoso, me puse en ello y diseñe un modelo utilizando puertas NOR en modo biestable R-S, un par de 555s, un puñado de leds y listos.


Esquema con Proteus de la primera idea del diseño.

Creyendolo un simple proyecto, diseñe el circuito, (ahí se empezó a complicar la cosa) y lo tuve que hacer a doble cara, ya que con una cara eran demasiadas conexiones a realizar.


Diseño a doble cara

Pese a todo, lo imprimí sobre PCB de doble cara, ataqué la placa y la barnizé, pero dandome cuenta (un poco tarde, por cierto), de que me estaba complicando la vida demasiado para algo tan pobre.


La placa con algunos de los componentes de ya soldados (ya se que se empieza con los mas pequeños, pero no los tenia a mano).

Fué en este momento cuando decidí optar por un PIC. Pero ¿por que montar un PIC? ya conocia Arduino y sus virtudes, pero nunca lo había tenido entre las manos, así que ni corto ni perezoso, opte por hacer el proyecto con Arduino, a pesar de no conocer nada practicamente sobre el.

Pues hasta aqui el como llegé al montaje de este (ahora ya complejo) proyecto, a partir de ahora, me centrare en lo que a todos nos interesa: Arduino y sus módulos.

La idea principal es utilizar unos sensores repartidos por la vivienda y conectados a Arduino mediante entradas analogicas. Los sensores, a pesar de ser muy comunes y baratos, opte por hacerlos yo, por varias cuestiones, entre ellas, que podia decidir que resistencia otorgarles (mas adelante lo expicaré).


Los sensores en forma de E, recien estañados, tienen trabajo por delanta aún.

Estos sensores van con esa cara al aire (una vez terminados, claro), con una malla de nylon para evitar falsos, y por su parte posterior, una resistencia de 47k y un encapsulado de plastico, esto hace que sea posible transmitir la información solo con 2 hilos (masa y señal, por consiguiente esta resistencia estaría en pull down). Por otro lado en la placa ponemos una pull up de 51k (en mi caso) y tengo variable para aburrirme:

VALOR ESTADO
-100 cortocircuito
100-300 sensor mojado
450-550 sensor seco y conectado
+900 sensor desconectado


En la pantalla de inicio


Con sensor mojado

¿Desconectar el sensor?


Sensor seco por si mismo, pero notificando que hubo un fallo
Los valores intermedios, los tendrria que mirar muy bien, o darlos por falsos, lo que daria como consecuencia un fallo del sensor.
Aparte de los sensores mencionados, utilizo también:

  • DHT11
  • DS1307
  • LCD (16x02 en esta versión, pero será 20x04 en su versión definitiva).
  • Matriz de teclado 4x4 (3x2 en su version definitiva).

El LCD he optado por conectarlo mediante I2C, principalmente para ahorrar E/S. Cabe destacar que en este moento no tiene E/S disponibles el Arduino, pero en el momento que el teclado cambie a 3x2, le quedarán 3 E/S libres, que perfectamente se pueden utilizar para conectar un registro de desplazamiento, como un 595 y ampliarlas a 8.
El objetivo del proyecto es:

  • Presentar fecha, hora, temperatura y humedad por LCD
  • Monitorizar el estado de los sensores
  • En caso de sensor en corto, mojado, desconectado involuntariamente o fallo desconocido alertar redundantemente, mediante una sirena sonora y alarma visual, y siempre activar la electrovalvula.
  • el sistema será autosuficiente, no necesitará de ningún componente extra para realizar sus funciones, incluida la puesta en hora/fecha
  • Se podrá mostrar tanto por LCD, como por puerto serial los datos mas relevantes, tales como fecha y hora, estado actual, mínimo y máximo de los sensores, hora de la última alarma, número de alarmas, etc
  • debe de contar con los menús y submenús para realizar todas estas tareas
  • un montón de cosas que se me quedan en el tintero
  • cosas que ya estan implementadas, pero que no he mencionado...

Como podreis ver en el código, lo primero que llama la atención es que eseté configurado solo para leer un sensor, esto es así por que es de la única forma que lo puedo tener en la protoboard, me es imposible conectarle todos los sensores. Si quiero ver que hace con todos los sensores, lo simulo en Proteus.
El código está extremadamente comentado (quizá en exceso), pero será muy dificil perderse por el.

Un último detalle, el código esta integramente (el 100%) escrito por mi, no hay ni una sola linea copiada de internet, ni de ningún otro sitio. Espero que quien pueda ayudar, me ayude, y quien no, que aprenda.

Principal problema: Sketch uses 19.406 bytes ...... Global variables use 1.440 bytes ... A este ritmo, me termino de escribir el código y la mitad de las variables en la po**a en la mano. :confused:

El código lo pongo en post posteriores, ya que el máximo de caracteres permitidos por post es de tan solo 9000.

///////////////////////////////////////////////////////////////////////////////////////////////

EDITO: Dejo el archivo .ino aqui, (gracias a surbyte), no sabia que se podia adjuntar.

alarma.ino (33.5 KB)

Que buen trabajo Pedro.. se nota que eres electrònico de los mios.. jaja Muy buen trabajo pero yo te darè una vuelta a la idea que tiene un componente que es justamente detectar las fugas en diferentes lugares.
Precisamente a mi me pasó lo mismo pero gracias a dios no inunde la casa.
Tengo un medidor de nivel de tanque y el otro dia verifico y decia 100% Lleno. Uso un sensor de presion que me mide la altura del nivel del tanque de agua.
Resulta que me doy un baño, (inmersiòn) y lo tengo medido que consumo 15% de mi tanque (una barbaridad ya lo se. Pues bien, al mirar deberia marcar 85 pero no decia 75 pero no me di cuenta....
La cuestion que hago unas cosas y vuelvo a leer 56%, madre de dios!!! que pasa.? Vivo en una ciudad que se corta mucho el agua.. Asi que llamo para averiguar y si.. habia cortes sorpresivos de suministro. Bien. Voy a la llave de paso y veo que tengo agua asi que no entiendo que ocurre.
Ya el nivel cai mas.

En fin.. lo he hecho muy dramatico. La cuestion fue que tenia como tu una canilla abierta con la que mi Sra habia regado las plantas y quedó asi.
Me descargó el tanque. Me vino bien mas alla del gasto, para regular elnivel inferior que no lo habia podido hacer.

Eso me hizo pensar en usar una simple alarma que sin en 10 min cae tanto el nivel me haga un pitido y envie un msg a mi celular.
Mi bañera demora menos que eso. Pero cualquier gasto constante en 10 min es un gasto fuera de lo común.

Asi que ahi tienes una forma simple de medir.

Los sensores que has fabricado supongo que los has protegido porque el cobre se oxida ràpidamente con el tiempo.
Por lo demás fabuloso.

Ahora sumale algo que te envia a tu celular la informaciòn en curso.

Luego lo miro con mas detalle.
No he leido el còdigo, si toda tu historia.
Un gusto.

NOTA: El codigo asi es dificil de seguir. Te recomiendo que borres las notas 2,3,4,5 y lo subas con el attachment que tiene el editor

surbyte, No tengo tanque (o cisterna) en mi casa, el agua viene desde la calle casi directamente, no tengo forma de medir por ahí, por otro lado, tampoco puedo poner un medidor de flujo, pues si pongo la lavadora o el lavavajillas, no tengo ni idea del tiempo que pasan "chupando" agua, ni mucho menos en los 1.746 programas distintos que pone mi mujer la lavadora :confused: , Pero toda idea es bienvenida y la agradezco de todo corazón.
Respecto al sistema de notificación, algo tenía pensado, pero lo primero es lo primero :-[ Gracias por la propuesta surbyte.

Hola.

Surbyte pues indicar que sensor de presión (marcavy modelo) utilizas para controlar el nivel del depósito?

Un saludo

SENSORES DE PRESION

Uso lo sensores Freescale MPX5XXX y aca me detengo porque todo depende de la altura que uses pero es muy facil.
Todos los sensores son diferenciales
El MPX5100DP te permite medir hasta 10 mts de columna de agua de ahora en adelante llamaré mcA (metros columna de agua)
Seré reiterativo pero asi no quedan dudas.
MPX5050DP para 5 mcA (metros de columna de agua)
MPX5025DP para 2.5 mcA
MPX5010DP para 1.0 mcA.

Este sensor tiene una salida 0.2 a 4.7V que lo hace perfecto para Arduino.

Mira mi situación. En mi casa de dos pisos el tanque esta a 5mts de altura y es de 1000 litros asi que mide aproximadamente 1.3 hasta su llenado total.
Solo por probar use un MPX5100DP y aunque estoy trabajando en el rango 487 para tanque lleno u 377 para vacio.

Claro que luego usare un MPX5025DP conectado a la salida del tanque para tener un mejor rango de medicion. Pero por ahora funciona.
Ahh estoy conectado con una T en una conexion que hice en el baño de segundo piso. que estará a 4 y algo metros.

VOLVAMOS AL TEMA DE ESTE POST

Bueno, lo primero que viene a mi cabeza es, que buen servicio tienen en Las Palmas que no le cortan nunca el agua... si vivieras en mi ciudad con un acueducto a 180kmts pensarías diferente.
Yo te recomendaria que instalaras el tanque igualmente pero eso requiere de que tu casa este preparada para ello. Me refiero a un sitio estructuralmente apto para soportar 1 ton o 1000 litros de agua.

Otra alternativa es que reemplazes tus canillas por otras que sean normalemnte cerradas y se activan por presion, tal vez en los lugares mas sensibles de la casa sea una buena alternativa incluso para ahorrar agua. Esa es mi solucion en mi casa. Todas lo son. salvo en el baño.

Has visto los sensores de riego para arduino?
Son similares a los que fabricaste pero los tuyos funcionan exactamente igual.
Dime donde estas parado en tu proyecto ahora. Porque luce muy avanzado. Que problemas tienes o no tienes ninguno?

Hola de nuevo, surbyte. Aquí no es que precisamente tengamos el mejor servicio de aguas que se pueda prestar, si no que como no llueve nunca, pues la opción fue construir una planta desalinizadora en la ciudad y venga, todos a vivir con agua de mar. :money_mouth_face: Solucionado el tema de cortes de agua. Eso si, como se te ocurra beber, estas tres días con diarrea. :smiling_imp:

Por otro lado no vivo en una vivienda particular, si no en un edificio de 13 plantas, así que si quiero un depósito, me lo tendría que meter en el salón ;D . El sistema de agua del edificio es bastante simple.
En el sótano del edificio si tenemos depósitos de agua, principalmente por si hay un corte puntual. Pero es uno para los pisos del 1 al 6 y otro para los pisos del 7 al 13. Cada deposito lleva una bomba de agua y listos.
Yo vivo en el primer piso, por lo que ya tengo un problema añadido por esa parte, puesto que la bomba mete el agua a una presión muy elevada para que los que viven en el sexto tengan una presión normal, pero a mí me llega con una fuerza brutal, así que lo primero que tuve que hacer fue meter un regulador de presión a la entrada de agua de la vivienda.

Otra alternativa es que reemplazes tus canillas por otras que sean normalemnte cerradas y se activan por presion, tal vez en los lugares mas sensibles de la casa sea una buena alternativa incluso para ahorrar agua. Esa es mi solucion en mi casa. Todas lo son. salvo en el baño.

No tengo muchos conocimientos de fontanería, ¿quizás te refieras a algo parecido a esto?

Has visto los sensores de riego para arduino?

Si, he visto como 20 modelos, pero como ya tenía pensado hacerlos, los hice de todas formas y funcionan a la perfección para el uso que les quiero dar. Al estar estañados, no hay problema con oxidación ni nada parecido.

Que problemas tienes o no tienes ninguno?

Por tener, tengo un montón. :cry:
El principal es este:

Sketch uses 19.406 bytes (60%) of program storage space.
Global variables use 1.440 bytes (70%) of dynamic memory

Llevaré como la mitad programado y ya empiezo a estar fatal de memoria, asi que si a alguien se le ocurre como depurar un poco el código, o decirme donde puedo estar haciendo algo mal, para hacerlo de forma mas simple o mas eficiente, estaría tremendamente agradecido.

Por supuesto cualquier idea/sugerencia/critica etc. será bienvenida. Cualquier cosa que pueda ser de un mínimo de utilidad, como un enlace a una web de un chino que hizo un menú con 3 variables y 12 lineas de código o lo que sea, lo recibiré con los brazos abiertos.

Un saludo a todos.

Para aligerar ram usa en la medida de lo posible variables locales que solo estan en memoria en el ambito en que se declaran ,por ejemplo:
for (e = 0; e < 1; e++){ -> for (byte e = 0; e < 1; e++){
y no la declaras antes del setup.de este modo solo estara en memoria mientras se ejecute
el for a costa de aumentar el tiempo de ejecucion (minimamente...) al tener que crear la variable en cada loop .
Te dejo tambien un esquema para manejar el menu que vi en el video de un tal Antonio Castro ,que usa arduino para sus acuarios .maneja 5 pulsadores con una entrada analogica.

esquema.png

Hola Pedro.
No. Esa no es la imagen, esa parace ser una válvula de alivio. Esta es la llave de agua que al presionar te entrega agua y permanece todo el tiempo cerrada, imposible dejarla abierta.

respecto de los menúes acabo de responder (anoche) un post y agregué la lista recopilada de todos los programas de manejo de menúes. Algunos son aparentemente dificil de configurar pero cuando le tomas el pulso son excelentes. Son librerías muy bien hechas, algunas como MK2TLIB es sinceramente sobervia, pero tambien lo es phi menu.

Lista de librerías esta mas o menos en la segunda respuesta. tenía un link mejor pero ahora no funciona.

Otra muy recomendable que la tengo en uso es OpenMoCo, simple, sencilla y muy intuitiva. Maneja todos los ingresos posibles, sea serial, sea, keypad, botones simples a entradas digitales o por botones tipo el LCD Shield. o sea através de A0.

Ahh y algo mas Pedro, perdona pero intenta subir tu codigo usando el atachado que figura al pie del editor en un solo archivo asi algunos no tendrán necesidad de copiar y pegar 5 mensajes.