本文主要是介绍【树莓派】关于树莓派2代,更新最新内核后,DS18B20温度传感器无法找到对应文件的问题的解决,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、问题和解决方法
问题:
在网上关于DS18B20温度传感器的教程有很多,但大部分都是基于老版本内核的例子。在入手树莓派2代后,加上DS18B20,按照他们的方法就是找不到对应的28-****文件,在经过几天研究实验,以及查阅相关资料后。发现官方给出的说法是:升级新内核之后,防止gpio冲突,使用了新的dt策略。然后问题就来了。
解决方法:
在/boot/config.txt配置文件的最后添加如下内容: dtoverlay=w1-gpio-pullup,gpiopin=4
然后按照正常的流程就可以看到那个期待已久的28-****文件了
二、实验操作
1、材料:
树莓派开发板(我的是2代RS版本),DS18B20传感器(我的是论坛淘宝店,板载已添加上拉电阻的那个),杜邦线若干,足额5V电源,内存卡,扩展板(可选),面包板(可选),排线(可选)
2、接线:
VCC 接 3.3V 的gpio接口
GND 接 GND 的gpio接口
DQ 接 GPIO7(#4)的gpio接口
3、然后采用VNC Viewer登陆,
4、温度操作
(1)、首先升级内核(可忽略,但如果版本较老,可能影响设备读取)
1 2 |
|
(2)、确认设备是否生效
1 2 3 4 |
|
显示结果:
1 2 3 |
|
28-00000494cb79就是笔者外接的温度传感器设备,但并不是每个客户端都显示一样的,这个是传感器的序列号。
(3)、查看当前温度
1 2 |
|
显示结果:
1 2 |
|
第二行的t=23000就是当前的温度值,要换算成摄氏度,除以1000,即当前温度为23000/1000=23摄氏度。
(4)、接下来就可以编程读出该温度了:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>#define BUFSIZE 128int main(void)
{float temp;int i, j;<span style="white-space:pre"> </span>int fd;int ret;char buf[BUFSIZE];char tempBuf[5];fd = open("/sys/bus/w1/devices/28-00000494cb79/w1_slave", O_RDONLY); //以只读方式打开ds18b20设备文件if(-1 == fd){ //打开设备文件出错perror("open device file error"); //打印出错信息(原因)return 1;}while(1){ret = read(fd, buf, BUFSIZE); //将设备文件中的内容读入buf中if(0 == ret){ //返回0表示读文件结束break; //跳出循环体}if(-1 == ret){ //读文件出错if(errno == EINTR){ //出错是由中断引起的continue; //继续读文件}perror("read()"); //打印出错信息(原因)close(fd); //关闭文件return 1;}}for(i=0;i<sizeof(buf);i++){if(buf[i] == 't'){ //如果读到‘t’,说明后面马上出现温度值for(j=0;j<sizeof(tempBuf);j++){tempBuf[j] = buf[i+2+j]; //将温度值以字符串的形式写入tempBuf中}} }temp = (float)atoi(tempBuf) / 1000; //将字符串转换为浮点型温度数据printf("%.3f C\n",temp); //打印出温度值close(fd); //关闭文件return 0;
}
5、然后就可以上传到yeelink上,或者做个微信公众平台,控制获取温度。
—— 2018-08-05 ——
这篇关于【树莓派】关于树莓派2代,更新最新内核后,DS18B20温度传感器无法找到对应文件的问题的解决的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!