// Define os pinos
const int RED_PIN = 9; // Pino vermelho do LED RGB
const int GREEN_PIN = 10; // Pino verde do LED RGB
const int BLUE_PIN = 11; // Pino azul do LED RGB
const int BUTTON_PIN = 2; // Pino do botão
// Variáveis de controle
unsigned long pressStartTime = 0;
unsigned long lastPressTime = 0;
int pressCount = 0;
unsigned long lastSequenceTime = 0;
const int SEQUENCE_INTERVAL = 5000; // 5 segundos entre sequências
void setup() {
// Configura os pinos
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
// Inicia com LEDs apagados
allLedsOff();
// Inicializa o gerador de números aleatórios
randomSeed(analogRead(0));
// Mostra sequência inicial
playRandomSequence();
}
void loop() {
// Verifica se é hora de mostrar uma nova sequência
if (millis() - lastSequenceTime > SEQUENCE_INTERVAL) {
playRandomSequence();
lastSequenceTime = millis();
}
// Lê o estado do botão
int buttonState = digitalRead(BUTTON_PIN);
// Se o botão foi pressionado (LOW devido ao pull-up)
if (buttonState == LOW) {
// Se é o início do pressionamento
if (pressStartTime == 0) {
pressStartTime = millis();
}
// Verifica se é uma pressão longa (mais de 1 segundo)
if ((millis() - pressStartTime) > 1000) {
allLedsOff();
digitalWrite(GREEN_PIN, HIGH); // Acende verde
while(digitalRead(BUTTON_PIN) == LOW) { // Espera soltar o botão
delay(10);
}
allLedsOff();
pressStartTime = 0;
pressCount = 0;
// Mostra nova sequência após pressão longa
playRandomSequence();
lastSequenceTime = millis();
return;
}
}
// Quando o botão é solto
if (buttonState == HIGH && pressStartTime > 0) {
// Calcula quanto tempo o botão ficou pressionado
unsigned long pressDuration = millis() - pressStartTime;
// Se foi um clique curto (menos de 500ms)
if (pressDuration < 500) {
pressCount++;
// Se é o primeiro clique
if (pressCount == 1) {
lastPressTime = millis();
allLedsOff();
digitalWrite(RED_PIN, HIGH); // Acende vermelho
}
// Se é o segundo clique em menos de 300ms (double click)
else if (pressCount == 2 && (millis() - lastPressTime) < 300) {
allLedsOff();
digitalWrite(BLUE_PIN, HIGH); // Acende azul
pressCount = 0;
// Mostra nova sequência após double click
delay(1000); // Espera 1 segundo antes da nova sequência
playRandomSequence();
lastSequenceTime = millis();
}
}
pressStartTime = 0;
}
// Reset contador de cliques se passou muito tempo
if (pressCount > 0 && (millis() - lastPressTime) > 300) {
pressCount = 0;
}
delay(10); // Pequeno delay para estabilidade
}
// Função para apagar todos os LEDs
void allLedsOff() {
digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);
}
// Função para mostrar uma sequência aleatória de cores
void playRandomSequence() {
allLedsOff();
// Número aleatório de cores na sequência (entre 3 e 6)
int numColors = random(3, 7);
// Mostra a sequência
for(int i = 0; i < numColors; i++) {
allLedsOff();
delay(200); // Espera entre cores
// Escolhe uma cor aleatória (1 = vermelho, 2 = verde, 3 = azul)
int color = random(1, 4);
switch(color) {
case 1:
digitalWrite(RED_PIN, HIGH);
break;
case 2:
digitalWrite(GREEN_PIN, HIGH);
break;
case 3:
digitalWrite(BLUE_PIN, HIGH);
break;
}
delay(500); // Mantém a cor acesa
}
allLedsOff(); // Apaga todos os LEDs no final da sequência
}