/////////////////////////////////////////////////////////////////////////
// GITHUB: https://github.com/FastLED/FastLED
// EJEMPLOS: https://github.com/FastLED/FastLED/tree/master/examples
////////////////////////////////////////////////////////////////////////
//#include <Arduino.h>
#include <FastLED.h>
#define SWITCH_PIN PB2
#define LED_BUILTIN PB1
#define PROGRAMAS 5
#define LED_STRIX_PIN PB0
#define NUM_LEDS 20
#define BRIGHTNESS 100
#define LED_TYPE WS2812
#define COLOR_ORDER GRB
#define PORCENTAJE_NARANJAS 20 // Porcentaje de LEDs naranjas
#define VELOCIDAD 100 // Velocidad de desplazamiento en milisegundos
CRGB leds[NUM_LEDS];
volatile byte caso = 0;
byte uCase = 0;
void cambioPrograma(){
for (int i=0; i<NUM_LEDS; i++){
leds[i] = CRGB::Black; FastLED.show();
}
if (caso >= PROGRAMAS){ caso = 0; }
else { caso = caso+1; }
return;
}
void programa_00(){digitalWrite(LED_BUILTIN, LOW);}
void programa_01(){
digitalWrite(LED_BUILTIN, HIGH);
// Breathe blue
for (int brightness = 0; brightness <= BRIGHTNESS; brightness++) {
if (caso != uCase){break;}
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB(0, 0, brightness);
}
FastLED.show();
delay(20);
}
for (int brightness = BRIGHTNESS; brightness >= 0; brightness--) {
if (caso != uCase){break;}
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB(0, 0, brightness);
}
FastLED.show();
delay(20);
}
// Breathe orange
for (int brightness = 0; brightness <= 255; brightness++) {
if (caso != uCase){break;}
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB(brightness, byte((brightness * 69) / 255), 0); // Adjust orange values here
}
FastLED.show();
delay(8);
}
for (int brightness = 255; brightness >= 0; brightness--) {
if (caso != uCase){break;}
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB(brightness, byte((brightness * 69) / 255), 0);
}
FastLED.show();
delay(8);
}
}
void programa_02(){
for (byte i = 0; i < NUM_LEDS; i++){
if (caso != uCase){break;}
leds[i] = CRGB::Blue; FastLED.show();delay(150);
}
for (byte i = 0; i < NUM_LEDS; i++){
if (caso != uCase){break;}
leds[i] = CRGB::OrangeRed; FastLED.show();delay(150);
}
}
void programa_03(){
for (byte i = 0; i < NUM_LEDS; i++){
if (caso != uCase){break;}
leds[i] = CRGB::Blue; FastLED.show();delay(150);
}
for (byte ii = NUM_LEDS-1; ii > -1; ii--){
if (caso != uCase){break;}
leds[ii] = CRGB::OrangeRed; FastLED.show();delay(150);
}
}
void programa_04(){
digitalWrite(LED_BUILTIN, HIGH);
int numNaranjas = (NUM_LEDS * PORCENTAJE_NARANJAS) / 100; // Calcula el número de LEDs naranjas
int posInicial = 0; // Posición inicial del primer LED naranja
while (caso == 6) {
// Configura todos los LEDs a azul
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB::Blue;
}
// Coloca los LEDs naranjas en las posiciones adecuadas
for (int i = 0; i < numNaranjas; i++) {
int pos = (posInicial + i) % NUM_LEDS; // Calcula la posición del LED naranja
leds[pos] = CRGB::Orange;
}
FastLED.show();
delay(VELOCIDAD);
// Incrementa la posición inicial para el siguiente ciclo
posInicial = (posInicial + 1) % NUM_LEDS;
// Si se ha cambiado el caso, rompe el bucle
if (caso != 6) {
break;
}
}
}
void programa_05(){}
void setup() {
// SWICH CONSTRUCTOR:
pinMode(SWITCH_PIN, INPUT);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(LED_STRIX_PIN, OUTPUT);
// CONFIGRACIÓN INTERRUPCIÓN "INT0":
/*RISING: Flanco ascendente (LOW a HIGH)
FALLING: Flanco descendente (HIGH a LOW)
LOW: Nivel de estado LOW permanente
HIGH: Nivel de estado HIGH permanente
CHANGE: Cualquier cambio en el estado del pin*/
//attachInterrupt(digitalPinToInterrupt(SWITCH_PIN), cambioPrograma, RISING);
attachInterrupt(0, cambioPrograma, RISING);
// FASTLED CONSTRUCTOR:
FastLED.addLeds<LED_TYPE, LED_STRIX_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
FastLED.setBrightness(BRIGHTNESS);
// INDICAR ENCENDIDO DE LA PCB:
for (size_t i = 0; i < 6; i++)
{
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
delay(100);
}
}
void loop() {
switch(caso)
{
case 0: uCase=0; programa_00();
break;
case 1: uCase=1; programa_01();
break;
case 2: uCase=2; programa_02();
break;
case 3: uCase=3; programa_03();
break;
case 4: uCase=4; programa_04();
break;
case 5: uCase=5; programa_05();
break;
default: programa_00();
}
}