树莓派系列教程:单总线控制DS18B20

news2025/1/6 18:06:09

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

一、修改配置文件

1sudo vi /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编号)

1dtoverlay=w1-gpio-pullup,gpioin=4

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

二、查看模块是否启动

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

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

1sudo modprobe w1_gpio
2sudo modprobe w1_therm

三、 读取温度

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

1sudo modprobe w1-gpio
2sudo modprobe w1-therm
3cd  /sys/bus/w1/devices
4cd 28-00000xxx
5cat w1_slave

返回数据中,第一行最后的YRS表示CRC校验成功,数据有效。第二行最后t=30500表示当前温度为30.5摄氏度。

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

四、软件编程

1、sysfs

  cpp代码:

01#include <stdio.h>
02#include <stdlib.h>
03#include <unistd.h>
04#include <fcntl.h>
05#include <dirent.h>
06#include <string.h>
07#include <time.h>
08 
09int main(int argc, char *argv[])
10{
11    char path[50] = "/sys/bus/w1/devices/";
12    char rom[20];
13    char buf[100];
14    DIR *dirp;
15    struct dirent *direntp;
16    int fd =-1;
17    char *temp;
18    float value;
19 
20    system("sudo modprobe w1-gpio");
21    system("sudo modprobe w1-therm");
22    if((dirp = opendir(path)) == NULL)
23    {
24        printf("opendir error\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("open error\n");
45            return 1;
46        }
47 
48        if(read(fd,buf,sizeof(buf)) < 0)
49        {
50            printf("read error\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}

编译并执行,结果如图

1gcc –Wall ds18b20.c –o ds18b20
2sudo ds18b20

注:(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

import os
import glob
import time

os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'
def read_rom():
    name_file=device_folder+'/name'
    f = open(name_file,'r')
    return f.readline()

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
        temp_f = temp_c * 9.0 / 5.0 + 32.0
        return temp_c, temp_f

print(' rom: '+ read_rom())
while True:
    print(' C=%3.3f  F=%3.3f'% read_temp())
time.sleep(1)

运行程序,运行结果如图

1sudo python ds18b20.py

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

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

        device_file = device_folder + '/w1_slave'

     定义设备文件夹和设备文件,glob.globbase_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程序更加简单方便。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1275293.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript WebAPI(三)(详解)

这次介绍一下webAPI中的一些知识&#xff1a; 回调函数 回调函数是指 如果将函数A做为参数传递给函数B时&#xff0c;我们称函数A为回调函数 例如&#xff1a; // 立即执行函数中传递的函数是一个回调函数 (function(){ console.log("我是回调函数") })(); // …

CSS技巧:从高度0过渡到自动高度

本文翻译自 CSS trick: transition from height 0 to auto!&#xff0c;作者&#xff1a;Francesco Vetere&#xff0c; 略有删改。 如果你在CSS上花了足够长的时间&#xff0c;很可能你曾尝试过从height:0到auto的平滑过渡。。。却发现它不起作用&#xff01;&#x1f622; ️…

USB Type-C的基本原理

1 USB Type-C的基本原理 1.1 基本特性 Figure 1-1 USB Type-C接头外形 USB Type-C&#xff08;简称USB-C&#xff09;的基本特性&#xff1a; 1. 接口插座的尺寸与原来的Micro-USB规格一样小&#xff0c;约为8.3mm X 2.5mm 2. 可承受1万次反复插拔 3. 支持正反均可插入的“正反…

力扣6.N字形变换

题目描述 思路 模拟轨迹&#xff0c;每当行数i到最顶&#xff08;0&#xff09;&#xff0c;或者最底&#xff08;numRows&#xff09;的时候&#xff0c;就会反方向走。 用flag来标记方向&#xff0c;在题解里看到&#xff0c;真的很巧妙5555&#xff01; 代码 class Solu…

Tomcat-安装与基础配置

Tomcat-安装与基础配置 下载 下载Tomcat9 选择适合自己系统位数的版本下载 Tomcat-目录 bin: 存放启动与关闭Tomcat的脚本文件conf: 存放Tomcat的各种配置文件,其中最主要的配置文件就是server.xml【如果端口冲突,就可以将 8080 端口修改】lib: 存放Tomcat运行时所需的j…

2023-12-01 AIGC-自动生成ppt的AI工具

摘要: 2023-12-01 AIGC-自动生成ppt-记录 自动生成ppt: BoardMix boardmix 一键生成ppt boardmix是一款基于云的ai设计软件&#xff0c;允许创建用于各种目的的自定义演示文稿、ai绘画&#xff0c;ai生成思维导图等。以下是它的一些功能&#xff1a; 可定制的模板 - 它有一个…

基于Web邮箱的邮件系统

题目: 基于web的邮件收发系统设计与实现 摘 要 计算机的应用已经越来越广泛&#xff0c;它从产生到完善已经差不多有50年左右的历史&#xff0c;更新换代速度非常快&#xff0c;在人们生活、工作中都发挥了不可替代的作用&#xff0c;几乎所有行业都离不开它&#xff0c;已经成…

校招笔试-Windows开发工程师客观题合集解析

360公司-2019校招笔试-Windows开发工程师客观题合集 API无法实现进程间数据的相互传递是PostMessage 2.以下代码执行后&#xff0c;it的数据为&#xff08;异常&#xff09; std::list<int> temp; std::list<int>::iterator it temp.begin(); it --it; 3.API…

matlab 无迹卡尔曼滤波

1、内容简介 略 26-可以交流、咨询、答疑 2、内容说明 无迹卡尔曼滤波 无迹卡尔曼滤波 无迹卡尔曼滤波 3、仿真分析 %该文件用于编写无迹卡尔曼滤波算法及其测试 %注解&#xff1a;主要子程序包括&#xff1a;轨迹发生器、系统方程 % 测量方程、UKF滤波器 %----…

微机原理——定时器学习1

目录 定时类型 8253内部结构框图 8253命令字 六种工作方式及输出波形 计数初值的计算与装入 8253的初始化 定时类型 可编程定时器8253&#xff1a;&#xff08;内部采用的是16位 减法计数器&#xff09; 8253内部结构框图 8253命令字 8253有三个命令字&#xff1a;方式命…

39.从0到上线三天搭建个人网站(第三天)

点赞收藏加关注&#xff0c;你也能住大别墅&#xff01; 一、第三天主要工作 1.完成detail页面的开发 2.将所有数据以及部分静态资源存在uniCloud&#xff0c;为以后做管理后台做准备 3.创建云对象getData&#xff0c;在beforecreate&#xff08;&#xff09;中获取数据 4.…

Linux 常用命令集

1、根据端口查询进程号&#xff1a; netstat -nlp | grep 10050 或者使用 lsof -i:10050 2、查询所有服务进程号&#xff1a;top 3、根据进程号查询服务路径 ll /proc/28145/cwd 4、同步网络时间 yum install -y ntpdate ntpdate ntp.aliyun.com 设置定时任务 更新时间 * * * *…

ansible模块

目录 一、ansible的command模块 1.ad-hoc 2.playbook 3.command模块 二、ansible的shell模块 1.shell模块帮助 2.shell模块支持的参数和解释 3.简单试验 4.批量远程执行脚本 三、script模块 1.script模块帮助 2.shell模块支持的参数和解释 3.实践 四、ansible文件…

ESP32-Web-Server编程- 通过滑动条向 Web 提交数据

ESP32-Web-Server编程- 通过滑动条向 Web 提交数据 概述 上一节我们讲述了通过文本框向 ESP32 发送字符串、数字。有时&#xff0c;我们需要向 ESP32 发送连续的值&#xff0c;这种需求可以通过在网页端实现滑动条来实现。 需求及功能解析 本节演示如何在 ESP32 上部署一个…

P4 链表的节点数统计与链表数据查找替换

目录 前言 01 链表的节点数统计 02 链表数据查找替换 2.1 残疾的数据查找 2.2 数据查找优化 前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C 》✨✨✨ &#x1f525; 推荐专栏2: 《 Linux C应用编程&#xff08;概念类&#xff09;》✨…

这几款 idea 插件让效率起飞!

作者&#xff1a;苍何&#xff0c;前大厂高级 Java 工程师&#xff0c;阿里云专家博主&#xff0c;CSDN 2023 年 实力新星&#xff0c;土木转码&#xff0c;现任部门技术 leader&#xff0c;专注于互联网技术分享&#xff0c;职场经验分享。 &#x1f525;热门文章推荐&#xf…

MySQL 教程 1.4

MySQL 连接 使用mysql二进制方式连接 您可以使用MySQL二进制方式进入到mysql命令提示符下来连接MySQL数据库。 实例 以下是从命令行中连接mysql服务器的简单实例&#xff1a; [roothost]# mysql -u root -p Enter password:****** 在登录成功后会出现 mysql> 命令提示窗…

jmeter资料

1.jmeter介绍 Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试&#xff0c;但后来扩展到其他测试领域。 它可以用于测试静态和动态资源&#xff0c;例如静态文件、Java 小服务程序、CGI 脚本、Java 对象…

大数据:Hadoop刷题

大数据&#xff1a;Hadoop刷题 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其sql要…

EG20网口远程下载程序使用案例

EG20网口远程下载程序使用案例 前言&#xff1a;本文档主要说明了使用蓝蜂虚拟网络工具通过EG20网关的网口&#xff08;LAN口&#xff09;远程给PLC下载程序的步骤及其注意事项。使用蓝蜂虚拟网络工具&#xff0c;不仅支持程序的远程下载&#xff0c;同样支持程序的远程上传与…