(三十)树莓派3B+ 1-wire获取DS18B20温度

在之前的系列文章中,介绍了树莓派的GPIO端口的使用,IICSPI的使用。现在看似乎就剩下单总线和串口了。由于没有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();

在这里插入图片描述

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页