Oh!Coder

Coding Life

好玩的Arduino-用按键开关计数

| Comments

Hi,大家好!今天我们将综合之前学到的,关于如何更好的使用按键开关等相关知识,做一个综合的小实验,看看如何用按键开关进行计数。当然,与其说是用按键开关进行计数,其实不如说是记录按键开关的点击次数,嘿嘿!好!打起精神,让我们开始吧!

首先,当然还是老样子,先要对所学的内容做准备。

硬件方面

arduino-read-digital-parts

图片来源:Arduino电路配件

具体包括如下:

  • Arduino UNO电路板(1块)
  • 面包板(1块)
  • 10k电阻(1个)
  • 按键开关(1个)
  • 面包线(3根)

看!电路配件还是之前碰到的电路配件!没有新面孔出现,继续!

软件方面

Arduino官方提供的IDE。

连接电路

arduino-read-digital

图片来源:Arduino连接开关按键电路示意图

嗯!电路连接还是之前碰到的电路连接!简单吧!就剩下最后一步啦!

添加几行代码

首先,还是新建一个项目窗口。

arduino-ide-new

图片来源:Arduino官方IDE

下面就不能再一样了,哈哈!!不过,虽说不一样了,但也只是综合了前面所学的相关知识。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// 定义按键的针脚号为2的整型常量
const int  buttonPin = 2;
// 定义LED输入针脚号为13号针脚
// 注:此处我们使用的LED神灯是Arduino UNO电路板自带,
// 此神灯对应的针脚号默认为13,此数值不得随意更改,
// 所以这里定义的数值13是为了和默认值相对应。
const int ledPin = 13;
// 定义用来记录按键次数的整型变量
int buttonPushCounter = 0;
// 记录当前按键的状态
int buttonState = 0;
// 记录按键之前的状态
int lastButtonState = 0;
// 对Arduino电路板或相关状态进行初始化方法
void setup() {
  // 设置按键的针脚为输入状态
  pinMode(buttonPin, INPUT);
  // 设置电路板上LED神灯的针脚状态为输出状态
  pinMode(ledPin, OUTPUT);
  // 开启串行通信,并设置其频率为9600。
  // 如果没有特别要求,此数值一般都为9600。
  Serial.begin(9600);
}
// 系统调用,无限循环方法
void loop() {
  // 读取按键的输入状态
  buttonState = digitalRead(buttonPin);
  // 判断当前的按键状态是否和之前有所变化
  if (buttonState != lastButtonState) {
    // 判断当前按键是否为按下状态,
    // 如果为按下状态,则记录按键次数的变量加一。
    if (buttonState == HIGH) {
      // 将记录按键次数的变量加一
      buttonPushCounter++;
      // 向串口调试终端打印字符串“on”,
      // 表示当前按键状态为按下接通状态,
      // 输出完成之后自动换行。
      Serial.println("on");
      // 向串口调试终端打印字符串
      // “number of button pushes: ”,此处没有换行。
      Serial.print("number of button pushes:  ");
      // 接着上一行尾部,打印记录按键次数变量的数值。
      Serial.println(buttonPushCounter);
    } else {
      // 向串口调试终端打印字符串“off”,
      // 表示当前按键状态为松开状态,也即断开状态。
      Serial.println("off");
    }
    // 为了避免信号互相干扰,
    // 此处将每次按键的变化时间间隔延迟50毫秒。
    delay(50);
  }
  // 将每次loop结束时最新的按键状态进行更新
  lastButtonState = buttonState;
  // 每点击4次,更新一次LED神灯状态。
  // 这里的百分号是求余数的意思,
  // 每次除以四,余数等于零说明按键点击的
  // 次数是四的整数倍,即此时更新LED神灯。
  if (buttonPushCounter % 4 == 0) {
    // 点亮LED神灯
    digitalWrite(ledPin, HIGH);
  } else {
    // 熄灭LED神灯
    digitalWrite(ledPin, LOW);
  }
}

代码看起来好像有点长……其实呢,如果你仔细观察,就会发现,其实百分之八十的代码都是之前学《另一种时间延迟》的时候学到的,而这次只是在其基础上加入了计数的变量而已。如果觉得眼前的代码有点眼晕,可以回过头去温习一下那篇文章。

arduino-menu

图片来源:Arduino官方IDE的文件编辑菜单选项

好!点击一下上图中标有向右指向的箭头图标,将编写好的代码烧入Arduino UNO电路板。然后点击上图中最右侧的放大镜图标,打开串口调试窗口,如下图所示。

arduino-button-count-serial

图片来源:Arduino串口调试窗口

此时,当你每次按下或松开按键开关,都会打印相应的字符串,来显示当前的按键状态。而与此同时,Arduino UNO电路上的LED神灯,也会在你每按四次按键更新一次状态。

总结

通过此次练习,我们没有加入任何新知识,总体而言,是对前面几次的学习进行了一次综合运用。如果哪一部分看起来有点儿头晕,可以温习一下过去的几次所学。嗯,加油!

下期预告

一连几次总是学习按键开关,是不是有点腻了?嗯,猜到了!下一次,我们将一起学习新内容。以前呢,Arduino UNO这块憨厚老实的电路板,总是默默无闻的任你使唤。接下来,我们要让她发出自己的声音。答对了!我们要听听她那令人陶醉的歌喉!

Comments