1.实验目的
本实验使用单片机ATmega128来控制高精度温湿度传感器SHT10获取周围环境的温度和湿度,并将温湿度数据发送到计算机。通过实验,使读者初步掌握ATmega128的基本编程方法,并掌握高精度温湿度传感器SHT10的使用方法。
2.实验设备
(1)硬件
● 单片机实验母板(IOT-SCMMB)1套。
● 传感器及外围模块(IOT-MODULES)1套。
● JTAG编程器1个。
● PC(含串口)1台。
(2)软件
● 串口调试助手。
● WinAVR20050214。
● AVRStudio4.18。
3.实验原理
本实验基于ATmega128实现一个高精度温湿度数据采集程序,主要硬件平台为单片机实验母板(IOT-SCMMB),以及相关的传感器和外围模块。程序主要完成的工作包括:首先,单片机发送命令给高精度传感器,高精度传感器再根据单片机命令,执行温度或湿度的采集;然后,单片机读出相应的温度或湿度的数据,并把相关数据通过单片机的串口发送到PC;最后,通过在PC上的串口调试助手,获取采集到的温度和湿度数据,并计算转化为具体的温湿度值。为了便于理解,将实验内容分为3个部分:各模块的初始化,单片机控制传感器采集温度和湿度,把采集的数据通过串口发送到PC上。下面分别对以上内容进行介绍。
(1)各模块的初始化
由于串口的初始化在实验一已经介绍,这里主要介绍高精度传感器的初始化。因为高精度温湿度传感器只需要将DATA引脚和CLK引脚与单片机相连,所以使用单片机的PC6和PC7引脚分别连接传感器的CLK和DATA口,并且只要单片机给PC6和PC7发送相应的时序就能控制高精度温湿度传感器。单片机对传感器I/O口的初始化代码如下:
(2)高精度温度和湿度数据的采集
数字高精度温湿度传感器SHT10有4个引脚:GND、DATA、SCK、VDD。图3-1为SHT10与单片机(即所使用的ATmega128)的连接方式。
在本实验中,SHT10的SCK和DATA引脚与ATmega128的PC6和PC7引脚相连。因此,只要通过单片机的PC6和PC7引脚向SHT10发送相应的时序,就能驱动SHT10进行采样,并返回采样数据。注意如图3-1所示的DATA引脚要接上拉电阻。
要驱动SHT10进行采样必须发送如下命令:首先,单片机向SHT10发送“启动传输”时序,完成数据传输的初始化。如图3-2所示,时序包括当SCK时钟高电平时DATA翻转为低电平,紧接着SCK变为低电平,随后在SCK时钟高电平时DATA翻转为高电平。初始化之后,单片机便可以向SHT10发送命令。通常的命令包含3个地址位(目前只支持“000”)和5个命令位,具体将在后面结合代码进行介绍。SHT10会以下述方式表示已正确地接收到指令:在第8个SCK时钟的下降沿之后,将DATA下拉为低电平,并且在第9个SCK时钟的下降沿之后,将DATA位恢复为高电平。
图3-1 SHT10与单片机连接方式
图3-2 SHT10启动传输时序图
启动传输程序如下:
启动时序完成之后,SHT10便会以串行数据方式与单片机进行通信,时序图如图3-3所示。DATA三态门用于数据的读取,DATA在SCK时钟下降沿之后改变状态,并仅在SCK时钟上升沿有效。数据传输期间,在SCK时钟高电平时,DATA必须保持稳定。为避免信号冲突,单片机应驱动DATA在低电平。
图3-3 SHT10与单片机通信时序图
给传感器发送数据需要注意时序,在上升沿之前把数据写入,上升沿时数据有效,在下降沿时把数据发送给传感器。数据发送的相关代码如下:
(www.xing528.com)
从传感器读数据,同样也要注意时序,只有在上升沿数据有效之后才能读。读数据的相关代码如下:
温湿度测量的过程如下:单片机发布一组测量命令后(“00000101”表示测量相对湿度,“00000011”表示测量温度),传感器开始采集数据。对应8/12/14bit 3种不同的测量,这个过程分别需要大约20/80/320ms。SHT10通过下拉DATA至低电平并进入空闲模式,表示测量的结束。单片机在触发SCK时钟来读出数据前,必须等待这个“数据备妥”信号。检测数据可以先被存储,这样单片机可以继续执行其他任务,在需要时再读出数据。在收到“数据备妥”信号之后,传输2B的测量数据和1B的CRC奇偶校验。单片机需要通过下拉DATA为低电平,以确认每字节。在测量和通信结束后,SHT10自动转入休眠模式。温湿度测量的相关代码如下:
(3)把采集的数据通过串口发送到PC上
单片机在获取了温湿度数据之后,通过串口将数据发送给PC。从串口获取数据的函数为:
将数据发送到串口的函数为:
以上是此实验的各个模块的分析,下面介绍实验的流程。首先,主函数初始化各模块;然后,单片机给高精度传感器发送命令,高精度传感器把采集的数据发送给单片机;最后,单片机通过串口把数据发送到PC。下面是main()函数的主要代码:
4.实验内容
阅读高精度温湿度传感器STH10芯片的数据手册,学会阅读并分析芯片的时序图,并能够依照时序图,编写相关的驱动程序,读出传感器的温度和湿度数据,然后通过串口把数据发送到PC。
5.实验步骤
1)编写实验代码,在WinAVR环境下编译得到.hex文件。
2)使用AVRStudio将.hex文件下载到开发板上。
3)把开发板的串口与PC相连,使用串口调试助手获得节点发回的温湿度数据。波特率9600bit/s,串口调试助手会显示:
其中的X和Y分别为传感器的采样数据,这个数据必须通过芯片数据手册上的公式进行计算才能获得最后的温湿度值。
计算温度的公式为:Temperature=d1+d2×X
式中,d1,d2为参数;X为传感器采集的温度数据。
对于本实验采用3.5V电压、14位采样精度,查芯片手册可知:d1=-39.67,d2=0.01。带入计算即可得到以摄氏度为单位的温度值。
计算湿度的公式为:
Humidity=c1+c2×Y+c3×Y2
式中,c1,c2,c3为参数;Y为传感器采集的湿度数据。
对于本实验采用12位采样精度,查芯片手册可知:c1=-4,c2=0.0405,c3=-2.8×10-6。代入计算即可得到湿度百分比。
6.思考题
本程序采样精度为8位温度,14位湿度,如何修改程序能够使精度变为8位湿度、12位温度。
7.补充阅读
[1]徐勇军,安竹林,等.无线传感器网络实验教程[M].北京:北京理工大学出版社,2007.
[2]ATmega128/LDatasheet.http://www.atmel.com/.Atmel,2010.
[3]SHT10 Datasheet.http://www.sensirion.com/.SENSIRION,2009.
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。