课程设计|无线单片机课程设计--基于WSN的厨房温度气体监控系统

基于WSN的厨房温度气体监控系统 一、 题目的要求和意义 课程设计的目的:
本课题是学生们使用单片机和至少两种传感器实现无线通信的项目,主要实现对厨房温度和气体进行实时监测。通过在厨房里安装基于无线传感器网络的温度、气体采集节点来厨房内各点的温度和气体,并以无线传输的方式发送到PC端或者是LCD液晶屏,用户可以通过上位机软件查询数据,能够及时了解到厨房的情况。
课程设计的要求:
基本要求:
1、必须有无线通信
2、必须有两种以上(包含两种)的传感器
3、必须用单片机实现
扩展要求:
1、三个以上(包含三个)的无线通信节点
2、可构建Ad Hoc网络即一种无中心自组织的多跳无线网络
课程设计的意义:
传统的使用线缆直接连接实现信号的传输方式,将严重限制数据采集点的安放灵活性,设备布线困难。而通过无线通信的方式传递数据是一种较为理想的选择,它与有线方式相比主要成本低、携带方便、布线安装简便等特点。
基于WSN的厨房温度气体监控系统不仅可以让人们的生活质量得到提高,而且保障了人民的生命安全。
二、 硬件电路设计 1. 具体电路的设计和参数的计算;
电路的原理图、PCB设计图、3D模型图如下:
课程设计|无线单片机课程设计--基于WSN的厨房温度气体监控系统
文章图片

图1电路原理图
课程设计|无线单片机课程设计--基于WSN的厨房温度气体监控系统
文章图片

课程设计|无线单片机课程设计--基于WSN的厨房温度气体监控系统
文章图片

我负责部分的电路:OLED显示模块电路,电源模块,下载电路。
OLED显示电路设计如下:
课程设计|无线单片机课程设计--基于WSN的厨房温度气体监控系统
文章图片

引脚说明:
DC:数据或命令切换
RESET:复位
SDA:双向数据线
SCL:时钟信号线
VCC:电源正3.3V
GND:电源地
由原理图可知核心板中的P0_0,P1_7,P1_3,P1_2,3V3,GND引脚分别与OLED显示屏的6个引脚对应相接。
本次设计采用模块级设计,故只需购买OLED显示屏模块即可,OLED显示屏模块的电路图如下:
课程设计|无线单片机课程设计--基于WSN的厨房温度气体监控系统
文章图片

电源模块电路设计如下:
课程设计|无线单片机课程设计--基于WSN的厨房温度气体监控系统
文章图片

ASM1117-3V3是电压降压芯片,作用是将输入的5V电压降至3.3V
C1、C2是输入电容,作用是防止断电后出现电压倒置,
C3、C4是输出滤波电容,作用是抑制自激振荡和稳定输出电压。
下载电路设计如下:
课程设计|无线单片机课程设计--基于WSN的厨房温度气体监控系统
文章图片

引脚说明:
第1Pin:GND
第2Pin:目标板电压检测,该信号用于支持宽目标电压,需要目标板为仿真器提供
第3、4Pin:在线调试或下载通信接口
第5、6、8、10Pin:协议分析或者由Smart Studio直接控制芯片的通信接口
第7Pin:芯片复位信号
第9Pin:仿真器提供的3.3V电压,最大可提供500MA电路
以上10个引脚中,只有GND/DC/DD/RESET为必须连接的引脚,其他均为可选。
若想要支持Packet Sniffer软件(用于抓取无线数据包),其余的SPI接口也要连接的目标板上
若想要使用仿真器对目标板进行供电,需接上9号引脚,可对目标板提供3.3V电压
为了更好的理解程序下载的实现,给出仿真器内部电路图如下:
课程设计|无线单片机课程设计--基于WSN的厨房温度气体监控系统
文章图片

2. 电路性能测试与结果分析
OLED显示电路:
通电后,经过数字万用表测量得
VCC引脚与GND引脚之间的电压为3.28V
结果分析:测量的结果在误差允许范围内
课程设计|无线单片机课程设计--基于WSN的厨房温度气体监控系统
文章图片

电源模块电路:
通电后,经过数字万用表测量得
3号引脚,即未经过AMS1117芯片的引脚的电压约为5.08 V
2号引脚,即经过AMS1117芯片的引脚的电压约为3.28V
结果分析:说明AMS1117芯片起到了对输入电压起到降压的作用
课程设计|无线单片机课程设计--基于WSN的厨房温度气体监控系统
文章图片

下载电路:
通电后,经过数字万用表测量得
VCC引脚与GND引脚之间的电压为3.28V
结果分析:测量的结果在误差允许范围内
课程设计|无线单片机课程设计--基于WSN的厨房温度气体监控系统
文章图片

三、软件设计 【课程设计|无线单片机课程设计--基于WSN的厨房温度气体监控系统】1. 主程序流程图;
协调器节点:
课程设计|无线单片机课程设计--基于WSN的厨房温度气体监控系统
文章图片

图12 协调器节点流程图
终端节点:
课程设计|无线单片机课程设计--基于WSN的厨房温度气体监控系统
文章图片

图13 终端节点流程图
子程序流程图;(无)
我负责部分的软件设计:组建无线通信和组网,上位机软件制作
无线通信:一般在具体项目开发过程中,通信双方需要提前定义好数据通信的格式,一般需要包含数据头、数据、校验位、数据尾等信息,为了简化本次项目的难度,使用的数据包格式如表1所示。
课程设计|无线单片机课程设计--基于WSN的厨房温度气体监控系统
文章图片

在项目开发过程中,使用到数据包时,一般会使用共用体将整个数据包所需要的数据包含起来,这样编程效率较高,在本实验中使用的结构体定义如下:

typedef union h { uint8 TEMP[36]; struct RFRXBUF { char Head1[3] ; //数据头'E1 ' /'E2 ' char ip1[2]; //温度提示'T:' char Tvalue[4] ; //温度数据 unsigned char Tail1 ; //温度尾 'C' unsigned char gap1 ; //数据间隔' ' char ip2[4]; //气体提示MQ2: , unsigned char Qvalue[2] ; //气体数据 unsigned char Tail2 ; //气体尾 '%' char Rn[2]; //回车换行'\r\n' char Led1[4]; //灯提示Led: char Led2[3]; //灯状态on/off unsigned char gap2 ; //数据间隔' ' char Beep1[5] ; //蜂鸣器提示Beep: char Beep2[3] ; //蜂鸣器的状态on/off }BUF ; }TEMPERATURE

使用一个共用体来表示整个数据包,里面有两个成员变量,一个是数组TEMP,该数组有36个元素;另外一个是结构体,该结构具体实现了数据包的数据头、温度数据、气体数据、数据尾…,结构体所占的也是36个字节
ZigBee组网流程 建立网络和设备入网:
平时我们只关心应用层,会组网,实现传感器的数据采集,无线传输就算掌握ZigBee通讯了,并非每个人都需要了解底层代码运行情况。
值得注意的是:ZDApp_Init(taskID++); //ZDApp层初始化,执行ZDApp_init函数后,如果是协调器将将建立网络,如果是终端设备将加入网络。
上位机软件制作:
课程设计|无线单片机课程设计--基于WSN的厨房温度气体监控系统
文章图片

串口助手选用Visual C#开发语言和Visual Studio 2012开发平台进行开发,实现的主要功能如下:
1需要用户名和密码才能登录软件——可以保障用户的隐私
2可用串口扫描——精确且快速的找到可以打开的串口号
3保存和读取数据——可以对数据进行保存和读取,方便后期查看
4显示接收数据的时间——用户可以知道数据到来的时间
5定时发送——用户可以设定在几秒甚至几小时后发送控制命令
四、调试记录 (重点内容) 1. 调试时间:6到10周
2. 调试中遇到的问题
问题1:移植队友写好的代码出现编译错误
问题2:如何让终端将采集的数据发送给协调器
问题3:接收到的数据无法正常显示
问题4:OLED屏无法显示温度小数后一位
问题5:无法区分是哪个终端发过来的数据
3. 解决的方法
解决1:加入相应的头文件,并在头文件里声明函数。
解决2:步骤如下
1) 定义一个事件标识符 如#define SEND_DATA_EVENT 0x01
2) 在系统事件里的网络状态改变事件中即case ZDO_STATE_CHANGE:语句后面设置自己定义事件的函数:osal_set_event(GenericApp_TaskID,SEND_DATA_EVENT);
3) 在if(events & SEND_DATA_EVENT)语句中放入发送数据的函数和下一次再执行SEND_DATA_EVENT事件的定时器函数osal_start_timerEx()。
解决3:
tvalue = https://www.it610.com/article/floatReadDs18B20() ; //读取温度函数
qvalue = https://www.it610.com/article/GetMq2() ; //读取MQ2的浓度
通过调用队友写好的函数返回值是一个数值,而发送到串口中的数据应该是字符串才行
可以将其转换为字符串格式再加载到数据包中:
sprintf(strTemp, "%.01f", tvalue); //将温度数据转成字符串 strcpy(temperature.BUF.Tvalue,strTemp); //将字符串型的温度数据复制到数据包 temperature.BUF.Qvalue[0] = qvalue / 10 + '0' ; //将气体数据转化为字符串 temperature.BUF.Qvalue[1] = qvalue % 10 + '0' ;

解决4:
终端发送过来的数据包中温度数据中数组的第5-8位,所以可以将温度的十位、个位、小数位分别取出来,将其由字符串格式转换为数值,之所以无法显示小数后一位,是因为我对温度数据进行如下处理
uint8 t = (t1-‘0’)*10+(t2-‘0’)+(t3-‘0’)/10;
因为(t3-‘0’)/10这个值永远为0,小数部分被抹除,故做如下处理
uint8 t1 = pkt->cmd.Data[5]; //从数据包中读取温度十位 uint8 t2 = pkt->cmd.Data[6]; //温度个位 uint8 t3 = pkt->cmd.Data[8]; //温度小数位 uint8t = (t1-'0')*10+(t2-'0'); //将十位数和个位数结合 uint8 t4 = (t3-'0'); //温度小数 sprintf(buff, "E1 T:%d.%d MQ2:%d", t,t4,mq2); HalLcdWriteString(buff,HAL_LCD_LINE_1); //OLED第1行显示数据

解决5
由于我们的终端是同时采集温度和气体数据的,故发过来的数据难以区分。
为了区分不同终端发过来的数据,在数据包中的数据头放入ID这个宏定义,在下载终端程序的时候可以通过修改ID的宏来区分不同的终端。
#defineID"E1 "//针对终端有效,取值E1 ,E2 strcpy(temperature.BUF.Head1,ID) ; //填充数据头1

五、课程设计体会 通过此次课程设计,我更加扎实的掌握了有关单片机方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。
通过这次课程设计,我掌握了使用zigbee协议栈进行无线组网通信的方法; 熟悉了上位机软件的制作; 了解了通信协议的制定; 以及如何提高电路的性能等等。此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研, 动脑思考,动手实践,就没有弄不懂的知识。
课程设计的过程中,也对团队精神的进行了考察,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。
六、参考文献 [1] QST青软实训.ZigBee技术开发[M].北京:清华大学出版社,2015
[2]王小强. ZigBee无线传感器网络设计与实现[M].北京:北京工业出版社,2012

    推荐阅读