关于SHT11的编程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于SHT11的编程相关的知识,希望对你有一定的参考价值。
跪求关于SHT11与AT89C2051连接的编程完整程序
参考技术A SHT11是瑞士Sensirion公司生产的具有I2C总线接口的单片全校准数字式相对湿度和温度传感器。该传感器采用独特的CMOSens TM技术,具有数字式输出、免调试、免标定、免外围电路及全互换的特点。文中对传感器的性能特点、接口时序与命令进行了详细的阐述,给出了SHT11与单片机的接口电路及相应程序。 关键词:数字式;温湿度传感器;I2C总线;单片机1 概述温湿度的测量在仓储管理、生产制造、气象观测、科学研究以及日常生活中被广泛应用,传统的模拟式湿度传感器一般都要设计信号调理电路并需要经过复杂的校准和标定过程,因此测量精度难以保证,且在线性度、重复性、互换性、一致性等方面往往不尽人意。SHT11是瑞士Sensirion公司推出的基于CMOSensTM技术的新型温湿度传感器。该传感器将CMOS芯片技术与传感器技术结合起来,从而发挥出它们强大的优势互补作用。2 性能特点SHT11温湿度传感器的主要特性如下:●将温湿度传感器、信号放大调理、A/D转换、I2C总线接口全部集成于一芯片(CMOSensTM技术);●可给出全校准相对湿度及温度值输出;●带有工业标准的I2C总线数字输出接口;●具有露点值计算输出功能;●具有卓越的长期稳定性;●湿度值输出分辨率为14位,温度值输出分辨率为12位,并可编程为12位和8位;●小体积(7.65×5.08×23.5mm),可表面贴装;●具有可靠的CRC数据传输校验功能;●片内装载的校准系数可保证100%互换性;●电源电压范围为2.4~5.5V;●电流消耗,测量时为550μA,平均为28μA,休眠时为3μA。
SHT11温湿度传感器采用SMD(LCC)表面贴片封装形式,管脚排列如图1所示,其引脚说明如下:(1)GND:接地端;(2)DATA:双向串行数据线;(3)SCK:串行时钟输入;(4)VDD电源端:0.4~5.5V电源端;(5~8)NC:空管脚。
3 工作原理SHT11的湿度检测运用电容式结构,并采用具有不同保护的“微型结构”检测电极系统与聚合物覆盖层来组成传感器芯片的电容,除保持电容式湿敏器件的原有特性外,还可抵御来自外界的影响。由于它将温度传感器与湿度传感器结合在一起而构成了一个单一的个体,因而测量精度较高且可精确得出露点,同时不会产生由于温度与湿度传感器之间随温度梯度变化引起的误差。CMOSensTM技术不仅将温湿度传感器结合在一起,而且还将信号放大器、模/数转换器、校准数据存储器、标准I2C总线等电路全部集成在一个芯片内。SHT11传感器的内部结构框图如图2所示。SHT11的每一个传感器都是在极为精确的湿度室中校准的。SHT11传感器的校准系数预先存在OTP内存中。经校准的相对湿度和温度传感器与一个14位的A/D转换器相连,可将转换后的数字温湿度值送给二线I2C总线器件,从而将数字信号转换为符合I2C总线协议的串行数字信号。
由于将传感器与电路部分结合在一起,因此,该传感器具有比其它类型的湿度传感器优越得多的性能。首先是传感器信号强度的增加增强了传感器的抗干扰性能,保证了传感器的长期稳定性,而A/D转换的同时完成,则降低了传感器对干扰噪声的敏感程度。其次在传感器芯片内装载的校准数据保证了每一只湿度传感器都具有相同的功能,即具有100%的互换性。最后,传感器可直接通过I2C总线与任何类型的微处理器、微控制器系统连接,从而减少了接口电路的硬件成本,简化了接口方式。3.1 输出特性(1)湿度值输出SHT11可通过I2C总线直接输出数字量湿度值,其相对湿度数字输出特性曲线如图3所示。由图3可看出,SHT11的输出特性呈一定的非线性,为了补偿湿度传感器的非线性,可按如下公式修正湿度值:RHlinear=c1+c2SORH+c3SORH2式中,SORH为传感器相对湿度测量值,系数取值如下:12位:SORH:c1=-4,c2=0.0405,c3=-2.8×10-68位:SORH:c1=-4,c2=0.648,c3=-7.2×10-4(2)温度值输出由于SHT11温度传感器的线性非常好,故可用下列公式将温度数字输出转换成实际温度值:T=d1+d2SOT当电源电压为5V,且温度传感器的分辨率为14位时,d1=-40�d2=0.01,当温度传感器的分辨率为12位时,d1=-40�d2=0.04。(3)露点计算空气的露点值可根据相对湿度和温度值来得出,具体的计算公式如下:LogEW=(0.66077+7.5T/(237.3+T)+[log10(RH)-2]Dp=[(0.66077-logEW)×237.3]/(logEW-8.16077)3.2 命令与接口时序SHT11传感器共有5条用户命令,具体命令格式见表1所列。下面介绍一下具体的命令顺序及命令时序。
i2c总线数字式温湿度传感器sht11及其在单片机系统的应用 来自: 免费论文网
表1 SHT11传感器命令列表命 令编 码说 明测量温度00011温度测量测量湿度00101湿度测量读寄存器状态00111“读”状态寄存器写寄存器状态00110“写”状态寄存器软启动11110重启芯片,清除状态记录器的错误记录11毫秒后进入下一个命令(1)传输开始初始化传输时,应首先发出“传输开始”命令,该命令可在SCK为高时使DATA由高电平变为低电平,并在下一个SCK为高时将DATA升高。接下来的命令顺序包含三个地址位(目前只支持“000”)和5个命令位,当DATA脚的ack位处于低电位时,表示SHT11正确收到命令。(2)连接复位顺序如果与SHT11传感器的通讯中断,下列信号顺序会使串口复位:即当DATA线处于高电平时,触发SCK 9次以上(含9次),此后应接着发一个“传输开始”命令。
表2 SHT11状态寄存器类型及说明位类型说 明缺 省 7 保留0 6读工检限(低电压检查)X 5 保留0 4 保留0 3 只用于试验,不可以使用0 2读/写加热0关1读/写不从OTP重下载0重下载0读/写'1'=8位相对湿度,12位温度分辨率。'0'=12位相对湿度,14位湿度分辨率012位相对湿度,14位湿度(3)温湿度测量时序当发出了温(湿)度测量命令后,控制器就要等到测量完成。使用8/12/14位的分辨率测量分别需要大约11/55/210ms的时间。为表明测量完成,SHT11会使数据线为低,此时控制器必须重新启动SCK,然后传送两字节的测量数据与1字节CRC校验和。控制器必须通过使DATA为低来确认每一个字节,所有的量均从右算,MSB列于第一位。通讯在确认CRC数据位后停止。如果没有用CRC-8校验和,则控制器就会在测量数据LSB后保持ack为高来停止通讯,SHT11在测量和通讯完成后会自动返回睡眠模式。需要注意的是:为使SHT11的温升低于0.1℃�此时的工作频率不能大于标定值的15%(如:12位精确度时,每秒最多进行3次测量)。测量温度和湿度命令所对应的时序如图4所示。
论文I2C总线数字式温湿度传感器SHT11及其在单片机系统的应用来自
图4
3.3 寄存器配置SHT11传感器中的一些高级功能是通过状态寄存器来实现的,寄存器各位的类型及说明见表2所列。下面对寄存器相关位的功能说明:(1)加热使芯片中的加热开关接通后,传感器温度大约增加5℃,从而使功耗增加至8mA@5V。加热用途如下:●通过对启动加热器前后的温、湿度进行比较,可以正确地区别传感器的功能;●在相对湿度较高的环境下,传感器可通过加热来避免冷凝。(2)低电压检测SHT11工作时可以自行检测VDD电压是否低于2.45V,准确度为±0.1V。(3)下载校准系数为了节省能量并提高速度,OTP在每次测量前都要重新下载校准系数,从而使每一次测量节省8.2ms的时间。(4)测量分辨率设定将测量分辨率从14位(温度)和12位(湿度)分别减到12位和8位可应用于高速或低功耗场合。
4 应用说明4.1 运行条件测量量程以外的温度会使湿度信号暂时地偏移+3%。然后传感器会慢慢返回到校准条件。若将芯片在湿度小于5%环境下加热24小时到90℃,芯片就会迅速恢复高相对湿度、高温度环境的影响,但是,延长强度条件会加速芯片的老化。4.2 安装注意事项由于大气的相对湿度与温度的关系比较密切,因此,测量大气温度时的要点是将传感器与大气保持同一温度,如果传感器线路板上有发热元件,SHT11应与热源保持良好的通风,为减少SHT11和PCB之间的热传导,应使铜导线最细并在其中加上窄缝,同时应避免使传感器在强光或UV下曝晒。传感器在布线时,SCK和DATA信号平行且相互接近,或信号线长于10cm时,均会产生干扰信息,此时应在两组信号之间放置VDD或GND。
5 具体应用图5是AT89C2051单片机与SHT11的接口电路。由于AT89C2051不具备I2C总线接口,故使用单片机通用I/O口线来虚拟I2C总线,并利用P1.0来虚拟数据线DATA,利用P1.1口线来虚拟时钟线,并在DATA端接入一只4.7kΩ的上拉电阻,同时,在VDD及GND端接入一只0.1μF的去耦电容。下面给出与上述硬件电路配套的C51应用程序。#define DATA P1_1#define SCK P1_0#define ACK 1#define noACK 0#define MEASURE_TEMP 0x03 //测量温度命令#define MEASURE_HUMI 0x05 //测量湿度命令//读温湿度数据char s-measure(unsigned char *p- value, un-signed char *p_checksum, unsigned char mode)unsigned char error=0;unsigned int i;s_transstart(); //传输开始switch(mode)caseTEMP:error+=s_write_byte(measure_temp);break;caseHUMI:error+=s_write_byte(measure_humi);break;default:break;for(i=0;i<65535;i++) if(DATA==0) break;if (DATA) reeor+=1;*(p_value)=s_read_byte(ACK);*(p_value+1)=s_read_byte(ACK);*p_checksum=s_read_byte(noACK);return error;//温湿度值标度变换及温度补偿void calc_sth15(float *p_humidity,float *p_tempera-ture)const float c1=-4.0;const float c2=0.0405;const float c3=-0.0000028;const float t1=-0.01;const float t2=0.00008;float rh=×p_humidity;float t=×p_temperature;float rh_lin;float th_ture;float t_c;t_c=t×0.01-40;rh_lin=c3×rh×rh+c2×rh+c1;trh_ture=(t_c-25)×(t1+t2×rh)+rh_lin;×p_temperature=t-c;×p_humidity=rh_ture;//从相对温度和湿度计算露点char calc_dewpoint(float h,float t)float logex,dew_point;logex=0.66077+7.5×t/(237.3+t)+[log10(h)-2];dew_point=(logex-0.66077)×237.3/(0.66077+7.5-logex);return dew_point;限于篇幅,上述程序中未给出传输开始、写字节数据、读字节数据函数。
.NET 与树莓派温度/湿度传感器——SHT30
SHT3XX 系列的传感,常见的有三种:SHT 30、SHT 31、SHT 35。其中,比较便宜性价比较愉快的是 SHT 30。
DHT 11 模块也是检测温度、湿度的,但SHT 11 使用的不是我们常见的 i2c 等协议,而是用它自己特有的单数据线协议。因此使用 DHT11 你需要自己写通信协议或使用现有的库;另外,DHT 11 模块似乎反应不太灵敏,上电后还得等几秒钟才能读到稳定数据。最重要的一点,不知道是不是老周运气不好,买了三个 DHT 11,坏了两个。而 SHT 30,一直用着——老周把它弄成家用温度计,挂在家里长期运作。当然,不是用树莓派去控制。毕竟,你想想,刻意用树莓派去读个温度,这也太浪费资源了,最开始是和客厅的监控连在一起的。老周买了个摄像头,用一块2G内存的树莓派刷了 Motion ,做成了监控,供家里客厅使用。
为了完美的伪装,找了个旧手机的盒子,自己打几个孔,然后把树莓派放进盒子里,摄像头用双面胶贴在盒子上。伪装效果还行,外人进来了一般不会发现。装中盒子里就造成一个问题:SHT30 检测温度湿度就不准了。于是,老周就拿掉了SHT,买了一块山寨的 ESP-8266,体积也很小,功耗低,也便宜,搞几个干电池就能供电了,然后就用 ESP 8266 来控制 SHT 30,还能通过 Wi-fi 来传数据(就读个温度/湿度,安全性不重要,随便透传)。用了三天,ESP 8266 上的板载LED灯坏了,但开发板还能正常用。
如果你特别喜欢大草莓(树莓派),也可以买树莓派家族的微控制器开发板—— 树莓派 Pico,也可以叫它小草莓。小草莓和 Arduino 系列的板子有点像(和 Nano 体积差不多),有 Micro-USB 口,用一根安卓手机数据线就可以和电脑连接了,非常地友好。Pico 不带操作系统,就是一块单片机,所以功耗低,特省电,供电电压在 1.8V 到 5.5V 之间,可以用手机充电器供电,省事。
好了,扯远了,因为本文的内容比较 easy,所以老周就先扯些没用的,接下来咱们扯些有用的。
SHT30 很小巧,标准的 i2C 引脚——vcc、gnd、sda、scl。买的时候最好买已经焊接好引脚的,不然,自己焊的话真的需要经验,毕竟模块很小,技术不好容易弄坏,动作不够快也容易焊成连锡——各个引脚导通了。老周的焊功比较烂,不敢自己动手。
既然是标准的 I2C 引脚,这模块当然是用 I2C 来通信了。如果你没作更改,默认的从机地址是 0x44。
这一次,老周向各位介绍微软封装的另一个库——iot bindings。这个库是微软提供的,里面封装了很多常用模块的操作,我们不用每次都自己手动写硬件通信,直接引用,开箱即用,无需调校,免打孔,免安装。
在创建.NET 项目后,执行以下命令引用(也可以用VS的Nuget管理工具)。
dotnet add package System.Device.Gpio
dotnet add package iot.device.bindings
封装的模块类位于命名空间 Iot.Device.XXX 中,其中XXX是各类模块的大类名。比如,我们这次用的 SHT 30, 它属于 SHT 30、31、35 系列,故命名空间为 Iot.Device.Sht3x。
在代码文件中,using 一下。
using System; using System.Device.I2c; using Iot.Device.Sht3x;
然后,很简单的几行代码调用。
I2cConnectionSettings set=new(4, (byte)I2cAddress.AddrLow); I2cDevice dev= I2cDevice.Create(set);
using Sht3x sht= new Sht3x(dev); bool running = true; Console.CancelKeyPress += (_,_) => running=false; while(running) { // 温度 double temp = sht.Temperature.DegreesCelsius; // 湿度 double hui = sht.Humidity.Percent; Console.WriteLine("温度:{0:N1} ℃\\n湿度:{1:N1} %RH", temp, hui); System.Threading.Thread.Sleep(2000); }
注意看 I2cAddress 枚举,它已经为我们定义好了 SHT 3x 传感器(模块)的地址:
public enum I2cAddress : byte { AddrLow = 0x44, AddrHigh = 0x45 }
我们在用时选默认地址 0x44 即可。
Sht3x 类已封装好,访问 Temperature 获取温度值,DegreesCelsius 是摄氏度,其他的不知道什么单位,老周见识浅,没研究过。Humidity 属性是相对湿度,一般用百分比。
写完代码后,发布。
dotnet publish -c Release -r linux-arm --no-self-contained
如果你的大草莓上没有配置 dotnet 框架,那就把 --no-self-contained 去掉,让它生成全部类库,然后全部复制到大草莓上运行。
scp -r bin\\Release\\net5.0\\linux-arm\\publish\\* pi@192.168.0.xxx:/home/pi/<你要放置的目录>
运行结果如下图所示。
是不是很简单呢?前面在写这系列文章时,老周没有提到这个 Iot.Device.Bindings 库,是因为想让大伙伴们对 GPIO 一些基本通信有所了解。咱们在学习的时候,不要急着拿现成的库来用,先自己试着写些简单的东东玩玩,对相关知识有一定了解后,再去寻找现成的库。这样既能学到原理性的东西,也能提高开发效率。
目前这个 bindings 库微软在不断地更新,支持的模块越来越多。尽管如此,有些模块还是没有收录进去。比如,上次老周介绍过的 MPU 6050 ,bindings 库里面就没有,库里面只有 MPU 6500 和 MPU 9250。
以上是关于关于SHT11的编程的主要内容,如果未能解决你的问题,请参考以下文章