// MÓDULO PERIFÉRICO 3 - TCC 2025
// Entradas:
#define pino_botao_lampada 0 //0 Botão momentâneo para lâmpada
#define pino_bot_diminui 17 //1 Botão diminuir velocidade
#define pino_bot_aumenta 2 //2 Botão aumentar velocidade
#define pino_interruptor_sentido 16 //3 Interruptor fixo (exautor/ventilador)
// Saídas:
#define pino_triac 18 //4
#define pino_rele_exaust_vent 22 //5
#define pino_rele_liga_desliga 15 //6
#define pino_rele_dpdt_lampada 13 //7
// Variáveis de estado:
int val_triac = 0;
int val_bruto_triac = 0;
int estado_rele_lampada = 0;
// Controle de tempo:
unsigned long ultimoMillisAumenta = 0;
unsigned long ultimoMillisDiminui = 0;
const unsigned long intervaloRepeticao = 100; // ms
// Debounce do botão da lâmpada
int estado_botao_lampada = HIGH;
int ultimo_estado_botao_lampada = HIGH;
unsigned long ultimoDebounceLampada = 0;
const unsigned long debounceDelay = 50;
void setup() {
Serial.begin(115200);
// Entradas
pinMode(pino_botao_lampada, INPUT_PULLUP);
pinMode(pino_bot_diminui, INPUT_PULLUP);
pinMode(pino_bot_aumenta, INPUT_PULLUP);
pinMode(pino_interruptor_sentido, INPUT_PULLUP);
// Saídas
pinMode(pino_triac, OUTPUT);
pinMode(pino_rele_exaust_vent, OUTPUT);
pinMode(pino_rele_liga_desliga, OUTPUT);
pinMode(pino_rele_dpdt_lampada, OUTPUT);
// Estado inicial do relé de sentido (NC = Exaustão)
digitalWrite(pino_rele_exaust_vent, HIGH);
}
void loop() {
unsigned long agora = millis();
// ======== LÂMPADA - botão momentâneo com debounce ========
int leitura_botao_lampada = digitalRead(pino_botao_lampada);
if (leitura_botao_lampada != ultimo_estado_botao_lampada) {
ultimoDebounceLampada = agora;
}
if ((agora - ultimoDebounceLampada) > debounceDelay) {
if (leitura_botao_lampada != estado_botao_lampada) {
estado_botao_lampada = leitura_botao_lampada;
if (estado_botao_lampada == LOW) {
estado_rele_lampada = !estado_rele_lampada;
digitalWrite(pino_rele_dpdt_lampada, estado_rele_lampada);
Serial.print("Lâmpada: ");
Serial.println(estado_rele_lampada ? "ON" : "OFF");
}
}
}
ultimo_estado_botao_lampada = leitura_botao_lampada;
// ======== VENTILADOR - controle de velocidade com botões ========
bool bot_aumenta = digitalRead(pino_bot_aumenta) == LOW;
bool bot_diminui = digitalRead(pino_bot_diminui) == LOW;
if (bot_aumenta && (agora - ultimoMillisAumenta > intervaloRepeticao)) {
if (val_bruto_triac < 100) val_bruto_triac++;
ultimoMillisAumenta = agora;
}
if (bot_diminui && (agora - ultimoMillisDiminui > intervaloRepeticao)) {
if (val_bruto_triac > 0) val_bruto_triac--;
ultimoMillisDiminui = agora;
}
val_bruto_triac = constrain(val_bruto_triac, 0, 100);
val_triac = (val_bruto_triac > 5) ? val_bruto_triac : 0;
digitalWrite(pino_rele_liga_desliga, val_triac > 0 ? LOW : HIGH);
int val_triac_map = map(val_triac, 0, 100, 0, 255);
analogWrite(pino_triac, val_triac_map);
// ======== SENTIDO - interruptor fixo (sem debounce) ========
int leitura_sentido = digitalRead(pino_interruptor_sentido);
if (leitura_sentido == LOW) {
digitalWrite(pino_rele_exaust_vent, LOW); // Ventilação (NO) //Colocar HIGH
Serial.println("Modo: Ventilação (NO)");
} else {
digitalWrite(pino_rele_exaust_vent, HIGH); // Exaustão (NC) //Colocar LOW
Serial.println("Modo: Exaustão (NC)");
}
// ======== DEBUG VELOCIDADE ========
Serial.print("Velocidade: ");
Serial.println(val_triac);
}
Estado
Lamp
Diminui/
/Aumenta
Velocidade Ventilador
Exaust/Vent
Ventilador
Exaust
-----------
Vent
VENTILADOR
F1
F2
Relé DPDT
Soquete
Lampada
ESP32c3
Brilho indica velocidade