Arduino拥有非常丰富的外接传感器。这一章节,我们将介绍感知型传感器。感知型传感器很多,按钮、温湿度监测、霍尔传感器等等都属于这一类。本文选择按钮开关来进行说明,希望大家学习之后,能够举一反三,掌握好其他本类型传感器的使用方法。

我们常用开关来控制Arduino开发板上其他外接硬件的通断。比如,一盏LED灯,硬件上最好有个开关,按一下开关,就让LED灯亮,再按一下开关,就让LED灯关闭。

按钮开关只有两种状态,因此,我们通过Arduino获取到的是典型的数字信号。

开关的外形有多种式样,但原理都是相同的。对于按钮开关的具体设计,需要使用到《电子技术基础》这门课的内容。我们可以使用Arduino配套的面包板、连线、电阻等元器件自己搭建。如果你对上述知识缺乏储备,或者觉得麻烦,那么就可以选用现成的,已经封装好的元器件。它简化了外围电路的设计,很适合对硬件缺乏深入认识的软件开发者。

这里我们选用使用最方便的三引脚按钮开关。
第4节 感知型传感器 - 图1

由此也可以发现,使用Arduino对我们掌握跨课程的知识也是非常有帮助的,你可以借由此道,开始深入研究电路的搭建,并且有非常完善的验证环境。这部分向硬件电路深入的内容,我们会在以后的章节展开介绍。

4.1 硬件连接

三引脚按钮开关的引脚对应如下,

第4节 感知型传感器 - 图2

含义 引脚位置 连接 开发板引脚
控制 S <—> D10
VCC 电源 <—> 5V
接地 GND <—> GND

在实际的使用当中,按钮开关也可能连接到扩展板上。例如这里将按钮开关连接到10组扩展口上,

含义 引脚位置 连接 扩展板引脚
控制 S <—> 10组S
VCC 电源 <—> 10组V
接地 GND <—> 10组G

第4节 感知型传感器 - 图3

4.2 控制代码

首先我们初始化引脚。这个引脚是用来读取连接其上的数据的,所以对开发板来讲它是个输入引脚-INPUT;按钮使用的是D10,所以就要初始化D10为输入引脚,

  1. int BUTTON_PIN = 10;
  2. void setup() {
  3. //D10是作为输入使用的引脚
  4. pinMode(BUTTON_PIN, INPUT);
  5. Serial.begin(9600);
  6. }

这里在初始化按钮引脚的同时,我们也设置好了的串口波特率,用来进行调试。

每按一次按钮,都会触发按下松开两个响应,也就是说,按钮按下后会自动弹起,不会保持被按下的状态。通过查阅按钮器件的说明文档,我们发现:

  1. 当按下开关按钮的时候,S引脚会变成LOW电平;
  2. 当松开开关按钮的时候,S引脚会变成HIGH电平;

所以当出现了这两个变化的时候,才能判断按钮被按下并抬起了一次。

采用digitalRead()读取按钮对应引脚的电平,判断它当前是否被按下,

  1. //初始情况下,按钮是没有按下的,所以是HIGH电平
  2. int oldButtonState = HIGH;
  3. void loop() {
  4. //读取开关引脚的电平,判断当前是否被按下
  5. int buttonState = digitalRead(BUTTON_PIN);
  6. //当前被按下(LOW),之前没有被按下(HIGH),
  7. //说明使用者按下了按钮
  8. if(buttonState == LOW && oldButtonState == HIGH)
  9. {
  10. Serial.println("button press down");
  11. oldButtonState = buttonState;
  12. }
  13. //当前没有被按下(HIGH),之前被按下(LOW),
  14. //说明使用者松开了按钮
  15. if(buttonState == HIGH && oldButtonState == LOW)
  16. {
  17. Serial.println("button press up");
  18. oldButtonState = buttonState;
  19. }
  20. }

4.3 查看结果

把以上代码部署到设备上,打开串口调试窗口,按下并松开开关,可以看到类似如下输出信息,

第4节 感知型传感器 - 图4

4.4 其他传感器数字信号的读取

按钮的数字信号获取就是这样简单,很多传感器也是使用的类似的方法进行数据的读取,比如水银开关、霍尔传感器等等。

在Arduino众多的感知型传感器中,如果是这种共性很大的传感器,我们一般就不再一一详细的介绍了。对于一些用法特殊的传感器才会专门开启章节详细介绍。

接下来,请按照本文的案例,模仿连线,获取到这些传感器的数据吧。