(三十)树莓派3B+ 1-wire获取DS18B20温度
Posted 小猿猪哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(三十)树莓派3B+ 1-wire获取DS18B20温度相关的知识,希望对你有一定的参考价值。
在之前的系列文章中,介绍了树莓派的GPIO
端口的使用,IIC
和SPI
的使用。现在看似乎就剩下单总线和串口了。由于没有windows电脑,串口就没有研究了。上周也没有发推文了,一直卡在使用GPIO
口按照DS18B20
的时序图来驱动DS18B20
,最后实验了几种方式还是不行。这里就按照网上有的方式来操作了。
关于DS18B20
,是一个单总线的温度传感器,关于单总线是什么,DS18B20
是什么,大家可以自行上网查找。
树莓派是支持单总线接口的。
设置树莓派的1-wire端口
1.在root用户模式下执行:raspi-config
2.打开1-wire端口
选择这个选项,剩下的选择是即可,然后重启树莓派,就设置好了树莓派的1-wire端口了。但是树莓派3B+上面一共有40个排针,那么具体是树莓派的哪个引脚呢?
查找1-wire引脚
1.打开boot/config.txt文件
最文件的最后找到:
[all]
#dtoverlay=vc4-fkms-v3d
enable_uart=1
dtoverlay=w1-gpio
2.找到overlays
这里也就找下w1-gpio对应的dtoverlay文件夹了。
但是在boot目录下面并没有这个文件夹,其实对应的是overlays, 打开里面README看看,找到如下说明:
Name: w1-gpio
Info: Configures the w1-gpio Onewire interface module.
Use this overlay if you *don't* need a GPIO to drive an external pullup.
Load: dtoverlay=w1-gpio,<param>=<val>
Params: gpiopin GPIO for I/O (default "4")
pullup Now enabled by default (ignored)
其实这里也就是说默认的是树莓派的GPIO.4这个端口,对应的BCM编码的端口了,板子上是第7端口了。
3.切换端口
这里其实也说明了怎么设置1-wire功能到其他端口了。
公式:
dtoverlay=w1-gpio,<param>=<val>
例如设置1-wire功能到GPIO.0端口:
dtoverlay=w1-gpio,gpiopin=17
保存只有重启树莓派就可以生效了。
获取1-wire设备
执行 cd /sys/bus/w1/devices
就可以看见单总线设备了:
root@raspberrypi:/# cd /sys/bus/w1/devices
root@raspberrypi:/sys/bus/w1/devices# ls
28-0113172196ce w1_bus_master1
这里的28-开头的就是1-wire上挂载的单总线设备DS18B20了,如果有多个就有多个,这里我只挂载了一个DS18B20。如果不是DS18B20那么是什么开头目前还不知道,也没芯片可以实验。
获取DS18B20的温度
root@raspberrypi:/sys/bus/w1/devices# cd 28-0113172196ce
root@raspberrypi:/sys/bus/w1/devices/28-0113172196ce# ls
alarms eeprom hwmon name resolution temperature w1_slave
driver ext_power id power subsystem uevent
root@raspberrypi:/sys/bus/w1/devices/28-0113172196ce# cat w1_slave
8d 01 4b 46 7f ff 0c 10 1b : crc=1b YES
8d 01 4b 46 7f ff 0c 10 1b t=24812
root@raspberrypi:/sys/bus/w1/devices/28-0113172196ce#
在单总线设备下打开文件w1_slave
, 就可以读取到温度了。其中的t=24812
就是温度数值,除以100就是实际的温度了, 24.812℃。
使用Node.js获取温度
let fs = require("fs");
let ds18b20 =
// 根目录
baseUrl: '/sys/bus/w1/devices',
// 获取单总线上的传感器集合
getSensors: function()
let files = fs.readdirSync(this.baseUrl, 'utf8');
// console.log('files = ',files);
let len = files.length;
let list = [];
if (len > 0)
for (let i = 0; i < len; i++)
// 单总线上有ds18b20设备
if (files[i].indexOf('28-') != -1)
list.push(files[i]);
return list;
,
// 根据传感器地址获取传感器数据
getTemperature: function(add)
let sensorAddr = this.baseUrl + '/' + add + '/w1_slave';
let data = fs.readFileSync(sensorAddr,'utf-8');
// console.log('data = ',data);
let temp = data.toString().split('t=')[1];
// console.log('temp = ',temp);
return parseFloat(temp)/1000;
module.exports = ds18b20;
其实也就是一个文件操作了。
测试代码还是在之前的(二十八)树莓派3B+ Node.js硬件SPI驱动Nokia5110液晶 基础上测试:
let ds18b20 = require('../ds18b20/index')
function main()
lcd_init();
let list = ds18b20.getSensors();
// 每2秒 获取一次温度
while(1)
if(list.length > 0)
lcd_show_string(0, 1,'TEMP: ' + ds18b20.getTemperature(list[0]));
rpio.sleep(2);
main();
以上是关于(三十)树莓派3B+ 1-wire获取DS18B20温度的主要内容,如果未能解决你的问题,请参考以下文章