Arduino Teensy反弹的数组未实际更新

问题描述

我对Arduino和C本身还是很陌生,但是我不知道为什么数组无法正常工作,而健全性检查却可以工作。

在我看来,两者都应该运行良好。我猜想我缺少关于C数组如何工作的一些关键信息。

代码的完整性:

#include <Bounce2.h>

#define BUTTON_AMOUNT 1
#define DEBOUNCE_INTERVAL 25

const int ledPin = LED_BUILTIN;

//Bounce *buttons[BUTTON_AMOUNT];
Bounce buttons[BUTTON_AMOUNT];
Bounce b1 = Bounce();

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

  pinMode(ledPin,OUTPUT);

  for (int i = 0; i < BUTTON_AMOUNT; i++) {
    Bounce b = Bounce();
    b.attach(i,INPUT_PULLUP);
    b.interval(DEBOUNCE_INTERVAL);

    buttons[i] = b;

    // buttons[i] = new Bounce();
    // (*buttons[i]).attach(i,INPUT_PULLUP);
    // (*buttons[i]).interval(DEBOUNCE_INTERVAL);
  }

  b1.attach(0,INPUT_PULLUP);
  b1.interval(25);
}

void loop () {
  for (int i = 0; i < BUTTON_AMOUNT; i++) {
    // Serial.println("looping ...");

    Bounce b = buttons[i];
    b.update();

    if (b.rose()) {
      // Serial.println("rising edge");
      digitalWrite(ledPin,LOW);
    }
    if (b.fell()) {
      // Serial.println("falling edge");
      digitalWrite(ledPin,HIGH);
    }
  }

  // sanity check
  b1.update();

  if (b1.rose()) {
    Serial.println("B1 - rising edge");
    digitalWrite(ledPin,LOW);
  }
  if (b1.fell()) {
    Serial.println("B1 - falling edge");
    digitalWrite(ledPin,HIGH);
  }
}

解决方法

您正在将Bounce对象复制到按钮数组中或从按钮数组中复制出来。例如

...
  for (int i = 0; i < BUTTON_AMOUNT; i++) {
    Bounce b = Bounce();
    b.attach(i,INPUT_PULLUP);
    b.interval(DEBOUNCE_INTERVAL);

    buttons[i] = b;  // <- bitwise copy
...

但是,由于Bounce没有实现复制对象buttons[i] = b的方法,因此只需按位复制b到数组中就行了。

您可以简单地访问而不是将元素从/复制到数组中。这里的工作代码展示了如何做到这一点。

#include "Bounce2.h"

constexpr int BUTTON_AMOUNT = 5;
constexpr int DEBOUNCE_INTERVAL = 25;
constexpr int ledPin = LED_BUILTIN;

Bounce buttons[BUTTON_AMOUNT];  // this already constructs the buttons in the array,you can use them directly

void setup() {
  pinMode(ledPin,OUTPUT);

  for (int i = 0; i < BUTTON_AMOUNT; i++) {
    buttons[i].attach(i,INPUT_PULLUP);      // directly access the Bounce objects in the array
    buttons[i].interval(DEBOUNCE_INTERVAL);
  }
}

void loop () {
  for (int i = 0; i < BUTTON_AMOUNT; i++) {
    buttons[i].update();

    if (buttons[i].rose()) {
      Serial.printf("rising edge B%u\n",i);
      digitalWrite(ledPin,LOW);
    }
    if (buttons[i].fell()) {
      Serial.printf("falling edge B%u\n",HIGH);
    }
  }
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...