1. 经过陆陆续续的几个双休日和考试周里的空闲时间里的编写和调试,终于于2015/12/26今天晚上大体完成了智能家居的调试工作!总算是没有半途而废,耐心也受到挑战。
2. 几个比较复杂的重要的模块,前面已经做过总结,这里不再赘述,配合起来使用,还是会存在一些延时导致的时差问题,会使得项目的工作不是很流畅,特别是加了温湿度模块以后,会在执行几次后,出现长时间的等待,然而在独立的模块调试的时候,是正常的,这真是费解。解决方法下面详述。
3. 因为是基于NRF模块的,所以,无线控制是这个智能家居的特点,2.4GHz也是这么来的,这个项目不能实现大量数据的实时传输,因为数据长度有限,还有51单片机的处理速度的限制,所以,只用NRF做发送和接收命令使用,也是很有用的一款模块,还可以扩展到其他项目上去,如遥控小车,无线四轴飞行器等等。这次能够调通,我也是花了一番精力和耐心的,当然,在前人的调试经验上,再去调试,简直事半功倍!NRF的程序虽然是我在参照别人代码的基础上写出来的,但是我自己写的每一行代码,我都能理解,并且做出相应的修改,使得收发一体,而不是简单的测试通不通。
4. 主数据接收端(普中的51开发板):这个单片机是我以前自学的时候买的,总体上说功能挺全,这次用来作为数据的总接收端,对采集机发送过来的四个字节的数据进行辨析,做出相应的现实,使用到的有,LCD12864,矩阵键盘,NRF24L01模块。最后经过处理的数据在LCD12864上显示出来,作为交互界面。
5. 主数据接收端:这里的主要思路是,首先做各种初始化,然后循环设置本机为接收模式,然后实时接收数据。由于程序中,我找不出为什么在接收了四个字节的数据包以后,本机就一直循环的,不停的接收这个包的最后一个字节,完全停不下来,所以,为了避免这个错误,我对采集的数据进行分析,要是四个数据相同,那么就作废,因为正确的数据包四个字节数据相同的概率很小。当然,为了辨清是本机上循环误读还是采集端上发来的数据,就需要在采集端上,做数据清空的时候,把原始包中的数据就置为不一样,这样才能在本机中辨识出来!
if((Rx[0] == Rx[1]) && (Rx[1] == Rx[2]) && (Rx[2] ==Rx[3]))//主机判断字节,要是相等,则作废
{
memset(Rx,0xff,4*sizeof(unsigned char));
}
//采集端的清空操作,实际上就是把包内数据变得不一样
void init_Tx()
{
Tx[0]= 0x01;
Tx[1]= 0x02;
Tx[2]= 0x03;
Tx[3]= 0x04;
}
6. 主数据接收端:还有一提的就是,千万要注意LCD12864使用的默认引脚,虽然不需要你接很方便,但是不接就会出现不小心重复使用某些引脚,导致错误,每次使用前,查询原理图很有必要!
7. 采集端(德飞莱开发板):这款开发板是我在苏嵌培训使用的一块板子,板子总体上来说很优秀,使用也很方便,所以,被我用来作为数据的采集和发送端,简称采集端。
8. 采集端:我这次加了的模块有,人体红外感应模块(有人时输出高电平),烟雾报警模块(有烟雾时输出低电平),温湿度传感器(湿度整数+湿度小数+温度整数+温度小数+总校验字,总校验字 = (取低八位)(湿度整数+湿度小数+温度整数+温度小数)),直流电机(模仿空调),步进电机(模拟窗帘或者窗户),NRF模块。
9. 采集端:从使用上来说,人体红外感应模块和烟雾报警器最最简单,也最容易上手,所以加进去基本没什么问题,就是人体红外感应模块在上电以后的一分钟内需要预热,所以调试的时候要耐心等待。
10. 采集端:直流电机和步进电机也并不难,在自学了以后就用起来了,简单的。有点问题的就是我最上面说的温湿度模块的问题。因为它在读取数据的时候,是单总线操作,其中需要延时等操作,虽然单独的模块调试的时候没有问题,但是在加入到整个项目中,想要整合的时候却出现了问题,采集温度的时候,最多能采集五次,最少两次,就在温湿度模块函数中的一个地方死循环了,可能是因为我用了while来滤过某个电平,但是也不至于前几次可以,后面就不行了吧?一旦停下来,整个项目就不工作了,这是我后期主要解决的问题。解决方案是,让采集端先只采集一次,采集完将数据放在本地的全局变量中就不再采集了,这样我就可以最起码有一次是正确的温湿度,发送的时候我让包的最后两个字节保存了温度的整数部分和湿度的整数部分,发送到主接收端同样也本地保存。然后,设置一个按键,按下就通知采集端采集一次温度,这样就避免了连续采集温度导致的程序死循环的问题,其实是很差的出错处理,但是我知道想要改出来难度很大,因为程序中延时用的很多,比较难以控制。
11. 采集端:采集端在加入温湿度模块以后,还会影响数据的发送速度,设置为一秒发一次,但是最长的有十二秒以后我才收到,我也是无语的,可能是我程序中还存在不完善,这是有待我改进的。
12. 采集端:步进电机和直流电机中,直流电机比较简单,开就是开,关就是关,需要说明的是步进电机。因为是模拟窗帘或者窗户的开端,但是也不能无限制的开或者关,所以我设置了开关限度的全局变量,不能使得它不停的往一个方向不停转动,要有限度。
正转:
step_num ++;//全局变量
if(step_num < 8)
{
control_StepMotor(0);
}
if(step_num>= 8)//大于8了就不再做了,保持8,作为反相的初始值
{
step_num= 8;
}
反转类似如此。
13. 采集端:项目还差的就是光照感应模块,及其模块控制的LED灯环节,这个因为项目验收时间有限,我也是一人之力,所以不打算加入这个模块了。
14. 项目BUG:存在问题有(1)本来要数据采集端开始时采集一次温湿度的,但是还是不能实现,只能通过手动发送命令,要采集端对温湿度模块进行采集。(2)加入温湿度模块以后,发送最新数据包的周期明显变长而且不稳定。(3)人体感应模块会偶尔在没人的时候也检测到,我觉得应该是干扰,这个问题解决也比较茫然。(4)使用电机来模拟空调以后,会明显的拉长数据收集的周期,偶尔会出现死循环,这是我这个项目里最头疼的地方了。
15.在前期做完的基础上,解决了两款单片机之间传输数据慢,延时长,时效性不高的问题。
解决:采用外部中断解决,将耗时函数,例如采集温湿度,放在中断服务函数中完成,进入外部中断时,整个程序都停止,这样就不会出现项目发送间隔不定,或者过长的问题。
同时也解决了14所列的问题,温度采集可以连续采集了,人体感应换了一个模块以后也稳定了。采集时间的话,频率加快了,虽然还是不是很稳定,但是时效性比加入中断方式前好了很多。
电机部分也能够正常工作,就是发出命令以后,还是要一定的时间才能恢复正常的通信,但是是能够接受的。
至此单片机项目--智能家居项目基本完成,准备开始做wifi视频小车!---------------------2016/1/16
16. 总结:总的来说,也没白花费我这么长时间的编程和调试,也算是小有成果吧,下午刚刚完成微处理器比赛,晚上这个花了好长时间的项目也接近尾声,算是我给自己的一个交代,在这个NRF模块使用成果的基础上,我后续还要尝试其他项目,我想肯定是减轻了不少的负担。