湿度传感器 - 从零开始认识各种传感器【第二期】

本篇来学习湿度传感器。我们将介绍到湿度传感器的工作原理、常见种类,如何查找和购买,以及通过MCU实际演示对于湿度传感器数据的读取过程。

湿度传感器|从零开始认识各种传感器

1. 什么是湿度传感器

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

图1 温湿度计

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

图2 温湿度相关性

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

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

图3 湿度传感器工作原理

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

图4 热敏电阻湿度传感器

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

图5 其他湿度传感器

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

3.1 湿敏电阻

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

图6 湿敏电阻

3.2 湿敏电容

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

图7 湿敏电容及其等效形式

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

图8 湿敏电容和湿敏电阻的对比

3.4 半导体及IC湿度传感器

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

图9 IC湿度传感器

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

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

5. 湿度传感器实验演示

图10  树莓派读取湿度传感器过程展示

主控板卡:基于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()
  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值