Buenas! Soy nuevo en el foro y en el mundo de Arduino. Llevo unos días pillado en un código y he intentado buscar información por YouTube, tutoriales e incluso por este foro y el inglés y nada, aunque supongo que es que no la veo.
Voy a intentar explicarme.
Tengo un Arduino nano conectado a una tira led la cual pruedo controlar led a led. A su vez el Arduino nano está conectado a un receptor de infrarrojos que recibe la señal de un mandito que me venía con el kit de iniciación de arduino.
Por un lado he conseguido hacer efecto arcoiris girando en la tira led:
#include "FastLED.h"
#define PIN 4
#define NUM_LEDS 60
CRGBArray<NUM_LEDS> leds;
uint8_t hue[NUM_LEDS];
void setup() {
FastLED.addLeds<NEOPIXEL, PIN>(leds, NUM_LEDS);
for (int i=0; i < NUM_LEDS; i++){
hue[i] = 255 / NUM_LEDS * i;
}
}
void loop() {
for (int i = 0; i < NUM_LEDS; i++){
leds[i] = CHSV(hue[i]++, 255, 255);
}
FastLED.show();
delay(15);
}
CODIGO SACADO DE CANAL DE NerdForge
Mi problema es que quiero manejar la tira led a través de infrarrojos. Tengo este código cuyas funciones, si pulso X botón, en orden son:
- Poner todos los LED en rojo.
- Apagar los leds.
- El efecto del código de arriba del cual tengo problemas.
- Cambiar color hacia arriba.
- Cambiar color hacia arriba botón pulsado.
- Cambiar color hacia abajo.
- Cambiar color hacia abajo botón pulsado.
- Subir brillo.
- Subir brillo botón pulsado.
- Bajar brillo.
- Bajar brillo botón pulsado.
#include "FastLED.h"
#include "IRremote.h"
#define PIN 4
#define NUM_LEDS 60
int k = 0;
int l = 230;
boolean colormas=0;
boolean colormenos=0;
boolean brillomas=0;
boolean brillomenos=0;
boolean rainbow=0;
int receptor = A1; //receptor infrarrojos
IRrecv irrecv(receptor);
decode_results codigo; //OBJETO CODIGO DE CLASE decode_result, oriundo de IRremote.h
CRGBArray<NUM_LEDS> leds;
uint8_t hue[NUM_LEDS];
void setup() {
FastLED.addLeds<NEOPIXEL, PIN>(leds, NUM_LEDS);
for (int i=0; i < NUM_LEDS; i++){
hue[i] = 255 / NUM_LEDS * i;
}
// == INFRARROJOS ==
Serial.begin(9600); //puerto serie
irrecv.enableIRIn(); //INICIAR LA RECEPIÓN
}
void loop() {
if(irrecv.decode(&codigo)){
Serial.println(codigo.value, HEX);
//ROJO
if(codigo.value==0xFF30CF){
colormenos=0;
colormas=0;
brillomas=0;
brillomenos=0;
k=254;
fill_solid(leds, NUM_LEDS, CHSV(255, 255, l));
FastLED.show();
}
//APAGAR
if(codigo.value==0xFFA25D){
colormenos=0;
colormas=0;
brillomas=0;
brillomenos=0;
fill_solid(leds, NUM_LEDS, CHSV(0, 0, 0));
FastLED.show();
}
//RAINBOW
if(codigo.value==0xFF18E7){
for (int i = 0; i < NUM_LEDS; i++){
leds[i] = CHSV(hue[i]++, 255, 255);
}
FastLED.show();
delay(15);
}
// ===== CAMIBIAR COLORES ======
//cambiar color +
if(codigo.value==0xFFC23D){
colormenos=0;
colormas=1;
brillomas=0;
brillomenos=0;
k=k+5;
fill_solid(leds, NUM_LEDS, CHSV(k, 255, l));
FastLED.show();
}
//cambiar color + Pulsado
if(codigo.value==0xFFFFFFFF && colormas){
k=k+5;
fill_solid(leds, NUM_LEDS, CHSV(k, 255, l));
FastLED.show();
}
//cambiar color -
if(codigo.value==0xFF02FD){
colormas=0;
colormenos=1;
brillomas=0;
brillomenos=0;
k=k-5;
fill_solid(leds, NUM_LEDS, CHSV(k, 255, l));
FastLED.show();
}
//cambiar color - Pulsado
if(codigo.value==0xFFFFFFFF && colormenos){
k=k-5;
fill_solid(leds, NUM_LEDS, CHSV(k, 255, l));
FastLED.show();
}
// ===== SUBIR/BAJAR BRILLO =====
//cambiar brillo +
if(codigo.value==0xFF906F){
colormenos=0;
colormas=0;
brillomas=1;
brillomenos=0;
Serial.println(l);
if(l<240){
l=l+10;
fill_solid(leds, NUM_LEDS, CHSV(k, 255, l));
}
FastLED.show();
}
//cambiar brillo + Pulsado
if(codigo.value==0xFFFFFFFF && brillomas){
if(l<240){
l=l+10;
fill_solid(leds, NUM_LEDS, CHSV(k, 255, l));
}
FastLED.show();
}
//cambiar brillo -
if(codigo.value==0xFFA857){
colormas=0;
colormenos=0;
brillomas=0;
brillomenos=1;
if(l>20){
l=l-10;
fill_solid(leds, NUM_LEDS, CHSV(k, 255, l));
}
FastLED.show();
}
//cambiar brillo - Pulsado
if(codigo.value==0xFFFFFFFF && brillomenos){
if(l>20){
l=l-10;
fill_solid(leds, NUM_LEDS, CHSV(k, 255, l));
}
FastLED.show();
}
irrecv.resume();
}
}
El problema que tengo es que con el código sin mando, el arcoiris se mueve de un led a otro, en cambio con el del mando al no hacer un bucle solo se repite una vez con lo cual solo pone los leds de arcoiris y no van rotando.
Mi primer intento, inocente de mi, fue meter el for dentro de un bucle y me hace el efecto perfecto, pero claro, se queda dentro del bucle y no está atento a recibir señal del infrarrojo.
Mi segundo intento fue poner un while con un booleano de interruptor que cuando detecte que se pulsa otro botón rompa el while, pero no consigo hacer que funcione.
También alguien que me pueda decir si está bien depurado el código o está echo una birria (seguramente sea una birria jajaja).
Saludos y espero puedan ayudarme y que valga para otros que tengan el mismo problema que yo.