Arduino 如何通过仅连接到一个中断引脚的中断服务例程检测三个开关的按下

Arduino 如何通过仅连接到一个中断引脚的中断服务例程检测三个开关的按下,arduino,avr,isr,circuit-diagram,Arduino,Avr,Isr,Circuit Diagram,最近,我尝试使用我的Arduino Uno(AtMega328)板通过中断服务程序检测一系列三个开关的按下 如果有三个开关,分别称为R、G和B。只要按下其中一个开关,RGB Led就会将其状态切换为红色、绿色或蓝色 现在,只有两个开关R和G没有问题,因为Arduino Uno板有两个中断 但是,对于开关B,我缺少另一个中断引脚来检测三个开关中至少一个的按下 是否有一个可能的电路,可以轻易地检测到三个开关中至少一个的按下,这样我就可以使用一个具有中断功能的引脚来检测任何开关的按下 使用Arduin

最近,我尝试使用我的Arduino Uno(AtMega328)板通过中断服务程序检测一系列三个开关的按下

如果有三个开关,分别称为R、G和B。只要按下其中一个开关,RGB Led就会将其状态切换为红色、绿色或蓝色

现在,只有两个开关R和G没有问题,因为Arduino Uno板有两个中断

但是,对于开关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);
} 

如注释中所述,您可以使用引脚更改中断

看 或

或者,您可以将所有按钮连接到同一中断,并将每个按钮连接到另一个输入。然后在ISR中检查三个按钮中的哪一个被按下

或者将三个具有三个不同电阻的按钮连接到模拟输入。测量的电压告诉您按下了哪些按钮


如果您的代码不执行任何操作,但执行此操作,则实际上不需要中断,因此您可以在循环中频繁轮询按钮状态。

ATmega328能够处理任何IO引脚上的引脚更改中断。见第13章。数据表中的外部中断