4 Temporizadores usando millis - Sem delay()

Senhores, bom base em alguns exemplos da internet desenvolvi esse Sketch, mas estou tendo algumas dificuldades, visto que sou novo a área, portanto peço ajuda de vocês.

Preciso adicionar o reconhecimento de um 2º PULSO vindo da mesma entrada do 1º PULSO e também adicionar um atraso - sem a função delay() para o 4º led (LED4).

Usando a função millis() consegui os temporizadores.

Se alguém puder me ajudar a resolver o problema, ou puder melhorar o que já foi feito, fico agradecido.

OBJETIVO:

2 BOTÕES.
4 LEDS

O 1º PULSO do BOTAO1 acionar o LED1
O 1º PULSO do BOTAO2 acionar o LED2
O 2º PULSO do BOTAO2 acionar o LED3

AGUARDAR 4 segundos

acionar o LED4.

Todos mantendo suas respectivos temporizações.

Desde já agradeço.

/*
 ************************************************************************************
 ************************************************************************************
 ************************************************************************************
 TENTANDO IMPLEMENTAR O SEGUNDO PULSO.
 TENTANDO IMPLEMENTAR O ATRASO (SEM delay() PARA O 4º LED.


 OBJETIVOS:  
 
 COM 1º PULSO DE BOTÃO1 LIGAR LED1
  
 COM 1º PULSO DE BOTÃO2 LIGAR LED2 
 COM 2º PULSO DE BOTÃO2 LIGAR LED3
 
 AGUARDAR 4 SEGUNDOS E LIGAR LED4 (IMPLEMENTAR)

 AGUARDAR TEMPORIZAÇÕES DE LED1, LED2, LED3 E LED4
 DESLIGA-LOS

 IMPLEMENTAR RESET

 Hélio Rodrigues
 Goianira/Go
 Brazil
 30/12/2017

 Video do sistema ainda sem 2º PULSO e sem o ATRASO para o 4º LED (LED4).
 https://youtu.be/AhQQgb2-QWQ

TODA E QUALQUER AJUDA É BEM VINDA.
h3lyofilho@gmail.com
WhatsApp: (62) 99458 1897
 
 ************************************************************************************
 *************************************************************************************
 ************************************************************************************
*/

#define TEMPO_LED1 2000  //PARA USO FINAL TEMPO SERA DE 3 OU 4 SEGUNDOS - SEM AJUSTE
#define TEMPO_LED2 90000 //PARA USO FINAL TEMPO SERA DE ATÉ 3 HORAS - COM AJUSTE
#define TEMPO_LED3 7000 //PARA USO FINAL TEMPO SERA DE ATÉ 30 MINUTOS - COM AJUSTE
#define TEMPO_LED4 4000 //PARA USO FINAL TEMPO SERA DE ATÉ 10 SEGUNDOS - COM AJUSTE


unsigned char BOTAO1 = 0;//INICIA TEMPO_LED1
unsigned char BOTAO2 = 2;//INICIA TEMPO_LED1, TEMPO_LED2, TEMPO_LED3 E TEMPO_LED4.

unsigned char LED1 = 8;
unsigned char LED2 = 9;
unsigned char LED3 = 10;
unsigned char LED4 = 11;

unsigned long AGORA = 0;
unsigned long EVENTO_LED1 = 0;
unsigned long EVENTO_LED2 = 0;
unsigned long EVENTO_LED3 = 0;
unsigned long EVENTO_LED4 = 0;


void setup()
{
pinMode(BOTAO1, INPUT_PULLUP);//SINAL DE ENTRADA COM RESISTOR INTERNO ATIVO
pinMode(BOTAO2,INPUT_PULLUP);//SINAL DE ENTRADA COM RESISTOR INTERNO ATIVO

pinMode(LED1,OUTPUT);//SINAL DE SAIDA
pinMode(LED2,OUTPUT);//SINAL DE SAIDA
pinMode(LED3,OUTPUT);//SINAL DE SAIDA
pinMode(LED4,OUTPUT);//SINAL DE SAIDA
}

void loop()
{
//LIGANDO.........
//LIGANDO.........
//LIGANDO.........
//LIGANDO.........
//LIGANDO.........
//LIGANDO.........
//==================================================================================
//==================================================================================
//==================================================================================
//==================================================================================

AGORA = millis(); //TEMPO DESDE QUE O ARDUINO FOI LIGADO  

   
//LED1
if (digitalRead(BOTAO1) == 0)//SE O BOTAO1 FOR PRESSIONADO...
{
 EVENTO_LED1 = millis();//...MARCAMOS O TEMPO DE INICIO DO LED1
 digitalWrite(LED1,1);//LIGA O LIGA O LED1
}


//LED2
if (digitalRead(BOTAO2) == 0)//SE O BOTAO2  FOR PRESSIONADO...
{
 EVENTO_LED2 = millis();//...MARCAMOS O TEMPO DE INICIO DO LED2
 digitalWrite(LED2,1);//LIGA O LED2
}


//LED3
if (digitalRead(BOTAO2) == 0)//SE O BOTAO2 FOR PRESSIONADO..
{
 EVENTO_LED3 = millis();//...MARCAMOS O TEMPO DE INICIO LED3
 digitalWrite(LED3,1);//LIGA O LED3
}


//LED4
if (digitalRead(BOTAO2) == 0)//SE O BOTAO2 FOR PRESSIONADO..
{
EVENTO_LED4 = millis();//...MARCAMOS O TEMPO DE INICIO LED4
digitalWrite(LED4,1);//LIGA O LED4
}

//DESLIGANDO.........
//DESLIGANDO.........
//DESLIGANDO.........
//DESLIGANDO.........
//DESLIGANDO.........
//DESLIGANDO.........
//==================================================================================
//==================================================================================
//==================================================================================
//==================================================================================
if(AGORA - EVENTO_LED1 > TEMPO_LED1)//SE ACABOU O TEMPO DE LED1
{
 EVENTO_LED1 = AGORA;//RESETA O LED1
 digitalWrite(LED1,0);//E DESLIGA O LED1
}


if(AGORA - EVENTO_LED2 > TEMPO_LED2)//SE ACABOU 0 TEMPO DE LED2
{
 EVENTO_LED2 = AGORA;//RESETA O TEMPO DE LED2
 digitalWrite(LED2,0);//E DESLIGA O LED2
}


if(AGORA - EVENTO_LED3 > TEMPO_LED3)//SE ACABOU O TEMPO DE LED3
{
 EVENTO_LED3= AGORA;//RESETA O TEMPO DE LED3
 digitalWrite(LED3,0);//E DESLIGA O LED3
}


if(AGORA - EVENTO_LED3 > TEMPO_LED4)//SE ACABOU O TEMPO LED4
{
 EVENTO_LED4 = AGORA;//RESETA O TEMPO DE LED4
 digitalWrite(LED4,0);//E DESLIGA O LED4
}
}

TIMER.ino (4.39 KB)

Não perguntaste já isto anteriormente e eu respondi??

Isto

if (digitalRead(BOTAO1) == 0)//SE O BOTAO1 FOR PRESSIONADO...
{
 EVENTO_LED1 = millis();//...MARCAMOS O TEMPO DE INICIO DO LED1
 digitalWrite(LED1,1);//LIGA O LIGA O LED1
}

Não faz o que tu pensas que faz. Isto não mete quando o botão foi pressionado, mas sim quando o botão foi libertado. Para detectares quando for pressionado, tens de ver quando existe a transição de 1 para 0.

ISto:

//LED4
if (digitalRead(BOTAO2) == 0)//SE O BOTAO2 FOR PRESSIONADO..
{
EVENTO_LED4 = millis();//...MARCAMOS O TEMPO DE INICIO LED4
digitalWrite(LED4,1);//LIGA O LED4
}

Não condiz com o que tu pretendes... o LED4 é suposto ligar apenas após 4 segundos passaram de ligar o LED3. Assim sendo deveria ser:

//LED4
if (millis() - EVENTO_LED3 >= 4000)//SE O BOTAO2 FOR PRESSIONADO..
{
digitalWrite(LED4,1);//LIGA O LED4
}

O resto do código parece mais ou menos correcto, começa por detectar o pulso (podes pesquisar nos meus posts) para os botões e depois implementa a lógica que meti aqui... se bem que tendo em conta o que apresentaste já devias ter lá chegado.

Fiz o código do zero

//MAPA DE I/O
const byte bt = 2;
const byte bt2 = 3;
const byte led=9;
const byte led2=10;
const byte led3=11;
const byte led4=12;

//Variveis globais
unsigned int press=0; //numero de vezes que bt2 foi usado


//Timing
const unsigned int intervalo=250; //intervalo de tempo em ms para ler os botes
unsigned long last=0; //tempo da última varredura dos botões

void setup(){
  pinMode(bt,INPUT_PULLUP);
  pinMode(bt2,INPUT_PULLUP);
  //OBS: botões configurados para PULLUP interno. Ou seja, não necessita colocar resistores externos.
  pinMode(led,OUTPUT);
  pinMode(led2,OUTPUT);
  pinMode(led3,OUTPUT);
  pinMode(led4,OUTPUT);
}
void loop(){
  //lê os botões a cada 250ms
  if(millis() - last >= intervalo){
    if(!digitalRead(bt)){ //o botão 1 foi acionado?
      digitalWrite(led,HIGH);
    }
    
    if(!digitalRead(bt2)){//o botão 2 foi acionado?
      press++;
      digitalWrite(led2,HIGH);
      if(press>=2){ //o btoão 2 foi acioando 2 ou mais vezes?
        digitalWrite(led3,HIGH);
      }
    }
    last = millis(); //atualiza a variável de última varredura
  }//end ler botões
  //se já se passaram 4s, ligar led4
  if(millis() >= 4000){
      digitalWrite(led4,HIGH);
    }
}//end void loop

Verifica se o acionamento do led 4 esta correto.
Aviso: compilei o código mais não testei!