基于stm 的温湿度监测Word文档格式.docx
《基于stm 的温湿度监测Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于stm 的温湿度监测Word文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
![基于stm 的温湿度监测Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/12/d10bb199-3255-4020-99f4-a175ed40184f/d10bb199-3255-4020-99f4-a175ed40184f1.gif)
在Nokia5110显示屏上显示出温度和湿度,然后详细介绍了各个模块的工作原理和硬件电路设计思路,实现了温湿度数据实时准确的测量;
之后阐述了系统各个部分的软件设计思路;
最后对系统在实际应用中采集到的数据进行了处理,分析了误差产生的原因,并通过分段线性插值算法对系统非线性误差进行了校准,同未校准时采集的数据相比,校准后的数据准确度更高,稳定性更好。
在保证测量效果的基础上,本系统设计中充分考虑到性价比和再次开发周期性等,具有成本低、设计开发方便、通用性强等特点,不仅适用于现代农业生产中,还能用于其它工业控制、机械制造等其它领域,具有一定的市场推广价值。
【关键词】:
嵌入式技术,电路设计,STM32,AM2302温湿度采集,Nokia5110显示屏,程序设计
Absract
InthedesignofthecurriculumimplementsasmarttemperatureandhumiditydetectionsystembasedonSTM32F103VET6,thepurposeistorealizetheacquisitionanddisplayofthetemperatureandhumidity,temperatureandhumidityoftheacquisitionasamustmasterinautomationsciencedetectiontechnology,isalsoapracticaltechnology.Thisexperimentmainlymadethefollowingseveralaspectswork:
firstofall,basedonthereal-time,accuracy,economyandexpansibilityetc.Afteranalysisandcomparisonoffourdirections,STM32F103VEmicro-controllerasthemastercontrolchipandAM2303temperatureandhumiditysensorstoachievetemperatureandhumiditydataacquisition;
OntheNokia5110screendisplaythetemperatureandhumidity,andthenintroducesindetailtheworkingprincipleofeachmoduleandthehardwarecircuitdesign,realizedthereal-timeaccuratemeasurementoftemperatureandhumiditydata;
Elaboratedthesystemaftereachpartofthesoftwaredesignidea;
Finally,thesysteminthepracticalapplicationofdealingwiththedatacollected,analyzedthereasonsoftheerror,andthroughthepiecewiselinearinterpolationalgorithmforsystemofnonlinearerrorcalibration,comparedwithnotcalibrationdata,aftercalibrationdatawithhigheraccuracyandbetterstability.
Keywords:
embeddedtechnology,circuitdesign,STM32,collectingAM2302temperatureandhumidity,Nokia5110display,theprogramdesign
一.设计目标
本次设计要求实现对周围环境温湿度的感知以及显示。
要求学生对STM32有一定程度的理解,熟悉STM32串口以及中断的使用,会基本的C语言和java,熟练掌握keilforARM软件的使用与程序下载以及手机软件开发环境。
二.设计方案
(1)了解温湿度传感器工作原理,根据原理画好PCB原理图。
(2)根据PCB原理图自制PCB板电路,将液晶屏,温湿度传感器,变压器,stm32开发板等相关元件设备进行集成。
(3)测试PCB电路,检查相关电路能否正常工作,以及STM32核心板的能否正常调试。
(4)在完成电路调试后,用jlink下载器下载调试程序成功完成程序对相关元件的驱动。
(5)实验完成后做好相应的实验总结。
三.实验所需器材
1.STM32F核心板2.温湿度传感器(DHT22)3.电容
4.3MM红光LED发光二极管5.稳压集成块(L7805)
6.整流桥7.电解电容8.保险座9.散热器
10.电阻11.变压器12.电位器
13.排座14.5110液晶屏模块
四.设计内容
4.1STM32模块
芯片的选择:
STM32VET6
芯片的介绍:
内核:
ARM
32位的Cortex™-M3
CPU
−
最高72MHz工作频率,在存储器的0等待周期访问时可达1.25DMips/MHz(Dhrystone
2.1)
单周期乘法和硬件除法
■
存储器
从64K或128K字节的闪存程序存储器
高达20K字节的SRAM
时钟、复位和电源管理
2.0~3.6伏供电和I/O引脚
上电/断电复位(POR/PDR)、可编程电压监测器(PVD)
4~16MHz晶体振荡器
内嵌经出厂调校的8MHz的RC振荡器
内嵌带校准的40kHz的RC振荡器
产生CPU时钟的PLL
带校准功能的32kHz
RTC振荡器
低功耗
睡眠、停机和待机模式
VBAT为RTC和后备寄存器供电
2个12位模数转换器,1μs转换时间(多达16个输入通道)
转换范围:
0至3.6V
双采样和保持功能
温度传感器
DMA:
7通道DMA控制器
支持的外设:
定时器、ADC、SPI、I2C和USART
图4.1STM32VET6芯片引脚图
图4.2STM32芯片实物图
4.2AM2302介绍
4.2.1产品概述
AM2302湿敏电容数字温湿度模块是一款含有己校准数字信号输出的温湿度复合传感器。
它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。
传感器包括一个电容式感湿元件和一个高精度测温元件,并与一个高性能8位单片机相连接。
因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。
每个传感器都在极为精确的湿度校验室中进行校准。
校准系数以程序的形式储存在单片机中,传感器内部在检测信号的处理过程中要调用这些校准系数。
标准单总线接口,使系统集成变得简易快捷。
超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选择。
产品为3引线(单总线接口)连接方便。
特殊封装形式可根据用户需求而提供。
图4.3实物图外形尺寸(单位:
mm)
4.2.2应用范围
暖通空调、除湿器、测试及检测设备、消费品、汽车、自动控制、数据记录器、家电、湿度调节器、医疗、气象站、及其他相关湿度检测控制等。
4.2.3产品亮点
超低能耗、传输距离远、全部自动化校准、采用电容式湿敏元件、完全互换、标准数字单总线输出、卓越的长期稳定性、采用高精度测温元件。
4.2.4单总线接口定义
引脚
名称
描述
①
VDD
电源(3.5V-5.5V)
②
SDA
串行数据,双向口
③
NC
空脚
④
GND
地
表4.1AM2302引脚分配表
图4.4AM2302引脚分配图
AM2302的供电电压范围为3.5V-5.5V,建议供电电压为5V。
数据线SDA引脚为三态结构,用于读写传感器数据。
4.2.5传感器性能
参数
条件
min
typ
max
单位
分辨率
0.1
%RH
16
bit
[1]
精度
25℃
±
2
重复性
0.3
互换性
完全互换
[2]
响应时间
1/e(63%)
<
5
S
迟滞
[3]
漂移
典型值
0.5
%RH/yr
表4.2AM2302相对湿度性能表
℃
1
量程范围
-40
80
0.2
10
℃/yr
表4.3AM2302相对温度性能表
图4.525℃时AM2302的相对湿度最大误差温度传感器的温最大误差
4.2.6单总线通信
①AM2302器件采用简化的单总线通信。
单总线即只有一根数据线,系统中的数据交换、控制均由数据线完成。
设备(微处理器)通过一个漏极开路或三态端口连至该数据线,以允许设备在不发送数据时能够释放总线,而让其它设备使用总线;
单总线通常要求外接一个约5.1kΩ的上拉电阻,这样,当总线闲置时,其状态为高电平。
由于它们是主从结构,只有主机呼叫传感器时,传感器才会应答,因此主机访问传感器都必须严格遵循单总线序列,如果出现序列混乱,传感器将不响应主机。
②SDA用于微处理器与AM2302之间的通讯和同步,采用单总线数据格式,一次传送40位数据,高位先出。
具体通信时序如图4.5所示,通信格式说明见表4.3。
图4.5AM2302单总线通信协议
单总线格式定义
起始信号
微处理器把数据总线(SDA)拉低一段时间(至少800µ
s)
[1],通知传感器准备数据。
响应信号
传感器把数据总线(SDA)拉低80µ
s,再接高80µ
s以响应主机的起始信号。
数据格式
收到主机起始信号后,传感器一次性从数据总线(SDA)串出40位数据,高位先出
湿度
湿度分辨率是16Bit,高位在前;
传感器串出的湿度值是实际湿度值的10倍。
温度
温度分辨率是16Bit,高位在前;
传感器串出的温度值是实际温度值的10倍;
温度最高位(Bit15)等于1表示负温度,温度最高位(Bit15)等于0表示正温度;
温度除了最高位(Bit14~Bit0)表示温度值。
校验位
校验位=湿度高位+湿度低位+温度高位+温度低位
表4.3:
AM2302通信格式说明
③用户主机(MCU)发送一次起始信号(把数据总线SDA拉低至少800µ
s)后,AM2302从休眠模式转换到高速模式。
待主机开始信号结束后,AM2302发送响应信号,从数据总线SDA串行送出40Bit的数据,先发送字节的高位;
发送的数据依次为湿度高位、湿度低位、温度高位、温度低位、校验位,发送数据结束触发一次信息采集,采集结束传感器自动转入休眠模式,直到下一次通信来临。
4.3Nokia5110介绍
1)84x48的点阵LCD,可以显示4行汉字,
2)采用串行接口与主处理器进行通信,接口信号线数量大幅度减少,包括电源和地在内的信号线仅有9条。
支持多种串行通信协议(如AVR单片机的SPI、MCS51的串口模式0等),传输速率高达4Mbps,可全速写入显示数据,无等待时间。
3)可通过导电胶连接模块与印制版,而不用连接电缆,用模块上的金属钩可将模块固定到印制板上,因而非常便于安装和更换。
4)LCD控制器/驱动器芯片已绑定到LCD晶片上,模块的体积很小。
5)采用低电压供电,工作电压为3,3V,正常显示时的工作电流在200μA以下,且具有掉电模式。
LPH7366的这些特点非常适合于电池供电的便携式通信设备和测试设备中。
图4.6
4.3.1SPI接口时序写数据/命令
Nokia5110(PCD8544)的通信协议是一个没有MISO只有MOSI的SPI协议,如果单片机有富裕的SPI接口,也可以利用硬件SPI,但通常没有必要,只需要软件程序模拟即可。
4.3.2显示汉字
显示汉字可以采用两种点阵方式,一种是12*12点阵,一种是16*16点阵,网上也有一个自动提取字模的小软件“3310液晶显示屏汉字提取程序”,这个小程序只适用于水平寻址(V=0)。
采用12*12点阵汉字时,由于不是8的整数倍数,因此行与行之间只能隔开,这样才能完整显示一个汉字。
4.3.4显示图形
显示的图形像素大小不能超过84*48。
也有一个字模提取小软件Zimo21可以帮助我们得到图像的像素数组。
但要注意Zimo21软件的设置,不然的话就显示不了想要的图片。
4.4原理图设计
图4.7电路板设计软件:
Altium
图4.8传感器电路
图4.95110显示屏电路
图4.10电源电路
图4.11实验原理图
4.5PCB板设计
要制作封装库首先必须对所需封装资料进行了解其长、宽、焊盘大小模块资料上都会有提供,另外还包括管脚信息,管脚标号都要明确了解。
图4.12
五.实验软件设计
5.1温湿度传感器DHT22的程序
#include<
stm32f10x_lib.h>
#include"
dht22.h"
//复位DHT22
voidDHT22_Rst(void)
{
DHT22_IO_OUT();
//SETOUTPUT
DHT22_DQ_OUT=0;
//拉低DQ
delay_ms(20);
//拉低至少18ms
DHT22_DQ_OUT=1;
//DQ=1
delay_us(30);
//主机拉高20~40us
}
u8DHT22_Check(void)
u8retry=0;
DHT22_IO_IN();
//SETINPUT
while(DHT22_DQ_IN&
&
retry<
100)//DHT22会拉低40~80us
{
retry++;
delay_us
(1);
};
if(retry>
=100)return1;
elseretry=0;
while(!
DHT22_DQ_IN&
100)//DHT22拉低后会再次拉高40~80us
return0;
//从DHT22读取一个位
//返回值:
1/0
u8DHT22_Read_Bit(void)
{
u8retry=0;
while(DHT22_DQ_IN&
100)//等待变为低电平
}
retry=0;
while(!
100)//等待变高电平
delay_us(40);
//等待40us
if(DHT22_DQ_IN)return1;
elsereturn0;
//从DHT22读取一个字节
读到的数据
u8DHT22_Read_Byte(void)
u8i,dat;
dat=0;
for(i=0;
i<
8;
i++)
dat<
=1;
dat|=DHT22_Read_Bit();
}
returndat;
/
u8DHT22_Read_Data(u8*temp,u8*humi)
u8buf[5];
u8i;
DHT22_Rst();
if(DHT22_Check()==0)
for(i=0;
5;
i++)//读取40位数据
{
buf[i]=DHT22_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
*humi=buf[0];
*temp=buf[2];
}elsereturn1;
u8DHT22_Init(void)
RCC->
APB2ENR|=1<
2;
//使能PORTA口时钟
GPIOA->
CRH&
=0XFFFF0FFF;
//PA11推挽输出
CRH|=0X00003000;
ODR|=1<
11;
//输出1
returnDHT22_Check();
5.2湿度显示函数
voidHumidity_display(void)
uchartable0[]={"
Temp:
00.00C"
};
uchartable1[]={"
Humi:
00.00%"
u8t=0;
u8temperature,tem;
u8humidity,hum;
intnum;
if(t%10==0)//每100ms读取一次
{
DHT22_Read_Data(&
temperature,&
humidity);
//读取温湿度值
//显示温度值
table0[5]=temperature/10+0x30;
table0[6]=temperature%10+0x30;
tem=temperature*100;
table0[8]=tem/10%10+0x30;
table0[9]=tem%10+0x30;
//显示湿度值
table1[5]=humidity/10+0x30;
table1[6]=humidity%10+0x30;
hum=humidity*100;
table1[8]=hum/10%10+0x30;
table1[9]=hum%10+0x30;
write_1602_com(0x80);
for(num=0;
num<
16;
num++)
write_1602_dat(table0[num]);
delay_ms(8);
write_1602_com(0x80+0x40);
write_1602_dat(table1[num]);
}
delay_ms(10);
t++;
if(t==10)
t=0;
5.3主函数程序
stm32f10x.h"
5110LCD.h"
main.h"
externunsignedcharchinese1;
intmain(void)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
GPIO_Configuration_LCD();
LCD_Init();
LCD_Clear();
while
(1)
LCD_WriteString_en(0,0,"
wendu:
"
);
LCD_WriteString_en(0,1,"
shidu:
}
5.3.1显屏程序
#include"
voiddelay_ms(intt)
inti,j;
for(i=t;
i>
0;
i--)
for(j=110;
j>
j--);
voidGPIO_Configuration_LCD(void)
GPIO_InitTypeDefGPIO_InitStructure;
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Sp