第第5章章Arduino人机界面及接口技术人机界面及接口技术5.1Arduino与按键的接口技术5.2Arduino与红外遥控器的接口技术5.3Arduino与数码管显示器的接口技术5.4Arduino与LED点阵模块的接口技术5.5Arduino与LCD显示器的接口技术5.6Arduino与语音模块的接口技术25.1Arduino与按键的接口技术常用的独立按常用的独立按键键接口是每个按接口是每个按键键接接1个个I/O口口Arduino通通过过4个个输输入引脚与入引脚与4个独立按个独立按键键K1K4连连接,按接,按键键一端接地,另一端端通一端接地,另一端端通过过R1R4上拉上拉电电阻接到阻接到5V上,当上,当按按键键没有按下没有按下时时,Arduino端口引脚保持高端口引脚保持高电电平;当有平;当有键键按按下下时时,对应对应的引脚的引脚变变低低电电平1.独立按独立按键键接口接口35.1Arduino与按键的接口技术按按键键接口的控制方式有以下三种:接口的控制方式有以下三种:(1)随机方式:当)随机方式:当Arduino空空闲时执闲时执行按行按键扫键扫描程序2)中断方式:当有按)中断方式:当有按键键按下按下时时通通过过或或门产门产生中断生中断请请求,求,Arduino中断响中断响应应后后执执行按行按键扫键扫描程序。
描程序3)定)定时时方式:每隔一定方式:每隔一定时间执时间执行一次按行一次按键扫键扫描程序,定描程序,定时时时间时间由由Arduino定定时时器完成通常按通常按键键所用的开关都是机械所用的开关都是机械弹弹性开关,当机械触点断开、性开关,当机械触点断开、闭闭合合时时,由于机械触点的,由于机械触点的弹弹性作用,一个按性作用,一个按键键开关开关在在闭闭合和断开合和断开时时会会产产生一生一连连串的抖串的抖动动45.1Arduino与按键的接口技术在抖动期间读取的键值是不可靠的,只有在按键稳定期间读取的键值才是正确的为了确保程序对按键的一次闭合或者一次断开只响应一次,必须进行按键消抖当检测到按键状态变化时,等待闭合或断开操作稳定一段时间后再进行处理软件消抖是当检测到按键状态变化后,先延时20ms左右,让抖动消失后再进行一次按键状态检测,如果与开始检测到的状态相同,就可以确认按键的操作55.1Arduino与按键的接口技术实例功能:独立按键软件消抖intk1=5,k2=6,k3=7,k4=8;intkey=0;/键值intkey1=0;/判断按键是否释放标志voidsetup()Serial.begin(9600);pinMode(k1,INPUT);pinMode(k2,INPUT);pinMode(k3,INPUT);pinMode(k4,INPUT);voidloop()/查询有无键按下,有键按下在屏幕显示结果read_key();/读取按键if(key!=0)/显示是哪个键按下Serial.print(K);Serial.print(key);0Serial.println(ispressed);key=0;65.1Arduino与按键的接口技术voidread_key()/读取按键值并消抖函数if(!digitalRead(k1)|!digitalRead(k2)|!digitalRead(k3)|!digitalRead(k4)delay(20);/消抖动延时if(!digitalRead(k1)|!digitalRead(k2)|!digitalRead(k3)|!digitalRead(k4)if(!digitalRead(k1)key=1;/键值输出if(!digitalRead(k2)key=2;if(!digitalRead(k3)key=3;if(!digitalRead(k4)key=4;elsekey=0;if(key1!=key)/判断按键是否释放key1=key;elsekey=0;/没有键按下,返回075.1Arduino与按键的接口技术2矩矩阵阵按按键键接口接口在按键数量较多时,为了减少在按键数量较多时,为了减少I/O口的占用,通常将口的占用,通常将按键排列成矩阵形式。
在矩阵式键盘中,每条水平线和垂直按键排列成矩阵形式在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接这样,线在交叉处不直接连通,而是通过一个按键加以连接这样,八个端口就可以构成八个端口就可以构成44=16个按键,比直接将按键与端个按键,比直接将按键与端口线连接多出了一倍,口线连接多出了一倍,而且线数越多,区别越而且线数越多,区别越明显,当需要的键数较明显,当需要的键数较多时,应采用矩阵按键多时,应采用矩阵按键85.1Arduino与按键的接口技术2矩矩阵阵按按键键接口接口44按键电路用按键电路用4根行线和根行线和4根列线与根列线与Arduino连接,连接,16个按键跨接在对应的行线、列线节点上如果个按键跨接在对应的行线、列线节点上如果I/O接口内接口内部没有上拉电阻,相应行和列要有上拉电阻接高电平,可以部没有上拉电阻,相应行和列要有上拉电阻接高电平,可以保证没键按下的行状态稳定保证没键按下的行状态稳定矩矩阵按按键同同样要考要考虑按按键触点触点闭合和断开合和断开时存在的抖存在的抖动期常用有常用有扫描法和反描法和反转法1)扫描法描法扫描法描法键值产生方法如下:生方法如下:设行行线(或列(或列线)为输出,列出,列线(或行(或行线)为输入,依次将行入,依次将行线设置置为低低电平,同平,同时读入列入列线的状的状态,如果列,如果列线的状的状态出出现非全非全1状状态,这时0状状态的行、的行、列交点的列交点的键就是所按下的就是所按下的键。
扫描法的特点是逐行(或逐列)描法的特点是逐行(或逐列)扫描描查询95.1Arduino与按键的接口技术/扫扫描法矩描法矩阵阵按按键键例程例程 int ko4=5,6,7,8;/定定义义行行int ki4=9,10,11,12;/定定义义列列int key=0;/键值键值int key1=0;/判断按判断按键键是否是否释释放放void setup()Serial.begin(9600);for(int i=0;i 4;i+)pinMode(koi,OUTPUT);/行行输输出出 pinMode(kii,INPUT_PULLUP);/列列输输入,入,带带内部上拉内部上拉电电阻阻 105.1Arduino与按键的接口技术void loop()read_key();/调调用用读键值读键值函数函数 if(key!=0)Serial.print(K);Serial.print(key);Serial.println(is pressed);key=0;void read_key()for(int l=0;l 4;l+)/首先把行首先把行线线全部全部输输出高出高电电平平 digitalWrite(kol,HIGH);for(int i=0;i 4;i+)digitalWrite(koi,LOW);/逐行逐行输输出低出低电电平平 delay(5);/等待等待稳稳定定 115.1Arduino与按键的接口技术 for(int k=0;k 4;k+)/逐列逐列读读入入 if(!digitalRead(kik)/低低电电平表示有平表示有键键按下按下 delay(20);/延延时时消抖消抖动动 if(!digitalRead(kik)/再次再次读读入,低入,低电电平确平确认认有有键键按下按下 key=i*4+k+1;/计计算算键值键值,行,行4+列,列,键值键值116 else key=0;if(key1!=key)/判断按判断按键键是否是否释释放放 key1=key;else key=0;125.1Arduino与按键的接口技术(2)反转法)反转法反转法只要经过两个步骤就可获得键值。
反转法只要经过两个步骤就可获得键值先将行线输出全部设置为低电平,从列线对应的引脚读取数先将行线输出全部设置为低电平,从列线对应的引脚读取数据,如果发现有列线变低电平,说明该列线上有键按下反据,如果发现有列线变低电平,说明该列线上有键按下反之,将列线输出全部设置为低电平,从行线对应的引脚读取之,将列线输出全部设置为低电平,从行线对应的引脚读取数据,如果发现有行线变低电平,说明该行线上有键按下数据,如果发现有行线变低电平,说明该行线上有键按下通过对应行线和列线即可判断出哪个键被按下通过对应行线和列线即可判断出哪个键被按下/反反转转法矩法矩阵阵按按键键例程例程 int kl4=5,6,7,8;/行行线线引脚定引脚定义义int kc4=9,10,11,12;/列列线线引脚定引脚定义义int key=0;/键值键值int key1=0;/按按键释键释放放检测检测int key_l;/行行int key_c;/列列int flag=0;/有有键键按下按下标标志志135.1Arduino与按键的接口技术void setup()Serial.begin(9600);void loop()read_key();if(key!=0)Serial.print(K);Serial.print(key);Serial.println(is pressed);key=0;145.1Arduino与按键的接口技术void read_key()for(int i=0;i 4;i+)/行行输输出,列出,列输输入入 pinMode(kli,OUTPUT);digitalWrite(kli,LOW);pinMode(kci,INPUT_PULLUP);/带带内部上拉内部上拉电电阻阻 delay(5);for(int k=0;k 4;k+)if(!digitalRead(kck)delay(20);if(!digitalRead(kck)key_c=k;flag=1;/有有键键按下按下标标志志 else flag=0;155.1Arduino与按键的接口技术if(flag=1)for(int n=0;n 4;n+)/列列输输出,行出,行输输入入 pinMode(kcn,OUTPUT);digitalWrite(kcn,LOW);pinMode(kln,INPUT_PULLUP);delay(5);for(int j=0;j 4;/读读取高取高8位位 if(key_Value!=0 x3F)/无无键键按下按下时时,最大,最大值值0 x3F delay(10);key_Value=analogRead(key_in)4;/再次再次读读取取 if(key_Value!=0 x3F)for(int i=0;i 4;i+)if(key_Value=key_vi)/查键值查键值表表 key=i;/对应赋键值对应赋键值 else key=0;key=0;205.2Arduino与红外遥控器的接口技术红外外线遥控器已被广泛使用在各种遥控器已被广泛使用在各种类型的家型的家电产品上,它品上,它的出的出现给使用使用电器提供了很多的便利。
器提供了很多的便利红外遥控系外遥控系统一般由一般由红外外发射装置和射装置和红外接收外接收设备两大部分两大部分组成通常为了使信号能了使信号能更好的被更好的被传输发送端将基送端将基带二二进制信号制信号调制制为脉冲串信号,通脉冲串信号,通过红外外发射管射管发射1.红红外遥控器的工作原理外遥控器的工作原理215.2Arduino与红外遥控器的接口技术在同一在同一环境中,通常有多种境中,通常有多种红外遥控接收外遥控接收设备,这样就要就要求遥控器要按一定的求遥控器要按一定的编码传送,防止相互干送,防止相互干扰,而,而编码则会由会由专用芯片或用芯片或电路完成发送端采用脉冲位置送端采用脉冲位置调制方式,将二制方式,将二进制数字信号制数字信号调制成某一制成某一频率的脉冲序列,并率的脉冲序列,并驱动红外外发射管以射管以光脉冲的形式光脉冲的形。