Contador binario de 3 bits com millis


#1

Bom dia

Faço curso técnico em mecatrônica, meu professor deu como tarefa desenvolver um contador binário de 3 bits usando a função millis que toda a vez que apertado um botão ele troca o sentido da contagem, consegui desenvolver o código para contagem, o código de debouncing, adaptei do modelo do próprio Arduino, porem não estou conseguindo implantar a função de reversão de contagem.

Se alguem puder me ajudar neste código ficarei muito grato.

/* ========================================================================================================

Curso de Tecnico em Mecatronica

CFP SENAI Ney Damasceno Ferreira

Contador de 3 bit com funcao millis

Aluno: Fabricio Cano Data: Fevereiro de 2019

======================================================================================================== */

//############################################### MAPEAMENTO DE HARWARE ###########################################

#define led1 8
#define led2 9
#define led3 10
#define buttonPin 11 // Numero do pino do botao

//###########################################MAPEAMENTO DE VARIAVEIS #############################3################

int buttonState; // Leitura atual do estado do botao
int lastButtonState = LOW; // Leitura do estado amterior do botao
int buttonPress = LOW;

/*
As variáveis ​​a seguir são unsigned long porque o tempo, medido em milissegundos,
rapidamente se tornará um número maior do que pode ser armazenado em uma variavel int.
*/

unsigned long lastDebounceTime = 0; // a ultima vez que o botao foi acionado
unsigned long debounceDelay = 50; // o tempo de debounce; aumentar se ainda persistir o bounce
long tempo1 = 1;
long tempo2 = 1;
long tempo3 = 1;
int status1 = HIGH;
int status2 = HIGH;
int status3 = HIGH;
void led_increasing();
void led_decreasing();

void setup() {

Serial.begin(9600);
digitalWrite(buttonPin, buttonPress); // define o stado inicial do botao

pinMode(led1,OUTPUT);
pinMode(buttonPin, INPUT);
pinMode(led2,OUTPUT);
pinMode(led3,OUTPUT);

}

void loop() {

// coloca o estado do bottao em uma variavel local
int reading = digitalRead(buttonPin);

/*
verifiqua se você acabou de pressionar o botão (ou seja, a entrada passou de LOW para HIGH), e você esperou o tempo suficiente
desde a última vez que pressionamos para ignorar qualquer ruído:
*/

if (reading != lastButtonState) {
// reset the debouncing timer
lastDebounceTime = millis();
}

if ((millis() - lastDebounceTime) > debounceDelay) {

//seja qual for a leitura, se está lá há mais tempo do que o atraso para debounce, então torne-o como estado atual:

// se a leitura do botao mudou:
if (reading != buttonState) {
  buttonState = reading;

  // inverte o estatus da variavel buttonPress
  if (buttonState == HIGH) {
    buttonPress = !buttonPress;
  }
}

}
// salva a leitura. Na próxima vez que passar pelo loop, será o lastButtonState:
lastButtonState = reading;
Serial.println(buttonPress);

//########################## LED 1 #####################

if((millis()-tempo1)>1000){
tempo1=millis();
if(status1==LOW){
status1=HIGH;
}
else{
status1=LOW;
}
digitalWrite(led1,status1);
}

//########################## LED 2 #####################

if((millis()-tempo2)>2000){
tempo2=millis();
if(status2==LOW){
status2=HIGH;
}
else{
status2=LOW;
}
digitalWrite(led2,status2);
}

//########################## LED 3 #####################

if((millis()-tempo3)>4000){
tempo3=millis();
if(status3==LOW){
status3=HIGH;
}
else{
status3=LOW;
}
digitalWrite(led3,status3);
}

}