问题描述
我对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);
}
}
}