如何让 LED 代码从键盘按下运行

Posted

技术标签:

【中文标题】如何让 LED 代码从键盘按下运行【英文标题】:How to get LED code to run from Keypad presses 【发布时间】:2019-12-09 21:39:25 【问题描述】:

我正在使用 FastLED 库和 Keypad 库在我的 WS2812 灯上运行代码。当我只使用一个基本的键盘布局来打印出正在按下的键时,这段代码就起作用了。但是现在我添加了从键盘 if 语句运行代码的方法,它似乎不起作用。当我按键盘上的数字时,灯没有任何反应。目前 LED 代码在方法中。我以前只是在键盘本身的 if 语句中使用它。我将尽可能保持此处包含的代码简洁,以免屏幕上出现我认为不相关的内容。如果您有任何问题,我可以提供其余代码的相关 sn-ps。

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()。

【问题讨论】:

没有按键怎么办? 无关:阅读switch/case。它应该可以帮助您简化代码(除非同时按下多个按钮是合法的)。 这听起来和这个人面临的问题一样:arduino.stackexchange.com/questions/48736/… 当没有按键被按下时,灯保持关闭。我在自己的代码中尝试了与他的解决方案类似的东西。 ``` while((key = keypad.getKey()) == NO_KEY) delay(1); while(keypad.getKey() != NO_KEY) delay(1); ``` 什么也没有发生。 @BobbyTables @user4581301 你能不能 Serial.Print(key) 看看当你按下各种键时实际的键值是多少?我认为这将有助于追查问题的根源。 【参考方案1】:

我现在相信您的 if 语句工作正常,但是由于循环条件的格式不正确,christmas() 什么都不做。我怀疑您的其他照明模式也存在类似问题。

这对两个循环都使用了i。第二个循环也永远不会运行,因为i &gt; 299 立即为假:

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

这也永远不会运行,因为i 立即大于 0:

for (int i = 299; i <= 0; i--) 

【讨论】:

我将通过更新编辑我的原始帖子,因为我将包含新代码。我实际上是一个白痴,因为最初没有注意到这一点,但它仍然不能完全发挥作用。

以上是关于如何让 LED 代码从键盘按下运行的主要内容,如果未能解决你的问题,请参考以下文章

PROTUSE 仿真STM32按键控制LED,按键不起作用

如何让 Maliit 键盘在 Linux 上工作? (薄荷)

如何在按下并释放一次按钮时打开 LED,然后通过再次按下和释放将其关闭?

只要按下键盘上的x按钮,如何从一个文本字段中删除值

如何从 Webview 的键盘完成按钮操作

如何让opengl调用键盘输入的数据