第三课:输入设备的使用

来自Microduino Wikipedia
Zhangfengfeng讨论 | 贡献2017年6月8日 (四) 07:25的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

碰撞开关

碰撞开关是最常用的输入设备之一,其原理也十分简单,当开关按下时,信号读取为0,当抬起时,读取为1,当使用起来时则可以实现很多变化。

碰撞开关的使用——利用开关实践选择结构

文件:Crash usage.png
开关使用的基本原理是:当开关弹起时,程序读取到的值是1,当开关按下时,读取到的值是0。
因此,如果要设计一个控制灯开关的程序,应该怎么写呢?

编程

 #include<Adafruit_NeoPixel.h>
 #define LED_Pin 6
 #define LED_Num 2
 #define Key_Pin 8 //定义开关的引脚为8
 Adafruit_NeoPixel ColorLED=Adafruit_NeoPixel(LED_Num, Led_Pin, NEO_GRB+NEO_KHZ800);
 void setup(){
 ColorLED.begin();
 pinMode(Key_Pin,INPUT); //定义开关的引脚为输入状态
 }
 void loop(){
 int KEY=digitalRead(PIN_Key); //定义一个整数变量KEY,同时让KEY的值等于读取到的开关引脚的值。digitalRead(a)也是Arduino的基本语句,意思是读取”a“引脚上的数字信号值。
 if(KEY==0){
 ColorLED.setPixelColor(0, ColorLED.Color(255,0,0));
 ColorLED.show(); //这段就是选择结构最基本的形式,”if“如果括号里的条件成立,则执行{}中的命令,在这段代码中,即当KEY的值等于0,也就是开关按下的时候,灯亮。其中”==“左右两边的值相等,而”=“只是将右边的值赋给了左边,并不是真正意义的等于。
 }else{
 ColorLED.setPixelColro(0,ColorLED.Color(255,0,0));
 ColorLED.show(); //如果不满足”if“条件,就执行”else“后面{}中的程序,在当前程序中即关灯。因为KEY只有等于0或1两种情况,所以else后面就不再写KEY==1了。
 }
 }

动手时间

试着用开关实现两种灯的切换,抬起时第一个灯亮,第二个灯灭,按下时反过来

其他用法

碰撞开关由于会自动回复到弹起的状态,在实际使用中,也可以当作按钮来使用
文件:Crash button.png
Microduino定义了一个库文件,可以检测到碰撞开关是否被按下(press)过,但只记录按下的那一瞬间,而不是一个持续的过程。
文件:Crash switch.png
这样,就可以实现按一下执行命令A(比如开灯),再按一下执行命令B(比如关灯),但程序怎么判断是第几次按开关呢?
文件:Crash judgement.png
因此我们需要引入一个布尔变量来记录开关被按的状态,布尔变量只有true和false两个值,每当开关按下时,这个布尔变量就翻转一次。
文件:Crash boolean.png
然后再定义,当布尔值为真的时候亮灯,反之则关灯,这样就实现切换控制了。具体代码如下:

 #include<Adafruit_NeoPixel.h>
 #include<Microduino_Key.h> //调用碰撞开关库文件
 #define PIN_LED 6
 #define PIN_NUM 2
 #define PIN_Key 8
 Key KeyA(PIN_Key,INPUT_PULLUP); //定义开关名称为KeyA,以及开关引脚和模式
 Adafruit_NeoPixel ColorLED=Adafruit_NeoPixel(LED_NUM, PIN_LED, NEO_GRB+NEO_KHZ800);
 boolean sta=false; //定义一个布尔变量sta,初始状态为假
 void setup(){
 ColorLED.begin();
 pinMode(PIN_Key,INPUT);
 }
 void loop(){
 if(KeyA.read(PRESS)){ //当开关读取到按下的状态时,反转布尔值,其中”名称.read(PRESS)“是开关使用的语法,这段代码只检测是否按过,而不是按下去的状态
 sta=!sta; //布尔值反转用”!“表示
 }
 if(sta){ //当布尔值sta为真时,灯亮
 ColroLED.setPixelColor(0, ColorLED.Color(255,0,0));
 ColroLED.show();
 }else{ //否则,也就是当sta值为假的时候,灯灭
 ColorLED.setPixelColor(0,ColorLED.Color(0,0,0));
 ColorLED.show();
 }delay(15); //由于单片机运行速度太快,导致程序判断时可能会出错,所以整体延时15毫秒,让它稍微放慢一些
 }

动手时间

尝试用开关控制两个灯,按一下第一个灯亮,再按一下第二个灯亮
更进一步,如果要实现多个命令的切换,应该怎么处理呢?
文件:Crash extension.png

其他输入设备

人体红外传感器

人体红外传感器返回的是数字信号,通过选择结构可以实现类似开关的功能。
当有人经过检测范围时,其信号值为0,而没有人的时候则为1,因此,人体红外传感器只能判断是否有人,而无法判断与人之间的距离。
文件:PIR detection.png

动手时间

PIR的程序和第一个开关使用的程序完全一样,试着套用一下,实现一个PIR控制的灯,有人经过灯就会亮

光敏传感器

光敏传感器传回的是模拟信号,即光线变化的一组数字,可以利用这些数字实现相应的控制。
文件:Light signal.png
模拟信号是一组不断变化的数字,可以通过串口监视器观察数值的变化

声音传感器

声音传感器与光敏传感器类似,也是返回一段声音变化的模拟信号,可以利用这个变化做应用
文件:MIC signal.png