将单片机项目实训——基于nRF905的多点温度无线采集系统分享出来,如有不足,敬请指出。
【实验图片】
【实验视频】
基于nRF905的多点温度无线采集系统设计
目录
目录
一、设计要求
系统采用NRF905作为无线收发器,四个从机采集到温度信息分别发送给主机,主机显示四点的温度信息,并且可通过按键设定温度的上下限报警值,超限能够进行声光报警。
二、方案设计
随着技术的发展,基于无线的信息传输方式越来越成熟,与有线的信息传输方式相比,无线的方式易于安装和后期维护。NRF905单片无线接收器是挪威Nordic公司推出的单片射频发射器芯片,工作电压为1.9V~3.6V,工作于433、868、915MHZ 3个ISM频道,通过SPI接口与MCU连接。由于51单片机没有SPI接口,可以通过软件模拟SPI通信协议进行通信。系统方案框图如下图所示。
三、硬件电路设计
从机用DS18B20温度传感器进行温度采集,DS18B20是美国Dallas半导体公司的数字化温度传感器,其单总线控制方式最大限度的节省单片机有限的IO口资源,其I/O口和单片机第8脚P17相连。从机电路原理图如下图所示。
主机使用LCD1602液晶屏进行显示,LCD1602液晶屏内置常用的ASCII码,有两种驱动方式,本设计考虑到显示数据的刷新速度,决定采用并口驱动方式;按键使用独立按键控制方式;声光报警部分采用蜂鸣器加LED指示。主机电路原理图如下图所示。
无线收发器均采用挪威Nordic公司推出的NRF905单片无线收发器。
思考:通过对比从机、主机原理图,发现其中一部分电路是相同的,也有部分差异,如果绘制PCB打样,需要设计两种PCB电路,考虑到成本与实际设计需要,作者本人设计了“主从一体机”,也就是从机、主机都是一样的电路,只是在具体焊接时部分器件不用焊接。
主从一体机原理图如下所示:
备注:D1~D8指示灯的含义:
D1:1号从机测量的环境温度低于温度下限;
D2:1号从机测量的环境温度高于温度上限;
D3:2号从机测量的环境温度低于温度下限;
D4:2号从机测量的环境温度高于温度上限;
D5:3号从机测量的环境温度低于温度下限;
D6:3号从机测量的环境温度高于温度上限;
D7:4号从机测量的环境温度低于温度下限;
D8:4号从机测量的环境温度高于温度上限;
四、软件设计
主机首先对从机分别分配不同的地址,然后通过地址来区别收到的数据是哪一个从机发来的。4个从机将温度传感器DS18B20测得温度值通过NRF905无线模块将数据传输给主机。
(一)从机发送端
1.主程序:
void main()
{
system_init();
while(1)
{
DS18B20_ReadTemperature(&temp);
display();
send();
}
}
2.程序分析
(二)主机接收端(下载链接在文章第六部分)
1.主程序
void main(void)
{
System_Init();
while(1)
{
Receive_Data();
Display();
Limit_Set();
Alarm();
}
}
2.程序分析
五、其他图片
(一)PCB -3D视图
1.主机-PCB-3D 正反面
2.从机-PCB-3D 正反面
(二)系统实物图
1.整体效果图
2.1号从机图
3.2号从机图
4.3号从机图
5.4号从机图
6.主机图
7.PCB空板图-正面
7.PCB空板图-背面
9.PCB-主机散件
10.PCB-从机散件
11.PCB-主从机散件
六、资料链接
(1)作品演示视频链接
链接①:哔哩哔哩--------点击播放
链接②:优酷视频--------点击播放
链接③:爱奇艺--------点击播放
链接④:腾讯视频--------点击播放
链接⑤:搜狐视频--------点击播放
(2)硬件电路分析视频:
链接①:哔哩哔哩--------点击播放
链接②:优酷视频--------点击播放
链接③:爱奇艺--------点击播放
链接④:腾讯视频--------点击播放
链接⑤:搜狐视频--------点击播放
(3)软件程序分析视频:
链接①:哔哩哔哩--------点击播放
链接②:优酷视频--------点击播放
链接③:爱奇艺 --------点击播放
链接④:腾讯视频--------点击播放
链接⑤: 搜狐视频--------点击播放
(4)原理图链接:
方案一:主机、从机分开设计
方案二:主从一体机
(5)源程序下载:
七、关于作者
八、后记
1.在做完第一版的作品之后,作者有些后悔,原因是从机代码、主机代码是二套代码程序,并且1号从机、2号从机、3号从机、4号从机,需要根据不同的编号修改从机代码中的一个宏定义,然后编译、下载到不同的从机里面去,这样不是很“智能化”。最好是1号从机、2号从机、3号从机、4号从机、主机都是同一套代码,下载到所有板子中去。具体想法很简单:增加一个3位的拨码开关,第1位拨码开关不同状态表示是主机还是从机,第2位、第3位拨码开关不同的状态表示当前是1号从机、2号从机、3号从机还是4号从机,软件成本很低,就是硬件方面需要重新修改PCB、送工厂打样、焊接,暂时就不做这个了,将想法记录在这里,有兴趣的朋友可以去试试做一下。
2.假设一种情形:1号从机、3号从机、4号从机开机,2号从机不开机,那么主机与1号从机通信后,准备和2号从机通信,这时候主机会貌似“卡死”,当然这是作者在代码中设定的通信机制,实际上这个机制也不够“智能”,应该是发现2号从机没有发送信息,就与下一个从机进行通信。这里有三种方法解决该问题:
方法一:在等待2号从机的发送数据的地方,增加一个时间或者次数设置,过了一定的时间,发现2号从机没有发送信息,就准备和3号从机通信。这个方法是作者首先想到的方案,软件成本低,貌似可以解决问题。这个方法在既定的方案中,可以暂时解决这个问题,但是不是一劳永逸的方法。因为两个原因:第一是这个时间的设置,如果设置小了,从机2还在执行其他部分代码,还没有发送数据,这时候主机可能会因为没有等到信息就放弃和它的通信了,可能导致数据的丢失,并且这种丢失如果在3号从机、4号从机……中不断地叠加,导致主机显示的温度值看起来 “不变化”了。如果这个时间设定大了,这时候1号从机、3号从机、4号从机开机,2号从机关机,会因为“等待”2号从机,消耗一段时间,导致其他从机的温度数据刷新不够“及时”了。第二是采用这种方法,这个数值当然要实验,但是如果这个数值实验好了,设定在主机程序中了,这时候客户要求增加从机的功能,那么又要对这个数值进行新的实验,就显得这个方法不够“智能”了。
方法二:在主机开机时,分别去检查从机是否在线,如果在线的,就将它的地址作为有效地址,将不在线的设备作为无效地址,然后主机只需去和在线的机器进行通信即可。但这个方法有两个问题:第一是不符合我们的日常习惯,日常习惯应该是这样,发现设备不在线,就不消耗时间去和它通信,但是发现从机设备一旦开机,状态从离线变为在线后,就需要和它通信并及时更新他的数据了。第二是这种方案涉及到主机发送信息、从机回复信息并返回温度数据,涉及到双向的通信,这种多个设备之间的通信功能上肯定是可以实现的,不过双向的通信时间上不知道怎么样,数据的“刷新”不知道时候可以让我们满意,暂时未进行实验,而且这样的通信显得过于繁琐。
方法三:通过CD和AM的监测,判断是否有必要和该从机进行通信。
这个方案目前是较好的,在选择该方案前,需要做一个实验,如果实验成功,就可以使用该方法,具体做法:从机对nRF905参数设置后while(1)进行“卡死”(原因暂不解释),主机通过CD和AM进行检测,如果可以,就可以使用该方案。该方法作者暂未实验,后续补充。
方法三实验结果:待补充!!!
3.(2024.11.28记录)该实验中对于温度上限、下限的设置有一个细节需要完善,就是设置好温度的上限、下限之后,应该做好保存,最好是保存在EEPROM中,可以保障掉电以后,我们设置好的报警限制值是保存下来的,重新上电不至于重新设置,这样也较符合日常习惯,因为可以采用两种方法。(方法一)硬件完善,增加EEPROM,例如AT24C02系列芯片就可以。(方法二)采用单片机内部的EEPROM,例如STC89C52RC单片机内部的EEPROM,这里可以采用方法二,减少硬件开发成本,只需要加入程序代码即可,具体方法可以参考STC手册或者我的另一篇文章“【出坑笔记】正确使用STC单片机内部EEPROM”
4.没有完美的产品,只有相对较好的产品,只要敢去想、善于实验验证,就能够不断完善作品!