Control de válvula no funciona como debería

Hola:

Record Monza Abarth.PNG

Como puedes ver en el esquema, hay dos entradas y una salida.

Entradas:
INTERRUPTOR --> Es un interruptor normal.
SPORT --> Es un pulsador que si lo pulsas y lo dejas de pulsar, vuelve a su estado normal.

Salida:
Válvula

Si dejas el INTERRUPOR abierto que sería 0V, estaría en un modo que siempre la Válvula estaría cerrada. En este momento si pulsas el pulsador SPORT, lo ignora.
Si dejas el INTERRUPTOR cerrado que sería 5V, estaría en un modo en el cual ya te puede obedecer el pulsador SPORT.
Si pulsas una vez el pulsador SPORT, abre la Válvula, si lo vuelves a pulsar, cierra la Válvula.

Diagrama de flujo.
Record Monza Abarth Diagrama de flujo.PNG
El código que he hecho hasta ahora no me funciona en Proteus 12 SP0.

Código Arduino:

C++:
// Constantes.
const byte pinInterruptor = 3;
const byte valvula =  4;
const byte sportBoton = 8;

// Variables.
byte estadoPinInterruptor = 0;
byte estadoSportBoton = 0;

// Variable para pulsador antirebotes o bounce.
int estadoActual1 = 0;
int estadoActual2 = 0;
int estadoUltimo = 0;
int contador = 0;
//--------------------------------------------
void setup()
{
  // Configuración de los pines.
  pinMode(valvula, OUTPUT);
  pinMode(pinInterruptor, INPUT);
  pinMode(sportBoton, INPUT);
  digitalWrite(valvula, LOW);
  Serial.begin(9600);
}
//--------------------------------------------
void loop()
{
  // Lee el estado del pulsador e interruptor.
  estadoPinInterruptor = digitalRead(pinInterruptor);
  estadoSportBoton = digitalRead(sportBoton);

  // Modo 1) Normal y 2) Modificado.

  // ¿INT pulsado?
  if (estadoPinInterruptor == HIGH)
  {
    // Sí. INT ha sido pulsado.
    // Comprueba el estado del pulsador Sport ha sido pulsado.
    estadoActual1 = sportBoton;
    delay(10);
    estadoActual2 = sportBoton;

    // ¿Los estados no son iguales?
    if (estadoActual1 == estadoActual2)
    {
      // ¿estadoACtual es distinto a estadoUltimo?
      if (estadoActual1 != estadoUltimo)
      {
        // ¿estadoActual es alto, 1, activado o HIGH?
        if (estadoActual1 == HIGH)
        {
          contador = contador + 1;
          Serial.print ("Ésta es la pulsación nº ");
          Serial.println(contador);
        }
      }
    }
    estadoUltimo = estadoActual1;

    if (contador % 2 == 0)
    {
      // Cerrar válvula.
      digitalWrite(valvula, LOW);
    }
    else
    {
      // Abrir válvula.
      digitalWrite(valvula, HIGH);
    }
  }
  else // Encontes. INT no ha sido pulsado.
  {
    // Cierra la válvula o el relé en NC.
    digitalWrite(valvula, LOW);
  }
}

Antes de comprar componentes y hacer una placa o PCB, quiero que en el simulador me funcione de maravilla.

¿Ves alguna solución?

Gracias.
 
En
C++:
// Sí. INT ha sido pulsado.
    // Comprueba el estado del pulsador Sport ha sido pulsado.
    estadoActual1 = sportBoton;
    delay(10);
    estadoActual2 = sportBoton;

estás asignando una constante al estado --> te comiste digitalRead()
 
Es verdad. Hay que dejarlo así.

C++:
    // Sí. INT ha sido pulsado.
    // Comprueba el estado del pulsador Sport ha sido pulsado.
    estadoActual1 = estadoSportBoton;
    delay(10);
    estadoActual2 = estadoSportBoton;

Ya me funciona. Muchas gracias.

Otra pregunta que me hago.

¿Es posible hacer todo esto solo con puertas lógicas sin usar Arduino?

Lo de antirebotes de los pulsadores se puede hacer mediante hardware, por ejemplo.
biestable-RS-con-NAND.gif


Ahí está la cuestión.
 
Última edición:
Si que se puede.
Con "interruptor" dejas el reset activado.
Una vez que se abre "interruptor", liberas el reset, realizando la funcion de flip flop normal...
El antorebote lo implementas directamente en el pulsador, con un capacitor de unos (a ojimetro) 10nF
 
Es verdad. Hay que dejarlo así.

C++:
    // Sí. INT ha sido pulsado.
    // Comprueba el estado del pulsador Sport ha sido pulsado.
    estadoActual1 = estadoSportBoton;
    delay(10);
    estadoActual2 = estadoSportBoton;

Ya me funciona. Muchas gracias.

Otra pregunta que me hago.

¿Es posible hacer todo esto solo con puertas lógicas sin usar Arduino?

Lo de antirebotes de los pulsadores se puede hacer mediante hardware, por ejemplo.
biestable-RS-con-NAND.gif


Ahí está la cuestión.
Por supuesto que se puede, antiguamente cuando cada bit costaba caro, se usaban 2 compuertas para hacer un anti-rebote , pero no es el set reset que usted pone, sino que habia un filtro RC de 30 milisegundos en medio y una or exclusiva creo.
Respecto del circuito , este esta bien, el diagrama de flujo está bien, el error seguro que esta en el código y probablemente sea una omisión
 
Inversor con histérisis hay que ponerlo si o si. Este parece que tiene dos cosas, protección con histéresis y antirrebotes. Aunque ne mi caso prefiero ponerle un no inversor con histéresis. Para no tener el contrario de la señal que deseo.
 
Dr Zoidberg no se refiere a que exista el símbolo, que de paso en ése no está explícito que sea schmitt trigger, sino a que comercialmente exista y se consiga con facilidad.
Existen, como por ejemplo el 74HC7014, pero no son integrados comunes --> Primero compralos y después seguí con el diseño.
 
.


También puede usar en tecnología CMOS el CD4093 = HEF4093 que es una cuádruple compuerta NAND con Schmitt Trigger que es muy común de encontrar en los comercios. Se encuentran linkeadas a sus respectivas datasheets.




Salu2.-
 
ME imagino qu ehabrá de 8 inversores con histéresis o Trigger Schmitt. Si lo quiero normal, espero que esté, normal me refire no inversor. Si no, pues usar en serie dos inversores.
 
Arriba