第三课:输入设备的使用
目录
碰撞开关
碰撞开关是最常用的输入设备之一,其原理也十分简单,当开关按下时,信号读取为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