c++ - 如何让 LED 代码从键盘按键运行

标签 c++ arduino led keypad fastled

我正在使用 FastLED 库和键盘库在我的 WS2812 灯上运行代码。当我只使用一个基本的键盘布局来打印出正在按下的键时,这段代码就起作用了。但是现在我添加了从键盘 if 语句运行代码的方法,它似乎不起作用。当我按下键盘上的数字时,灯没有任何反应。目前 LED 代码在方法中。我以前只是在键盘本身的 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()。

最佳答案

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

这两个循环都使用了 i。此外,第二个循环永远不会运行,因为 i > 299 立即为 false:

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

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

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

关于c++ - 如何让 LED 代码从键盘按键运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59257059/

相关文章:

arduino - Desfire EV1 通信示例

android - 以编程方式永久启用和禁用android中闪烁的LED通知灯

c++ - 如何通过删除部分或全部#include 来清理预处理结果

c++ - 通过 char* 缓冲区读取 int 的行为是不同的,无论它是正数还是负数

c++ - 使用 Phong 方法的不良照明

java - 控制 Android 的前 LED 灯

warnings - 晶格钻石 : Setting up a clock

c++ - POCO 构建问题

c++ - 中断 arduino 例程以运行基于缓慢延迟的进程

node.js - Arduino 使用 NodeJS 读取串行监视器并在 React 网页中输出