WeBee团队Zigbee组网实验教程13、光敏传感器前言:这一节我们我学习传感器部分内容中的光敏传感器,这一类型的传感器跟前面温湿度的传感器最大的区别就是控制简单,只有硬件电路搭好了,给CC2530的IO口一个高低电平就是反映外界情况。所以我们用起来就很方便。传感器介绍:光敏传感器是最常见的传感器之一,它的种类繁多,主要有:光电管、光电倍增管、光敏电阻、光敏三极管、太阳能电池、红外线传感器、紫外线传感器、光纤式光电传感器、色彩传感器、CCD和CMOS图像传感器等。它的敏感波长在可见光波长附近,包括红外线波长和紫外线波长。光传感器不只局限于对光的探测,它还可以作为探测元件组成其他传感器,对许多非电量进行检测,只要将这些非电量转换为光信号的变化即可。光传感器是目前产量最多、应用最广的传感器之一,它在自动控制和非电量电测技术中占有非常重要的地位。最简单的光敏传感器是光敏电阻,当光子冲击接合处就会产生电流。图1光敏电阻实现平台:网蜂二代ZigBee开发平台WeBee团队Zigbee组网实验教程2图2网蜂物联网ZigBee开发平台图3光敏传感器硬件电路WeBee团队Zigbee组网实验教程3实验现象:光敏电阻电路通过检测外界光线的情况,将信息通过LCD12864显示和串口打印出来。实验讲解:像前面传感器例程一样,我们先实现裸机程序里检测光敏电阻电路的检测。然后在协议栈里添加相应的代码。一:在裸机上完成对光敏电阻电路的驱动。打开配套程序下裸机文件夹—光敏传感器下的工程文件,看到函数如下:/**************************************//*WeBee团队*//*Zigbee学习例程*//*例程名称:光线检测*//*建立时间:2012/10*//*描述:通过光敏电阻检测外界光线,通过LED1指示**************************************/1.1.#includeioCC2530.h2.2.#defineuintunsignedint3.#defineucharunsignedchar4.//定义控制LED灯的端口5.#defineLED1P1_0//LED1为P1.0口控制6.#defineLIGHTP2_0//光敏电阻为IO口为P2.07.//函数声明8.voidDelayms(uint);//延时函数9.voidInitLed(void);//初始化LED110.voidLightInit();//光敏初始化11.ucharLightScan();//按键扫描程序12./****************************13.延时函数14.*****************************/15.voidDelayms(uintxms)//i=xms即延时i毫秒16.{17.uinti,j;18.for(i=xms;i0;i--)for(j=587;j0;j--);19.}20./****************************LED初始化函数WeBee团队Zigbee组网实验教程421.*****************************/22.voidInitLed(void)23.{P1DIR|=0x01;//P1_0定义为输出LED1=1;//LED1灯熄灭24.}25./****************************光敏电阻初始化函数26.*****************************/27.voidLightInit()28.{P2SEL&=~0X01;//设置P20为普通IO口P2DIR&=~0X01;//在P20口,设置为输入模式P2INP&=~0x01;//打开P20上拉电阻,不影响29.}30./****************************i.按键检测函数31.*****************************/32.ucharLightScan(void)33.{if(LIGHT==0){Delayms(10);if(LIGHT==0){return1;//有按键按下}}return0;//无按键按下34.}35./***************************主函数36.***************************/37.voidmain(void)38.{39.InitLed();//调用初始化函数40.LightInit();41.while(1){if(LightScan())//按键改变LED状态LED1=1;//有光,LED1灭掉WeBee团队Zigbee组网实验教程5elseLED1=0;//无光,LED1点亮}42.}我们来看主函数:第39~40行:进行一些初始化工作。第41~42行:判断外界光线情况,通过LED1指示。上面的代码实现了当有光线时候LED1灭掉,没有光线的时候LED1亮。实验现象如图4所示:图4二:将程序添加到协议栈代码中光敏电阻电路是对IO口电平的检测。所以在协议栈里检测程序比较简单。我们只需要配置好IO口,然后周期性检测就可以了。1)打开例程SampleApp.eww工程,打开SampleApp.c文件。我们先初始化P2.0引脚。设为输入模式。/******光敏电阻电路初始化******/P2SEL&=~0X01;//设置P2.0为普通IO口P2DIR&=~0X01;//在P2.0口,设置为输入模式P2INP&=~0x01;//打开P2.0上拉电阻WeBee团队Zigbee组网实验教程6图52)利用周期性点播的定时器作为光线信息采集时间,将采集到的信息发送给协调器。并通过LCD显示和串口打印。协调器只做串口打印。0.5秒采集一次。//SendMessageTimeout#defineSAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT500//Every0.5seconds3)终端每0.5秒执行点播函数一次,我们在点播函数里判断IO口。加入下面红色代码。voidSampleApp_SendPointToPointMessage(void){uint8L;if(LIGHT==1){L=1;//有光线HalUARTWrite(0,nolight\n,9);//串口HalLcdWriteString(NoLight,HAL_LCD_LINE_3);//LCD}else{L=0;//没有光线HalUARTWrite(0,gotLight\n,10);//串口HalLcdWriteString(GotLight,HAL_LCD_LINE_3);//LCD}if(AF_DataRequest(&Point_To_Point_DstAddr,WeBee团队Zigbee组网实验教程7&SampleApp_epDesc,SAMPLEAPP_POINT_TO_POINT_CLUSTERID,1,&L,&SampleApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS)==afStatus_SUCCESS){}else{//Erroroccurredinrequesttosend.}}图64)协调器接收函数我们将数据读出来然后判断。通过串口打印传感器信息出来。caseSAMPLEAPP_POINT_TO_POINT_CLUSTERID:if(pkt-cmd.Data[0])HalUARTWrite(0,nolight\n,9);//没光线elseHalUARTWrite(0,gotlight\n,10);//有光线break;WeBee团队Zigbee组网实验教程8图7实验现象:下载程序到终端(带光敏传感器)和协调器。观察LCD12864,如下图所示:图8WeBee团队Zigbee组网实验教程9协调器收到的信息:图9结语:细心的读者会发现,光敏传感器的检测实际上就是CC2530的IO口电平检测,通过硬件电路的转换将模拟量变成了数字量。接下来的部分传感器也是相关的原理。希望大家能读一通百。