基于WiFi的温度采集与控制系统
项目设计报告
版?本?号:V1.0
项目名称:??????????基于WiFi的温度采集与控制系统??????????????????????
设计周期:? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
项目团队:? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
项目组长:??????? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
拟 制 人:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
完成日期:???????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?????????????
?
-
- 项目概述
随着现代信息技术的飞速发展,温度采集与控制系统在社会生产生活中扮演着一个越来越重要的角色,它对人们的生活具有很大的影响,所以温度采集控制系统的设计与研究有十分重要的意义。从目前温度控制的产品现状及国内外的市场前景来看,温度采集与控制课题是一个成熟的有市场潜力的研究项目。该课题的研究不仅能够解决国内在这方面研究的弱势,而且能够迅速适应市场发展,满足国内外市场的需求。目前我国农业经济占很大比例,而温控系统在农业生产中显得尤为重要,并且由过去单因素控制向利用环境计算机进行多因子动态控制的展,以后更趋于智能化、网络化和节能化发展。由于所学理论知识和学校所提供器件都有限,本次设计采用单片机技术完成,控制功能比较简单,很容易就能实现,其他的模块电路采用的是最基本电子技术。本设计最重要的是用单片机软件编程实现功能,它的编程思想方法仍值得学习和研究,为温控系统的进一步研究奠定基础。
-
- 设计任务和要求
本次设计以常见的温度传感器DS18B20为基础,结合单片机STC89C52,以及当前低价高性价比的热门芯片ESP8266WiFi芯片,WM-USB2UART模块,同时使用App?Inventor软件开发手机APP,开发一个实时温度监控系统。单片机通过温度传感器对温度实施实时的采集,并通过LCD1602将温度数据实时显示并且上传到手机App。外部设备没有独立电源,可用WM-USB2UART模块给外部设备供电,提供3.3V、5V两种规格直流电源。
- 项目管理目标
团队成员必须按照分配任务定期完成,不能因为个人导致团队的进度无法推进。
项目产品的设计需采用合适的器件,争取最小成本实现完整稳定的系统。
- 个人技术提升目标
通过项目开发的锻炼,能够熟练掌握一个控制系统的开发流程,熟悉STC89C52RC、DS180B20DLCD1602、WM-USB2UART模块、ESP8266WiFi模块等各个模块的使用方法和原理,能够测试软件、硬件功能并找出问题。
- 项目产品性能实现目标
有显示屏将实时温度采样值、设置信息显示出来
通过手机?APP控制显示
通过WiFi模块传送数据
- 工作量评估及团队分工
根据项目实现难度和工作量,考虑个人能力,完成本项目预计需1~3人,推荐2人完成,默认A为项目组长。
按推荐的2人完成,需要1周时间来完成。如果1人或3人完成,时间加减3天。
具体的工作内容、时间及人员安排见下表:
表1工作内容
项目CDIO阶段任务描述 | 工作内容 | 人员分工(A,B两人) | 时间安排(天) | 成果输出 | C | 进行项目产品需求整理和确认,产品实现原理、方案和架构、规格等分析论证和整理 | 原理图设计、产品效果预测、市场需求调查 | | 一天 | 设计好电源原理图,并且通过调查发现在高校中像这种产品的需求量还是很大的,预测产品效果也较佳。 | D | 进行项目软硬件详细设计,包含硬件电路理论分析,软件和程序流程梳理,关键算法分析等,最后完成硬件电路原理图PCB设计,软件和程序编码工作 | 软件设计 | | 一天 | 通过原理图在proteus上进行仿真,并且达到预计效果。 | 硬件设计 | | 一天 | 通过在相关软件个画原理图转换PCB板,制作出对应的PCB板。 | I | 进行项目实物制作并开展调试测试验收 | 焊接实物进行调试 | | 一天 | 完成实物焊接,并进行测试达到了预测效果。 | O | 整理项目设计报告,整理更新项目附件资料 | 实验报告撰写 | | 一天 | 完成实验报告撰写,并进行相关整理。 |
-
- 项目可行性分析
1.单片机最小系统 ????单片机最小系统包括单片机芯片,时钟电路和复位电路。时钟电路用于产生单片机工作时所必须的时钟信号。STC89C52RC单片机的内部电路在时钟信号控制下,严格地按时序执行指令进行工作;复位操作是单片机的初始化操作,只需给单片机的复位引脚RST加上大于2个机器周期的高电平就可以使单片机复位。
2.测温部分
采用的是DS18B20传感器进行温度测量,它在测量温度、转换时间、传输距离、分辨率等方面也有很大的改进。与传统的热敏电阻相比,它不仅能够直接读出被测温度值,并且可以根据实际要求通过简单的变成来读取9到12位的温度值。
3.WiFi模块
ATK-ESP8266WiFi模块是ALIENTEK 推出的一款高性能的 UART-WiFi(串口-无线 WIFI)模块,ATK-ESP8266 板载 ai-thinkerai公司的 ESP8266 模块,该模块通过 FCC,CE 认证。ATK-ESP8266 模块采用串口(LVTTL)与 MCU(或其他串口设备)通信,内置 TCP/IP协议栈,能够实现串口与 WIFI 之间的转换。ATK-ESP8266 模块支持 LVTTL 串口,兼容 3.3V 和 5V 单片机系统,可以很方便的与产品进行连接。模块支持串口转 WIFI STA、串口转 AP 和 WIFI STA+WIFI AP 的模式,从而快速构建串口-WIFI 数据传输方案,方便设备使用互联网传输数据。
-
- 方案比较与关键器件选型
- 方案比较
方案一:采用STC89C单片机。STC89C单片机的软件编程自由度比较大,可通过编程实现各种算法以及逻辑控制。并且体积适中,引脚足够,方便安装使用。可以单独对数字温度传感器DS18B20进行控制,另外STC89C在工农业控制上也有着比较广泛的应用,编程技术和外围电路的配合使用都相当成熟。
方案二:使用STM32正点原子16位单片机。 STM32系列?MCU?功能强大、种类齐全,结合了高性能、实时、低功耗、低电压等特性,同时保持了高集成度和易于开发的优势。根据片内?Flash?和?RAM?的容量,以及片上外设资源种类和数量的不同,STM32系列微控制器主要分为STM32F101系列、STM32F102系列、STM32F103系列和STM32F105/107系列。
方案一:采用热敏电阻,可满足40摄氏度至90摄氏度测量范围,但热敏电阻精度、重复性、可靠性较差,对于检测1摄氏度的信号是不适用的。 方案二:采用单片模拟量的温度传感器,比如AD590,LM35等。但这些芯片输出的都是模拟信号,必须经过A/D转换后才能送给单片机,这样就使得测温装置的结构较复杂。另外,这种测温装置的一根线上只能挂一个传感器,不能进行多点测量。即使能实现,也要用到复杂的算法,一定程度上也增加了软件实现的难度。 方案三:采用DS18B20来测量待测电的温度,数字温度传感器DS18B20输出的信号全数字化。方便单片机处理及控制,省去传统的测温系统的很多外围电路。且该芯片的物理化学性都很稳定,它能作为工业测温元件。此元件线性度好,在0℃到100℃时,最大线形偏差小于1℃。DS18B20的最大特点是单总线的数据传输,由数字温度计DS18B20和微控制器STC89C52构成的温度采集系统,它可以直接输出温度的数字信号,而且直接显示在数码管上。因此该温度采集系统的结构就比较简单,体积也较小。
- 关键器件选型
DS18B20 -55°C~+125°C,测温分辨率可达0.0625°C
STC89C52
LCD1602
WM-USB2UART模块
ESP8266?WiFi模块
-
- 系统架构及规格定义
图1:结构框图
系统设计规格图表显示如下:
表2:测试结果
结果 基于 WiFi的温度 采集与控制系统参数 | 预期结果 | 实测结果 | 显示 | 能本地显示实时温度采样值、被控设备指示状态,无乱码、多字节、少字节现象 | 正常显示 | 执行模块 | 收到相应指令后能执行命令动作,据有告警指示功能 | WiFi连接功能 | 可以和手机正常连接 | 正常连接 | 手机APP | 具有温度显示、过温报警功能且可通过按键发送指令控制执行模块 | 正常控制 |
?
-
- 硬件设计
- 理论分析
基于WiFi的温度采集与控制系统的仿真使用的是Proteus软件。
电路设计使用Altium Designer进行电路原理图和PCB的设计。
单片机开发使用Keil4,程序下载使用串口ISP下载的方式。
上位机开发使用Android Studio,如果不做上位机开发,可通过手机网络调试助手进行温度读取及命令下发。
硬件仿真和固件程序的设计需同步进行,对有些仿真库中没有的物料,使用能替换的物料进行仿真。
画电路原理图时,可直接使用附件资料中的原理图封装库xx.SCHLIB而不用再自己绘制原理图元件符号,将其添加到自己的Project中即可使用。绘制PCB时,可直接将附件资料中的PCB机械尺寸(PCB的外框)xx- -Outline.PcbDoc导入到自己的Project中,作为自己的PCB,而不用自己规划PCB的大小,直接将元件导入后在上面布局即可。另外,可直接使用附件资料中的PCB封装库文件xx.Pcblib而不用再自己画元器件的PCB封装,将其添加到自己的Project中即可使用。
PCB设计采用模块化分区布局,PCB大小为100*80mm;
电源指示灯靠近电源输入端指示模块上的供电情况;
两侧各留5mm工艺边,可标注公司及产品信息;
采用2mm倒角,防止尖锐的直角对使用者构成安全隐患;
过孔:>=20mil;
线宽:>=10mil;
线间距:>=7mil;
铺铜:在布局布线完成后,应尽可能多的铺铜(铺地),以减少雕刻区域,节省雕刻时间(如果是自己制作PCB板)。
PCB电气规则检查无误后可用于生产,如果是外协制作PCB板,在PCB设计文件交给PCB制版厂生产时,需要填写制版说明,制版说明应该包括联系人、联系方式、制版要求等信息。譬如,板厚:2.0mm,蓝底白字,过孔覆绿油、指定的机械孔要电镀等。在设备支持的情况下也可自行生产。
图1:供电电路
-
-
- 仿真验证
图2:proteus仿真电路
-
-
- 电路原理图设计
图3:AD原理图设计
-
-
- PCB设计
图4:PCB正反面
-
- 固件程序设计
采用 51 系列的单片机。该单片机是一个高可靠性、超低价、高性能的 8 位单片机, 32 个 IO 口,且 STC 系列的 51 单片机单片机可以在线编程、调试,方便地实现程序的 下载与整机的调试。
-
-
- 开发环境描述,接口说明及绘制程序流程图
- 关键算法分析
- 编码
- 软件设计
- 开发环境说明及绘制软件流程图
- 关键算法分析
- 编码
-
- 调测步骤
- 调试步骤如下:
由于单片机和ESP8266的通信是通过串口收发命令的方式进行通信的,所以调试过程中需要对ESP8266的一些指令要有一定的了解。单片机发送给ESP8266的数据格式要符合ESP8266的规定,ESP8266发送给单片机的数据需要在单片机固件程序中进行解析。可以对ESP8266模块和51单片机分别进行串口调试。
ESP8266模块的初始波特率为115200(有些可能为9600),与单片机通信时需要将波特率改为9600,可在USB2UART模块上测试。测试时将ESP8266接在USB2UART模块上。
调试方法如下:
a. 将USB2UART插入电脑USB口(确保CH340的驱动已经安装)。查看设备管理器中的端口号。
b.打开串口调试助手,进行配置。
c. 输入"AT"命令,点击发送,如果返回OK,则正常。如果不返回,则将调试助手的波特率改为115200后再输入"AT",点击发送,如果返回为OK,则说明ESP8266的波特率为115200,需要发送“AT+UART_DEF=9600,8,1,0,0”命令,将ESP8266的波特率改为9600。再将串口通信助手的波特率改为9600,再次输入命令"AT",发送后查看是否返回OK。
d.步骤c正常后,输入“AT+CIFSR”查看ESP8266的IP地址;输入“AT+CWMODE=2”配置AP模式;输入“AT+CWSAP="ESP8266-TEMP","qwertyui",5,3”配置热点名、密码、连接方式等(参考AT手册)。
e. 上述配置完成后,用手机连接已经设置好的WiFi并安装手机的网络调试助手软件进行收发命令测试。 ??
g. 手机网络调试助手输入aa,则电脑串口助手显示“+IPD,0,3:aa”;电脑串口助手输入“AT+CIPSEND=0,5”后再“20.5”,手机网络调试助手显示20.5。
f.通过串口助手发送命令来控制执行模块,串口输入“+IPD,0,3:aa”则打开D1。串口输入“+IPD,0,3:bb”关闭D1。同样输入相应命令控制D2指示灯。
-
- 成品展示
下面的图片分别展示了产品硬件实物、检测过程图片:
图5:测试实物图
图6:App测试图
-
- 测试记录
参考C阶段的规格定义,逐项检查设计结果是否满足项目设计指标要求。
表3:实物测试结果
结果 基于 WiFi的温度 采集与控制系统参数 | 预期结果 | 实测结果 | 显示 | 能本地显示实时温度采样值、被控设备指示状态,无乱码、多字节、少字节现象 | 能正常显示 | 执行模块 | 收到相应指令后能执行命令动作,据有告警指示功能 | WiFi连接功能 | 可以和手机正常连接 | 可以 | 手机APP | 具有温度显示、过温报警功能且可通过按键发送指令控制执行模块 | 可以连接 |
-
- 测试结论
基本功能全部正常,能正常通过WiFi模块向手机发送数据,手机能正常接受数据并且正常控制。
O-项目运作(Operate)
-
- 项目运作其他考虑因素
- 项目总结
在这次实习中还锻炼了我其他方面的潜力,提高了我的综合素质。首先,它锻炼了我做项目的潜力,提高了独立思考问题、自己动手操作的潜力,在工作的过程中,复习了以前学习过的知识,并掌握了一些应用知识的技巧等。其次,实训中的项目作业也使我更加有团队精神。
从这里,我学会了下面几点:
一、继续学习,不断提升理论涵养。
在信息时代,学习是不断地汲取新信息,获得事业进步的动力。作为一名青年学子更就应把学习作为持续工作用心性的重要途径。走上工作岗位后,我会用心响应单位号召,结合工作实际,不断学习理论、业务知识和社会知识,用先进的理论武装头脑,用精良的业务知识提升潜力,以广博的社会知识拓展视野。
二、努力实践,自觉进行主角转化。
只有将理论付诸于实践才能实现理论自身的价值,也只有将理论付诸于实践才能使理论得以检验。同样,一个人的价值也是透过实践活动来实现的,也只有透过实践才能锻炼人的品质,彰显人的意志。务必在实际的工作和生活中潜心体会,并自觉的进行这种主角的转换。
三、提高工作用心性和主动性
实习,是开端也是结束。展此刻自己面前的是一片任自己驰骋的沃土,也分明感受到了沉甸甸的职责。在今后的工作和生活中,我将继续学习,深入实践,不断提升自我,努力创造业绩,继续创造更多的价值。
我认为大学生实习难,就业难,除非你有关系,能给你简单找到工作,否则就难逃市场选取的厄运。只能智勇双全,才能在这个社会中出人头地。
能够说这次实训不仅仅使我学到了知识,丰富了经验。也帮忙我缩小了实践和理论的差距。这次实训将会有利于我更好的适应以后的工作。我会把握和珍惜实训的机会,在未来的工作中我会把学到的理论知识和实践经验不断的应用到实际工作中,为实现理想而努力。最后,我要感谢学院组织的这次十分有好处的实训,使我们学到了很多,也领悟了很多,同时也要感谢企业的各位老师,每天跟随着我们,指导我们,让我们更快更好的接触项目,了解项目,帮助我们解决疑难。
电路原理图
proteus仿真
?
?
?
?
?ESP8266代码
#include <esp8266.h>
#include <public.h>
#include <uart.h>
void ESP8266_init()
{
UART_str("AT+CWMODE=3\r\n");//STA+AP模式 掉电重启保留
delay(100);
UART_str(" ,5,3\r\n");//设置esp8266的WiFi名称,掉电重启保留
delay(100);
// UART_str("AT+RST\r\n");//重启
// delay(600);
UART_str("AT+CIPMUX=1\r\n");//多连接
delay(100);
UART_str("AT+CIPSERVER=1,8080\r\n");//建立TCP server,默认端口333
delay(100);
}
串口代码
#include <uart.h>
#include <public.h>
void UART_data(uchar dat)
{
SBUF=dat;
while(TI==0);
TI=0;
}
//字符串发送函数
void UART_str(uchar *s)//不能用来发送含有'\0'的字符数组:table[10],Temp[6];
{
while(*s!='\0')
{
UART_data(*s);
s++;
}
delay(10);
}
void UART_init()
{
TMOD=0x21;//定时器T0方式一,T1方式二:8位自动重装
TH0=0x4c;//50ms
TL0=0x00;
EA=1;
ET0=1;
TR0=1;
SCON=0x50;//串口方式一,REN=1,允许接收
PCON=0x00;
TH1=0xfd;//将波特率设置为9600
TL1=0xfd;
ES =1;
TR1=1;
}
主函数
#include <reg52.h>
#include <temp.h>
#include <lcd1602.h>
#include <public.h>
#include <esp8266.h>
#include <uart.h>
uchar Temp[8]="025.0";//存放温度。例如123.32
uchar Temp1[]="Temp:";
uchar rec_data[20];//存放串口接收字符串,发送字符串长度不要超过10。
uchar code OFF[]="OFF";
uchar code ON[]="ON ";
uchar code LED[]="LED:";
uchar SetTemp[]="25";
sbit D2=P2^4;
sbit D3=P2^5;
sbit S1=P2^1;
sbit S2=P2^2;
sbit relay=P2^3;//继电器
bit flag=0;
void temp_change(int temp)
{
float tp=0;//11111 000 00000000,temp为16位2进制数,前五位符号位,1为负,0为正
if(temp&0xf000)//&0xf000
{
Temp[0]='-';
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
}
else
{
tp=temp;
temp=(tp*6.25)+0.5;
Temp[0]=temp%100000/10000+0x30;
}
Temp[1]=temp%10000/1000+0x30;
Temp[2]=temp%1000/100+0x30;
Temp[3]='.';
Temp[4]=temp%100/10+0x30;
Temp[5]=temp%10/1+0x30;
Temp[6]=0x6f;
Temp[7]='C';
}
void keyscanf()
{
uchar i;
if(S1==0)
delay(10);
if(S1==0)//继电器关
{
while(S1==0);
relay=0;
LCD_write_com(0x80+0x44);
for(i=0;i<3;i++)
LCD_write_data(ON[i]);
}
if(S2==0)
delay(10);
if(S2==0)//继电器关
{
while(S2==0);
relay=1;
LCD_write_com(0x80+0x44);
for(i=0;i<3;i++)
LCD_write_data(OFF[i]);
}
}
void init()
{
uchar i;
LCD_write_com(0x80);
for(i=0;i<8;i++)
LCD_write_data(Temp1[i]);
LCD_write_com(0x80+0x40);
for(i=0;i<4;i++)
LCD_write_data(LED[i]);
for(i=0;i<3;i++)
LCD_write_data(OFF[i]);
}
void main()
{
uchar i;
UART_init(); // 串口初始化
LCD_init(); // 1602初始化
init();
ESP8266_init(); // 8266初始化
for(i=0;i<90;i++)
temp_change(ds18b20_readtemp());
while(1)
{
temp_change(ds18b20_readtemp());//将温度存放到Temp[]数组,方便发送给串口
LCD_write_com(0x85);
for(i=1;i<8;i++)
LCD_write_data(Temp[i]);
UART_str("AT+CIPSEND=0,5\r\n"); //数据发送命令
for(i=1;i<6;i++)
{
UART_data(Temp[i]); //数据发送
delay(100);
}
UART_str("\r\n");
delay(1000);
}
}
void time0() interrupt 1
{
static count;
TH0=0x4c;//50ms
TL0=0x00;
count++;
keyscanf();
if(count==10)
{
count=0;
if(flag)
{
if(Temp[1]>=SetTemp[0]&&Temp[2]>=SetTemp[1])
D3=~D3;
if(Temp[1]<=SetTemp[0]&&Temp[2]<SetTemp[1])
D3=1;
}
else
D3=1;
}
}
//串口中断函数,每接收一个字节(8bit),中断一次。num必须定义为static
void uart() interrupt 4
{
static uchar num=0;//num 用来计数
uchar i;
if(RI)//接受到了数据
{
ES=0;
rec_data[num]=SBUF;
RI=0;
if(rec_data[0]=='+')//+IPD
num++;
else
num=0;
if(num==11)
{
if(rec_data[9]>='0'&&rec_data[9]<='9'&&rec_data[10]>='0'&&rec_data[10]<='9')
{
for(i=0;i<2;i++)
SetTemp[i]=rec_data[num+i-2];
}
num=0;
switch(rec_data[9])
{
case 'a':
relay=0;
LCD_write_com(0x80+0x44);
for(i=0;i<3;i++)
LCD_write_data(ON[i]);
break;
case 'b':
relay=1;
LCD_write_com(0x80+0x44);
for(i=0;i<3;i++)
LCD_write_data(OFF[i]);
break;
case 'c':
D2=0;
break;
case 'd':
D2=1;
break;
case 'e':
flag=1;
break;
case 'f':
flag=0;
break;
}
}
ES=1;
}
}
|