Temporizador problema simples


#1

Amigos, fiz um temporizador que ao apertar o push button aciona um relê, conta X tempo, desliga o relê, conta Y tempo, aciona um buzzer por Z tempo e encerra o processo. Ocorre que no meu sketch, após acionado o push, o relê é acionado, conta o tempo X, não desliga o relê, aciona o buzzer e após o tempo do buzzer, ai si, desliga o relê. Alguem pode me ajudar a encontrar o erro ? Sou iniciante. Grato
#define rele 12
#define botao 2
#define buzzer 5
boolean estado = false;
unsigned long Tempo; // Variavel de 4 bytes para Tempo
//------------------------------
void setup()
{
Serial.begin(9600); // Diag
pinMode(rele, OUTPUT);
pinMode(botao, INPUT);
pinMode(buzzer,OUTPUT);
digitalWrite(botao, HIGH);
Tempo = millis(); // Inicializa a variavel Tempo
}
//------------------------------
void loop()
{
if (digitalRead(botao) == LOW) // Se botao foi apertado
{
delay(100); // Evita debouncing
if (digitalRead(botao) == LOW) // Se botao continua apertado
{
delay(100); // Evita debouncing
estado = !estado; // Inverte estado da saida
Tempo = millis(); // Reinicializa a variavel
Serial.println(estado); // Diag
}
}
if (digitalRead(botao) == HIGH) // Se botao está liberado
{
if (estado == true) // Se o estado for ligado
{
if (millis() - Tempo >= 5000) // Testa espera o tempo de 5 segundos
{
Serial.println(millis() - Tempo); // Diag
Tempo = millis(); // Reinicializa a variavel
estado = false; // Informa desligado

}

}


#2

Opa tudo blz?

Tem algo errado ai. No void setup vc determina botao como INPUT e logo depois coloca nível lógico HIGH nele?
O digitalWrite() é usado para OUTPUT, para determinar um estado em um pino de saída.

Caso sua intenção foi usar o resistor pull-up interno, então use o comando:

pinMode(botao, INPUT_PULLUP);

video sobre pull-UP

Com relação a temporização vc pode somar os tempos:

tempoDoRele + tempoDoBuzzer.

Depois lgue o relê e conte o tempo.

quando o tempo for >= tempoTotal - tempoDoBuzzer desligue o relê e ligue o buzzer.

quando o tempo for >= tempoTotal desligue o buzzer e zere o tempo pra ficar pronto para próxima vez.