一旦你有一个工作的按键,你经常会想基础按键次数来激发一些东西。为了做这个,你需要知道何时按键的开和关和多少次这个状态发生了改变。这个就叫做状态变化监测或者叫边缘监测。这个教程就是来告诉你,我们如何确认状态改变。我们记录四次按键后开或关LED,把相关信息发送到串口监视器上。
硬件需求
—Arduino控制板
—按键开关
—10K电阻
—杜邦线或面包线
—面包板
电路
用三根面包线把主控板和面包板连接到一起,一根线接地,通过一个10K电阻连接到按键开关的一角。第二根控制板的5V接入按键开关的另一角。第三根线接着2号引脚,用来读取按键状态。
当按键没有按下的时候,没有连接通过按键的两个脚,所以2号引脚是通过下拉电阻接地的,我们读取到的是LOW。当按键按下的时候,按键两个脚连接起来,接入正极。这个时候我们读取到的是HIGH。
如果不用到下拉电阻的话,数字IO引脚就会读取到一个不稳定的值,可能是HIGH或LOW,也就是我们为什么需要下拉电阻的原因。
代码
下面的代码连续读取按键的状态。它通过比较按键在循环中的目前状态和上一次状态来比较。如果现在的状态和之前的状态不同,并且现在的状态是HIGH,就把按键状态从off改成on。之后进入相反运行。
这段代码同时计算按键的累计值,如果是四的倍数,就打开13号引脚的LED,否则就关闭LED。
const int buttonPin = 2; // 定义读取按键的引脚
const int ledPin = 13; //定义LED引脚
// 变量会改变
int buttonPushCounter = 0; // 存储按键次数
int buttonState = 0; // 存储目前按键状态
int lastButtonState = 0; //存储上一次按键状态
void setup() {
// 定义buttonPin为输入模式
pinMode(buttonPin, INPUT);
// 定义LED引脚为输出模式
pinMode(ledPin, OUTPUT);
// 定义串口通信频率
Serial.begin(9600);
}
void loop() {
// 读取按键引脚的值:
buttonState = digitalRead(buttonPin);
// 把现在的状态和上一次状态作比较
if (buttonState != lastButtonState) {
//如果状态改变了,增加计数
if (buttonState == HIGH) {
// 如果状态时HIGH,按键输出OFF改为ON
buttonPushCounter++;
Serial.println("on");
Serial.print("number of button pushes: ");
Serial.println(buttonPushCounter);
} else {
//如果目前的状态时LOW,则按键从ON转为OFF
Serial.println("off");
}
// 延迟一点时间避免反复
delay(50);
}
// 保存目前的状态到上一次状态,为下次循环做准备
lastButtonState = buttonState;
// 如果按键计数是4个倍数,则点亮13号引脚的板载LED,反之则熄灭
if (buttonPushCounter % 4 == 0) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
}
const int ledPin = 13; //定义LED引脚
// 变量会改变
int buttonPushCounter = 0; // 存储按键次数
int buttonState = 0; // 存储目前按键状态
int lastButtonState = 0; //存储上一次按键状态
void setup() {
// 定义buttonPin为输入模式
pinMode(buttonPin, INPUT);
// 定义LED引脚为输出模式
pinMode(ledPin, OUTPUT);
// 定义串口通信频率
Serial.begin(9600);
}
void loop() {
// 读取按键引脚的值:
buttonState = digitalRead(buttonPin);
// 把现在的状态和上一次状态作比较
if (buttonState != lastButtonState) {
//如果状态改变了,增加计数
if (buttonState == HIGH) {
// 如果状态时HIGH,按键输出OFF改为ON
buttonPushCounter++;
Serial.println("on");
Serial.print("number of button pushes: ");
Serial.println(buttonPushCounter);
} else {
//如果目前的状态时LOW,则按键从ON转为OFF
Serial.println("off");
}
// 延迟一点时间避免反复
delay(50);
}
// 保存目前的状态到上一次状态,为下次循环做准备
lastButtonState = buttonState;
// 如果按键计数是4个倍数,则点亮13号引脚的板载LED,反之则熄灭
if (buttonPushCounter % 4 == 0) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
}
请先
!