Pages: [1] 2   Go Down
Author Topic: 1er post. Ayuda a programar tiempo en pulsador  (Read 1519 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola, este es mi primer post. El caso es que he leido infinidad de articulos pero no consigo aclarar un problema con el codigo que estoy haciendo, si alguien me puede ayudar le agradeceria enormemente pues ya son 3 semanas las que llevo buscando una solucion.

Necesito hacer que cuando un switch queda pulsado o cerrado éste active una salida durante 15 segundos y despues de este tiempo todos los procesos se detengan hasta que este mismo switch se suelte o quede en abierto. He usado los comandos if...else pero cuando queda pulsado este no para nunca de reproducir el delay. No se como hacerlo, no se que hago mal o que comando no estoy usando correctamente. El codigo que estoy utilizando es el siguiente:
//Proyecto auto limpieza
//Declaracion de variables estaticas
int presostatoMin = 2; // Presostato de minima presion
int interruptor = 4; //Interruptor de Encendido-Apagado
int valvulaIn = 7; // Electrovalvula entrada de agua
int valvulaLimp = 8; // Electrovalvula de limpieza
int presostatoMax = 10; // Presostato de maxima
int bomba = 12; // Enciende la bomba
// Variables Dinamicas
int estadoInt = 0; // Mantiene el equipo apagado
int estadoMin = 0; // Estado del presostato de minima
int estadoMax = 0; // Estado presostato max

void setup()
{
pinMode(presostatoMin, INPUT); // Pin 2 Entrada
pinMode(interruptor, INPUT); // Pin 4 Entrada
pinMode(valvulaIn,OUTPUT); // Pin 7 Salida
pinMode(valvulaLimp,OUTPUT); // Pin 8 Salida
pinMode(presostatoMax, INPUT); // Pin 10 Entrada
pinMode(bomba, OUTPUT); // Pin 12 Salida
}
void loop()
{
estadoInt = digitalRead(interruptor);
if (estadoInt == HIGH)
{
digitalWrite(valvulaIn, HIGH);
}

else
{
digitalWrite(valvulaIn, LOW);
digitalWrite(bomba, LOW);
digitalWrite(valvulaLimp, LOW);
}
estadoMin = digitalRead(presostatoMin);
if (estadoMin == HIGH)
{
digitalWrite(bomba, HIGH);
}

else
{
digitalWrite(bomba, LOW);
}
estadoMax = digitalRead(presostatoMax);
if (estadoMax == HIGH)
{
digitalWrite(bomba, HIGH);
digitalWrite(valvulaLimp, HIGH);
//while(valvulaLimp); // He probado pero no funciona
delay(2000);
//digitalWrite(bomba, HIGH);
//digitalWrite(valvulaIn, HIGH);

}

else
{
digitalWrite(bomba, LOW);
digitalWrite(valvulaLimp, LOW);
}



}
En todas las entradas he utilizado la configuracion Pull Down.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,

Si no he entendido mal tienes tres pulsadores y cada uno de ellos activa un proceso. La pregunta que tengo es si mientras se lleva a cabo un proceso tiene que existir la posibilidad de realizar los otros o por lo contrario sólo puede ejecutarse uno a la vez.

Ya me dirás
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola. Gracias por contestar.
Lo cierto es que son condicionantes y el proceso es el siguiente:
1º- Interruptor para encender/conectar la maquina.
2º- Si se da la condicion de que hay presion (presostato de minima presion) entonces se activa una bomba.
3º- Esta se detiene si hay una presion determinada que la determina un presostato de maxima presion (medio mecanico).
En este 3er paso es donde tengo el problema. Que una vez llegue a esa presion quiero que la bomba contrinue trabajando durante 15 segundos y ademas habra una electrovalvula de alivio durante esos mismos 15 segundos los cuales transcurridos detendra todo el proceso hasta que el presostato (micro) detecte una caida de presion y todo vuelva a comenzar.
No se si se entiende... smiley-cry
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si lo he entendido bien deberías depurar bastante el código (limpiarlo y ordenarlo un poco), pero  para que haga lo que necesitas es cambiar el interior de tu último IF por este código

       
Code:
        digitalWrite(bomba, HIGH);
        digitalWrite(valvulaLimp, HIGH);
       
        while (digitalRead(presostatoMax)<=presostatoMax){
            //aqui no hace falta que pongas nada, simplemente sirve para
            //que no avance en el codigo hasta que la presion sea menor al
            //maximo que has establecido
        }
       
        delay(15000); //una vez a alcanzado el maximo esperas 15 segundos
       
        digitalWrite(bomba, LOW);
        digitalWrite(valvulaLimp, LOW);
       

Si no es esto lo que necesitabas, dímelo
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola bettoad. He sustituido el final como me dices y nada....se queda todo encendido.
Igual no me explique bien con lo de los presostatos pero son diferentes y estyos actuan como un micro por lo que en el de maxima si hay presion este cierra su contacto y el de minima es independiente tambien por lo que si detecta presion cierra su contacto.
Lo tengo montado en una protoboard simulando las salidas de rele con leds y las entradas con interruptores.
Gracias por tu tiempo y tu conocimiento.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

poco a poco me entero como lo tienes montado.

Mis conocimientos de programación son bueno pero de electrónica soy novatillo. Te explico lo que veo:

Tu quieres que pare cuando llegue a una determinada presión. Entiendo que no es una lectura digital, sino analógica. Nunca he usado posostatos pero deberían serlo. Así que aquí tienes tu primer problema. Debes usar analogRead para poder leer la lectura exacta ya que digitalRead sólo te devuelve HIGH ó LOW.

Una vez lo tengas como analógico solo debes especificar el valor máximo que quieras alcanzar y usas el código anterior sustituyendo VALORMAXIMO por el valor que quieras.

Code:
        digitalWrite(bomba, HIGH);
        digitalWrite(valvulaLimp, HIGH);
       
        while (analogRead(presostatoMax)<=VALORMAXIMO){
            //aqui no hace falta que pongas nada, simplemente sirve para
            //que no avance en el codigo hasta que la presion sea menor al
            //maximo que has establecido
        }
       
        delay(15000); //una vez a alcanzado el maximo esperas 15 segundos
       
        digitalWrite(bomba, LOW);
        digitalWrite(valvulaLimp, LOW);
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Claro...no me he explicado bien con el presostato. Bueno es como un interruptor enciende o apaga es por eso que los tengo conectados a entradas digitales pues seria HIGH si recibe la presion y LOW si no recibe la presion.
Si fuese un transductor este si que tendria que ir en AnalogRead. Siendo ON/OFF entiendo que ha de ir en digital.
Perdona la confusion que te he causado.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si quieres escríbeme por privado tu skype y lo miramos mejor, que sino llenaremos el foto de mensajes. Y cuando lo tengamos publicamos la respuesta.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola chicos.... porfa una ayudita...
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-cry
Lo unico que quiero es que despues de activar un interruptor mantenga una salida (HIGH +5v) durante 5 segundos, luego que todo deje de funcionar hasta que el interruptor cambie de estado (HIGH/LOW)... smiley-sad-blue
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola, también soy bastante nuevo en ésto, pero miraré si puedo ayudar. Hace pinta de ser un control para osmosis, ¿me equivoco?

Creo que esquemáticamente es ésto lo que quieres:
Code:
void loop(){
mientras (presostato_minima_activado){
      enciende_valvula_entrada;
      si (presostato_maxima_activado){
          pausa_15_con_valvula_alivio();
          mientras (presostato_maxima_activado){     // éstas lineas esperan a que baje la presión del presostato
          }                                                                                       //  de alta, y mientras no hace nada, es un bucle  infinito
      }
}
void  pausa_15_con_valvula_alivio(){
     para_valvula_entrada;
     enciende_valvula_alivio;
     delay (15000);
     para_valvula_alivio;
     return;
     }


Creo que básicamente debe ser esto, pero que me corrijan los expertos
« Last Edit: December 07, 2013, 10:21:12 am by vier » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

A tus pies vier.

Gracias por tu ayuda, voy a probar. Si es para la limpieza de una osmosis. Tengo todo el circuito montado pero tenia el fallo en esta parte del programa.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Lo siento vier. He intentado adaptar la porcion de codigo que me has puesto pero no me funciona... smiley-cry
La desesperación me puede...socorooooo S.O.S
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Prueba si ésto funciona:

Me faltaría implementar el botón de encendido, y seguro que puede programarse mejor, pero ya es para expertos, no novatos como yo.
Se pueden eliminar los "Serial.print," y algún "delay", etc, pero me han servido para ver qué hacía el sketch.
Creo que lo que quieres debe ser ésto o muy parecido.

Los pines donde conectar los presostatos pueden cambiarse.
Recordar de poner una resistencia de unos 10K desde masa a los pines que se van a usar como entrada para no dar valores espuria en las entradas.

Code:
int alivio= 13;  // valvula de alivio (he puesto el  13 porque así veo el led)
 int carga= 1;    // válvula de carga
 int pres_alta= 2;    // presostato de alta
 int pres_baja= 3;    // presostato de baja
 int estado_baja;
 int estado_alta;
 // me falta implementar el botón de encendido.

void setup() {               
 
  pinMode(alivio, OUTPUT);
  pinMode(carga, OUTPUT);
  pinMode (pres_alta, INPUT);
  pinMode (pres_baja, INPUT);
   digitalWrite (alivio, LOW);
  digitalWrite (carga, LOW);
 estado_baja = LOW;
 estado_alta = LOW;
  Serial.begin(9600);
}

void loop() {
  estado_baja=digitalRead(pres_baja);
  while (estado_baja==LOW){
    Serial.println("no hay agua");
    estado_baja=digitalRead(pres_baja);
    delay (1000);
  }
  estado_alta=digitalRead(pres_alta);
  while (estado_baja == HIGH){    // Si se activa el presostato de baja
  digitalWrite(carga, HIGH);   // Empieza a entrar agua por la válvula normal
  Serial.println("cargando agua");
    delay(1000);
    estado_alta=digitalRead(pres_alta);
    if (estado_alta == HIGH ){      //Si se activa el presostato de alta
      haz_alivio() ;             //Activa la valvula de alivio
     
    }
    estado_baja=digitalRead(pres_baja);
  }
}
void haz_alivio (){
  digitalWrite (carga, LOW);
  Serial.println("carga de agua parada");
  digitalWrite (alivio, HIGH);
  Serial.println("empezando alivio");
  delay (15000);
  digitalWrite (alivio, LOW);
  Serial.println ("fin del alivio");
  estado_alta=digitalRead(pres_alta);
  while (estado_alta== HIGH){    // esperando que se desactive el presostato
      estado_alta= digitalRead(pres_alta);
      delay(1000);
      Serial.println("esperando bajada de presión en alta");
      }                        // de alta
  return;
}
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-grin smiley-lol smiley-mr-green
Este si que funciona.
Mil millones de gracias por tu tiempo y esfuerzo. No se como agradecerte tu ayuda, lo cierto es que llevo 10 min intentando escribir mi agradecimiento y me pasa como con el codigo no me fluyen las palabras.

Ahora voy a intentar comprender el sketch e integrar el accionamiento de la bomba y del interruptor de encendido.
Por otra parte creo que tengo que tener algo mal en el circuito electrico pues el led de simulacion de valvula de entrada se queda encendido mientras que en la pantalla serial indica lo contrario.
Bueno voy a discurrir un poco.... mil gracias vier
Logged

Pages: [1] 2   Go Up
Jump to: