STM32应用实例五:与SHT1X温湿度传感器通讯
在这次项目开发中应用到了SHT1X温湿度传感器,该系列有SHT10、SHT11和SHT15,属于Sersirion温湿度传感器家族中的贴片封装系列。包括一个电容性聚合体测湿敏感元件、一个用能隙材料制成的测温元件,传感器内部有一个精度高达14为位的A/D转换器。更详细资料请参考说明书。
1、硬件介绍
现在对本次使用的SHT15作简要介绍。其引脚定义如下:
引脚 |
名称 |
描述 |
|
1 |
GND |
地 |
|
2 |
DATA |
串行数据, 双向 |
|
3 |
SCK |
串行时钟, 输入口 |
|
4 |
VDD |
电源 |
|
NC |
NC |
必须为空 |
SHT1X温湿度传感器使用的2线通讯,类是于I2C总线,但并不相同,使用普通的GPIO就可实现通讯。此次采用STM32F103VET6来操作SHT15,具体的连接方式如下:
SCK 用于微处理器与SHT1x 之间的通讯同步。由于接口包含了完全静态逻辑,因而不存在最小SCK 频率。
DATA 引脚为三态结构,用于读取传感器数据 . 当向传感器发送命令时, DATA 在 SCK 上升沿有效且在 SCK 高电平时必须保持稳定。 DATA 在 SCK 下降沿之后改变。为避免信号冲突,微处理器应驱动DATA 在低电平。需要一个外部的上拉电阻(例如: 10kΩ)将信号提拉至高电平。上拉电阻通常已包含在微处理器的I/O 电路中。
2、通讯实现
现在说明一下传感器通讯的实现。首先看一看其操作命令。传感器的命令包含三个地址位(目前只支持000,这就是只能挂接在空闲的IIC总线上的原因)和五个命令位。SHT1x 会以下述方式表示已正确地接收到指令:在第8个SCK 时钟的下降沿之后,将DATA 下拉为低电平(ACK 位)。在第9个SCK 时钟的下降沿之后,释放DATA(恢复高电平)。命令集如下:
命令 |
代码 |
预留 |
0000x |
温度测量 |
00011 |
湿度测量 |
00101 |
读状态寄存器 |
00111 |
写状态寄存器 |
00110 |
预留 |
0101x-1110x |
软复位, 接口复位, 状态寄存器复位即恢复为默认状态.在要发送下一个命令前,至少等待 11ms. |
11110 |
接下来具体说说各种该命令操作的实现:
(1)启动时序
用一组“启动传输”时序来完成数据传输的初始化。它包括:当SCK时钟高电平时DATA翻转为低电平,紧接着SCK变成低电平,随后是在SCK时钟高电平,随后是在SCK时钟高电平DATA翻转位高电平。时序如下:
具体的编码实现如下:
/*SHT1X启动时序操作*/ void StartSHT1XOperation(BusPinOperation *SetBusPin) { /*将data线设置为输出模式*/ SetDataPineDirection(Out); SetBusPin[DataPin](Set); SetBusPin[SckPin](Reset); Delayus(); SetBusPin[SckPin](Set); Delayus(); SetBusPin[DataPin](Reset); Delayus(); SetBusPin[SckPin](Reset); Delayus(); SetBusPin[SckPin](Set); Delayus(); SetBusPin[DataPin](Set); Delayus(); SetBusPin[SckPin](Reset); }
(2)通讯复位
如果与SHT1x 通讯中断,可通过下列信号时序复位:当DATA 保持高电平时,触发SCK 时钟9 次或更多。时序图如下:
具体的编码实现如下:
/*SHT1X通讯复位*/ void ResetSHT1XCommunication(BusPinOperation *SetBusPin) { /*将data线设置为输出模式*/ SetDataPineDirection(Out); Delayms(); SetBusPin[DataPin](Set); SetBusPin[SckPin](Reset); for(int i=;i<;i++) { SetBusPin[SckPin](Set); Delayus(); SetBusPin[SckPin](Reset); Delayus(); } StartSHT1XOperation(SetBusPin); }
同时也可以实现软件复位,状态寄存器复位为默认状态。在要发送下一个命令前,至少等待 11ms。具体实现如下:
/*对SHT1X实现软件复位*/ uint8_t Sht1xSoftwareReset(BusPinOperation *SetBusPin) { uint8_t err = ; ResetSHT1XCommunication(SetBusPin); err=err+WriteByteT0Sht1x(SOFTWARE_RESET,SetBusPin); return err; }
(3)操作状态寄存器
SHT1x 的某些高级功能可以通过给状态寄存器发送指令来实现,如选择测量分辨率,电量不足提醒,使用 OTP 加载或启动加热功能等。
/*读状态寄存器*/ uint8_t ReadStatusRegister(uint8_t *pValue,uint8_t *pCheckSum,BusPinOperation *SetBusPin) { uint8_t err=; StartSHT1XOperation(SetBusPin); err=WriteByteT0Sht1x(READ_STATUS_REGISTER,SetBusPin); *pValue=ReadByteFromSht1x( Ack,SetBusPin); *pCheckSum=ReadByteFromSht1x( noAck,SetBusPin); return err; } /*写状态寄存器*/ uint8_t WriteStatusRegister(uint8_t *pValue,BusPinOperation *SetBusPin) { uint8_t err=; StartSHT1XOperation(SetBusPin); err +=WriteByteT0Sht1x(WRITE_STATUS_REGISTER,SetBusPin); err +=WriteByteT0Sht1x(*pValue,SetBusPin); return err; }
(4)温湿度的读取和计算
发布一组测量命令(‘00000101’表示相对湿度RH,‘00000011’表示温度T)后,控制器要等待测量结束。这个过程需要大约20/80/320ms,分别对应8/12/14bit 测量。根据本人测试8位时,15ms可以;12位时,70ms可以;14位时240ms可以。 SHT1x 通过下拉DATA 至低电平并进入空闲模式,表示测量的结束。控制器在再次触发SCK 时钟前,必须等待这个“数据备妥”信号来读出数据。检测数据可以先被存储,这样控制器可以继续执行其它任务在需要时再读出数据。
/*获取SHT1X的温度值*/ float GetSht1xTemperatureValue(float vdd,BusPinOperation *SetBusPin) { float tempValue=0.0; uint16_t sot=; uint8_t err=; uint8_t highByte=; uint8_t lowByte=; uint8_t checkSum=; StartSHT1XOperation(SetBusPin); WriteByteT0Sht1x(TEMP_MEAS_COMMAND,SetBusPin); SetDataPineDirection(In); Delayms(); if(ReadDataPinBit() == ) { err += ; } highByte=ReadByteFromSht1x(Ack,SetBusPin); lowByte=ReadByteFromSht1x(Ack,SetBusPin); checkSum=ReadByteFromSht1x(noAck,SetBusPin); sot=(uint16_t)highByte; sot=(sot*)+(uint16_t)lowByte; if(err != ) { ResetSHT1XCommunication(SetBusPin); } else { tempValue=ConvertTemperatureData(sot,vdd); } return tempValue; } /*获取SHT1X的湿度值*/ float GetSht1xHumidityValue(float temp,BusPinOperation *SetBusPin) { float humiValue=0.0; uint16_t sorh=; uint8_t err=; uint8_t highByte=; uint8_t lowByte=; uint8_t checkSum=; StartSHT1XOperation(SetBusPin); WriteByteT0Sht1x(HUMI_MEAS_COMMAND,SetBusPin); SetDataPineDirection(In); Delayms(); if(ReadDataPinBit() == ) { err += ; } highByte=ReadByteFromSht1x(Ack,SetBusPin); lowByte=ReadByteFromSht1x(Ack,SetBusPin); checkSum=ReadByteFromSht1x(noAck,SetBusPin); sorh=(highByte<<)|lowByte; if(err != ) { ResetSHT1XCommunication(SetBusPin); } else { humiValue=ConvertHumidityData(sorh,temp); } return humiValue; }
对于其他的计算部分直接按公式便写即可。
STM32应用实例五:与SHT1X温湿度传感器通讯的更多相关文章
- STM32读取温湿度传感器DHT11和DHT21(AM2301)系列问题
1.DHT11和DHT21传感器 这两种传感器都是奥松公司的产品,具体的传感器说明书在其官网上有(www.aosong.com). DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合 ...
- STC15系列通用-STC15F2K60S2/STCW4K32S4读取DHT11温湿度传感器数据串口输出代码实例工程免费下载
//为了方便大家调试,另附程序工程共大家下载,下载地址:https://www.90pan.com/b1908750 //************************** //程序说明:stc ...
- STM32—驱动DHT11数字温湿度传感器
文章目录 DHT11模块简介 DHT11数据传输 DHT11通信时序 代码实现 相关引脚初始化 复位模块 判断响应模块 读取数据包模块 DHT11模块简介 DHT11数字温湿度传感器,用来测量环境的温 ...
- DHT11温湿度传感器编程思路以及代码的实现(转载)
源自:https://blog.csdn.net/qq_34952376/article/details/81193938 在我们刚开始进入单片机的学习中,练习写传感器的时序是必不可少的,其实我比较推 ...
- Arduino连接SHT10温湿度传感器--返回值不正常解决办法
如题目,arduino中连接温湿度传感器,用的是一个github开源项目,地址:点击打开,其实这个就是一个封装好的库,下载后把解压的文件夹复制到Arduino目录下的librarys文件夹内,重启Ar ...
- 基于I2C的AHT20温湿度传感器的数据采集
关于:IC( Inter-- Integrated Circuit)总线是一种由 PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备.它是由数据线SDA和时钟SCL构成的串行总线,可 ...
- 数字温湿度传感器DHT11--操作源代码
//IO定义 #define P_DataIN_DHT11 PB0_IN #define P_DataOUT_DHT11 PB0_OUT //宏定义 #define BSET_DHT11 P_Data ...
- STM32应用实例十:简析STM32 I2C通讯死锁问题
I2C接口是一种使用非常普遍的MCU与外部设备的接口方式,在STM32中也集成了I2C接口,我们也常常使用它来与外围的传感器等设备通讯. 最近在我们使用STM32F1VET6读取压力和温湿度传感器数据 ...
- Arduino和C51开发DHT11温湿度传感器
技术:51单片机.Arduino.DHT11.温湿度传感器.传感器 概述 学习单片机离不开对传感器的学习,本文主要介绍DHT11温湿度传感器的使用方法,同学也可以了解更多的传感器,这对你以后开发产 ...
随机推荐
- 2018 ACM 网络选拔赛 徐州赛区
A. Hard to prepare #include <cstdio> #include <cstdlib> #include <cmath> #include ...
- vcf文件(call variants得来的)怎么看变异是纯合还是杂合的
如下图片所示: 对于位置为48245131的allele来说,REF为A,ALT为C 想确定变异到底是纯合还是杂合,即两条染色体是否同时发生了变异,则看GT,GT对应的数值为0/1,说明该变异为杂合: ...
- Win7任务栏合并
在“任务栏” -> "任务栏按钮" -> "始终合并.隐藏标签” 另外,如果想使时间显示详细,可消去“使用小图标”
- xtrabackup备份MySQL
mysql备份之xtrabackup(建议用来备份innodb) 下载地址:https://www.percona.com/downloads/XtraBackup/ 安装xtrabackup [ro ...
- SuperArray
package com.lovo.array; public class SuperIntArray { //属性 public int[] array; private int index;//代表 ...
- JavaSE学习总结(七)—— 集合
一.为什么需要集合 如果要将100个学生成绩存放到程序中,怎么做? 首先想到是数组 int[] scores=new int[100]; 然而,长度是固定的,比如是101个学生成绩,这个数组就不能用了 ...
- js加减法运算多出很多小数点
链接:http://www.jb51.net/article/73043.htm 解决方法:解决这种问题两种方法,第一种就是利用JavaScript 的toFixed(n) 方法,直接获取N 位小数, ...
- luogu P3674 小清新人渣的本愿
传送门 毒瘤lxl 本质是莫队,关键是怎么处理询问 这里需要开两个bitset(记为\(b1,b2\)),分别存\(x\)和\(n-x\)是否出现 对于询问1,即\(x-y=z\),由于\(y=x-z ...
- Android避免OOM(内存优化)
Android内存优化是性能优化很重要的一部分,而如何避免OOM又是内存优化的核心. Android内存管理机制 android官网有一篇文章 Android是如何管理应用的进程与内存分配 Andro ...
- 2018-2019-2 网络对抗技术 20165230 Exp4 恶意代码分析
目录 1.实验内容 2.实验过程 任务一:系统运行监控 每隔五分钟记录自己的电脑,并进行分析 安装配置sysinternals里的sysmon工具 任务二:恶意软件分析 静态分析工具 ViruScan ...