#include <avr/io.h>
#include <avr/interrupt.h>
// Pinos PWM do ATmega328P
#define R 6 // Timer0 (OC0A)
#define G 5 // Timer0 (OC0B)
#define B 3 // Timer2 (OC2B)
volatile uint8_t modo = 0;
volatile uint8_t troca = 1;
volatile unsigned long ultimoDebounceTime = 0;
const unsigned long debounceDelay = 200;
// ISR da Interrupção Externa INT0 (Pino D2)
ISR(INT0_vect)
{
unsigned long agora = millis();
if ((agora - ultimoDebounceTime) > debounceDelay) {
modo++;
if (modo > 9) { // 0: Desligado, 1 a 8: Cores/Rampa, 9: Rampa Automática
modo = 0;
}
troca = 1;
ultimoDebounceTime = agora;
}
}
// Função para LED RGB Anodo Comum
void rgb(uint8_t r, uint8_t g, uint8_t b)
{
analogWrite(R, 255 - r);
analogWrite(G, 255 - g);
analogWrite(B, 255 - b);
}
void setup()
{
// Configuração dos pinos como SAÍDA e estado inicial DESLIGADO (HIGH)
digitalWrite(R, HIGH);
digitalWrite(G, HIGH);
digitalWrite(B, HIGH);
pinMode(R, OUTPUT);
pinMode(G, OUTPUT);
pinMode(B, OUTPUT);
// Garante início 100% DESLIGADO no carregamento
rgb(0, 0, 0);
// Configuração do Botão (D2 com Pull-up interno)
DDRD &= ~(1 << DDD2);
PORTD |= (1 << PORTD2);
// Configuração da interrupção INT0 (Borda de Descida)
EICRA |= (1 << ISC01);
EICRA &= ~(1 << ISC00);
EIMSK |= (1 << INT0);
// Limpa qualquer flag de interrupção pendente antes de habilitar as globais
EIFR |= (1 << INTF0);
sei();
}
void loop()
{
if (troca)
{
troca = 0;
switch (modo)
{
case 0: rgb(0, 0, 0); break; // Modo 0: Totalmente Desligado ao Iniciar
case 1: rgb(25, 25, 25); break; // Modo 1: Branco Fraco (~10%)
case 2: rgb(255, 255, 255); break; // Modo 2: Branco Forte (100%)
case 3: rgb(255, 0, 0); break; // Modo 3: Vermelho
case 4: rgb(0, 255, 0); break; // Modo 4: Verde
case 5: rgb(0, 0, 255); break; // Modo 5: Azul
case 6: rgb(255, 255, 0); break; // Modo 6: Amarelo
case 7: rgb(0, 255, 255); break; // Modo 8: Ciano
case 8: rgb(255, 0, 255); break; // Modo 8: Magenta
}
}
// Modo 9: Rampa Automática
if (modo == 9)
{
for (int i = 0; i <= 255 && modo == 9; i++) {
rgb(i, 0, 255 - i);
delay(10);
}
for (int i = 0; i <= 255 && modo == 9; i++) {
rgb(255 - i, i, 0);
delay(10);
}
for (int i = 0; i <= 255 && modo == 9; i++) {
rgb(0, 255 - i, i);
delay(10);
}
}
}