переключение между функциями с помощью ИК-пульта - PullRequest
0 голосов
/ 30 апреля 2020

Я купил светодиодную ленту WS2812B. Я пытаюсь управлять им с помощью ИК-пульта. все это управляется arduino uno.
Я знаю, как работают светодиоды, и я знаю, что работает удаленно. Я пытаюсь предварительно запрограммировать несколько анимаций на пульте.
Код ниже, насколько я понял. Я могу показать одну анимацию, но мне нужно подождать до ее конца, чтобы изменить ее на другую.
Можно ли прервать это (поскольку некоторые анимации бесконечны), когда я нажимаю sh кнопку, чтобы выбрать другую анимацию?

#include <IRremote.h>
#include "FastLED.h"
#define NUM_LEDS 232
CRGB leds[NUM_LEDS];
#define PIN 7

const int RECV_PIN = 6;
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long key_value = 0;

void setup(){
  FastLED.addLeds<WS2812B, PIN, RGB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  Serial.begin(9600);
  irrecv.enableIRIn();
  irrecv.blink13(true);
}

//switch case for remote
void loop(){
  if (irrecv.decode(&results)){

        if (results.value == 0XFFFFFFFF)
          results.value = key_value;

        switch(results.value){
          case 0xFF30CF:
          Serial.println("1");
          RGBLoop();
          break ;
          case 0xFF18E7:
          Serial.println("2");
          red();
          break ;
          case 0xFF7A85:
          Serial.println("3");
          break ;
        }
        key_value = results.value;
        irrecv.resume(); 
  }
}


void RGBLoop(){

  while(key_value==key_value){
  for(int j = 0; j < 6; j++ ) {
    // Fade IN
    for(int k = 0; k < 256; k++) {
      switch(j) {
        case 0: setAll(k,0,0); break;
        case 2: setAll(k,k,0); break;
        case 3: setAll(0,k,0); break;
        case 4: setAll(0,k,k); break;
        case 5: setAll(0,0,k); break;
      }
      showStrip();
      delay(3);
    }
    // Fade OUT
    for(int k = 255; k >= 0; k--) {
      switch(j) {
        case 0: setAll(k,0,0); break;
        case 2: setAll(k,k,0); break;
        case 3: setAll(0,k,0); break;
        case 4: setAll(0,k,k); break;
        case 5: setAll(0,0,k); break;
      }
      showStrip();
      delay(3);
    }
  }
}
}

void red(){
  irrecv.resume();
  setAll(0,255,255);
  showStrip();
}

void setPixel(int Pixel, byte red, byte green, byte blue) {
 #ifdef ADAFRUIT_NEOPIXEL_H
   // NeoPixel
   strip.setPixelColor(Pixel, strip.Color(red, green, blue));
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   // FastLED
   leds[Pixel].r = red;
   leds[Pixel].g = green;
   leds[Pixel].b = blue;
 #endif
}


void setAll(byte red, byte green, byte blue) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
    setPixel(i, red, green, blue);
  }
  showStrip();
}


void showStrip() {
 #ifdef ADAFRUIT_NEOPIXEL_H
   // NeoPixel
   strip.show();
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   // FastLED
   FastLED.show();
 #endif
}

void fadeall() { for(int i = 0; i < NUM_LEDS; i++) { leds[i].nscale8(250); } }

Честно говоря, большую часть этого я получил в Интернете. я впервые программирую на Arduino. но пока мне нравится

1 Ответ

0 голосов
/ 30 апреля 2020

Вместо использования бесконечных циклов вы можете просто проверить, получена ли какая-либо другая команда.

Например:

вместо

while ( key_value == key_value ) //This is a weird infinite loop condition but whatever 
{
    // do stuff
}

, которые вы можете иметь

while ( decode() == condition_for_this_loop )
{
    // do stuff
}

или

for(;;) //This also is just an infinite loop, but looks nicer.
{
    // do stuff

    if ( decode() != condition_for_this_loop ) {  break;  }
}

Обратите внимание, что это псевдокод. Вы должны правильно реализовать это. И вам может понадобиться немного изменить логику c вашей программы.

Поскольку вы определили объект irrecv глобально, он будет виден для других функций ниже, это не будет проблемой , Ваш код может даже работать, просто заменив условие l oop. Но если вы получаете ошибки, вам нужно их устранить, я просто указываю на логи c. В итоге у вас может получиться что-то вроде этого:

irrecv.decode( &results );

switch ( results )
{
    case CONDITION_1:
        inf_loop1();
    break;

    case CONDITION_2:
        int_loop2();
    break;
}

...

void inf_loop1()
{
    for(;;) 
    {
        // do stuff

        irrecv.decode( &results );
        if ( results != CONDITION_1 ) {  break;  }
    }
}


void inf_loop2()
{
    for(;;) 
    {
        // do stuff

        irrecv.decode( &results );
        if ( results != CONDITION_2 ) {  break;  }
    }
}

Кстати, начинать с относительно больших проектов не очень хорошая идея , По вашему вопросу, я предполагаю, что это не только ваша первая программа для Arduino, но и ваша первая в мире программа. Вы не бежите, прежде чем идти. Начните медленно, мигайте несколькими светодиодами, реализуйте забавные алгоритмы со светодиодами, я не знаю, их несколько, они загораются в разной последовательности, имеют несколько кнопок и объединяют их со светодиодами. Просто играйте со светодиодами. По мере накопления опыта вы не будете задавать подобные вопросы. И если вы начнете с какого-то большого проекта, скорее всего, вы не сможете это сделать и будете разочарованы, или вы просто будете следовать некоторым онлайн-учебникам и копировать-вставлять код, следовательно, вы не будете чувствовать себя так, как вы. это.

...