#include <WiFi.h>
const int PINO_ENTRADA = 4;
const int PINO_SAIDA = 2;
volatile unsigned long contador = 0;
unsigned long limite = 5;
bool saidaAtiva = false;
// Variรกveis para debounce
volatile unsigned long ultimoTempo = 0;
void IRAM_ATTR contarImpulso() {
if (millis() - ultimoTempo > 200) {
contador++;
ultimoTempo = millis();
Serial.println("๐ Impulso detectado! Contador: " + String(contador));
// Verificar limite imediatamente apรณs contar
if (contador >= limite && !saidaAtiva) {
saidaAtiva = true;
digitalWrite(PINO_SAIDA, HIGH);
Serial.println("โญโญโญ LIMITE ATINGIDO! SAรDA ATIVADA โญโญโญ");
}
}
}
void mostrarStatus() {
Serial.println("\n๐ **ESTADO DO SISTEMA**");
Serial.println(" โโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
Serial.println(" โ Contador: " + String(contador) + String(contador < 10 ? " " : "") + " โ");
Serial.println(" โ Limite: " + String(limite) + String(limite < 10 ? " " : "") + " โ");
Serial.println(" โ Saรญda: " + String(saidaAtiva ? "ATIVA โ
" : "INATIVA โ") + " โ");
Serial.println(" โโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
}
void mostrarAjuda() {
Serial.println("\nโ **COMANDOS DISPONรVEIS:**");
Serial.println(" โโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
Serial.println(" โ COMANDO โ DESCRIรรO โ");
Serial.println(" โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค");
Serial.println(" โ status โ Mostrar estado atual โ");
Serial.println(" โ reset โ Zerar contador โ");
Serial.println(" โ limite N โ Definir limite (ex: limite 10) โ");
Serial.println(" โ simular โ Simular 1 impulso โ");
Serial.println(" โ simular N โ Simular N impulsos โ");
Serial.println(" โ ajuda โ Mostrar esta ajuda โ");
Serial.println(" โโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
}
void setup() {
Serial.begin(115200);
// Configuraรงรฃo dos pinos
pinMode(PINO_ENTRADA, INPUT_PULLUP);
pinMode(PINO_SAIDA, OUTPUT);
digitalWrite(PINO_SAIDA, LOW);
// Configurar interrupรงรฃo no botรฃo
attachInterrupt(digitalPinToInterrupt(PINO_ENTRADA), contarImpulso, FALLING);
Serial.println("\n"
"โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n"
"โ CONTADOR DE IMPULSOS ESP32 โ\n"
"โ WOKWI SIMULATION โ\n"
"โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n");
Serial.println("๐ Sistema iniciado com sucesso!");
Serial.println("๐ง Configuraรงรฃo:");
Serial.println(" โข Entrada: GPIO4 (Botรฃo para GND)");
Serial.println(" โข Saรญda: GPIO2 (LED/Relรฉ)");
Serial.println(" โข Limite: " + String(limite) + " impulsos");
mostrarAjuda();
mostrarStatus();
Serial.println("\n๐ฏ **PRONTO PARA USAR!**");
Serial.println(" Pressione o botรฃo no GPIO4 ou digite comandos abaixo:");
Serial.println("โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
}
void loop() {
// Processar comandos do Serial Monitor
if (Serial.available()) {
String comando = Serial.readStringUntil('\n');
comando.trim();
if (comando == "status") {
mostrarStatus();
}
else if (comando == "reset") {
contador = 0;
saidaAtiva = false;
digitalWrite(PINO_SAIDA, LOW);
Serial.println("๐ Contador resetado para 0");
mostrarStatus();
}
else if (comando == "simular") {
contador++;
Serial.println("๐ฎ 1 impulso simulado!");
mostrarStatus();
}
else if (comando.startsWith("simular ")) {
int qtd = comando.substring(8).toInt();
if (qtd > 0) {
contador += qtd;
Serial.println("๐ฎ " + String(qtd) + " impulsos simulados!");
mostrarStatus();
}
}
else if (comando.startsWith("limite ")) {
int novoLimite = comando.substring(7).toInt();
if (novoLimite > 0) {
limite = novoLimite;
Serial.println("๐ฏ Limite alterado para: " + String(limite));
mostrarStatus();
} else {
Serial.println("โ Erro: Limite deve ser maior que 0");
}
}
else if (comando == "ajuda" || comando == "help") {
mostrarAjuda();
}
else if (comando.length() > 0) {
Serial.println("โ Comando desconhecido: '" + comando + "'");
Serial.println("๐ก Digite 'ajuda' para ver os comandos disponรญveis");
}
// Verificar limite apรณs comando
if (contador >= limite && !saidaAtiva) {
saidaAtiva = true;
digitalWrite(PINO_SAIDA, HIGH);
Serial.println("โญโญโญ LIMITE ATINGIDO! SAรDA ATIVADA โญโญโญ");
}
else if (contador < limite && saidaAtiva) {
saidaAtiva = false;
digitalWrite(PINO_SAIDA, LOW);
Serial.println("๐ก Contador abaixo do limite. Saรญda desativada.");
}
}
delay(10);
}