跳转至

模拟温度传感器实验

Lab5实验报告:模拟温度传感器实验

一、实验介绍

温度感测模块提供易于使用的传感器,它带有模拟和数字输出。该温度模块 使用 NTC(负温度系数)热敏电阻来检测温度变化,其对温度感应非常灵敏。 NTC 热敏电阻电路相对简单,价格低廉,组件精确,可以轻松获取项目的温度数 据,因此广泛应用于各种温度的感测与补偿中。 简而言之,NTC 热敏电阻将随 温度变化传递为电阻变化,利用这种特性,我们可以通过测量电阻网络(例如分 压器)的电压来检测室内/环境温度。 本次实验的任务为:获取当前环境的温度值。

二、实验原理

  1. NTC热敏电阻特性
  2. 在本实验中,我们将使用Steinhart-Hart方程来计算热敏电阻的精确温度,这是一个用于描述热敏电阻电阻-温度特性的经验公式,即Steinhart-Hart方程。
  3. Steinhart-Hart方程表达式为 1T=A+Bln(R)+C(ln(R))3\frac{1}{T} = A + B\ln(R) + C(\ln(R))^3,其中TT是以开尔文为单位的绝对温度,RR是热敏电阻在给定温度下的电阻值,而AA, BB, CC 则是取决于具体型号的常数参数。对于本次实验,假设R0R_0为10kΩ,BB值为3950K。

  4. 电路

  5. 温度传感器模块由一个NTC热敏电阻和一个固定电阻组成分压电路。当环境温度发生变化时,热敏电阻的阻值也会随之改变,从而影响分压点处的电压输出。 alt text
  6. 通过连接到PCF8591的模拟输入端口AIN0,我们可以采集这个电压信号,并将其转换为数字形式以便后续分析。

  7. 数据处理

  8. 首先从PCF8591读取经过A/D转换后的数值analogVal=PCF8591.read(0)analogVal =PCF8591.read(0),然后根据已知条件(如供电电压Vcc=5VV_{cc}=5V,ADC分辨率为8位即0255对应05V)计算出对应的模拟电压 Vr=Vccfloat(analogVal)/255.0V_r = V_{cc} * float(analogVal) / 255.0
  9. 接着利用分压比公式计算得到热敏电阻的实际阻值Rt=R0Vr/(VccVr)R_t = R_0 * V_r / (V_{cc} - V_r)
  10. 再代入Steinhart-Hart方程求解温度T。

三、实验步骤

  1. 硬件连接
  2. 连接Raspberry Pi、T型转接板和PCF8591模块之间的SDA、SCL、VCC和GND引脚。alt text
  3. 将模拟温度传感器的AO引脚连接到PCF8591模块的AIN0,DO引脚可以留空或接地,VCC引脚接5V电源,GND引脚接地。

  4. 配置I2C总线: 见Lab4实验报告中的第2步。

  5. 编写代码

  6. 导入必要的库。
  7. 创建一个SMBus实例并与PCF8591建立连接,读取AIN0上的模拟值并根据该值计算温度。

程序框图:

Python代码:

Python
import smbus
import math
import time

address = 0x48  # 地址
control_bit = 0x40  # 控制字

# 常数
R0 = 10000  
B = 3950  
T0 = 298.15  # 25°C -> 开氏温度
Vcc = 5.0  # 5V供电

bus = smbus.SMBus(1)

def read_temperature():
    try:
        # 设置PCF8591地址和控制位
        bus.write_byte(address, control_bit)

        analog_value = bus.read_byte(address)

        Vr = (analog_value / 255.0) * Vcc

        # 计算热敏电阻的阻值
        Rt = R0 * Vr / (Vcc - Vr)

        # 计算温度
        temp_kelvin = 1 / (math.log(Rt / R0) / B + 1 / T0)
        temp_celsius = temp_kelvin - 273.15

        return round(temp_celsius, 2)

    except Exception as e:
        print("Error reading temperature:", str(e))
        return None

try:
    while True:
        temperature = read_temperature()
        if temperature is not None:
            print(f"Temperature: {temperature}°C")
        else:
            print("Failed to read temperature.")

        time.sleep(1)

except KeyboardInterrupt:
   print("\nExiting program.")

评论