具有红外功能的安卓手机可以做万能遥控器,以华为手机为例, *** 作流升余者程如下:
1、手机在工具箱找到并点击【智能遥控】。
2、在智能遥控界面点击【添加】。
3、遥控类型支持电视、空调和机顶盒等设备,这里以【空调】为例。
4、点击后,进入空调型号选毁慎择列表,这里以【格力】为例,点击它。
5、按照提示对准空调点击下图所示的电源按键。
6、空调成功启动后,吵薯选择【是】,完成设置,重复以上步骤添加其他设备遥控。
红外接收头的主要功能为IC化的一种受光元件,其内部是将光电二极管(俗称接收管)和集成IC共同组合封装而成,其IC设计主要以类比式控制,一般主要接收38KHZ的频率的红外线,而对其他频率段的红外信号不敏感。这样,遥控器发出载波在38KHZ的频率,接收管接受遥控器发送过来的信息,从而构成通讯。
★Raspberry Pi主板*1
★树莓派电源*1
★40P软排线*1
★红外接收模块*1
★红外遥控器模块*1
★RGB LED模块*1
★面包板*1
★跳线若干
在本实验中,我们将使用PWM脉宽调制技术来控制RGB的亮度。详情可以查看前面的实验: 树莓派基础实验2:RGB-LED实验 。
我们使用lirc库读取遥控器按钮返回的红外信号,并将它们转换为按钮值,然后使用pylirc来简化从远程控制中读取值的过程。在本实验中,使用遥控器顶部的9个按钮来控制RGB LED模块的颜色。每行代表一种颜色,每列代表亮度。
第1步: 连接电路。
第2步: 安装lirc库,配置详情这里不作介绍。
检查该模块是否已加载,你应该看到“/dev/lirc0”。
然后使用“irw”命令测试,按遥控器上的按钮,看屏幕上是否打印按钮名称,如下图所示:
python lirc模块,有关LIRC的更多信息,请参见 http://www.lirc.org
lirc模块的函数及功能介绍如下:
第3步: 编写控制程序。遥控器上的前三行按钮中的每一行代表一种颜色,即从上到下一次控制红色、绿色和蓝色。每列代表关灯、亮和暗。例如,按第一行的第二个按钮,是控制红色灯亮。
你可以使用遥控器共生产27种颜色,包括关闭所有led灯。
红外遥控程序
#include "SPCE061A.H"
#define LED_SEG 0x00ff //IOB0~IOB7
#define LED_DIG 0x3f00 //IOB8~IOB13
unsigned int Time=0,Code[40]={0},CodeNum=0//计数器,32位码,码字计数
//extern unsigned int Time,CodeNum,Code[40]
unsigned int Star_Flag,First_IRQ
//====================================================================================
//函数名称:unsigned getkey(void)
//函数功能:获得红外遥控器键值
//入口参数:无
//出口参数:无
//说明:适用于32位码字红外接收头及宏科万能遥控器
//====================================================================================
unsigned getkey(void)
{
unsigned int j=0
unsigned int DateCode,key=0
if(Code[0]==5) //判断头部是否是5;防止误接收
{ for(j=9j<=14j++)
{
*P_Watchdog_Clear = 0x01
if(Code[j]==1&&Code[j+1]==1&&Code[j+2]==1&&Code[j+3]==1&&Code[j+4]==1&&Code[j+5]==1&&Code[j+6]==0&&Code[j+7]==1)
{ //判断用户识别码是不是1111 1101
for(DateCode=0DateCode<8DateCode++)//若是,则开始接收八位数据码
{
Code[j+8+DateCode]<<=8
key|=Code[j+8+DateCode]
key>>=1 //将八位二进制数倒序转成16进制
}
break
}
}
Code[0]=0//将头部清零
return key//返回键值
}
else return(0)
}
//====================================================================
//函数名称:void IO_Init()
//函数功能:IO口初始化,主要是设置IOB2口,用于外中断
//入口参数:无
//出口参数:无
//====================================================================
void IO_Init()
{
*P_IOB_Attrib&=0xfffb //IOB2端口上拉电阻输入 外中断
*P_IOB_Dir&=0xfffb
*P_TimerA_Ctrl=C_SourceA_32768Hz+C_SourceB_1//TimerA:32768Hz
*P_TimerA_Data=0xfffe
*P_INT_Ctrl=C_IRQ3_EXT1|C_IRQ1_TMA// 外中断1,时基中断,定时中断
__asm("INT IRQ")
}
//做档=====================================================================
//函数并厅名称:
//函数功能绝胡隐:中断函数
//入口参数:无
//出口参数:无
//=====================================================================
void IRQ3(void) __attribute__ ((ISR))
void IRQ3(void)
{
if(*P_INT_Ctrl&C_IRQ3_EXT2)
{ //IRQ3_Ext1
*P_INT_Clear=C_IRQ3_EXT2
}
else if(*P_INT_Ctrl&C_IRQ3_EXT1)
{//外中断1用于判断脉冲个数
if(!First_IRQ) {Time=0First_IRQ=1}//第一次外中断来时设置
else
{
if(Time>180&&Time<240)//判断起始码
{Star_Flag=1CodeNum=0Code[0]=5CodeNum=1Time=0}//起始码来时设置
if(Star_Flag)//开始接收
{
if((Time>=10)&&(Time<25))Code[CodeNum]=0//计数值设置
else if((Time>25)&&(Time<40))Code[CodeNum]=1
CodeNum++//码字计数器加1
Time=0//计数值清零,以对下一个脉冲宽度进行计时
if(CodeNum>40) {CodeNum=0Star_Flag=0First_IRQ=0}//脉冲个数判断,共32个,此处设为40,是为防止漏接收
}
}
*P_INT_Clear=C_IRQ3_EXT1
}
else
{
*P_INT_Clear=C_IRQ3_KEY//IRQ3_KeyWakeUp
}
}
void IRQ1(void) __attribute__ ((ISR))
void IRQ1(void)
{ Time++//计数以获得脉冲宽度
*P_INT_Clear=C_IRQ1_TMA//clear INT flag
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)