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

本文主要是介绍无线单片机课程设计--基于ZigBee的厨房温度气体监控系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于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/offunsigned 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

最后:
需要资料的可以自行下载。下载链接
下载操作:
在这里插入图片描述

这篇关于无线单片机课程设计--基于ZigBee的厨房温度气体监控系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/708842

相关文章

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

springboot2.1.3 hystrix集成及hystrix-dashboard监控详解

《springboot2.1.3hystrix集成及hystrix-dashboard监控详解》Hystrix是Netflix开源的微服务容错工具,通过线程池隔离和熔断机制防止服务崩溃,支持降级、监... 目录Hystrix是Netflix开源技术www.chinasem.cn栈中的又一员猛将Hystrix熔

基于Python实现温度单位转换器(新手版)

《基于Python实现温度单位转换器(新手版)》这篇文章主要为大家详细介绍了如何基于Python实现温度单位转换器,主要是将摄氏温度(C)和华氏温度(F)相互转换,下面小编就来和大家简单介绍一下吧... 目录为什么选择温度转换器作为第一个项目项目概述所需基础知识实现步骤详解1. 温度转换公式2. 用户输入处

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默

在Linux系统上连接GitHub的方法步骤(适用2025年)

《在Linux系统上连接GitHub的方法步骤(适用2025年)》在2025年,使用Linux系统连接GitHub的推荐方式是通过SSH(SecureShell)协议进行身份验证,这种方式不仅安全,还... 目录步骤一:检查并安装 Git步骤二:生成 SSH 密钥步骤三:将 SSH 公钥添加到 github

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方