中职扩展资源包资料树莓派系列教程14单总线控制DS18B20.docx

上传人:b****9 文档编号:25034962 上传时间:2023-06-04 格式:DOCX 页数:11 大小:118.63KB
下载 相关 举报
中职扩展资源包资料树莓派系列教程14单总线控制DS18B20.docx_第1页
第1页 / 共11页
中职扩展资源包资料树莓派系列教程14单总线控制DS18B20.docx_第2页
第2页 / 共11页
中职扩展资源包资料树莓派系列教程14单总线控制DS18B20.docx_第3页
第3页 / 共11页
中职扩展资源包资料树莓派系列教程14单总线控制DS18B20.docx_第4页
第4页 / 共11页
中职扩展资源包资料树莓派系列教程14单总线控制DS18B20.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

中职扩展资源包资料树莓派系列教程14单总线控制DS18B20.docx

《中职扩展资源包资料树莓派系列教程14单总线控制DS18B20.docx》由会员分享,可在线阅读,更多相关《中职扩展资源包资料树莓派系列教程14单总线控制DS18B20.docx(11页珍藏版)》请在冰豆网上搜索。

中职扩展资源包资料树莓派系列教程14单总线控制DS18B20.docx

中职扩展资源包资料树莓派系列教程14单总线控制DS18B20

DS18B20是一个比较常用的温度传感器,采用单总线控制,以前用单片机编程控制时严格按照单总线的时序控制,今天来看看在linux系统下如何控制DS18B20,体验一下在linux世界,一切都是文件。

一、修改配置文件

1

sudovi/boot/config.txt

(注:

运行sudo raspi-config实际上也是修改这个文件,例如设置Advanced Options  -> I2C 启动i2C内核驱动,就是修个dtparam=i2c_arm=on 这一行)

在/boot/config.txt文件后面添加下面这一句,这一句就是树莓派添加Device Tree设备,dtoverlay=w1-gpio-pull表示添加单总线设备,gpioin=4默认管脚为4,如果DS18B20接到其他管脚则需要修改这个值,Pioneer 600扩展板DS18B20默认接到4,故不用修改。

(注:

管脚为BCM编号)

1

dtoverlay=w1-gpio-pull,gpioin=4

在/boot/overlays/README中有关于树莓派Device Tree的详细介绍,在其中我们找到下面关于w1-gpio-pullup设备的介绍如下图。

二、查看模块是否启动

重启树莓派是设置生效,运行lsmod命令,如果发现红色方框的两个模块说明模块已启动。

如果没有发现,也可以运行如下命令加载模块

1

sudomodprobew1_gpio

2

sudomodprobew1_therm

三、 读取温度

如果没有问题,在/sys/bus/w1/devices中发现一个28-XXXX开头的文件夹,这个就是DS18B20的ROM,每个DS18B20都一样,在这个文件夹中读取w1_slave文件则会返回当前温度值。

操作如下图:

1

sudomodprobew1-gpio

2

sudomodprobew1-therm

3

cd /sys/bus/w1/devices

4

cd28-00000xxx

5

catw1_slave

返回数据中,第一行最后的YRS表示CRC校验成功,数据有效。

第二行最后t=30500表示当前温度为30.5摄氏度。

如果接多个DS18B20,将会看到多个28-xxxx的文件,分别对应各个DS18B20。

四、软件编程

1、sysfs

01

#include 

02

#include 

03

#include 

04

#include 

05

#include 

06

#include 

07

#include 

08

 

09

intmain(intargc,char*argv[])

10

{

11

    charpath[50]= "/sys/bus/w1/devices/";

12

    charrom[20];

13

    charbuf[100];

14

    DIR*dirp;

15

    structdirent*direntp;

16

    intfd=-1;

17

    char*temp;

18

    floatvalue;

19

 

20

    system("sudomodprobew1-gpio");

21

    system("sudomodprobew1-therm");

22

    if((dirp=opendir(path))==NULL)

23

    {

24

        printf("opendirerror\n");

25

        return 1;

26

    }

27

 

28

    while((direntp=readdir(dirp))!

=NULL)

29

    {

30

        if(strstr(direntp->d_name,"28-00000"))

31

        {

32

            strcpy(rom,direntp->d_name);

33

            printf("rom:

%s\n",rom);

34

        }

35

    }

36

    closedir(dirp);

37

 

38

    strcat(path,rom);

39

    strcat(path,"/w1_slave");

40

    while

(1)

41

    {

42

        if((fd=open(path,O_RDONLY))<0)

43

        {

44

            printf("openerror\n");

45

            return 1;

46

        }

47

 

48

        if(read(fd,buf,sizeof(buf))<0)

49

        {

50

            printf("readerror\n");

51

            return 1;

52

        }

53

 

54

        temp= strchr(buf,'t');

55

        sscanf(temp,"t=%s",temp);

56

        value=atof(temp)/1000;

57

        printf("temp:

%3.3f°C\n",value);

58

 

59

        sleep

(1);

60

    }

61

    return 0;

62

}

编译并执行,结果如图

1

gcc–Wallds18b20.c–ods18b20

2

sudods18b20

注:

(1)system("sudo modprobe w1-gpio");system("sudo modprobe w1-therm");在程序的开头运行了一下modprobe命令

    

(2) dirp = opendir(path) 打开/sys/bus/w1/devices/文件路径

(3)direntp = readdir(dirp) 读取当前路径下的文件或文件夹

(4)strstr(direntp->d_name,"28-00000")

 查找28-00000开头的文件,strstr为字符串操作函数,上面这条语句表示文件名字是否包含字符串“28-00000”,如果匹配则返回第一次匹配的地址,没有搜索到则返回NULL.

(5)strcpy(rom,direntp->d_name); strcpy为字符串复制函数。

,将包含28-00000的文件名复制到rom字符串

(6)strcat(path,rom);strcat(path,"/w1_slave");  strcat为字符串连接函数,此时path的值为/sys/bus/w1/devices/28-00000xxxx/w1_slave

(7)fd = open(path,O_RDONLY); read(fd,buf,sizeof(buf)) 打开文件并读取数据

(8)temp = strchr(buf,'t'); 查找字符‘t’第一次出现的位置, 

(9)sscanf(temp,"t=%s",temp); sscanf函数是从一个字符串中读进与指定格式相符的数据,此处为从第二行数据中扫描出温度值

(10)value = atof(temp)/1000; atof函数把字符串转化为浮点数。

2、python

01

importos

02

import glob

03

importtime

04

 

05

os.system('modprobew1-gpio')

06

os.system('modprobew1-therm')

07

 

08

base_dir= '/sys/bus/w1/devices/'

09

device_folder= glob.glob(base_dir+ '28*')[0]

10

device_file=device_folder+ '/w1_slave'

11

defread_rom():

12

    name_file=device_folder+'/name'

13

    f=open(name_file,'r')

14

    return f.readline()

15

 

16

defread_temp_raw():

17

    f=open(device_file, 'r')

18

    lines=f.readlines()

19

    f.close()

20

    return lines

21

 

22

defread_temp():

23

    lines=read_temp_raw()

24

    while lines[0].strip()[-3:

]!

= 'YES':

25

        time.sleep(0.2)

26

        lines=read_temp_raw()

27

    equals_pos=lines[1].find('t=')

28

    if equals_pos!

=-1:

29

        temp_string=lines[1][equals_pos+2:

]

30

        temp_c=float(temp_string)/1000.0

31

        temp_f=temp_c*9.0/5.0+32.0

32

        return temp_c,temp_f

33

 

34

print('rom:

'+read_rom())

35

while True:

36

    print('C=%3.3f F=%3.3f'%read_temp())

37

time.sleep

(1)

运行程序,运行结果如图

1

sudopythonds18b20.py

注:

(1)程序的开头运行了一下modprobe命令

   

(2) device_folder = glob.glob(base_dir + '28*')[0]

    device_file = device_folder + '/w1_slave'

   定义设备文件夹和设备文件,glob.glob(base_dir + '28*'))函数为获得base_dir路径下所有28开头的文件。

(3)while lines[0].strip()[-3:

] !

= 'YES':

  判断w1-value第一行的最后三个字符是否为‘YES‘

(4)equals_pos = lines[1].find('t=') 查找第二行中‘t=’出现的位置

 (5) temp_string = lines[1][equals_pos+2:

] 取温度数据

总结:

对比上面两个两个程序,我们可以发现python程序更加简单方便。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1