当前位置:   article > 正文

在树莓派下利用DS18B20传感器获取温度

在树莓派下利用DS18B20传感器获取温度

一、DS18D20传感器简介:

DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。它是由Dallas半导体公司推出的一种的一线总线(1-Wire)接口的数字温度传感器,它工作在 3v-5.5V的电压范围,其测量温度范围为-55~+125℃ ,精度为±0.5℃。该产品适用于冷冻库,粮仓,储罐,电讯机房,电力机房,电缆线槽等测温和控制领域。轴瓦,缸体,纺机,空调,等狭小空间工业设备测温和控制。汽车空调、冰箱、冷柜、以及中低温干燥箱等。供热/制冷管道热量计量,中央空调分户热能计量和工业领域测温和控制。
在这里插入图片描述
在这里插入图片描述
DS18B20传感器主要具有以下功能特性:

  • 它的工作电压范围为3.0v~5.0v,另外也可以直接由数据线供电而不需要外部电源供电;
  • 采用一线协议(1-Wire),即仅使用一根数据线(以及地线)与微控制器(MCU)进行通信;
  • 它可以提供9-Bit到12-Bit的测量精度和一个用户可编程的非易失性且具有过温和低温触发报警的报警功能;
  • 该传感器的温度检测范围为-55℃至+125℃,并且在温度范围超过-10℃至85℃之外时还具有±0.5℃的精度;
  • DS18B20温度转换时间在转换精度为12-Bits时达到最大值750ms;

每个DS18B20芯片在出厂时,都固化烧录了一个唯一的64位产品序列号在其ROM中,它可以看作是该 DS18B20 的地址序列码。 64 位 ROM 的排列是:前 8 位是产品家族码,接着 48 位是DS18B20 的序列号,最后 8 位是前面 56 位的循环冗余校验码(CRC=X8+X5+X4+1)。 ROM 作用是使每一个 DS18B20 都各不相同,这样就可实现一根总线上挂接多个 DS18B20。

数据处理

DS18B20的高速暂存存储器由9个字节组成。当温度转换命令(0x44)发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器前两个字节。接着单片机可以发送读暂存存储器命令(0xBH)读出存储器里的值, 存储器里的9个字节的存储结构如下图所示:
在这里插入图片描述

  • 字节0~1 是温度存储器,用来存储转换好的温度。第0个字节存储温度低8位,第一个字节存储温度高8位;
  • 字节2~3 是用户用来设置最高报警和最低报警值(TH和TL)。
  • 字节4 是配置寄存器,用来配置转换精度,可以设置为9~12 位。
  • 字节5~7 保留位。芯片内部使用
  • 字节8 CRC校验位。是64位ROM中的前56位编码的校验码,由CRC发生器产生。
    如果我们只关心采样温度值的话,则只需要读前两个字节即可。其中Byte[0]为温度值的低字节,而Byte[1]为温度值的高字节。这16位数据的格式如下图所示:
    在这里插入图片描述
  • BIT[3:0]为温度值的小数部分;
  • BIT[10:4]为温度值的整数部分;
  • BIT[15:11]则为符号位,如果为0则温度为正值,如果为1则温度为负值。
  • 在树莓派下运行结果如下:

![在这里插入图片描述](https://img-blog.csdnimg.cn/c384a96b9532464a8eafc7dd9072e7c1.png
![在这里插入图片描述](https://img-blog.csdnimg.cn/1c59f9e2004a46eebce79c5ee9e945a5.png

实验结果

在这里插入图片描述

crc=ff : 它是DS18B20采样时传输数据的CRC校验和,主要用来校验传感器将采样数据发送给CPU时是否出错;
t=20062: 后面的 20062就是采样温度值,其中20是整数部分,062为小数部分,即本次采样温度为 25.062℃。

DS18B20温度采样编程

实现简单的对文件的读取并获取温度

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <time.h>
#include <errno.h>
#include <string.h>
int ds18b20_gettemp(float *temp);
int main(int argc,char *argv[])
{
    float temp;
    if(ds18b20_gettemp(&temp) < 0)
    {
        printf("ERROR ,ds18b20 get temp faulire");
        return 1;
    }
    printf("ds18b20 get temp: %f \n",temp);
}

int ds18b20_gettemp(float *temp)
{
    char path[120] = "/sys/bus/w1/devices/";
    int fd;
    char buf[128];
    DIR *dirp;
    struct dirent *direntp;
    char chip[40];
    char *ptr;

    if((dirp = opendir(path))==NULL)
    {
        printf("FILE: %s OPEN faulire %s",path,strerror(errno));
        return -1;
    }
    while((direntp=readdir(dirp))!=NULL)
    {
        printf("find file:%s\n",direntp->d_name);
        if(strstr(direntp->d_name,"28-"))
        {
            strcpy(chip,direntp->d_name);
            printf("28- file name :\n",chip);
        }

    }
    closedir(dirp);
    strncat(path,chip,sizeof(path));
    printf("%s\n",chip);
    strncat(path,"/w1_slave",sizeof("/w1_slave"));
    printf("%s\n",path);
    if((fd=open(path,O_RDONLY))<0)
    {
        printf("OPEN temp faulire %s",strerror(errno));
        return -2;
    }
    printf("%d\n",fd);
    if(read(fd,buf,sizeof(buf))<0)
    {
        printf("read %s error : %s\n",path,strerror(errno));
        return -3;
    }
    ptr = strstr(buf,"t=") + 2;
    *temp=atof(ptr)/1000;
    return 0;
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/647952
推荐阅读
相关标签
  

闽ICP备14008679号