FastLED.h阻止ezButton.h

如何解决FastLED.h阻止ezButton.h

我正在使用Arduino来控制一个包含可寻址LED和按钮的项目。 我正在使用的库在标题中。 出于一个未知的原因,当我分别使用每个代码时,所有功能都可以正常工作,但是当我将它们组合在一起时,FastLED库会阻止按钮读取并导致奇怪的事情,例如双击或停止执行其他操作。

如何解决此问题? (我试图消除delay(),但没有帮助) 预先感谢!

/*
  Author: Yuval Kedar - KD Technology
  Instagram: https://www.instagram.com/kd_technology/
  Date: Oct 19
  Dev board: Arduino Uno
  
    There are two button types: Red and Blue.
    Red btn = -1
    Blue btn = +1

    On the machine's background there is an LED matrix which shows the user's progress.
    There are 4 levels (square frames) until one reaches the core and wins.

    The trick? The floor,which includes the buttons,is spinning.
*/

#include <FastLED.h>
#include <ezButton.h>
#include "Arduino.h"

#define WINNING_SENSOR_PIN (12)
#define LED_DATA_PIN (6)
#define BLUE_BTN_PIN (A0)
#define RED_BTN_PIN (A3)

#define SERIAL_BAUdratE (115200)
#define NUM_LEDS (64)
#define LED_BRIGHTnesS (200)
#define WINNING_FX_TIME (1000)

ezButton blue_btn(BLUE_BTN_PIN);
ezButton red_btn(RED_BTN_PIN);
CRGB leds[NUM_LEDS];

uint8_t score = 0;
uint8_t last_score = 0;
uint8_t level[] = {0,28,48,60,63};  //levels 0 to 4

void level_up(uint8_t led_num) {
    uint8_t start_point = 0;
    if (led_num == level[1]) start_point = 0;   //up from level 0 to 1
    if (led_num == level[2]) start_point = 28;  //up from level 1 to 2
    if (led_num == level[3]) start_point = 48;  //up from level 2 to 3
    if (led_num == level[4]) start_point = 60;  //...

    for (uint8_t current_pixel = start_point; current_pixel < led_num; current_pixeL++) {
        leds[current_pixel] = CRGB::Blue;
        FastLED.show();
        delay(50);
    }
    delay(2500); //debounce
}

void level_down(uint8_t led_num) {  //clear prev level's frame and do the opposite direction effect with red color
    uint8_t start_point = 0;
    if (led_num == level[0]) start_point = 28;  //down from level 1 to 0
    if (led_num == level[1]) start_point = 48;  //down from level 2 to 1
    if (led_num == level[2]) start_point = 60;  //down from level 3 to 2
    if (led_num == level[3]) start_point = 63;  //...

    for (int8_t i = start_point - 1; i > led_num; i--) {
        leds[i] = CRGB::Red;
        FastLED.show();
        delay(50);
    }
    for (int8_t i = start_point - 1; i > led_num; i--) {
        leds[i] = CRGB::Black;
        FastLED.show();
    }
    delay(2500); //debounce
}

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

void winning() {
    static uint8_t hue = 0;
    for(uint8_t x = 0; x < 5; x++) {
        for(int8_t i = 0; i < NUM_LEDS; i++) {
            leds[i] = CHSV(hue++,255,255);
            FastLED.show(); 
            fadeall();
            // delay(10);
        }
        for(int8_t i = (NUM_LEDS)-1; i >= 0; i--) {
            leds[i] = CHSV(hue++,255);
            FastLED.show();
            fadeall();
            // delay(10);
        }
    }
    
}

void reset_game() {
    score = 0;
    last_score = 4;
    digitalWrite(WINNING_SENSOR_PIN,LOW);
    FastLED.clear();
    FastLED.show();}

void winning_check() {
    (score == 4) ? analogWrite(WINNING_SENSOR_PIN,175) : digitalWrite(WINNING_SENSOR_PIN,LOW);
}

void update_score() {
    if (blue_btn.ispressed()) {
        Serial.println("+PLUS+");
        if (score++ >= 4) score = 4;
    }

    if (red_btn.ispressed()) {
        Serial.println("-MINUS-");
        if (score-- <= 0) score = 0;
    }

    if (score == 0){
        if (last_score == 1) level_down(level[0]);
        last_score = 0;
        digitalWrite(WINNING_SENSOR_PIN,LOW);
    }
    else if (score == 1) {
        if (last_score == 0) level_up(level[1]);    // if last_score was 0 make the blue effect because level is up
        if (last_score == 2) level_down(level[1]);  // if last_score was 2 make the red effect because level is down
        last_score = 1;
        digitalWrite(WINNING_SENSOR_PIN,LOW);
    }
    else if (score == 2) {
        if (last_score == 1) level_up(level[2]);
        if (last_score == 3) level_down(level[2]);
        last_score = 2;
        digitalWrite(WINNING_SENSOR_PIN,LOW);
    }
    else if (score == 3) {
        if (last_score == 2) level_up(level[3]);
        if (last_score == 4) level_down(level[3]);
        last_score = 3;
        digitalWrite(WINNING_SENSOR_PIN,LOW);
    }
    else if (score == 4) {
        winning_check();
        // winning();  //this func makes issue when using ezButton.h. It calls "show" too many times.
        reset_game();
    }
}

void setup() {
    Serial.begin(SERIAL_BAUdratE);

    pinMode(WINNING_SENSOR_PIN,OUTPUT);
    digitalWrite(WINNING_SENSOR_PIN,LOW);

    blue_btn.setDebounceTime(150);
    red_btn.setDebounceTime(150);

    FastLED.addLeds<NEOPIXEL,LED_DATA_PIN>(leds,NUM_LEDS);  // GRB ordering is assumed
    FastLED.setBrightness(LED_BRIGHTnesS);
    FastLED.clear();
    FastLED.show();


    Serial.println(F(
        "_______________________________\n"
        "\n"
        "   G e a r   M a c h i n e     \n"
        "_______________________________\n"
        "\n"
        "   ~ Made by KD Technology ~   \n"
        "\n"));
}

void loop() {
    blue_btn.loop();
    red_btn.loop();
    Serial.println(score);

    update_score();
    FastLED.show();
}

解决方法

原因是,您使用了 delay() 函数。如果你使用延迟,一些按下的事件将被遗漏,不仅对于 ezButton,而且对于任何类型的按钮按下实现。 ezButton 已经有内部去抖动功能。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?