无线单片机课程设计--基于WSN的厨房温度气体监控系统
Posted ⁽⁽ଘ晴空万里ଓ⁾⁾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无线单片机课程设计--基于WSN的厨房温度气体监控系统相关的知识,希望对你有一定的参考价值。
基于WSN的厨房温度气体监控系统
一、 题目的要求和意义
课程设计的目的:
本课题是学生们使用单片机和至少两种传感器实现无线通信的项目,主要实现对厨房温度和气体进行实时监测。通过在厨房里安装基于无线传感器网络的温度、气体采集节点来厨房内各点的温度和气体,并以无线传输的方式发送到PC端或者是LCD液晶屏,用户可以通过上位机软件查询数据,能够及时了解到厨房的情况。
课程设计的要求:
基本要求:
1、必须有无线通信
2、必须有两种以上(包含两种)的传感器
3、必须用单片机实现
扩展要求:
1、三个以上(包含三个)的无线通信节点
2、可构建Ad Hoc网络即一种无中心自组织的多跳无线网络
课程设计的意义:
传统的使用线缆直接连接实现信号的传输方式,将严重限制数据采集点的安放灵活性,设备布线困难。而通过无线通信的方式传递数据是一种较为理想的选择,它与有线方式相比主要成本低、携带方便、布线安装简便等特点。
基于WSN的厨房温度气体监控系统不仅可以让人们的生活质量得到提高,而且保障了人民的生命安全。
二、 硬件电路设计
1. 具体电路的设计和参数的计算;
电路的原理图、PCB设计图、3D模型图如下:
图1电路原理图
我负责部分的电路:OLED显示模块电路,电源模块,下载电路。
OLED显示电路设计如下:
引脚说明:
DC:数据或命令切换
RESET:复位
SDA:双向数据线
SCL:时钟信号线
VCC:电源正3.3V
GND:电源地
由原理图可知核心板中的P0_0,P1_7,P1_3,P1_2,3V3,GND引脚分别与OLED显示屏的6个引脚对应相接。
本次设计采用模块级设计,故只需购买OLED显示屏模块即可,OLED显示屏模块的电路图如下:
电源模块电路设计如下:
ASM1117-3V3是电压降压芯片,作用是将输入的5V电压降至3.3V
C1、C2是输入电容,作用是防止断电后出现电压倒置,
C3、C4是输出滤波电容,作用是抑制自激振荡和稳定输出电压。
下载电路设计如下:
引脚说明:
第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电压
为了更好的理解程序下载的实现,给出仿真器内部电路图如下:
2. 电路性能测试与结果分析
OLED显示电路:
通电后,经过数字万用表测量得
VCC引脚与GND引脚之间的电压为3.28V
结果分析:测量的结果在误差允许范围内
电源模块电路:
通电后,经过数字万用表测量得
3号引脚,即未经过AMS1117芯片的引脚的电压约为5.08 V
2号引脚,即经过AMS1117芯片的引脚的电压约为3.28V
结果分析:说明AMS1117芯片起到了对输入电压起到降压的作用
下载电路:
通电后,经过数字万用表测量得
VCC引脚与GND引脚之间的电压为3.28V
结果分析:测量的结果在误差允许范围内
三、软件设计
1. 主程序流程图;
协调器节点:
图12 协调器节点流程图
终端节点:
图13 终端节点流程图
子程序流程图;(无)
我负责部分的软件设计:组建无线通信和组网,上位机软件制作
无线通信:一般在具体项目开发过程中,通信双方需要提前定义好数据通信的格式,一般需要包含数据头、数据、校验位、数据尾等信息,为了简化本次项目的难度,使用的数据包格式如表1所示。
在项目开发过程中,使用到数据包时,一般会使用共用体将整个数据包所需要的数据包含起来,这样编程效率较高,在本实验中使用的结构体定义如下:
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函数后,如果是协调器将将建立网络,如果是终端设备将加入网络。
上位机软件制作:
串口助手选用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 = floatReadDs18B20() ; //读取温度函数
qvalue = 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];//温度小数位
uint8 t = (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的宏来区分不同的终端。
#define ID "E1 " //针对终端有效,取值E1 ,E2
strcpy(temperature.BUF.Head1,ID) ; //填充数据头1
五、课程设计体会
通过此次课程设计,我更加扎实的掌握了有关单片机方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。
通过这次课程设计,我掌握了使用zigbee协议栈进行无线组网通信的方法;熟悉了上位机软件的制作;了解了通信协议的制定;以及如何提高电路的性能等等。此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研, 动脑思考,动手实践,就没有弄不懂的知识。
课程设计的过程中,也对团队精神的进行了考察,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。
六、参考文献
[1] QST青软实训.ZigBee技术开发[M].北京:清华大学出版社,2015
[2]王小强. ZigBee无线传感器网络设计与实现[M].北京:北京工业出版社,2012
以上是关于无线单片机课程设计--基于WSN的厨房温度气体监控系统的主要内容,如果未能解决你的问题,请参考以下文章
基于单片机的饮水机温度控制系统基于单片机继电器及双向可控硅控制照明设备基于单片机的液位自动检测控制仿真设计基于单片机家用厨房天然气火灾报警器系统-设计全套资料
基于单片机热电偶智能体温检测系统设计-基于单片机一氧化碳CO有毒气体采集报警系统设计-基于单片机热电偶智能体温检测系统设计(仿真,原理图,报告)资料转发分享