湿度传感器 - 从零开始认识各种传感器【第二期】
本篇来学习湿度传感器。我们将介绍到湿度传感器的工作原理、常见种类、以及通过MCU实际演示对于湿度传感器数据的读取过程。
标签
嵌入式系统
Lucia
更新2024-08-02
77

1、什么是湿度传感器

湿度传感器是一种用于测量空气中相对湿度的设备。它广泛应用于多个领域,如气象、建筑、农业、医学、食品加工等。它测量的是被测环境中的相对含水量。以我们在家用常见的温湿度计(图1)读到的数值为例,它是一个百分比数。如果把空气中水蒸气饱和状态下的湿度定义为100,那么读数是55则表示当前空气中含有的水蒸气含量是饱和状态下的55%。所以它表示的是相对湿度。

我们知道“相对湿度” 与当前温度是密切相关的,当空气受温度影响而收缩或膨胀时,相对湿度会发生变化,比如温度下降时,空气体积减小,但是含有的水蒸气不变,所以相对湿度上升了, 反之如果温度上升,空气体积膨胀,水蒸气含量不变,会造成相对湿度下降。 而绝对湿度的表示是用重量比来衡量的,不受温度变化影响。我们通常在仪表上看到的都是相对湿度。


2、湿度传感器是如何工作的

常见的湿度传感器的工作原理是基于材料的吸湿性质,如湿敏电阻,湿敏电容等。因为水分子具有极性,当材料受到湿气的影响时,它的电导率会随之变化,从而影响器件的阻值或者容值,那么相应的就可以测量出对应的湿度度变化。

另一种方式是利用物理量在不同湿度空气中传播速度和损耗的差异来测量湿度。比如利用潮湿空气和干燥空气的热传导速度的差异,可以制成热敏电阻式湿度传感器。它将一个参考NTC放在密封的干燥金属盒中,而测量NTC放在开孔金属盒中与潮湿空气接触,由于潮湿空气和干燥空气热传导性质的差异,会使得两个NTC的阻值产生差异,从而导致测量电压Vm的变化,这样就可以测量出湿度。

另外利用微波,超声波或者红外线在含水蒸汽的空气中传播产生损耗的原理来 ,可以制成微波,超声波以及红外线湿度传感器。


3、常见的湿度传感器的种类

3.1 湿敏电阻

湿敏电阻的特点是在基片上覆盖一层用感湿材料制成的膜,当空气中的水蒸气吸附在感湿膜上时,元件的电阻率和电阻值都发生变化,利用这一特性即可测量湿度。湿敏电阻的优点是灵敏度高,缺点则是线性度 较差。湿敏电阻的种类很多,例如金属氧化物湿敏电阻、硅湿敏电阻、陶瓷湿敏电阻等。

3.2 湿敏电容

湿敏电容一般由高分子薄膜电容制成。当环境湿度发生改变时,湿敏电容式传感器的介电常数发生变化,使其电容量也发生变化,其电容变化量与相对湿度成正比。湿敏电容式传感器的主要优点是灵敏度高、响应速度快、容易实现小型化和集成化。

3.3 湿敏电容和湿敏电阻的对比

3.4 半导体及IC湿度传感器

另外还有二极管湿敏器件和MOSFET湿度敏感器件等。其特点是易于和半导体电路集成在一起。比如这款在得捷电子网站上搜索到的温湿度传感器IC【SHTC3-TR-10KS】,它具有封装小,响应速度快,精度高的特点。值得一提的是,由于温度和湿度的相关性,市面上的IC类的传感器一般都是同时提供了温度和湿度的测量数据。

4、湿度传感器的应用和设计注意事项

湿度传感器是非密封性的,为保护测量的准确度和稳定性,应尽量避免在酸性、碱性,粉尘,及含有机溶剂的环境中使用。为正确反映测试空间的湿度,还应避免将传感器安放在离墙壁太近或空气不流通的死角处。在设计PCB时,要注意湿度传感器附近空气流通的通道。

5、湿度传感器实验演示

最后,我们来演示如何使用配备显示屏的树莓派读取湿度传感器的数据并将结果显示出来。这里我们选用的是一款DHT11数字温湿度传感器。树莓派MCU通过模拟接口读取到的数字进行数字化处理后,在显示屏上直观地显示出来。

主控板卡:基于RP2040的带屏调试助手

以下是主程序中对于温度传感器数据的获取代码示例。

from breakout_colourlcd240x240 import BreakoutColourLCD240x240
from machine import ADC, Pin, Timer, PWM,I2C
from utime import sleep
import time, math,array
#------------------------------------------------------------------

######################################################################

# 定义连接到 DHT22 数据线的引脚
data_pin=Pin(20, Pin.IN,Pin.PULL_UP)

def readdata():
# 向 DHT22 传感器发送启动信号
data_pin.init(Pin.OUT)
data_pin.low()
time.sleep_ms(20)#微处理器的I/O设置为输出同时输出低电平,且低电平保持时间不能小于18ms(最大不得超过30ms)
data_pin.high()
data_pin.init(Pin.IN, Pin.PULL_UP)
# 等待 DHT22 传感器响应
while data_pin.value() == 1:
pass
while data_pin.value() == 0:
pass
while data_pin.value() == 1:
pass
data_pro = []
j=0
k=0
while j < 40:
k = 0
while data_pin.value() == 0:
pass
while data_pin.value() == 1:
k += 1
if k > 100:
break
if k < 3:
data_pro.append(0)
else:
data_pro.append(1)
j += 1
return data_pro

def read():
# 读取传感器数据并验证校验和
data=[]
data = readdata()
humidity_bit=data[0:8]
humidity_point_bit=data[8:16]
temperature_bit=data[16:24]
temperature_point_bit=data[24:32]
check_bit=data[32:40]
humidity=0
humidity_point=0
temperature=0
temperature_point=0
check=0
#温度、湿度、校验位计算
for i in range(8):
#湿度计算
humidity+=humidity_bit[i]*2**(7-i)
humidity_point+=humidity_point_bit[i]*2**(7-i)
#温度计算
temperature+=temperature_bit[i]*2**(7-i)
temperature_point+=temperature_point_bit[i]*2**(7-i)
#校验位计算
check+=check_bit[i]*2**(7-i)
tmp=humidity+humidity_point+temperature+temperature_point
return temperature, humidity

######################################################################
#初始化
width = BreakoutColourLCD240x240.WIDTH
height = BreakoutColourLCD240x240.HEIGHT
display_buffer = bytearray(width * height*2)
display = BreakoutColourLCD240x240(display_buffer)

timer1 = Timer() #定时器1

stemp = ADC(2)
current_temp = 0
#-------------------------------------------------------------------
def display_init():

display.set_pen(0,255,0)
display.rectangle(58,30,13,160)
display.circle(64,190,10)
display.set_pen(255,0,0)
display.text("current", 150, 20, 194, 2)
display.text("humidity", 150, 35, 194, 2)

display.update()

for i in range(6):
display.set_pen(0,200,0)
display.pixel_span(80,27 + i*30,10)
display.text(str(100 - i *20), 100, 20+i*30, 194, 2)
display.set_pen(0,0,220)
if i < 5:
for j in range(4):
display.pixel_span(80,33 + j*6 + i * 30,5)
display.update()

display.update()
#---------------------------------------------------------------------
def display_change(temp, color):
global current_temp
current_temp = temp
#print(temp)
display.set_pen(color[0], color[1], color[2])
display.rectangle(58,30,13,160)
display.circle(64,190,10)
display.set_pen(0,0,150)
display.rectangle(58,20,13,7+int((50-temp/2)/2)*6)
display.set_pen(0,0,0)
display.rectangle(150,50,90,40)
display.set_pen(0,255,0)
display.text(str(temp)+"%", 150, 50, 5, 5)
display.update()
#----------------------------------------------------------------------

def get_temp():
# 尝试从DHT22传感器读取温度和湿度数据
temperature, humidity = read()
time.sleep(0.5) # 等待 2 秒,然后进行下一次读数
return humidity

#-----------------------------------------------------------------------

def main():

color = [0,255,0]
timer1 = Timer()

display_init()

#timer1初始化
timer1.init(freq=5,mode=Timer.PERIODIC, callback=lambda t:display_change(round(get_temp(),1), color))

while True:
sleep(0.1)
main()
团队介绍
你了解生活中常见的各种传感器是如何工作的吗?本系列将选择30种不同类型的传感器,通过5分钟左右的视频和文章带你一步步了解每个传感器的内部结构和工作原理,并推荐选型和购买合适的传感器。
团队成员
硬禾学堂
硬禾核心团队举办实战培训营已有超过6年的经验。自成立起矢志建立专业化、系统化、工程化技能培训体系,以在工业界中的最佳实践为行业培养技术中坚和领军人才。 硬禾采用Project-Based Learning(PBL)项目制教学方法,在基于实际产品和项目的教学过程中借助短期的高强度、快节奏的系统性实战训练,让学员迅速积累优秀工程师应具备的专业技能、职业素养和全区思维,加速其职业成长。
得捷电子
DigiKey 总部位于美国明尼苏达州锡夫里弗福尔斯市,是全球电子元器件和自动化产品前沿商业分销领域公认的领航者和持续创新者。我们通过分销来自 2,900 多家优质品牌制造商的 1,530 多万种元器件获得了强大的技术优势,并凭借行业领先的产品存货广度和深度以及立即发货的能力,确立了我们在分销领域的领导地位。DigiKey 还为工程师、设计师、创建者和采购专业人员提供丰富的数字解决方案、无障碍互动和工具支持,以帮助他们提升工作效率。如需了解更多信息,请访问 www.digikey.cn 并关注我们的微信、微博、腾讯视频和 BiliBili 账号。
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号