ImageVerifierCode 换一换
格式:PPT , 页数:247 ,大小:4.13MB ,
资源ID:4789605      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-4789605.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(FSIOT_A智能家居系统 --基于Atmel物联网解决方案.ppt)为本站会员(ysd1539)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

FSIOT_A智能家居系统 --基于Atmel物联网解决方案.ppt

1、FSIOT_A智能家居系统,-基于Atmel物联网解决方案,概述,1,系统硬件设计,2,系统软件设计,3,Zigbee 模块硬件设计 传感板硬件设计 执行板硬件设计 网关板硬件设计,传感板软件设计 执行板软件设计 网关板软件设计 Android软件设计,系统外观,4,本系统采用基于Atmel先进的软硬件方案,能将物联网的概念与应用很好的展现出来。从物联网架构中下面的感知层,到上级的网络层、应用层,在整个项目中都会得到充分地体现。 系统主要有以下几个单元组成:(1)传感单元(2)执行单元(3)网关板单元(4)交互控制单元,系统功能概述,系统功能框图:,系统利用Node1上得各种传感器实现对外界环

2、境信息的“感知”,然后通过ZigBee Module无线传感模块将信号传递到Main board。Main board上带有的触控功能的显示屏,实时显示信息、控制Node2执行单元动作。平台的WiFi、GPRS、Ethernet允许用户可以远程地监控这些信息。当外界环境出现异常状况的时候,系统会向用户发出报警提示信息。另外,RFID模块会做好对人物信息的登记,以便查询。,系统功能描述,平台采用Atmel公司先进的基于Cortex-M3内核的SAM3S4B与SAM3X8E处理器设计而成,提供了一套完整的物联网解决方案。此开发平台主要由4个重要组成部分:传感单元、网关板单元、交互控制单元以及执行单

3、元。 传感单元集成多种传感器,主要有:温度湿度传感器、烟雾传感器、磁门传感器、光敏传感器、三轴加速度传感器等,利用多个传感器与ZigBee主控单元的交互将数据信息传送到上层单元。,设备介绍,执行单元集成数码管、ISD1760语音模块、蜂鸣器、PWM风扇等,利用模块与ZigBee主控单元的交互接收来自上级单元的命令并完成相应的操作。 人机交互部分由7寸工业串口触摸屏和Android智能终端组成。 网关板单元作为平台核心所在,进行数据的接收、分析与处理。其上有GPRS模块、WiFi模块、RFID射频模块和ZigBee模块。 开发平台具有丰富的硬件资源以及软件,提供物联网相关实验程序,适合于物联网教

4、学以及工程师做研发参考平台。,设备介绍,概述,1,系统硬件设计,2,系统软件设计,3,Zigbee 模块硬件设计 传感板硬件设计 执行板硬件设计 网关板硬件设计,传感板软件设计 执行板软件设计 网关板软件设计 Android软件设计,CPU 选用SAM3S4B 该芯片有256K Flash及64pin管脚。此ZigBee Module除了可以用于ZigBee无线通信外,还可以有足够的资源用于信息采集和外设控制。所以,ZigBee Module也是Node1(传感单元)和Node2(执行单元)的主控单元。 ZigBee Transceivers 选用AT91RF231 ZigBee收发芯片采用的

5、是AT91RF231,该芯片的优点在于它在进行无线传输时,功耗较小、距离远。,ZigBee 模块选型,ZigBee模块说明与实物图,概述,1,系统硬件设计,2,系统软件设计,3,Zigbee 模块硬件设计 传感板硬件设计 执行板硬件设计 网关板硬件设计,传感板软件设计 执行板软件设计 网关板软件设计 Android软件设计,传感单元完成的功能主要有:温/湿度信息的采集、光照信息的采集、三轴加速度信息的采集、烟雾浓度的采集、门状态的采集以及数据信息的发送等。,传感单元,传感单元模块说明与实物图,概述,1,系统硬件设计,2,系统软件设计,3,Zigbee 模块硬件设计 传感板硬件设计 执行板硬件设

6、计 网关板硬件设计,传感板软件设计 执行板软件设计 网关板软件设计 Android软件设计,执行单元实现的功能有:数码管的操作、风扇的操作、蜂鸣器报警、语音播放等,执行单元,执行单元,执行单元,概述,1,系统硬件设计,2,系统软件设计,3,Zigbee 模块硬件设计 传感板硬件设计 执行板硬件设计 网关板硬件设计,传感板软件设计 执行板软件设计 网关板软件设计 Android软件设计,网关板的功能有: 从Node1获取信息并进行处理 发送命令控制Node2执行单元 WiFi无线通信 Ethernet网络的访问 GPRS模块入网、短信收发 通过LCD/TP实现人机交互,网关板功能图,网关板实物图

7、,工业串口屏 Main Board上有一个和用户交互的过程,通过Serial Touch Screen实现 屏幕参数:800x480 工业串口屏,带触摸,交互控制单元,Android智能终端交互 Android智能手机与平板电脑作为交互的终端存在,通过Wifi网络与Main Board相连。既可以接受来自传感单元的实时数据,也可以对执行单元及Main Board进行控制。,交互控制单元,概述,1,系统硬件设计,2,系统软件设计,3,Zigbee 模块硬件设计 传感板硬件设计 执行板硬件设计 网关板硬件设计,传感板软件设计 执行板软件设计 网关板软件设计 Android软件设计,软件设计分为三个

8、单元: 传感单元 执行单元 网关单元 下面就对上面的三个单元进行详细的阐述,系统软件设计方案,传感单元概述,硬件实物图,(一)主要功能 1.温/湿度信息的采集2.光照信息的采集 3.三轴加速度信息的采集4.烟雾浓度的采集、门状态的采集5.按键状态6.数据信息的发送,传感单元概述,29,(二)模块组成,传感单元概述,30,传感单元概述,(三) 流程图,NO.1 温湿度采集1.单总线时序:DHT11采用单总线通信(DATA,单线双向),40bit数据,高位先出。8bit(湿度整数)8bit(湿度小数)8bit(温度整数)8bit(温度小数)8bit(校验位),传感单元详述,2.数据采集过程PIO_

9、Configure( / Set io to input,传感单元详述,for(i=0; i3; i+)SetTemIntType(i,传感单元详述,80us低电平-应答信号 80us高电平-通知外设准备接收数据,传感单元详述,使能上升沿中断中断等待使能下降沿中断中断等待俩次中断产生的系统化时钟差(大于临界数值-为1小于临界数值-为0),NO.2 光照 本模块采用ISL29003传感器,本传感器可以感应到光照强度的变化,并进行数据传输,传感单元详述,传感单元详述,ISL29003传感器利用I2C进行读写,时序如下,传感单元详述,反应到程序中的函数调用如下: void Light_Test(ui

10、nt32_t* light_result) *light_result = light_read(); 调用light_read函数,uint32_t light_read(void) uint32_t data = 0;uint8_t buf1;buf0 = ADDR_LSB_SENSOR;I2CWrite(LIGHT_I2C_ADDR, buf, 1);I2CRead(LIGHT_I2C_ADDR, buf, 1);delay_ms(250);data = buf0;buf0 = ADDR_MSB_SENSOR;I2CWrite(LIGHT_I2C_ADDR, buf, 1);I2CRea

11、d(LIGHT_I2C_ADDR, buf, 1);data = (buf0 8 | data);data *= range;data /= width;return data; ,传感单元详述,函数中调用了I2C操作 void I2CWrite(uint8_t addr,uint8_t *buf,uint32_t size) twi_master_write(TWI0,size,buf,addr);void I2CRead(uint8_t addr,uint8_t *buf,uint32_t size) twi_master_read(TWI0,size,buf,addr); ,传感单元详述

12、,传感单元详述,NO.3 三轴加速传感器模块 飞思卡尔公司的 MMA7455L 数字三轴加速度传感器可以感知位置移动信息,NO.3 三轴加速传感器模块 同样,对这个模块的操作也涉及到I2C操作,具体时序如下:,传感单元详述,传感单元详述,NO.3 三轴加速传感器模块反应到系统调用下面的函数就可完成对位置的确定: void Axis3_Test(int8_t *axis_result) acc_read( ,void acc_read (int8_t *x, int8_t *y, int8_t *z) uint8_t buf1;/* wait for ready flag */while (ge

13、tStatus() ,传感单元详述,I2CWrite(ACC_I2C_ADDR, buf, 1);I2CRead(ACC_I2C_ADDR, buf, 1);*y = (int8_t)buf0;buf0 = ACC_ADDR_ZOUT8;I2CWrite(ACC_I2C_ADDR, buf, 1);I2CRead(ACC_I2C_ADDR, buf, 1);*z = (int8_t)buf0; ,传感单元详述,对三个轴分别进行读。即对三个寄存器进行读,不能写,因为是只读寄存器 如何调用该函数:int32_t xoff = 0;int32_t yoff = 0;int32_t zoff = 0;

14、int8_t x = 0;int8_t y = 0;int8_t z = 0; acc_read( 此时的x、y、z才是真正的三轴数据。,传感单元详述,NO.4 A/D转换与烟雾本模块利用MQ-2气体传感器,这个传感器可以检测液化气、甲烷、丙烷、丁烷等气体,传感单元详述,ADC_StartConversion(ADC);adcs = 0xfff 这样gas_result就是我们想要的输出结果。,传感单元详述,NO.5 门磁当有磁铁靠近的时候,根据下面的电路PA16就会输出低电平if(PIO_Get(,传感单元详述,传感单元详述,当传感器的数据都采集完成后,调用以下程序段 if(appState

15、 = APP_JOINED_STATE)sendDataBlock(); data_send.adc_flag = 0; void sendDataBlock(void) APS_DataReq( 然后调用sendDataBlack函数,将数据发送出去。 sendDataBlack调用的是BitCloud协议栈中封装好的APS_DataReq(&apsDataReq)函数,最后要调用SYS_RunTask()在调用 SYS_RunTask()时,系统会调用BitCloud协议栈中的用户应用程序 APL_TaskHandler()。 这样才能发送数据,传感单元详述,概述,1,系统硬件设计,2,系

16、统软件设计,3,Zigbee 模块硬件设计 传感板硬件设计 执行板硬件设计 网关板硬件设计,传感板软件设计 执行板软件设计 网关板软件设计 Android软件设计,硬件实物图,FS_EXCUTE执行单元上有以下几个模块:(1)ZigBee模块; (2)ISD1760语音模块; (3)7段数码管; (4)PWM风扇; (5)蜂鸣器;,执行单元主要模块及功能,54,执行单元模块硬件设计,(1)搜索ZigBee网络; (2)加入ZigBee网络; (3)接收主板命令控制语音模块; (4)接收主板命令控制7段数码管; (5)接收主板命令控制PWM风扇; (6)接收主板命令控制蜂鸣器。外对于执行单元添加

17、这样一项功能:在将执行单元断电之后,重新开机,执行单元会恢复到关机之前的状态。,完成以下的操作:,流程图,网络状态初始化及配置static void initNetwork(void) 网络加入startNetwork(); 发送数据sendDataBlock(); 网络退出leaveNetwork(),执行单元ZigBee网络的建立过程,执行单元ZigBee网络,在事件驱动函数中执行单元接收数据,并进行命令的解析及执行。 static void APS_DataIndData(APS_DataInd_t *ind) memset(execute_buf,0,sizeof(execute_bu

18、f);memcpy(execute_buf,ind-asdu, sizeof(execute_buf);process_dev(execute_buf); 函数process_dev根据收到的数据进行对不同模块的操作:,执行单元解析命令及执行,void process_dev(unsigned char dev) switch(dev0)case 0 : /数码管 disply_num(dev1);break ;case 1 : /蜂鸣器buzz_op(dev1);break ;,执行单元解析命令及执行,case 2 : / 风扇switch (dev1)case 0 : /关风扇 fan_s

19、peed(0);break ;case 1 :fan_speed(30);/一级风break ;case 2 : fan_speed(60);/二级风break ;case 3:fan_speed(90);/三级风break ;break ;,执行单元解析命令及执行,case 3 : / 语音ISD1760_RunTask(dev1,dev2);break ;case 4:printf(“resumern“);resume_state(,执行单元解析命令及执行,数码管操作,执行板上数码管及蜂鸣器的操作通过对I/O引脚的设置完成,通过高低电平的变化控制数码管数字的显示及蜂鸣器的开关操作。 Eg:

20、数码管显示1 case 0x02: PIO_Clear(,数码管操作,蜂鸣器操作,void buzz_op(uint8_t operation) switch(operation)case 0:PIO_Set( ,蜂鸣器操作,PWM风扇操作,PWM风扇操作,(1)首先进行PWM的初始化void fan_bell_init(void) PMC_EnablePeripheral(ID_PWM);PIO_Configure( /通道配置,PWM风扇操作,PWMC_ConfigureClocks(PWM_CMR_CPRE_CLKA , 0, BOARD_MCK);/配置PWM时钟PWMC_SetPer

21、iod( PWM, CHANNEL_PWM_SPEAKER, 100);/设置周期PWMC_SetDutyCycle( PWM, CHANNEL_PWM_SPEAKER, 0);/设置占空比PWMC_EnableChannel( PWM, CHANNEL_PWM_SPEAKER);,(2)接收到改变风扇风速的命令后进行判断switch (dev1)case 0 : fan_speed(0);break ;case 1 :fan_speed(30);break ;case 2 : fan_speed(60);break ;case 3:fan_speed(90); 风速的改变是通过改变占空比完成

22、的: void fan_speed(unsigned char speed) PWMC_SetDutyCycle( PWM, 2, speed); ,PWM风扇操作,语音模块操作,本模块采用ISD1760芯片进行操作,语音模块操作,语音录制说明 4.1 程序下载将“语音录制程序”下载到执行单元发板中。 4.2 设备连接(1)将设备通过USB转串口与PC机相连,使用音频输入/输出线连接PC机的音频输出端,输入端连接到执行单元上。然后再设备管理器中查看设备对应的COM口,并打开对应的COM口。 打开“串口调试助手”,打开相应的COM口:,语音模块操作,根据语音模块的要求,发送0x040d,如上图所

23、示,就会返回如下的信息:,语音模块操作,语音模块操作,(2)开启录音软件打开“VoiceReader.exe”应用程序:,语音模块操作,4.3 录音在进行录音之前,需要定制好协议,根据上层发送而来的命令,执行某一段语音的播放。现制定命令协议如下:开窗帘 0关窗帘 1开左窗 2关左窗 3开右窗 4关右窗 5开灯 6关灯 7 一级风 8二级风 9三级风 10(0x0a)关风扇 11(0x0b开电视 12(0X0c)关电视 13(0x0d)以录制“开窗帘”为例,讲述一下操作过程:,语音模块操作,在串口调试助手以16进制发送命令“0x03 0x00”:,语音模块操作,然后,在“Voice Reader

24、”界面输入“开窗帘”,点击“播放”按钮。 注意:设置的分段录音时间较短,在点击串口助手中的“发送”之后请立即点击“播放”,可以事先将播放的语音设置好。,语音模块操作,录音播放为检验录制效果,可以将录制的声音播放出来。比如播放第一段声音,在串口调试助手端发送“04 00”,则将“开窗帘”播放出来。,语音模块式通过I/O模拟SPI总线实现的 (1)模块初始化 void ISD1760_Init(void ) Isd1760_Configure( 3 ); delay_ms(10);ISD_Reset();ISD_PU(); ISD_ClrInt(); delay_ms(10);printf(“ID

25、 = %Xn“,ISD_RDDevID() ); /读取芯片ID,-1760为0xA0 ISD_CHK_MEM(); /检查环状存储器存储地址是否首尾相连/改变1700内部存储单元或是内部寄存器的指令前,都要加上这个指令。,语音模块操作,ISD_WR_APC2(0x40); /*写APC寄存器,后3位为音量,此设为最大0xA7为最小 0x10 为mic和Analn混合输入 AUD和SP输出 声音最大0x40 为默认值0x00 为只是Analns输入 */ISD_RDAPC(); /读APC寄存器,语音模块操作,(2)根据不同命令执行不同操作 void ISD1760_RunTask(unsig

26、ned char ISD1760_STATE,unsigned char sension) switch(ISD1760_STATE) case 0: Erase_All();printf(“Erase_Alln“);break;case 1: ISD_REC();printf(“ISD_RECn“); break;case 2: ISD_PLAY();printf(“ISD_PLAYn“);break;case 3: ISD_Set_ERASE(sension);/按段擦除录制的声音/ISD_Set_REC(sension);printf(“ISD_Set_ERASE(%d)n“,sensi

27、on);printf(“ISD_Set_REC(%d)n“,sension);break;case 4: ISD_SetPLAY(sension);/按段播放声音/ printf(“ISD_SetPLAY(%d)n“,sension);break;default:break; ,语音模块操作,概述,1,系统硬件设计,2,系统软件设计,3,Zigbee 模块硬件设计 传感板硬件设计 执行板硬件设计 网关板硬件设计,传感板软件设计 执行板软件设计 网关板软件设计 Android软件设计,网关板硬件,网关板的总体流程图,在网关板上移植uCos-ii操作系统,创建多个任务完成整个数据处理。 在Main

28、 board部分,将其分为以下几个任务 Task_Start,完成uCos系统的启动; Task_Wifiin,与Wifi模块交互信息,完成Wifi初始化以及上层命令的接收; Task_Wifiout,向与Wifi网络相连的Android智能手机和Android平板电脑发送数据信息; Task_Gprs,实现报警操作; Task_Rfid,对RFID卡识别,完成对身份的认证; Task_Zigbeein,接收传感单元发送上来的数据; Task_Zigbeeout,向执行单元发送控制命令; Task_Screen,进行数据的显示以及与用户的交互操作。,网关板各个任务介绍,任务的实现如下: voi

29、d Task_Start(void *ppdata) ppdata = ppdata;INT32U clk;clk = sysclk_get_cpu_hz();OS_CPU_SysTickInit(clk * 10); /10ms产生一个节拍 OSStatInit(); / uC/OS-II 统计任务初始化 OSTaskDel(OS_PRIO_SELF); / 初始化以上内容后删除本任务,以减少任务调度时间 起始任务的存在意义就是始终节拍的初始化。,Task_Start线程,Task_Wifiin线程,wifi模块由RedPine公司研发,支持UART模式,支持SPI模式,内嵌TCP/IP协议

30、栈,支持HTTP,支持DHCP,DNS等网络协议。 除此之外,该模块可以自由设置是否使用内嵌的TCP/IP协议,Task_Wifiin线程,wifi_in :初始化网络,完成加入网络,并建立监听套接字。并负责接收从pad发送过来的命令解析,并执行。 wifi_out:将采集板上信息通过soket发送至pad,Task_Wifiin线程,Wifiin_Sem = OSSemCreate(0);Wifiout_Sem = OSSemCreate(0); 系统启动时创建两个信号量,分别控制wifi_in和wifi_out wifi_in信号量于spi中断函数中释放 wifi_out信号量于wifi_

31、in中接收到data请求后释放,所使用信号量,使用tcp/ip内嵌模式,通过spi向module发送命令 spi接口由c1,c2,c3,c4控制host和module的读写,spi接口,在c1,c2,c3,c4后发送word0-word7,有数据包和管理包两种相对应格式。有request和reponse两种,wifi command代码格式,word0-word7对应含义,Request Frame,Response Frame,void Task_Wifiin(void *ppdata) ppdata = ppdata;while(1)wifi_dataflow(); ,循环接受数据,if(

32、WIFICONFIG = 1)WifiFlowOnePart(); / 完成初始化网络,加入网络,并建立监听套接字OSSemPend(Wifiin_Sem, 0, / 接收到从soket发送过来pad对执行板的控制命令,分析并执行相对应函数,初始化网络,初始化前cmd为0 ,每次执行完一次命令后自加,顺序执行完一系列初始化任务 rsi_band(rsi_strApi.band); rsi_spi_mode_sel(22); rsi_init(); rsi_scan(,初始化cmd,int16 rsi_execute_cmd_data(uint8 *descparam,uint8 *payloa

33、dparam,uint16 size_param) 每个命令执行都为调用此函数将构建好的Frame通过此函数从spi发送到module 此函数中重要另一构建Frame函数 void rsi_buildFrameDescriptor(rsi_uFrameDsc *uFrameDscFrame, uint8 *command) 构建出相对应的word0-word7 然后发送,命令执行函数,rsi_socket( 当已经加入网络后,建立监听套接字,创建监听套接字,当有数据来时触发中断,释放wifi_in信号量 OSSemPend(Wifiin_Sem, 0, /* 将packet读取到Frame中

34、然后分析对应recvType */switch (ptrStrRecvArgs-recvType),WifiDataPartTwo(),根据从soket中读出信息 执行相对应操作 play_one_speed(); play_two_speed(); play_three_speed(); play_close_fan(); open_rightwindow(); close_leftwindow(); open_leftwindow(); close_rightwindow(); open_tv(); close_tv(); open_curtain(); close_curtain();

35、turnon_led(); turnoff_led(); buzz_on(1); buzz_on(0);,Wifi_Rcv,如果是data请求者释放信号量wifi_out,wifi_out进程向pad发送data数据处理完后,使能中断,data请求,void Task_Wifiout(void *ppdata) printf(“Task_Wifioutn“);ppdata = ppdata;while(1)OSSemPend(Wifiout_Sem, 0, ,wifi_out进程,等待信号量wifi_out,由wifi_in中如果有data请求着释放 OSSemPend(Wifiout_Sem

36、, 0, 将所有信息放在一个buff中发出,Wifi_Send(),Task_Gprs线程,平台中使用的GPRS是中兴ME3000_V2模块,在系统中只是使用模块实现了发送短信的功能。 模块提供AT指令接口,模块通过AT指令可以方便地跟外部设备进行通信。,Task_Gprs线程,(1)硬件初始化,硬件上GPRS模块与MCU利用USART1进行通信。 进行对模块的操作之前,首先要对硬件进行初始化。 static void configure_GPRS(void) const sam_usart_opt_t usart_console_settings = BOARD_USART_BAUDRATE

37、,US_MR_CHRL_8_BIT,US_MR_PAR_NO,US_MR_NBSTOP_1_BIT,US_MR_CHMODE_NORMAL,/* This field is only used in IrDA mode. */0;,gpio_configure_pin(PIN_USART1_RXD_IDX, PIN_USART1_RXD_FLAGS);gpio_configure_pin(PIN_USART1_TXD_IDX, PIN_USART1_TXD_FLAGS | PIO_PULLUP);pmc_enable_periph_clk(BOARD_ID_USART1);usart_init

38、_rs232(BOARD_USART1, 进行引脚的配置。并设置串口的工作模式:8位数据位、1位停止位、无奇偶校验位、无硬件流控制,速率115200bps。,(1)硬件初始化,(2)流程分析,整个GPRS模块操作的流程由下面的函数完成: void GPRSdataFlow() switch(GPRS_step)case G_INIT :CUR_WORK = GPRSCFG;InitGPRS();GPRS_step = G_READY ;break ;,(2)流程分析,case G_READY:if(readapkgchk() = 1) GPRS_step = G_WAIT ;printf(“r

39、eady to work gprs module rn“);else GPRS_step = G_READY ;break ;case G_WAIT : gprs_op(0,message_t);break ; case G_SMS :,(2)流程分析,switch(SMS_STEP) case SMSREADY :printf(“config the sms rn“);CUR_WORK = SMS ;SMSCONFIG(0); /to choose the text modeGPRS_step = G_GET ;break;case SMSSEND :printf(“config the s

40、ms send to w ?rn“);SMSSENDTO();GPRS_step = G_GET;break;,(2)流程分析,case SMSMSG : SMSSENDMSG();GPRS_step = G_WAIT;break ;case G_GET : readapkg();break ;case G_EXIT: break ; ,(2)流程分析,完成硬件及标志位的初始化。 G_READY 判断返回值以进行下个状态切换 static uint32 readapkgchk(void) if(!read_flag)return 0; uint32_t val = isReady();gprs

41、_data_len = 0;read_flag = 0 ;return val; G_WAIT 调用函数完成对环境状态的判定: uint8_t gprs_op(uint8_t *phone_num, char *message) phone_num = phone_num;message = message;if(testflag = 1)return 0;,(2)流程分析,testflag = 1;else if(temperature0 min_tem) /超过温度下限sen_flag = tem_low_flag;printf(“low:%drn“,min_tem);GPRS_step

42、= G_SMS ;testflag = 1;,(2)流程分析,if(sen_flag)switch(sen_flag)case tem_high_flag: /设置发送短信内容message = tem_high;break;case tem_low_flag:message = tem_low;break;default:break; return 0; ,(2)流程分析,G_SMS 完成信息的发送。其中短信的发送号码由串口屏部分输入。case G_SMS : switch(SMS_STEP) case SMSREADY :printf(“config the sms rn“);CUR_WO

43、RK = SMS ;SMSCONFIG(0); /to choose the text modeGPRS_step = G_GET ;break;,(2)流程分析,case SMSSEND :printf(“config the sms send to w ?rn“);SMSSENDTO();GPRS_step = G_GET;break; case SMSMSG : SMSSENDMSG();GPRS_step = G_WAIT;break ;,设置短信发送模式 发送“AT+CMGF=1”,设置短信的输入模式为文本模式。设置短信发送号码 snprintf(number,30,“AT+CMGS

44、=“%s“rn“,gprs_number);短信发送memcpy(tmpbuf,tem_high,13);tmpbuf14 = 0x1A; for(i=0; i 15 ; i+)usart_write(BOARD_USART1,tmpbufi);,(3)短信发送,流程图,Task_Rfid线程,(1)任务实现: void Task_Rfid(void *ppdata) ppdata = ppdata;while(1)OSSemPend(Rfid_Sem, 0, 任务创建之后等待RFID中断的到来。,Task_Rfid线程,(2)当有卡片进入射频区域时,会引发软件上的一个中断,中断处理函数如下:

45、 static void RFID_Handler(uint32_t a,uint32_t b) a = a;b = b;OS_CPU_SR cpu_sr;OS_ENTER_CRITICAL();OSIntEnter();OS_EXIT_CRITICAL();rfid_pending+; /标志位设置OSSemPost(Rfid_Sem); /释放信号量,触发RFID任务OSIntExit();,Task_Rfid线程,(3)有卡片到来时,进行数据的获取与认证。if( rfid_pending 0) configspirfid();/接口配置rfid_pending=0; RFID_Read_

46、Card(rbuf);/读卡操作NVIC_EnableIRQ(PIOC_IRQn);,Task_Rfid线程,for(i = 0;i id_counter;i+)/身份识别 if(OwnerIdi0 = rbuf2) ,Task_Rfid线程,在rfid.c文件中,有这样的数组用于存储验证卡片的相关信息:uint8_t OwnerIdid_counterid_len = 0xEA, 0x8E, 0x51, 0x28,0xBD, 0x39, 0x30, 0xE8; 修改对应的数组中的数据,可以对不同的RFID卡进行设置。 在RFID_Read_Card函数的实现中有几句注释代码:/*printf

47、(“rn“);for(i=0; i8; i+) printf(“%02X “, rbufi);*/ 作用在于将RFID读取的信息打印出来。如果用户使用不同的卡片时,首先需要将注释的代码打开,编译下载运行。,Task_Rfid线程,再次刷卡串口会打印下面的数据:“BD 39 30 E8”四个字节为RFID卡序列号。 从串口中提出4字节的RFID卡序列号,然后替换数组OwnerId中的数据内容,编译程序重新烧写。当再次进行刷卡操作时,会出现相应效果。,Task_Rfid线程,uint8_t RFID_Operate(uint8_t *tbuf, uint8_t *rbuf) uint8_t chk

48、sum;uint32_t i=0, j, rnumb;chksum = RFID_CheckSum(tbuf);/计算发送数据的校验码SPI_PutGet(1, 0xaa); /根据协议发送0xaaSPI_PutGet(1, 0xbb); /发送0xbbfor(j=0; jtbuf0; j+)rbufi = SPI_PutGet(1, tbufj);i+;,数据(ID号、数据块信息)的读取过程,SPI_PutGet(1, chksum); /发送校验码delay_ms(10);SPI_PutGet(1, 0);if(SPI_PutGet(1, 0) != 0xaa)printf(“error 1n“);return 0;if(SPI_PutGet(0, 0) != 0xbb)printf(“error 2n“);return 0;,数据(ID号、数据块信息)的读取过程,数据(ID号、数据块信息)的读取过程,switch(tbuf1) /返回值数据长度的指定case 0x01:rnumb = 8 + 2 + 1;break;case 0x19:rnumb = 2 + 2 + 1;break;case 0x20:rnumb = 4 + 2 + 1;break;case 0x21:rnumb = 16 + 2 + 1;break;,

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报