您的位置:

ds18b20温度传感器工作原理解析

一、ds18b20概述

DS18B20是一款数字温度传感器,由美国独立半导体公司研制生产。其特点是一线式结构、数字化输出、精度高、抗干扰能力强等。DS18B20提供的数字输出,能够节省传感器到微控制器之间的CAN控制资源,并具有传输距离远、干扰小、成本低等优点。

二、ds18b20工作原理

DS18B20数字温度传感器是基于热电阻元件(PTC)的数字温度传感器。在DS18B20的核心部件中,有一块名为“温度传感器”(Temperature Sensor)的芯片。其内部结构如下图所示:

             	 _______
            	|       |
 GND------|______ |-|         |
                          |          |
 DQ--------|——CHIP——|-|         |
                          |_____|
 VCC--------|

其中,“温度传感器”由一根金属导线(镍、铬合金)构成,即作为Pt电阻元件,同时还起到振动元件的作用。当外界温度变化时,它的电阻值也随之变化。具体地,当温度升高时,它的电阻值也增大。

当程序启动时,微控制器将引脚DQ输出初始化为输出高电平,然后再将其设置为输入模式,在这种模式下,DS18B20将输出其唯一的ROM代码,这个代码被用来在单个脚上识别和区别多个DS18B20。

三、ds18b20连接方式

DS18B20与微处理器或其他数字IC的连接方式如下图所示,其中VCC、GND、DQ为三根线,这是一根单线(总线)连接器。

                  __________
                 |          |
         VCC----|1         3|----DQ
         GND----|2         4|----NC(Not Connected)
                 |__________|

其中VCC为芯片正极,GND为芯片负极,DQ为芯片数据线,NC用于测试,暂时没有使用。

四、ds18b20程序设计

下面的代码是利用Python语言写的,可以实现读取DS18B20模块输出的温度值。其中DS18B20的数据线连接到了GPIO4引脚处,使用的是W1协议库文件,代码如下:

   import os
   import glob
   import time
 
# 单总线接口路径
   os.system('modprobe w1-gpio')
# 一个总线下的多个DS18B20的通信串口
   os.system('modprobe w1-therm')
 
# 定义传感器的数据文件路径
   base_dir = '/sys/bus/w1/devices/'
# 获取所有的DS18B20的路径信息
   device_folder = glob.glob(base_dir + '28*')[0]
# 获取DS18B20数据文件所对应的文件路径
   device_file = device_folder + '/w1_slave'
 
   def read_temp_raw():
       f = open(device_file, 'r')
       lines = f.readlines()
       f.close()
       return lines
 
   def read_temp():
       lines = read_temp_raw()
       while lines[0].strip()[-3:] != 'YES':
           time.sleep(0.2)
           lines = read_temp_raw()
       equals_pos = lines[1].find('t=')
       if equals_pos != -1:
           temp_string = lines[1][equals_pos+2:]
           temp_c = float(temp_string) / 1000.0
           return temp_c
 
   while True:
       print(read_temp())
       time.sleep(1)

五、ds18b20传感器的应用

DS18B20数字温度传感器最常见的应用场合是在家庭和办公室中进行温度和湿度测量,以及在工业设备上进行温度监测等领域内,如下使用DS18B20测量温度的代码:

#include  <OneWire.h>
#include  <DallasTemperature.h>
// 定义总线变量Pin为2号针脚
#define ONE_WIRE_BUS 2        
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup(void)
{
  Serial.begin(9600);
  sensors.begin();
}
void loop(void)
{
  sensors.requestTemperatures();
  Serial.println(sensors.getTempCByIndex(0));
  delay(1000);
}