Bueno pues gracias a Surbyte el código esta prácticamente terminado lo único que quedaría seria que al darle al botón cada vez que empieze desde 0 se desactivase el botón 3 segundos mientras que el crono siguiera contando y de ese modo que el cronometro no pudiese parar aunque se presionase el boton en los 3 primeros segundos, transcurrido esos segundos se pudiese parar y al volver a pulsar pasara lo mismo otra vez
Si alguien tiene alguna idea que lo comente
gracias
/* StopWatch
* Paul Badger 2008
* Demonstrates using millis(), pullup resistors,
* making two things happen at once, printing fractions
*
* Physical setup: momentary switch connected to pin 4, other side connected to ground
* LED with series resistor between pin 13 and ground
Programa base tomado de http://playground.arduino.cc/Code/Stopwatch
*/
#define ledPin 13 // LED connected to digital pin 13
const int buttonPin = 2;
int value = LOW; // previous value of the LED
int buttonState; // variable to store button state
int lastButtonState; // variable to store last button state
int blinking; // condition for blinking - timer is timing
long interval = 100; // blink interval - change to suit
long previousMillis = 0; // variable to store last time LED was updated
long demoroBoton;
long startTime ; // start time for stop watch
long elapsedTime ; // elapsed time for stop watch
int fractional; // variable used to store fractional part of time
// Definiciones de los 74HC595
int pinLatch = 10; //Pin para el latch de los 74CH495
int pinDatos = 11; //Pin para Datos serie del 74CH495
int pinReloj = 12; //Pin para reloj del 74CH495
byte digitOne[10]= {
// Codificación hexadecimal de los dígitos decimales en el display de 7 segmentos
//0xEE, 0x82, 0xDC, 0xD6, 0xB2, 0x76, 0x7E, 0xC2, 0xFE, 0xF6};
// Codificacion del autor del Hilo
0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xb6, 0x3E, 0xE0, 0xFE, 0xF6};
// con esta codificación los leds encienden correctamente
int centenas = 0; //Número de las centenas
int decenas = 0; //Número de las decenas
int unidades = 0; //Número de las unidades
int decimas = 0; //Numero de las decimas
int centesimas = 0; //Numero de las centesimas
void setup(){
Serial.begin(19200);
pinMode(pinLatch, OUTPUT);
pinMode(pinDatos, OUTPUT);
pinMode(pinReloj, OUTPUT);
//pinMode(buttonPin, INPUT);
Serial.println("Cronometro Ok");
pinMode(ledPin, OUTPUT); // seteo el pin digital LED como salida
pinMode(buttonPin, INPUT_PULLUP); // buttonPin como entrada
digitalWrite(buttonPin, HIGH); // activo el resistor pullup. Cablear el boton de modo que cuando se presione vaya a masa
demoroBoton = millis()+3000UL;
display(0);
}
void loop()
{
// check for button press
buttonState = digitalRead(buttonPin); // leo el estado del botón y lo guardo
if (buttonState == LOW && lastButtonState == HIGH && blinking == false){ // check for a high to low transition
// if true then found a new button press while clock is not running - start the clock
if (millis() - demoroBoton > 3000UL) {
startTime = millis(); // almacena el tiempo de arranque del cronómetro
blinking = true; // activar el led durante el cronometrado
delay(5); // pequeño retardo para evitar rebotes
lastButtonState = buttonState; // guardo buttonState en lastButtonState para luego comparar
Serial.println("Startime =");
Serial.print(startTime);
display(0);
demoroBoton = millis();
}
}
else if (buttonState == LOW && lastButtonState == HIGH && blinking == true){
// chequear una transición de alto a bajo
// si es verdadero luego encontrar una nueva presion del boton mientras el reloj corre - parar el reloj y presentar
elapsedTime = millis() - startTime; // guardo el tiempo transcurrido
blinking = false; // apago parpadeo
lastButtonState = buttonState; // guardo buttonState en lastButtonState para luego compararlo
display(elapsedTime );
Serial.println("ElapsedTime =");
Serial.print(elapsedTime);
// presento el tiempo transcurrido
Serial.print( (int)(elapsedTime / 100L)); // divido por 1000 para convertir a segundos luego tomo el entero
Serial.print("."); // imprimo el punto decimal
// calculo la parte fraccional
fractional = (int)(elapsedTime % 1000L);
// pad in leading zeros - wouldn't it be nice if
// Arduino language had a flag for this? :)
if (fractional == 0)
Serial.print("000"); // add three zero's
else if (fractional < 10) // if fractional < 10 the 0 is ignored giving a wrong time, so add the zeros
Serial.print("00"); // add two zeros
else if (fractional < 100)
Serial.print("0"); // add one zero
Serial.println(fractional); // print fractional part of time
}
else{
lastButtonState = buttonState; // store buttonState in lastButtonState, to compare next time
}
if (blinking){
display(millis() - startTime);
}
// Rutina para hacer parpadear un led pin 13 indicando que esta contando.
if ( (millis() - previousMillis > interval) ) {
if (blinking == true){
previousMillis = millis(); // Recuerndo el momento en que parpadea el led
// cambio el estado del led
if (value == LOW)
value = HIGH;
else
value = LOW;
digitalWrite(ledPin, value);
}
else{
digitalWrite(ledPin, LOW); // apago el led cuando no parpadea
}
}
}
void display(unsigned long numero){
centenas = numero/10000;
numero %= 10000;
decenas = numero/1000;
numero %= 1000;
unidades = numero/100;
numero %= 100;
decimas = numero/10;
numero %= 10;
centesimas = numero;
digitalWrite(pinLatch, LOW);
shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[centesimas]); //digitOne centesimas
shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[decimas]); //digitOne decimas
shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[unidades]); // digitOne unidades
shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[decenas]); //digitOne decenas
shiftOut(pinDatos, pinReloj, LSBFIRST, digitOne[centenas]); //digitOne centenas
digitalWrite(pinLatch, HIGH);
}