int segmentos[7] = {0,23,12,13,18,21,19};
int comumCat = 14;
int bot[2] = {26,27};
//Desafio: usar multiplexação para usar apenas 5 pinos (usar o fato do display ter 2 pinos para o pino comum. Assim os pinos que compartilham o mesmo pino ficariam acessos por 20 ms cada)
int numeros[10] = {B00111111, B00000110, B01011011, B01001111, B01100110, B01101101, B01111101, B00000111, B01111111, B01101111}; //0, 1, 2, 3, ..., em binário.
void setup() {
// put your setup code here, to run once:
//Definição de entradas e saídas
for(int j =1;j<=7;j++) pinMode(segmentos[j], OUTPUT);
pinMode(comumCat, OUTPUT);
for(int j =1;j<=2;j++) pinMode(bot[j], OUTPUT);
Serial.begin(115200);
}
void loop() {
// put your main code here, to run repeatedly:
int time = 1000;
int ref = millis();
int num = 0;
int ant = -1;
bool regressiva = false;
const int timeBounce = 10; //O bounce depende do tempo de estabilização. Assim, aqui presumi-se que depois de 10 ms as leituras estão estáveis.
int bounce = 0;
bool verificadoAz = false;
bool verificadoVd = false;
digitalWrite(comumCat, LOW);
do{
//Verificação de se o botão azul (regressiva, pino 26) foi pressionado
if(!digitalRead(bot[0]) == 1 && verificadoAz == false){
verificadoAz = true;
bounce = millis();
}
//Acão do botão azul: resetar o cronômetro e acionar a contagem regressiva de 9 a 0 assim que soltar o botão azul.
if(millis() - bounce > timeBounce && verificadoAz == true){
if(!digitalRead(bot[0]) == 1){
//Deixar o display limpo
for(int i = 0; i < 7; i++){
digitalWrite(segmentos[i], 0);
}
//prender a progressão do código enquanto o botão não for solto
while(!digitalRead(bot[0]) == 1){
}
//Reseta os parâmetros relacionados à contagem regressiva
num = 9;
regressiva = true;
ref = millis(); //reinicia a contagem
//Reseta os parâmetros de debounce do botão
bounce = 0;
verificadoAz = false;
}
}
//Contagem regressiva
if(millis()-ref>(9-num)*time && millis()-ref<=(9-num+1)*time && ant !=num && regressiva == true ){
for(int i = 0; i < 7; i++){
digitalWrite(segmentos[i], 0);
}
for(int i = 0; i < 7; i++){
digitalWrite(segmentos[i], bitRead(numeros[num],i));
}
ant = num;
num--;
}
//Reiniciar contagem regressiva sem necessidade de sair do loop while
if( regressiva == true && num == -1 ){
if(millis()-ref>(9-num)*time && millis()-ref<=(9-num+1)*time && ant !=num && regressiva == true ){
ref = millis();
num = 9;
ant = 10;
}
}
//-------------------------------------------------------------------------------------------------
//Verificação de se o botão verde (regressiva, pino 27) foi pressionado
if(!digitalRead(bot[1]) == 1 && verificadoVd == false){
verificadoVd = true;
bounce = millis();
}
//Acão do botão verde: resetar o cronômetro e acionar a contagem progressiva de 0 a 9 assim que soltar o botão verde.
if(millis() - bounce > timeBounce && verificadoVd == true){
if(!digitalRead(bot[1]) == 1){
//Deixar o display limpo
for(int i = 0; i < 7; i++){
digitalWrite(segmentos[i], 0);
}
//prender a progressão do código enquanto o botão não for solto
while(!digitalRead(bot[1]) == 1){
}
//Reseta os parâmetros relacionados à contagem progressiva
num = 0;
regressiva = false;
ref = millis(); //reinicia a contagem
//Reseta os parâmetros de debounce do botão
bounce = 0;
verificadoVd = false;
}
}
//Contagem progressiva
if(millis()-ref>(num)*time && millis()-ref<=(num+1)*time && ant !=num && regressiva == false ){
for(int i = 0; i < 7; i++){
digitalWrite(segmentos[i], 0);
}
for(int i = 0; i < 7; i++){
digitalWrite(segmentos[i], bitRead(numeros[num],i));
}
ant = num;
num++;
}
//Reiniciar contagem progressiva sem necessidade de sair do loop while
if( regressiva == false && num == 9 ){
delay(time);
if(millis()-ref>(num)*time && millis()-ref<=(num+1)*time && ant !=num && regressiva == false ){
ref = millis();
num = 0;
ant = -1;
}
}
}while(1 == 1);
}