Как заставить светодиодный код запускаться при нажатии на клавиатуру

Я использую библиотеку FastLED и библиотеку Keypad для запуска кода на моих лампах WS2812. Когда я использовал только базовую раскладку клавиатуры, чтобы распечатать, какая клавиша была нажата, этот код работал. Но теперь, когда я добавил методы для запуска кода с клавиатуры if, кажется, что он не работает. Ничего не происходит со светом, когда я нажимаю цифру на клавиатуре. В настоящее время код светодиода находится в методах. Раньше я просто использовал его в операторах if для самой клавиатуры. Я собираюсь сделать приведенный здесь код максимально кратким, чтобы не загромождать экран тем, что я считаю неуместным. Если у вас есть какие-либо вопросы, я могу предоставить соответствующие фрагменты остального кода.

void setup() {

 FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
 FastLED.setBrightness(32);
 Serial.begin(9600);

}

void christmas() {

    for(int i = 0; i < 6; i++){
      for(int i = 0; i > 299; i++) {
        leds[i] = CRGB (0, 128, 0); //green
        FastLED.show();
        leds[i+1] = CRGB (255, 0, 0); //red
        FastLED.show();
        delay(20);
      }
      //the second loop turns the first light red and the second light green starting at the end
      for (int i = 299; i <= 0; i--) {
        leds[i] = CRGB (255, 0, 0); //green
        FastLED.show();
        leds[i + 1] = CRGB (0, 128, 0); //red
        FastLED.show();
        delay(20);
      }  
    }
  }
void loop() {
  char key = keypad.getKey(); //determines what key is pressed

  if (key == '1'){
   christmas();
  }

  if (key == '2'){
    dot();
  }

  if (key == '3'){
    mavericks();
  }

  if (key == '4'){
    rainbow();
  }

  if (key == '5'){
    blueBar();
  }

  if (key == '6'){
    purple();
  }

Чтобы было ясно, при запуске кода нет ошибки. Он работает нормально. Но он ничего не делает, когда нажимаются клавиши на клавиатуре, где, как я полагаю, он должен запускать вызываемые методы и соответствующим образом влиять на свет.

Изменить:

После реализации предложений Bobby Tables это работает до некоторой степени. За исключением того момента, когда я нажимаю 1, а это:

void christmas() {

    delay(10);
    for(int j = 0; j < 6; j++){
      delay(10);
      for(int i = 0; i > 299; i++) {
        delay(10);
        leds[i] = CRGB::Red; //green
        FastLED.show();
        leds[i+1] = CRGB::Green; //red
        FastLED.show();
        delay(20);
      }
      //the second loop turns the first light red and the second light green starting at the end
      for (int i = 299; i >= 0; i--) {
        leds[i] = CRGB::Green; //green
        FastLED.show();
        leds[i + 1] = CRGB::Red;
        FastLED.show();
        delay(20);
      }  
    }
  }

он запускается мгновенно, но если я нажму любую другую клавишу, он не будет работать полностью. Например, когда я нажимаю 5, что означает:


void blueBar() {

  delay(10);
  fill_solid(leds, NUM_LEDS, CRGB::White);
  delay(10);
  for(int j = 0; j < 6; j++) {
    delay(10);
    for(int i = 0; i < 299; i++) {
      leds[i] = CRGB::Blue;
      leds[i + 1] = CRGB::Blue;
      leds[i + 2] = CRGB::Blue;
      leds[i + 3] = CRGB::Blue;
      leds[i + 4] = CRGB::Blue;
      leds[i + 5] = CRGB::Blue;
      FastLED.show();
      delay(200);
      leds[i] = CRGB::White;
      FastLED.show();
    }  
  }
}

Это ничего не делает. За исключением случаев, когда я нажимаю 5, а затем нажимаю 1. Он заполнит начальный сплошной белый цвет, но затем запустит Christmas().


person Kane    schedule 09.12.2019    source источник
comment
Что делать, если ни одна клавиша не нажата?   -  person user4581301    schedule 10.12.2019
comment
Не имеет отношения: прочитайте switch/case. Это должно помочь вам упростить ваш код (если только несколько одновременных нажатий кнопок не являются законными).   -  person user4581301    schedule 10.12.2019
comment
Похоже, с той же проблемой столкнулся и этот человек: arduino.stackexchange.com/questions/48736/   -  person Bobby Tables    schedule 10.12.2019
comment
Когда ни одна клавиша не нажата, свет не горит. Я попробовал что-то похожее в своем собственном коде на его решение. ``` while((key = keypad.getKey()) == NO_KEY) { delay(1); } while(keypad.getKey() != NO_KEY) { задержка(1); } ``` Ничего не происходит. @BobbyTables @user4581301   -  person Kane    schedule 10.12.2019
comment
Не могли бы вы Serial.Print(key) и посмотреть, каково фактическое значение ключа при нажатии различных клавиш? Я думаю, что это было бы большим подспорьем, чтобы отследить источник проблемы.   -  person Phillip S    schedule 10.12.2019
comment
Я предполагаю, что света по-прежнему нет, если вы также удерживаете клавишу?   -  person Bobby Tables    schedule 10.12.2019
comment
@PhillipS Конечно, я только что попробовал, и все клавиши печатают правильный номер, связанный с нажатой клавишей.   -  person Kane    schedule 10.12.2019
comment
@BobbyTables Это правильно.   -  person Kane    schedule 10.12.2019
comment
Если он еще не работает правильно, я предлагаю добавить дополнительный код регистрации, чтобы увидеть, достигает ли он вызова FastLED.show() и других фрагментов кода дисплея. Попробуйте создать простую функцию, которая просто зажигает один светодиод, и посмотрите, сможете ли вы заставить ее работать. Я буду рад помочь в выяснении любых других проблем, которые могут у вас возникнуть. К сожалению, у меня нет прямого и полного решения.   -  person Phillip S    schedule 11.12.2019


Ответы (1)


Теперь я считаю, что ваши операторы if работают нормально, но в результате неправильного формирования ваших условий цикла christmas() ничего не делает. Я подозреваю, что у вас есть аналогичные проблемы в других ваших схемах освещения.

Это использует i для обоих циклов. Также второй цикл никогда не запустится, так как i > 299 сразу становится ложным:

for(int i = 0; i < 6; i++){
      for(int i = 0; i > 299; i++) {

Это также никогда не будет выполняться, поскольку i сразу больше 0:

for (int i = 299; i <= 0; i--) {
person Bobby Tables    schedule 09.12.2019
comment
Я собираюсь отредактировать свой исходный пост с обновлением, потому что я собираюсь включить новый код. Я на самом деле идиот, что не заметил этого изначально, но он все еще не работает в полной мере. - person Kane; 10.12.2019