#define BUTTON_PIN 12
#define SENSOR_PIN 14
#define SIRENE 13
#define INTERVALO_CLIQUE 700 // 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:
// Só aqui faz leitura do sensor
if (analogRead(SENSOR_PIN) > 4000) {
estadoAtual = ALARME;
digitalWrite(SIRENE, HIGH);
Serial.println("Estado: ALARME");
}
break;
case ALARME:
sirene();
// Continua lendo para sair automaticamente
if (analogRead(SENSOR_PIN) <= 4000) {
estadoAtual = OPERACAO;
Serial.println("Estado: OPERACAO");
}
break;
case DESLIGADO:
digitalWrite(SIRENE, LOW);
break;
}
//delay(200);
}
void detectarCliques() {
bool leitura = digitalRead(BUTTON_PIN);
unsigned long agora = millis();
if (leitura == HIGH && botaoAnterior == LOW) {
if (agora - ultimoClique < INTERVALO_CLIQUE) {
contadorCliques++;
} else {
contadorCliques = 1;
}
ultimoClique = agora;
}
delay(20); // debounce simples
// Decide ação após tempo
if ((agora - ultimoClique) > INTERVALO_CLIQUE && contadorCliques > 0) {
if (contadorCliques == 1) {
estadoAtual = OPERACAO;
Serial.println("Estado: OPERACAO");
}
else if (contadorCliques >= 2) {
estadoAtual = DESLIGADO;
Serial.println("Estado: DESLIGADO");
}
contadorCliques = 0;
}
botaoAnterior = leitura;
}
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
}
}
}