// Definindo os pinos dos LEDs e do botão
const int num_leds = 8;
const int ledPins[num_leds] = {2, 3, 4, 5, 6, 7, 8, 9};
const int buzzerPin = 10; // Pino do buzzer
const int buttonPin = 12;
// Velocidade inicial, velocidade máxima e fator de desaceleração
int delayTime = 60;
const int maxDelay = 300; // Tempo máximo entre as rotações
const int minDelay = 50; // Tempo mínimo entre as rotações
const int accelerationFactor = 15; // Fator de aceleração
const int dampingFactor = 1; // Fator de amortecimento
// Variáveis de controle
boolean spinning = false;
int selectedLed = 0;
int lastLitLed = 0; // Armazena o último LED aceso durante a rotação
void setup() {
// Configuração dos pinos dos LEDs como saída
for (int i = 0; i < num_leds; i++) {
pinMode(ledPins[i], OUTPUT);
}
// Configuração do pino do buzzer como saída
pinMode(buzzerPin, OUTPUT);
// Configuração do pino do botão como entrada
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
// Verifica se o botão foi pressionado para iniciar o efeito de rotação
if (digitalRead(buttonPin) == LOW && !spinning) {
spinning = true;
int numSteps = random(20, 31); // Número aleatório de LEDs a percorrer entre 30 e 50
int stopPosition = random(num_leds); // Posição aleatória de parada
// Realiza os giros
for (int i = 0; i < numSteps; i++) {
// Gira os LEDs
spinWheel();
// Toca o som do buzzer
tone(buzzerPin, 1000, 10); // Frequência e duração do som
delay(delayTime);
// Ajusta a velocidade gradualmente para simular a desaceleração
if (delayTime < maxDelay) {
delayTime += accelerationFactor;
}
}
// Desliga todos os LEDs, exceto o último aceso
for (int i = 0; i < num_leds; i++) {
digitalWrite(ledPins[i], LOW);
}
// Define o LED selecionado como o último LED aceso durante a rotação
selectedLed = lastLitLed;
digitalWrite(ledPins[selectedLed], HIGH); // Acende o último LED
// Reinicia a velocidade para o valor inicial
delayTime = minDelay;
spinning = false;
}
}
// Função para girar os LEDs
void spinWheel() {
// Desliga todos os LEDs
for (int i = 0; i < num_leds; i++) {
digitalWrite(ledPins[i], LOW);
}
// Acende o próximo LED
selectedLed = (selectedLed + 1) % num_leds;
digitalWrite(ledPins[selectedLed], HIGH);
// Atualiza o último LED aceso
lastLitLed = selectedLed;
}