#define LED_R 9 // Configura o pino (porta) de saída do LED VERMELHO (RED)
#define LED_G 5 // Configura o pino (porta) de saída do LED VERDE (GREEN)
#define LED_B 3 // Configura o pino (porta) de saída do LED AZUL (BLUE)

/* A função setup serve para configuração e é executada uma vez 
   quando você pressiona reset ou liga a placa */
void setup() {
  // Configura os pinos (portas) abaixo como SAÍDA (OUTPUT)
  pinMode(LED_R, OUTPUT);
  pinMode(LED_G, OUTPUT);
  pinMode(LED_B, OUTPUT);
}

// A função fade serve para variar o brilho de um LED
void fade(int pin) {
  // Aparecimento gradual do mínimo ao máximo com incrementos de ~2%
  for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
    // Aciona uma onda PWM no pino analógico com o valor (intervalo de 0 a 255) 
    analogWrite(pin, fadeValue);
    // Aguarda 30 milissegundos para ver o efeito de brilho do LED
    delay(30);
  }

  // Desligamento gradual do máximo ao mínimo com decrementos de ~2%
  for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {
    // Aciona uma onda PWM no pino analógico com o valor (intervalo de 255 a 0) 
    analogWrite(pin, fadeValue);
    // Aguarda 30 milissegundos para ver o efeito de escurecimento do LED
    delay(30);
  }
}

// A função loop é executada repetidamente para sempre
void loop() {
  fade(LED_R);
  fade(LED_G);
  fade(LED_B);
}