//definicion de los pines
#define segA 3
#define segB 7
#define segC 10
#define segD 9
#define segE 8
#define segF 4
#define segG 11
#define DIG1 2
#define DIG2 5
#define DIG3 6
#define DIG4 12
#define NUMpins 11
#define pinStarStop A4
#define pinUpDown A3
#define pinReset A5
//vector para facilitar el setup
int pines [] = {segA, segB, segC, segD, segE, segF, segG, DIG1, DIG2, DIG3, DIG4 };
#define INTERVALO 1000 //en milisegundos
#define tRefresco 10
//Variables de los digitos de cada display
char d4 = 3;
char d3 = 0;
char d2 = 1;
char d1 = 0;
//Variables para los botones
volatile boolean star_stop = 1; //1: star, 0: stop
volatile boolean up_Down = 1; //1: Up, 0: Down
boolean listoBtnStar = 1;
boolean listoBtnReset = 1;
boolean listoBtnUp = 1;
boolean resetTimer = 0;
void setup() {
// put your setup code here, to run once:
for (int i = 0; i < NUMpins; i++)
{
pinMode(pines[i], OUTPUT);
digitalWrite(pines[i], 0);
}
pinMode(pinStarStop, INPUT_PULLUP);
pinMode(pinUpDown, INPUT_PULLUP);
pinMode(pinReset, INPUT_PULLUP);
pinMode(A0, OUTPUT);
digitalWrite(A0, 0);
pinMode(A1, OUTPUT);
digitalWrite(A1, 0);
//attachInterrupt (0, miISR, FALLING);
}
void loop() {
// put your main code here, to run repeatedly:
static unsigned long tCont = millis(); //timer para hacer el conteo
static unsigned long tBtns = millis(); //timer para lectura de los btns
//condicion para que se puede leer los btns cada cierto tiempo
if( millis() - tBtns >= 666)
{
tBtns = millis();
listoBtnUp = 1;
listoBtnStar = 1;
listoBtnReset = 1;
}
leerBtns();
if(resetTimer)//Reinicia el timer cuando se presiono el btn reset
{
resetTimer = 0;
tCont = millis();
}
//Conndicion para inciar/parar el cronometro
if(star_stop)
{
//condicion para que se ejecute cada intervalo y haga la opcion indicada
if( millis() - tCont >= INTERVALO)
{
tCont = millis();
//condicion para definir el sentido cronometro
if( up_Down )//1 para aumentar
upCrono();
else
downCrono();
}
}
else //actualiza el timer del contador
{
tCont = millis();
}
digitalWrite(A0, star_stop);//led indicador inicio
digitalWrite(A1, up_Down);//led indicador sentido
actualizarDisplay();
}
//FUNs
void leerBtns()
{
if ( digitalRead(pinStarStop) == LOW )
{
//condicion para que se ejecute cada cierto tiempo y pueda cambiar de estado
if( listoBtnStar )
{
listoBtnStar = 0;
star_stop = !star_stop;
}
//delay(100);
}
else if ( digitalRead(pinUpDown) == LOW )
{
if( listoBtnUp )
{
listoBtnUp = 0;
up_Down = !up_Down;
}
// delay(100);
}
else if ( digitalRead(pinReset) == LOW )
{
if( listoBtnReset )
{
listoBtnReset = 0;
d4 = 0;
d3 = 0;
d2 = 0;
d1 = 0;
resetTimer = 1;
}
//delay(100);
}
}
void downCrono()
{
d4--;
if(d4 < 0)
{
d3--;
d4 = 9;
}
if(d3 < 0)
{
d2--;
d3 = 5;
}
if(d2 < 0)
{
d1--;
d2 = 9;
}
if(d1 < 0)
{
d1 = 5;
}
}
void upCrono()
{
d4++;
if(d4 > 9)
{
d3++;
d4 = 0;
}
if(d3 > 5)
{
d2++;
d3 = 0;
}
if(d2 > 9)
{
d1++;
d2 = 0;
}
if(d1 > 5)
{
d1 = 0;
}
}
void actualizarDisplay()
{
static unsigned long timer = millis();
static byte digAct = 4;
if (millis() - timer >= tRefresco)
{
timer += tRefresco; //aumento un seg
switch(digAct)
{
case 4:
digitalWrite(DIG1, 0);
digAct--;
setNumero(d4);
setDigito(4);
break;
case 3:
digitalWrite(DIG4, 0);
digAct--;
setNumero(d3);
digitalWrite(DIG3, 1);
break;
case 2:
digitalWrite(DIG3, 0);
digAct--;
setNumero(d2);
digitalWrite(DIG2, 1);
break;
case 1:
digitalWrite(DIG2, 0);
digAct = 4;
setNumero(d1);
setDigito(1);
break;
}
}
}
void setNumero(byte num)
{
switch(num)
{
case 0:
set0();
break;
case 1:
set1();
break;
case 2:
set2();
break;
case 3:
set3();
break;
case 4:
set4();
break;
case 5:
set5();
break;
case 6:
set6();
break;
case 7:
set7();
break;
case 8:
set8();
break;
case 9:
set9();
break;
}
}
void setDigito(byte dig)
{
switch(dig)
{
case 4:
digitalWrite(DIG4, 1);
digitalWrite(DIG3, 0);
digitalWrite(DIG2, 0);
digitalWrite(DIG1, 0);
break;
case 3:
digitalWrite(DIG4, 0);
digitalWrite(DIG3, 1);
digitalWrite(DIG2, 0);
digitalWrite(DIG1, 0);
break;
case 2:
digitalWrite(DIG4, 0);
digitalWrite(DIG3, 0);
digitalWrite(DIG2, 1);
digitalWrite(DIG1, 0);
break;
case 1:
digitalWrite(DIG4, 0);
digitalWrite(DIG3, 0);
digitalWrite(DIG2, 0);
digitalWrite(DIG1, 1);
break;
}
}
void set0()
{
for (int i = 0; i < 6; i++)
{
digitalWrite(pines[i], 0);
}
digitalWrite(segG, 1);
}
void set1()
{
for (int i = 0; i < NUMpins-4; i++)
{
if( i >= 1 && i <= 2 )
digitalWrite(pines[i], 0);
else
digitalWrite(pines[i], 1);
}
}
void set2()
{
digitalWrite(segA, 0);
digitalWrite(segB, 0);
digitalWrite(segC, 1);
digitalWrite(segD, 0);
digitalWrite(segE, 0);
digitalWrite(segF, 1);
digitalWrite(segG, 0);
}
void set3()
{
digitalWrite(segA, 0);
digitalWrite(segB, 0);
digitalWrite(segC, 0);
digitalWrite(segD, 0);
digitalWrite(segE, 1);
digitalWrite(segF, 1);
digitalWrite(segG, 0);
}
void set4()
{
digitalWrite(segA, 1);
digitalWrite(segB, 0);
digitalWrite(segC, 0);
digitalWrite(segD, 1);
digitalWrite(segE, 1);
digitalWrite(segF, 0);
digitalWrite(segG, 0);
}
void set5()
{
digitalWrite(segA, 0);
digitalWrite(segB, 1);
digitalWrite(segC, 0);
digitalWrite(segD, 0);
digitalWrite(segE, 1);
digitalWrite(segF, 0);
digitalWrite(segG, 0);
}
void set6()
{
digitalWrite(segA, 0);
digitalWrite(segB, 1);
digitalWrite(segC, 0);
digitalWrite(segD, 0);
digitalWrite(segE, 0);
digitalWrite(segF, 0);
digitalWrite(segG, 0);
}
void set7()
{
digitalWrite(segA, 0);
digitalWrite(segB, 0);
digitalWrite(segC, 0);
digitalWrite(segD, 1);
digitalWrite(segE, 1);
digitalWrite(segF, 1);
digitalWrite(segG, 1);
}
void set8()
{
for(int i = 0; i < NUMpins - 4; i++ )
digitalWrite(pines[i], 0);
}
void set9()
{
set8();
digitalWrite(segE, 1);
}