Go Down

Topic: Necesito un contador de tiempo y de pulsos que trabajen a la vez. (Read 178 times) previous topic - next topic

pierocosme

Mi problema es el siguiente, necesito instalar un botón de on/off que funcione de tal modo que al pulsar 5 veces rápida y consecutivamente un pulsador (push button), este active un circuito en el que puede estar un led, un motor o lo que sea que se necesite encender. Por lo tanto, estas 5 pulsaciones "rápidas y consecutivas" deben depender del tiempo; es decir, que, por ejemplo,  para que el circuito se active, se necesitan de 5 pulsaciones consecutivas las cuales deben ser ejecutadas en un tiempo máximo de 7 segundos. He estado usando millis (), pero cada vez que siento tener el código, surge otro problema. Entre estos está el hecho de cómo hacer para inicializar el conteo del tiempo (7 segundos); ya que, este debe ser iniciado con una pulsación la cual depende enteramente del usuario.

P.S. Estoy usando un Arduino LEONARDO.

El siguiente código es el que estoy usando, aunque todavía este lejos de lo que quiero hacer.
¿Alguna manilla por ahí para ayudar a este amateur?


Code: [Select]


const int  buttonPin = 2;   
const int ledPin = 11;     

// Variables will change:
int buttonPushCounter = 0;
int buttonPushCounter2 = 0;
int buttonState = 0;       
int lastButtonState = 0;     

void setup() {
 
  pinMode(buttonPin, INPUT);
 
  pinMode(ledPin, OUTPUT);
 
  Serial.begin(9600);
}


void loop() {

  buttonState = digitalRead(buttonPin);

 


                      if (buttonState != lastButtonState)
{
                     
   
                                                   if (buttonState == HIGH) {
                                                   
     
                                                                                buttonPushCounter++;
                                                                                Serial.println("on");
                                                                                Serial.print("number of button pushes: ");
                                                                                Serial.println(buttonPushCounter);
                                                                               
                                                                             }
   
                     
                                                   else {

                                                    Serial.println("off");
                                                   
                                                          }
 
                           delay(50);
             
                                                           }

 
                        lastButtonState = buttonState;


 
                        if (buttonPushCounter == 19) {
                                                                  buttonPushCounter = 1;
                                                     
                                                      }

                         buttonPushCounter2 = buttonPushCounter/6 ;
 
                       
                        if (buttonPushCounter2 % 2 == 0) {
   
                                                                   digitalWrite(ledPin, LOW);
 
                                                          }
                        else if (buttonPushCounter2 % 2 != 0) {
     
                                                                    digitalWrite(ledPin, HIGH);
     
                                                               }
 
}





surbyte

He modificado tu programa para que cumpla este requerimiento.

define dos constantes
PULSADAS 5
INTERVALO 7000 para que lo puedas modificar a tu gusto

Code: [Select]
#define PULSADAS        5
#define INTERVALO       7000

const byte buttonPin    = 2;   
const byte ledPin       = 11;     

// Variables will change:
int buttonPushCounter   = 0;
int buttonPushCounter2  = 0;
bool buttonState        = false;       
bool lastButtonState    = false;
bool flag               = false;
unsigned long start;   

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}


void loop() {

  buttonState = digitalRead(buttonPin);
  if (buttonState && !lastButtonState) {
      if (buttonPushCounter++ == 1)
          start = millis(); // inicio conteo de 7 seg
      if (buttonPushCounter == PULSADAS) { // hay 5 pulsaciones => verifico tiempo
          unsigned long dif = millis()-start;
          if (dif <= INTERVALO) { // todo se expresa en milisegunedos 7000 = 7 segundos
              flag = true;
              Serial.println("Se han pulsado 5 veces dentro de 7 seg");
          }
          else {
              flag = false;
              Serial.println("No se han pulsado 5 veces dentro de 7 seg");
          }
          buttonPushCounter = 0;
      }
      Serial.print("Numero de pulsadas : ");
      Serial.println(buttonPushCounter);
  }
  lastButtonState = buttonState;
 
  if (flag) {
      digitalWrite(ledPin, LOW);
  else
      digitalWrite(ledPin, HIGH);
}


En lugar de mirar el cambio de estado, veo el flanco. Con cada flanco tengo una pulsada.
Cuando la cantidad de pulsaciones sea igual a PULSADAS (5) entonces verifico el tiempo que comienza con la primera.

pierocosme

Hola, muchas gracias por tu ayuda; sin embargo, el código parece funcionar solo la primera vez, luego, una vez que ya está prendido, quiero apagarlo con 5 pulsaciones dentro del mismo marco de 7 segundos y no funciona. Otra cosa que también me pasa es que al parecer no detecta el primer "push" o el contador a veces suma 3 en vez de sumar 1. Siento que puede ser por el ruido del ambiente, pero ya he puesto algunas resistencias y capacitores para reducir el ruido y sigue el problema.

surbyte

Bueno falto poner que buttonPushCounter = 0 cuando se da la condición de 5 pulsaciones efectivas.

Pense que esto

Code: [Select]
if (buttonPushCounter == PULSADAS) { // hay 5 pulsaciones => verifico tiempo
          unsigned long dif = millis()-start;
          if (dif <= INTERVALO) { // todo se expresa en milisegunedos 7000 = 7 segundos
              flag = true;
              Serial.println("Se han pulsado 5 veces dentro de 7 seg");
          }
          else {
              flag = false;
              Serial.println("No se han pulsado 5 veces dentro de 7 seg");
          }
          buttonPushCounter = 0;      // <== esto pone a 0 el contador de pulsaciones
      }


era suficiente.

Agrega un par de Serial print para ver en que estado queda buttonPushCounter

Go Up