// MÓDULO PERIFÉRICO 3 - TCC 2025
// Entradas:
#define pino_interruptor_lampada 0 //0
#define pino_bot_diminui 17 //1
#define pino_bot_aumenta 2 //2
#define pino_interruptor_sentido 16 //3
// 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 interruptor_lampada_atual = 0;
int interruptor_lampada_anterior = 0;
int estado_rele_lampada = 0;
int interruptor_sentido_atual = HIGH;
int interruptor_sentido_anterior = HIGH;
bool estado_sentido = false;
// Controle de tempo:
unsigned long ultimoMillisAumenta = 0;
unsigned long ultimoMillisDiminui = 0;
const unsigned long intervaloRepeticao = 100; // ms
void setup() {
Serial.begin(115200);
// Entradas
pinMode(pino_interruptor_lampada, INPUT);
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
digitalWrite(pino_rele_exaust_vent, HIGH); // NC = Exaustão
}
void loop() {
unsigned long agora = millis();
// LÂMPADA - Toque alterna estado
interruptor_lampada_atual = digitalRead(pino_interruptor_lampada);
if (interruptor_lampada_atual != interruptor_lampada_anterior) {
estado_rele_lampada = !estado_rele_lampada;
digitalWrite(pino_rele_dpdt_lampada, estado_rele_lampada);
}
interruptor_lampada_anterior = interruptor_lampada_atual;
// 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;
}
// Limites de segurança
val_bruto_triac = constrain(val_bruto_triac, 0, 100);
val_triac = (val_bruto_triac > 5) ? val_bruto_triac : 0;
// Liga/desliga ventilador via relé
digitalWrite(pino_rele_liga_desliga, val_triac > 0 ? HIGH : LOW);
// Envia valor ao TRIAC
int val_triac_map = map(val_triac, 0, 100, 0, 255);
analogWrite(pino_triac, val_triac_map);
// SENTIDO - alterna ao toque
interruptor_sentido_atual = digitalRead(pino_interruptor_sentido);
if (interruptor_sentido_anterior != interruptor_sentido_atual) {
estado_sentido = !estado_sentido;
digitalWrite(pino_rele_exaust_vent, estado_sentido ? LOW : HIGH); // NO = Vent, NC = Exaust
Serial.print("Novo modo: ");
Serial.println(estado_sentido ? "Ventilação (NO)" : "Exaustão (NC)");
}
interruptor_sentido_anterior = interruptor_sentido_atual;
// Debug
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