/*
Controle velocidade de Ventilador com ATtiny85
By Fabio Tec
Versão 0.1
01/12/2025
*/
const uint8_t led1 = 0; // PB0
const uint8_t led2 = 1; // PB1
const uint8_t led3 = 2; // PB2
const uint8_t btn = 3; // PB3
const uint8_t buz = 4; // PB4
// Estados: 0=OFF, 1=LED1, 2=LED2, 3=LED3
uint8_t currentState = 0;
uint8_t nextState = 0;
bool inTransition = false;
unsigned long transitionStart = 0;
const unsigned long changeDelay = 700; // ms entre apagar e acender
// Debounce
unsigned long lastDebounceTime = 0;
const unsigned long debounceTime = 50;
uint8_t stableBtn = HIGH;
uint8_t lastRead = HIGH;
// Função para gerar um bip curto ------------------------------------
void beep(unsigned int freq, unsigned long duration) {
unsigned long period = 1000000L / freq; // período em microssegundos
unsigned long cycles = duration * 1000L / period;
for (unsigned long i = 0; i < cycles; i++) {
digitalWrite(buz, HIGH);
delayMicroseconds(period / 2);
digitalWrite(buz, LOW);
delayMicroseconds(period / 2);
}
}
//------------------------------------------------------------------
void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(buz, OUTPUT);
pinMode(btn, INPUT_PULLUP);
beep(1250, 50);
delay(200);
beep(1250, 100);
}//------------------------------------------------------------------
void loop() {
button(); // trata cliques
controlS(); // aplica LEDs com transição segura
}
// Função LEDs -----------------------------------------------------
void controlS() {
unsigned long now = millis();
if (inTransition) {
// Durante transição: tudo apagado
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
if (now - transitionStart >= changeDelay) {
// Após o delay, ativa próximo estado
currentState = nextState;
inTransition = false;
}
return;
}
// Exibe estado atual
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
if (currentState == 1) digitalWrite(led1, HIGH);
else if (currentState == 2) digitalWrite(led2, HIGH);
else if (currentState == 3) digitalWrite(led3, HIGH);
}
// Função botão ------------------------------------------------
void button() {
uint8_t reading = digitalRead(btn);
unsigned long now = millis();
if (reading != lastRead) {
lastDebounceTime = now;
lastRead = reading;
}
if ((now - lastDebounceTime) >= debounceTime) {
if (stableBtn != reading) {
stableBtn = reading;
// Borda de descida (pressionado)
if (stableBtn == LOW) {
// Dá o bip curto
beep(1250, 50); // 1250 Hz por 50 ms
// Calcula próximo estado
if (currentState == 0) nextState = 1;
else if (currentState == 1) nextState = 2;
else if (currentState == 2) nextState = 3;
else if (currentState == 3) nextState = 0;
// Apaga imediatamente e inicia transição
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
inTransition = true;
transitionStart = now;
}
}
}
}