如何通过仅连接到一个中断引脚的中断服务例程检测三个开关的按下
How can I detect the press of three switches by an interrupt service routine connected to just one interrupt pin
最近,我尝试使用我的 Arduino Uno (AtMega328) 板来检测中断服务例程对一系列三个开关的按下。
如果有三个开关用于称为 R、G 和 B。每当按下这些开关中的至少一个时,RGB-Led 应将其状态切换为红色、绿色或蓝色。
现在,只有两个开关 R 和 G 没问题,因为 Arduino Uno 板有两个中断 capable pins (2 and 3)。
但是,对于开关 B,我缺少另一个中断引脚来检测三个开关中至少一个的按下。
有没有一种电路可以轻松地检测到三个开关中至少一个的按下,这样我就可以只使用一个具有中断功能的引脚来检测任何开关的按下?
使用 Arduino IDE 的两个 LED 的代码对于两个开关来说非常简单:
const int buttonRed = 2; // the number of the pushbutton pin
const int ledRed = 13; // the number of the LED pin
const int buttonGreen= 3;
const int ledGreen=12;
// variables will change due to ISR
volatile int redState = 0;
volatile int greenState=0;
void setup() {
// initialize the LED pin as an output:
pinMode(ledRed, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonRed, INPUT);
pinMode(ledGreen, OUTPUT);
pinMode(buttonGreen, INPUT);
// Attach an interrupt to the ISR vector
attachInterrupt(digitalPinToInterrupt(buttonRed), redButton_ISR, CHANGE);
attachInterrupt(digitalPinToInterrupt(buttonGreen), greenButton_ISR, CHANGE);
}
void loop() {
// Nothing to do here
}
void greenButton_ISR() {
greenState=digitalRead(buttonGreen);
digitalWrite(ledGreen, greenState);
}
void redButton_ISR() {
redState = digitalRead(buttonRed);
digitalWrite(ledRed, redState);
}
如评论中所述,您可以使用引脚更改中断。
见https://thewanderingengineer.com/2014/08/11/arduino-pin-change-interrupts/
或
https://arduino.stackexchange.com/questions/1784/how-many-interrupt-pins-can-an-uno-handle
或者,您可以将所有按钮连接到同一个中断,并将每个按钮连接到另一个输入。然后在 ISR 中检查按下了三个按钮中的哪一个。
或者您将所有三个按钮与三个不同的电阻器连接到模拟输入。测得的电压告诉您按下了哪个按钮。
如果您的代码除此之外什么都不做,实际上不需要中断,因此您可以在循环中频繁轮询按钮状态。
最近,我尝试使用我的 Arduino Uno (AtMega328) 板来检测中断服务例程对一系列三个开关的按下。
如果有三个开关用于称为 R、G 和 B。每当按下这些开关中的至少一个时,RGB-Led 应将其状态切换为红色、绿色或蓝色。
现在,只有两个开关 R 和 G 没问题,因为 Arduino Uno 板有两个中断 capable pins (2 and 3)。
但是,对于开关 B,我缺少另一个中断引脚来检测三个开关中至少一个的按下。
有没有一种电路可以轻松地检测到三个开关中至少一个的按下,这样我就可以只使用一个具有中断功能的引脚来检测任何开关的按下?
使用 Arduino IDE 的两个 LED 的代码对于两个开关来说非常简单:
const int buttonRed = 2; // the number of the pushbutton pin
const int ledRed = 13; // the number of the LED pin
const int buttonGreen= 3;
const int ledGreen=12;
// variables will change due to ISR
volatile int redState = 0;
volatile int greenState=0;
void setup() {
// initialize the LED pin as an output:
pinMode(ledRed, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonRed, INPUT);
pinMode(ledGreen, OUTPUT);
pinMode(buttonGreen, INPUT);
// Attach an interrupt to the ISR vector
attachInterrupt(digitalPinToInterrupt(buttonRed), redButton_ISR, CHANGE);
attachInterrupt(digitalPinToInterrupt(buttonGreen), greenButton_ISR, CHANGE);
}
void loop() {
// Nothing to do here
}
void greenButton_ISR() {
greenState=digitalRead(buttonGreen);
digitalWrite(ledGreen, greenState);
}
void redButton_ISR() {
redState = digitalRead(buttonRed);
digitalWrite(ledRed, redState);
}
如评论中所述,您可以使用引脚更改中断。
见https://thewanderingengineer.com/2014/08/11/arduino-pin-change-interrupts/ 或
https://arduino.stackexchange.com/questions/1784/how-many-interrupt-pins-can-an-uno-handle
或者,您可以将所有按钮连接到同一个中断,并将每个按钮连接到另一个输入。然后在 ISR 中检查按下了三个按钮中的哪一个。
或者您将所有三个按钮与三个不同的电阻器连接到模拟输入。测得的电压告诉您按下了哪个按钮。
如果您的代码除此之外什么都不做,实际上不需要中断,因此您可以在循环中频繁轮询按钮状态。