ayuda con proyecto con nivel de deposito de agua a distancia

Muy buenas esta es mi primera intervencion aqui, en primer lugar tengo un nivel bajo en el tema de la programacion, pero desde luego intento aprender, leyendo y releyendo por estos lares. Os comento mi intento de proyecto, quisiera controlar el nivel de un deposito de agua a traves de dos modulos arduino y dos Xbee S2 a 900Mhz, en estos momentos los modulos Xbee no los tengo, pues como la distancia a cubrir es bastante (alrededor de 2 Kms), estoy haciendo pruebas a traves del puerto Serial del Arduino a traves de cables y con una distancia corta (15 centimetros).
El deposito le colocaré unas boyas distanciadas unas de otras a 25 cmt. con lo cual se va a tratar de interruptores, en total serian 4 interruptores en el modulo emisor y en el modulo receptor colocaria en un futuro una pantalla LCD, pero ahora para iniciar el proyecto van a ser 4 leds. Navegando por la red he encontrado un proyecto de un timbre inalambrico Index of /bwsn_book/code que devuelve una respuesta al enviar el pulso, yo lo he modificado colocando un segundo pulsador (tendria que llegar a 4)
codigo del emisor:

  • ********* Doorbell Feedback BUTTON ********
  • requires pre-paired XBee Radios
  • and the BELL program on the receiving end
  • by Rob Faludi http://faludi.com
    */

#define VERSION "1.00a0"

int BUTTON = 2;
int LED = 11;
int PULS = 3;
int LED1 =12;

void setup() {
pinMode(BUTTON, INPUT);
pinMode(LED, OUTPUT);
pinMode(PULS, INPUT);
pinMode(LED1, OUTPUT);

Serial.begin(9600);
}

void loop() {
// envia el caracter D a traves del puerto serial si se pulso BUTTON
if (digitalRead(BUTTON) == HIGH) {
Serial.print('D');
delay(10); // evita colapsar el puerto serie
}

// si se recibe el caracter K se enciende el LED de respuesta
if (Serial.available() > 0 ) {
if (Serial.read() == 'K') {
digitalWrite(LED, HIGH);
}
}

// cuando se suelta el BUTTON se apaga el led
if (digitalRead(BUTTON) == LOW) {
digitalWrite(LED, LOW);
}
// envia el caracter C a traves del puerto serial si se pulsa PULS
if (digitalRead(PULS) == HIGH) {
Serial.print('C');
delay(10); // evita colapsar el puerto serie
}

// si se recibe el caracter l se enciende el LED1 de respuesta
if (Serial.available() > 0 ) {
if (Serial.read() == 'L') {
digitalWrite(LED1, HIGH);
}
}

// cuando se suelta el PULS se apaga el LED1
if (digitalRead(PULS) == LOW) {
digitalWrite(LED1, LOW);
}
}

y este es el codigo del receptor:

/*

  • ********* Doorbell Feedback BELL ********
  • requires pre-paired XBee Radios
  • and the BUTTON program on the receiving end
  • by Rob Faludi http://faludi.com
    */

#define VERSION "1.00a0"

int led = 5;
int led1 = 6;

void setup() {
pinMode(led, OUTPUT);
pinMode(led1, OUTPUT);
Serial.begin(9600);
}

void loop() {
// busca el caracter D y si lo encuentra enciende el led
if (Serial.available() > 0) {
if (Serial.read() == 'D'){
//envia la respuesta si el mensaje se recibió
Serial.print('K');
//enciende el led
digitalWrite(led, HIGH);
delay(10);
digitalWrite(led, LOW);

}
}
// busca el caracter C y si lo encuentra enciende el led1
if (Serial.available() > 0) {
if (Serial.read() == 'C'){
//envia la respuesta si el mensaje se recibió
Serial.print('L');
//enciende el led1
digitalWrite(led1, HIGH);
delay(10);
digitalWrite(led1, LOW);

}
}
}

Los problemas que se me presentan son:

  • Dado que el emisor se alimenta con una bateria y los pulsadores son en realidad interruptores, con lo cual el emisor siempre estaría emitiendo y con lo cual la vida de la bateria se extenguía en breve (consumo Arduino + Xbee+leds) ¿como se puede implantar una rutina de retardo, para que emita por ejemplo cada 5 minutos? ya que si elevo el valor de DELAY(), segun lo que tengo entendido (y doy fé de ello) el programa se me para y no me envia la señal del segundo pulsador, tambien habría que contar que con dicha rutina de retardo, en el receptor, los leds sigan encendidos indicando el nivel del deposito de agua.

A la espera de sus indicaciones me despido con un cordial saludo.

Buenas, yo en programación ando como tu o peor, pero de electrónica mucho peor :stuck_out_tongue:

Una solución podría ser un pequeño panel solar que te valla cargando la bateria. Tendrías que ver cuanto consume todo eso, y buscar bateria cargador y panel adaptado.

Las xbee creo que se pueden poner "en reposo" cuando no necesitas emitir dato. Y para no utilizar delay(), emite dato solo cuando haya cambio de estado.

Para leer las sondas cada x minutos, puedes usar la función millis(), para comprobar el tiempo transcurrido desde la ultima medición.

échale un ojo a esto por si te pudiera servir: Proyectos Geek: Monitor de nivel de agua con Arduino y ultrasonido

Muchas gracias por responder Marcial, lo del tema de la placa solar no me interesa, pues por la cosa de los robos, por lo menos aqui por mi zona la cosa está muy calentita, por eso tengo que alimentarlo con una bateria, aunque tenga que ir a cambiarla cada x tiempo. El ejemplo que me has puesto no me sirve, se trata de medir la altura de un desposito a traves de ultrasonidos y enviarlos a una pagina web. Volviendo a tu respuesta, donde se implementaria la funcion "milis" para leer los interruptores?, por que creo que seria la mejor solucion, leer datos, enviarlos por serial, hacer un descanso (que incluso puede llegar a 15 minutos, serian 4 veces por hora y 96 al dia, lo que daria bastante autonomia a la bateria) y volver a empezar de nuevo.

Hola,

El enlace del ejemplo del post anterior es muy bueno.
En el libro "Practical arduino" viene un ejemplo de ese mismo proyecto con detalles muy interesantes.
Esta en ingles, si no lo encuentras mandame un privado....

Vete informandonos de los avances
Un saludo

unsigned long Tiempo_Transcurrido=0;
unsigned long Tiempo_Espera=1000; // Tiempo que quieres demorar en milisegundos

void loop()
{
if (millis()>Tiempo_Transcurrido)
{

todo el proceso

Tiempo_Transcurrido=Tiempo_Espera+millis()
}
}

Con eso te realizaría el proceso cada cada “Tiempo_Espera” milesimas
el enlace que te pase, ya se que envía la información a Internet, pero la parte de control de nivel podridria encajarte, sin usar 4 bollas, con un solo sensor, me pareció interesante.

hola todo el foro,para que el transmisor no este emitiendo continuamente puedes darle alimentacion atraves de un transistor que a su vez solo sea activado por el arduino cada vez que vaya a enviar una trama de datos.Asi lo hice yo con un walkie para usarlo como baliza de telemetria.

Muchas gracias a todos por sus respuestas.
Para Lolailo investigaré lo que me dices y ya te contaré.
Para Marcial, he visto tu rutina basada en millis, pero segun he leido esta rutina pasado un tiempo (no me acuerdo ahora mismo cuantos dias eran) se desborda, con lo cual, pienso para mi mismo, no es fiable esta rutina pues pasado este tiempo de desbordamiento, lo que en principio se pueda programar a 15 minutos, pasados esos dias al desbordar, podrian ser "x" minutos ¿no? (o son imaginaciones mias, pero estoy viendo que este problema de temporizacion va a ser super complicao con el arduino)
Para esdrufao, lo del transistor en este caso no creo que haga falta, pues los modulos de radio Xbee tienen la opcion de sleep (sueño o inactividad al emitir pero preparados para recibir), lo que ocurre, es que como toda documentacion que encuentro esta en ingles y claro se "junta" que el traductor del google hace lo que puede y que mi nivel de programacion se me queda corto, como dice el dicho "con la iglesia hemos topao" :roll_eyes:
P.D. lo del emisor ultrasonico es buena idea, me daria el nivel exacto del deposito de agua, pero, el tema de usar interruptores (que en realidad son boyas de nivel) es que a determinado nivel de agua, tengo que poner en funcionamiento una electrovalvula para que llene el deposito y viceversa para cuando se llene el tanque, pero ese tema lo tengo "controlao".

No te preocupes yo de programar en c level floor,pero a todo se aprende,se me da mejor PBP ya que he trabajado mas con los pic y aun asi hay cosillas que se me escapan.

http://arduino.cc/es/Reference/millis :slight_smile:

Efectivamente se desborda, aprox en 50 dias (la pila dura menos jejejej) , pasa a cero, y vuelve a contar, asi que con una comprobación puedes subsanarlo

if (millis()< 100) // Acaba de reiniciar
{
Tiempo_Transcurrido=0; // iniciamos el ciclo de lecturas
delay(100); // para que no vuelva a entrar hasta el siguiente desborde
}

Muy buenas a todos y feliz año. Se me "jodio" el disco duro del PC y hasta hace un par de dias no he podido retomar el tema, menos mal que hice la pregunta por aqui, por que lo perdí todo y he vuelto a empezar desde cero. Bueno Marcial, con el tema de "millis" sigo como al principio, es decir, no he progresado, lo que si estoy muy contento es con el receptor, le he implementado una pantalla LCD 2x16 y digamos que me funciona de lujo. Cuando tenga un pelin de tiempo pondre el programa, fotos y avances. Un saludo.

Buenas bitri1967, y feliz año a todo el foro

Yo comparto desgracia contigo, jeje. Llevo unos días intentando recuperar ficheros de mi disco duro. Por si te interesa, hay un adaptador que sirve para conctar el HD a un puerto usb y leerlo como una unidad externa. Aqui te dejo un ejemplo usando millis para controlar en envío.

const unsigned long Frecuencia=1000;          // Frecuencia de envío de datos en milisegundos
unsigned long T_Espera=0;                               // Para controlar el tiempo transcurrido

void loop() 
{
  if(millis()<100)                                    // Millis  ha desbordado y reiniciado
  {
    delay(100);                                         // Para que repita una solo vez por cada desborde
    T_Espera=0;                                       // asegurar que realiza el proceso tras desborde  
  }
  if (millis()>T_Espera)                          // Finalizo tiempo de espera para muestreo
  {
    Proceso();                                             // Proceso de leer datos y enviarlos
    T_Espera = millis() + Frecuencia;   // Tiempo para siguiente muestreo
  }
}

Buenas Marcial, voy a implementar tu ejemplo y ya te contaré, pero ya tendra que ser la semana que viene. Mi disco duro está muerto total, para sacar los datos tendria que enviarlo a un laboratorio especializado, pero no aseguran el resultado final pero si el precio que ronda los 1.000€, la unica esperanza que hay (que tengo poca la verdad) es que como el disco está en garantia y es un WD de 2Tb lo han enviado al proveedor y ya este contestará. Un saludo para el foro.

Ups, suerte con el disco

El mio funciona, pero no puedo acceder a los datos de mi cuenta, ni idea de por que, lo intentare con ubuntu a ver si hay mas suerte