用户工具

站点工具


learing:examples:buttonstatechange

差别

这里会显示出您选择的修订版和当前版本之间的差别。


前一修订版
learing:examples:buttonstatechange [2023/06/07 04:23] (当前版本) – 外部编辑 127.0.0.1
行 1: 行 1:
 +====== Button State Change Detection (监测按键状态改变) ======
 +
 +<WRAP left round info 65%>
 +如果你的按键工作后,通常你会需要基于按键按下多少次来做出反应。为了达到这个目的,你需要知道什么时候按键被打开或者关闭了,并且知道按键被按下的次数,这就是状态监测。
 +</WRAP>
 +
 +<WRAP left round box 100%>
 +===== ALPHA MEGA328-U核心 =====
 +==== 硬件 ====
 +  * [[ocrobot:alpha:parallelexpansion:index|ALPHA 并行扩展板]]
 +  * [[ocrobot:alpha:mega328-u:main|ALPHA MEGA328-U]]
 +  * [[ocrobot:alpha:microswitch:index|ALPHA 微动开关模块]]
 +==== 搭建电路 ====
 +
 +  - 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, INPUT);
 +  // 初始化LED为输出:
 +  pinMode(ledPin, OUTPUT);
 +  // 初始化串口通讯:
 +  Serial.begin(9600);
 +}
 +
 +
 +void loop() {
 +  // 读取按键输入:
 +  buttonState = digitalRead(buttonPin);
 +
 +  // 比较两次按键状态
 +  if (buttonState != lastButtonState) {
 +    // 如果状态改变了增加计数器
 +    if (buttonState == HIGH) {
 +      // 如果当前的状态是high,按键就从关到开
 +      Serial.println("on");
 +      Serial.print("number of button pushes:  ");
 +      Serial.println(buttonPushCounter);
 +    } 
 +    else {
 +      //如果当前的状态是low,按键就从开到关
 +      Serial.println("off"); 
 +    }
 +  }
 +  // 保存当前的状态到上一次
 +  lastButtonState = buttonState;
 +
 +  
 +  // 通过取模功能,每按4次键就点亮LED
 +  if (buttonPushCounter % 4 == 0) {
 +    digitalWrite(ledPin, HIGH);
 +  } else {
 +   digitalWrite(ledPin, LOW);
 +  }
 +  
 +}</code>
 +
 +</WRAP>
 +
 +<WRAP left round box 100%>
 +===== ALPHA 8F328D-U核心 =====
 +==== 硬件 ====
 +
 +==== 搭建电路 ====
 +
 +==== 代码 ====
 +</WRAP>
 +
 +<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, INPUT);
 +  // 初始化LED为输出:
 +  pinMode(ledPin, OUTPUT);
 +  // 初始化串口通讯:
 +  Serial.begin(9600);
 +}
 +
 +
 +void loop() {
 +  // 读取按键输入:
 +  buttonState = digitalRead(buttonPin);
 +
 +  // 比较两次按键状态
 +  if (buttonState != lastButtonState) {
 +    // 如果状态改变了增加计数器
 +    if (buttonState == HIGH) {
 +      // 如果当前的状态是high,按键就从关到开
 +      Serial.println("on");
 +      Serial.print("number of button pushes:  ");
 +      Serial.println(buttonPushCounter);
 +    } 
 +    else {
 +      //如果当前的状态是low,按键就从开到关
 +      Serial.println("off"); 
 +    }
 +  }
 +  // 保存当前的状态到上一次
 +  lastButtonState = buttonState;
 +
 +  
 +  // 通过取模功能,每按4次键就点亮LED
 +  if (buttonPushCounter % 4 == 0) {
 +    digitalWrite(ledPin, HIGH);
 +  } else {
 +   digitalWrite(ledPin, LOW);
 +  }
 +  
 +}</code>
 +</WRAP>