[SOLUCIONADO] Controlar incremento en contador mediante un botón

Hola a todos

Tengo un pequeño problema con el que he estado lidiando desde hace un par de días, me encuentro realizando un pequeño proyecto para el cual ocupo un contador de 0-999 usando displays de 7 segmentos de ánodo común pero como necesito usar casi (sino es que todos) los pines de mi Arduino UNO me estoy apoyando de mis fieles compañeros de batalla, los CI 74595 anexo el diagrama del circuito elaborado en proteus

así en vez de lidiar con la distribución de pines puedo controlar los 3 displays con solo 3 pines. Hasta aquí no hay problema todo va bien en el sentido de que tengo el contador funcionando de forma automática, es decir una vez conectándolo empieza a contar es aquí donde mi problema reside ya que quiero que la cantidad aumente hasta que yo presione el pulsador que se ve conectado al pin 6.

Anexo el código del contador trabajando de forma automatica:

int dataPin =8;
int latchPin =11;
int clockPin =12;


void setup() {

 pinMode(dataPin, OUTPUT);
 pinMode(latchPin, OUTPUT);
 pinMode(clockPin, OUTPUT);


}

void cero(){
  shiftOut(dataPin, clockPin, MSBFIRST, 64);
}

void uno(){
  shiftOut(dataPin, clockPin, MSBFIRST, 121);
}

void dos(){
  shiftOut(dataPin, clockPin, MSBFIRST, 36);
}

void tres(){
  shiftOut(dataPin, clockPin, MSBFIRST, 48);
}

void cuatro(){
  shiftOut(dataPin, clockPin, MSBFIRST, 25);
}


void cinco(){
  shiftOut(dataPin, clockPin, MSBFIRST, 18);
}


void seis(){
  shiftOut(dataPin, clockPin, MSBFIRST, 2);
}


void siete(){
  shiftOut(dataPin, clockPin, MSBFIRST, 120);
}


void ocho(){
  shiftOut(dataPin, clockPin, MSBFIRST, 0);
}


void nueve(){
  shiftOut(dataPin, clockPin, MSBFIRST, 24);
}

void muestra(int x){
  switch (x){
    case 0:
    cero();
    break;
    
    case 1:
    uno();
    break;
    
    case 2:
    dos();
    break;
    
    case 3:
    tres();
    break;
    
    case 4:
    cuatro();
    break;
    
    case 5:
    cinco();
    break;
    
    case 6:
    seis();
    break;
    
    case 7:
    siete();
    break;
    
    case 8:
    ocho();
    break;
    
    case 9:
    nueve();
    break;
  }
}

void loop() {
  
  
  for (int x=0; x<1000; x++){
    digitalWrite(latchPin, LOW);
    muestra(x%10);
    muestra((x/10)%10);
    muestra(x/100);
    digitalWrite(latchPin, HIGH);  
    delay(10);
  }
delay(1000);
}

Hasta este punto como mencione el contador trabaja de forma automática.

Pensé que añadiendo esto podría hacer lo que yo quiero que es controlar el incremento de forma manual

int dataPin =8;
int latchPin =11;
int clockPin =12;
/////////////////////////////// Lineas añadidas /////////////////////////
int button=6;
int estado=0;
int cantidad=0;
/////////////////////////////////////////////////////////////////////////////

void setup() {
  // put your setup code here, to run once:
 pinMode(dataPin, OUTPUT);
 pinMode(latchPin, OUTPUT);
 pinMode(clockPin, OUTPUT);
 pinMode(button, INPUT);

}

void cero(){
  shiftOut(dataPin, clockPin, MSBFIRST, 64);
}

void uno(){
  shiftOut(dataPin, clockPin, MSBFIRST, 121);
}

void dos(){
  shiftOut(dataPin, clockPin, MSBFIRST, 36);
}

void tres(){
  shiftOut(dataPin, clockPin, MSBFIRST, 48);
}

void cuatro(){
  shiftOut(dataPin, clockPin, MSBFIRST, 25);
}


void cinco(){
  shiftOut(dataPin, clockPin, MSBFIRST, 18);
}


void seis(){
  shiftOut(dataPin, clockPin, MSBFIRST, 2);
}


void siete(){
  shiftOut(dataPin, clockPin, MSBFIRST, 120);
}


void ocho(){
  shiftOut(dataPin, clockPin, MSBFIRST, 0);
}


void nueve(){
  shiftOut(dataPin, clockPin, MSBFIRST, 24);
}

void muestra(int x){
  switch (x){
    case 0:
    cero();
    break;
    
    case 1:
    uno();
    break;
    
    case 2:
    dos();
    break;
    
    case 3:
    tres();
    break;
    
    case 4:
    cuatro();
    break;
    
    case 5:
    cinco();
    break;
    
    case 6:
    seis();
    break;
    
    case 7:
    siete();
    break;
    
    case 8:
    ocho();
    break;
    
    case 9:
    nueve();
    break;
  }
}

void loop() {
  
 ///////////////////////////////// lineas añadidas /////////////////////////////// 

  estado=digitalRead(button);
  [color=red]if(estado==HIGH){
  cantidad=cantidad++;
  delay(15);
  }
/////////////////////////////////////////////////////////////////////////////////////////////
  
  for (int x=0; x<1000; x++){
    digitalWrite(latchPin, LOW);
    muestra(x%10);
    muestra((x/10)%10);
    muestra(x/100);
    digitalWrite(latchPin, HIGH);  
    delay(10);
  }
delay(1000);
}

Pero no logro lo que quiero, espero y alguien me pueda orientar un poco.

Gracias

Una pista. No uses jamás delay si luego quieres controlar El flujo del programa.
Otro tema: porque no usas un vector para enviar Los bits que necesitas para cada dígito. Hay un Tutorial mio en Documentacion.

Lo puedes poner todo dentro de un solo IF

 estado=digitalRead(button);
 if (estado==HIGH){

// incremento manual

 }
else {

 // incremento automatico

  }

El tema es que si el boton de parar es el mismo que para incrementar, deberias poner una variable boolean tipo true o false y hacer el if con ella (if boolean==true) haciendo que por ejemplo pase a true desde el primer activado del boton para que a partir de ahi sea solo con incremento manual.

a esto me refería con controlar el flujo.. no uses delay si quieres hacer algun control

const byte dataPin 		= 8;
const byte latchPin 	= 11;
const byte clockPin 	= 12;

const byte button 		= 6;

bool estado   	        = false; 
bool estadoAnt	        = false;
int cantidad            = 0;
unsigned long tstart	= 0;
byte numero[] = {64, 121, 36, 48, 25, 18, 2, 120, 0, 24};

void setup() {
	// put your setup code here, to run once:
	pinMode(dataPin, OUTPUT);
	pinMode(latchPin, OUTPUT);
	pinMode(clockPin, OUTPUT);
	pinMode(button, INPUT);
}

void muestra(int x){

    byte unidad  = x%10;
    byte decena  = (x/10)%10;
    byte centena = x/100;

    digitalWrite(latchPin, LOW);  
    shiftOut(dataPin, clockPin, MSBFIRST, numero[unidad]);
    shiftOut(dataPin, clockPin, MSBFIRST, numero[decena]);
    shiftOut(dataPin, clockPin, MSBFIRST, numero[centena]);
    digitalWrite(latchPin, HIGH);  
    
}

void loop() {
  
  estado = digitalRead(button);

  if (estado == HIGH && estadoAnt == LOW){ // Espero flanco 0 a 1 
  	 estado = true;
  }
  else
     estado = false;

  estadoAnt = estado;

 
  if (millis() > tstart) {   // Cada 1000 mseg presento
  	 if (estado)
	  	 cantidad++; 
  	 muestra(cantidad);	
  	 tstart = millis() + 1000UL;
  }
}

cas6678:
Lo puedes poner todo dentro de un solo IF

 estado=digitalRead(button);

if (estado==HIGH){

// incremento manual

}
else {

// incremento automatico

}




El tema es que si el boton de parar es el mismo que para incrementar, deberias poner una variable boolean tipo true o false y hacer el if con ella (if boolean==true) haciendo que por ejemplo pase a true desde el primer activado del boton para que a partir de ahi sea solo con incremento manual.

Gracias por comentar, agradezco tu aporte pero en mi contador no estoy usando un botón de parar solo para el incremento es que uso el botón

surbyte:
a esto me refería con controlar el flujo.. no uses delay si quieres hacer algun control

const byte dataPin 		= 8;

const byte latchPin = 11;
const byte clockPin = 12;

const byte button = 6;

bool estado          = false;
bool estadoAnt         = false;
int cantidad            = 0;
unsigned long tstart = 0;
byte numero[] = {64, 121, 36, 48, 25, 18, 2, 120, 0, 24};

void setup() {
// put your setup code here, to run once:
pinMode(dataPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(button, INPUT);
}

void muestra(int x){

byte unidad  = x%10;
    byte decena  = (x/10)%10;
    byte centena = x/100;

digitalWrite(latchPin, LOW); 
    shiftOut(dataPin, clockPin, MSBFIRST, numero[unidad]);
    shiftOut(dataPin, clockPin, MSBFIRST, numero[decena]);
    shiftOut(dataPin, clockPin, MSBFIRST, numero[centena]);
    digitalWrite(latchPin, HIGH); 
   
}

void loop() {
 
  estado = digitalRead(button);

if (estado == HIGH && estadoAnt == LOW){ // Espero flanco 0 a 1
  estado = true;
  }
  else
    estado = false;

estadoAnt = estado;

if (millis() > tstart) {  // Cada 1000 mseg presento
  if (estado)
  cantidad++;
  muestra(cantidad);
  tstart = millis() + 1000UL;
  }
}

Grande Surbyte eh cargado el código en la simulación (Le preste mi arduino a un primo que iba a presentar algo en su colegio) y todo anda de maravilla, la verdad es que no uso mucho millis porque me da bastante lata para usarlo, hay algunas cosas que aún me faltan por dominar, incluso en este código me llevo algo de tiempo ver como con un solo arreglo de matriz hiciste funcionar el código y tuve que pasarme al "Learning" para ver que cuando escribiste 1000UL te referias a un "UL" (Ahora ya sé xD). Justo cuando creía empezar a tener exp. en esto. Te agradezco la ayuda y quedo a la espera de probarlo en físico.

Cierro tema.

Si hubieras viste mi tutorial, verías que use el 98% de lo qeu ahi estaba. Buscalo en Documentación.
Mira el uso de millis() no es fácil, no es tan intuitivo como delay(). Hay que pensarlo bien, muy bien.