#define BUTTON_PIN 12
#define SENSOR_PIN 14
#define SIRENE 13
#define INTERVALO_CLIQUE 500 // Tempo máximo entre dois cliques rápidos (ms)
#define TEMPO_PRESSAO_LONGA 3000 // Tempo mínimo para considerar como pressão longa (ms)
enum Estado { DESLIGADO, OPERACAO, ALARME };
Estado estadoAtual = DESLIGADO;
unsigned long ultimoClique = 0;
unsigned long tempoPressionado = 0;
bool botaoAnterior = LOW;
int contadorCliques = 0;
const unsigned long intervaloClique = 500; // tempo máximo entre cliques
bool pressionando = false;
void setup() {
pinMode(BUTTON_PIN, INPUT);
pinMode(SIRENE, OUTPUT);
//pinMode(LED, OUTPUT);
Serial.begin(9600);
}
void loop() {
detectarCliques();
switch (estadoAtual) {
case OPERACAO:
Serial.println("Estado: OPERACAO");
digitalWrite(SIRENE, HIGH);
delay(200);
digitalWrite(SIRENE, LOW);
while(1){
detectarCliques();
if (analogRead(SENSOR_PIN) > 4000) {
estadoAtual = ALARME;
break;
}
}
case ALARME:
Serial.println("Estado: ALARME");
while(1){
sirene();
detectarCliques();
if(estadoAtual == DESLIGADO){
break;
}
}
case DESLIGADO:
Serial.println("Estado: DESLIGADO");
digitalWrite(SIRENE, LOW);
while(1){
detectarCliques();
if(estadoAtual == OPERACAO){
break;
}
}
}
//delay(200);
}
void detectarCliques() {
bool estadoBotao = digitalRead(BUTTON_PIN);
unsigned long agora = millis();
// Botão pressionado
if (estadoBotao == HIGH) {
if (!pressionando) {
tempoPressionado = agora;
pressionando = true;
} else {
// Verifica se já passou 3 segundos com o botão pressionado
if ((agora - tempoPressionado) >= TEMPO_PRESSAO_LONGA && estadoAtual != OPERACAO) {
estadoAtual = OPERACAO;
Serial.println("Estado: OPERACAO");
contadorCliques = 0;
}
}
}
// Botão solto
if (estadoBotao == LOW && botaoAnterior == HIGH) {
pressionando = false;
// Se não foi pressão longa, verifica clique duplo
if ((agora - tempoPressionado) < TEMPO_PRESSAO_LONGA) {
if (agora - ultimoClique < INTERVALO_CLIQUE) {
contadorCliques++;
} else {
contadorCliques = 1;
}
ultimoClique = agora;
if (contadorCliques == 2) {
estadoAtual = DESLIGADO;
Serial.println("Estado: DESLIGADO");
contadorCliques = 0;
}
}
}
botaoAnterior = estadoBotao;
}
void sirene() {
static int posicao = 0;
static unsigned long tempoAnterior = 0;
const unsigned long intervalo = 100; // 100 ms
static int contadorPisca = 0;
unsigned long agora = millis();
if (posicao == 0) {
contadorPisca = 0;
posicao = 1;
tempoAnterior = agora;
}
if (posicao == 1 && agora - tempoAnterior >= intervalo) {
digitalWrite(SIRENE, !digitalRead(SIRENE)); // alterna o LED
tempoAnterior = agora;
contadorPisca++;
if (contadorPisca >= 8) { // 4 ciclos ON/OFF = 8 alternâncias
digitalWrite(SIRENE, LOW); // garante que o LED fique apagado no final
posicao = 0; // reinicia
}
}
}
Loading
esp32-devkit-c-v4
esp32-devkit-c-v4