learing:examples:buttonstatechange
差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 两侧同时换到之前的修订记录前一修订版 | |||
| learing:examples:buttonstatechange [2017/10/05 03:27] – 弘毅 | learing:examples:buttonstatechange [2025/10/11 02:55] (当前版本) – 外部编辑 127.0.0.1 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | ====== Button State Change Detection (监测按键状态改变) ====== | ||
| + | |||
| + | <WRAP left round info 65%> | ||
| + | 如果你的按键工作后,通常你会需要基于按键按下多少次来做出反应。为了达到这个目的,你需要知道什么时候按键被打开或者关闭了,并且知道按键被按下的次数,这就是状态监测。 | ||
| + | </ | ||
| + | |||
| + | <WRAP left round box 100%> | ||
| + | ===== ALPHA MEGA328-U核心 ===== | ||
| + | ==== 硬件 ==== | ||
| + | * [[ocrobot: | ||
| + | * [[ocrobot: | ||
| + | * [[ocrobot: | ||
| + | ==== 搭建电路 ==== | ||
| + | |||
| + | - ALPHA MEGA328-U模块插入并行扩展板1号槽位。 | ||
| + | - ALPHA 微动开关模块插入并行扩展版2号槽位。 | ||
| + | - USB线连接计算机与ALPHA MEGA328-U。 | ||
| + | ==== 代码 ==== | ||
| + | |||
| + | <code cpp>/* | ||
| + | State change detection (edge detection) | ||
| + | 通常你不需要一直知道数字输入的状态,但是你需要哪个时候知道输入状态改变了。 | ||
| + | 这个例子显示了怎么检测按键状态的改变 | ||
| + | */ | ||
| + | const int buttonPin = 15; // 按键连接的引脚 | ||
| + | const int ledPin = 2; // LED连接的引脚 | ||
| + | int buttonPushCounter = 0; // 按键按下次数的计数器 | ||
| + | int buttonState = 0; // 当前按键状态 | ||
| + | int lastButtonState = 0; // 前一次按键状态 | ||
| + | |||
| + | void setup() { | ||
| + | // 初始化按键为输入: | ||
| + | pinMode(buttonPin, | ||
| + | // 初始化LED为输出: | ||
| + | pinMode(ledPin, | ||
| + | // 初始化串口通讯: | ||
| + | Serial.begin(9600); | ||
| + | } | ||
| + | |||
| + | |||
| + | void loop() { | ||
| + | // 读取按键输入: | ||
| + | buttonState = digitalRead(buttonPin); | ||
| + | |||
| + | // 比较两次按键状态 | ||
| + | if (buttonState != lastButtonState) { | ||
| + | // 如果状态改变了增加计数器 | ||
| + | if (buttonState == HIGH) { | ||
| + | // 如果当前的状态是high,按键就从关到开 | ||
| + | Serial.println(" | ||
| + | Serial.print(" | ||
| + | Serial.println(buttonPushCounter); | ||
| + | } | ||
| + | else { | ||
| + | // | ||
| + | Serial.println(" | ||
| + | } | ||
| + | } | ||
| + | // 保存当前的状态到上一次 | ||
| + | lastButtonState = buttonState; | ||
| + | |||
| + | | ||
| + | // 通过取模功能,每按4次键就点亮LED | ||
| + | if (buttonPushCounter % 4 == 0) { | ||
| + | digitalWrite(ledPin, | ||
| + | } else { | ||
| + | | ||
| + | } | ||
| + | | ||
| + | }</ | ||
| + | |||
| + | </ | ||
| + | |||
| + | <WRAP left round box 100%> | ||
| + | ===== ALPHA 8F328D-U核心 ===== | ||
| + | ==== 硬件 ==== | ||
| + | |||
| + | ==== 搭建电路 ==== | ||
| + | |||
| + | ==== 代码 ==== | ||
| + | </ | ||
| + | |||
| + | <WRAP left round box 100%> | ||
| + | ===== MangoII ===== | ||
| + | ==== 硬件要求 ==== | ||
| + | |||
| + | |OCROBOT控制器| | ||
| + | |按键或开关| | ||
| + | |10K欧姆电阻| | ||
| + | |面包板| | ||
| + | |跳线| | ||
| + | |||
| + | 连接三根线到控制器。第一根从按键长的一个脚通过一个下拉电阻连接到控制器的GND上。第二根从按键对应的另一个脚连到5V电源。第三根线连接到2号数字口读取按键状态。 | ||
| + | |||
| + | 当按键打开,也就是按键两个脚之间没有连接,但是通过下拉电阻连到了GND,我们就读到了LOW。当按键闭合,也就是按下,按键两个脚联通到5V,我们读取到HIGH。此时引脚依然连接到GND,但是电阻阻碍了电流流过,所以较低阻值的那端连接到了+5V。 | ||
| + | |||
| + | 加入断开数字口,LED可能就会无规则闪烁。因为输入端是悬空的,也就是连到5V或GND了。它会随机返回HIGH或LOW,这就是为什么连接下拉电阻的原因了。 | ||
| + | |||
| + | 下面的程序连续读取按键状态。在循环中它会比较和上一次的状态。如果当前的状态不同于上一次的状态并且当前的状态是HIGH,那么按键就被按下了,程序就增加了一个计数器。 | ||
| + | |||
| + | 程序也会检查按键次数值,如果它是四的倍数就点亮13号脚的LED,否则就熄灭它。 | ||
| + | |||
| + | ==== 代码 ==== | ||
| + | |||
| + | <code cpp>/* | ||
| + | State change detection (edge detection) | ||
| + | 通常你不需要一直知道数字输入的状态,但是你需要哪个时候知道输入状态改变了。 | ||
| + | 这个例子显示了怎么检测按键状态的改变 | ||
| + | */ | ||
| + | |||
| + | |||
| + | const int buttonPin = 2; // 按键连接的引脚 | ||
| + | const int ledPin = 13; // LED连接的引脚 | ||
| + | |||
| + | |||
| + | int buttonPushCounter = 0; // 按键按下次数的计数器 | ||
| + | int buttonState = 0; // 当前按键状态 | ||
| + | int lastButtonState = 0; // 前一次按键状态 | ||
| + | |||
| + | void setup() { | ||
| + | // 初始化按键为输入: | ||
| + | pinMode(buttonPin, | ||
| + | // 初始化LED为输出: | ||
| + | pinMode(ledPin, | ||
| + | // 初始化串口通讯: | ||
| + | Serial.begin(9600); | ||
| + | } | ||
| + | |||
| + | |||
| + | void loop() { | ||
| + | // 读取按键输入: | ||
| + | buttonState = digitalRead(buttonPin); | ||
| + | |||
| + | // 比较两次按键状态 | ||
| + | if (buttonState != lastButtonState) { | ||
| + | // 如果状态改变了增加计数器 | ||
| + | if (buttonState == HIGH) { | ||
| + | // 如果当前的状态是high,按键就从关到开 | ||
| + | Serial.println(" | ||
| + | Serial.print(" | ||
| + | Serial.println(buttonPushCounter); | ||
| + | } | ||
| + | else { | ||
| + | // | ||
| + | Serial.println(" | ||
| + | } | ||
| + | } | ||
| + | // 保存当前的状态到上一次 | ||
| + | lastButtonState = buttonState; | ||
| + | |||
| + | | ||
| + | // 通过取模功能,每按4次键就点亮LED | ||
| + | if (buttonPushCounter % 4 == 0) { | ||
| + | digitalWrite(ledPin, | ||
| + | } else { | ||
| + | | ||
| + | } | ||
| + | | ||
| + | }</ | ||
| + | </ | ||
