1. 程式人生 > >【樹莓派】關於樹莓派2代,更新最新核心後,DS18B20溫度感測器無法找到對應檔案的問題的解決

【樹莓派】關於樹莓派2代,更新最新核心後,DS18B20溫度感測器無法找到對應檔案的問題的解決

樹莓派採用DS18B20檢測環境溫度!

在網上關於DS18B20溫度感測器的教程有很多,但大部分都是基於老版本核心的例子。在入手樹莓派2代後,加上DS18B20,按照他們的方法就是找不到對應的28-****檔案,在經過幾天研究實驗,以及查閱相關資料後。發現官方給出的說法是:升級新核心之後,防止gpio衝突,使用了新的dt策略。然後問題就來了。
解決方法是:在/boot/config.txt配置檔案的最後新增如下內容: dtoverlay=w1-gpio-pullup,gpiopin=4

 

然後按照正常的流程就可以看到那個期待已久的28-****檔案了。

 


一、材料:樹莓派開發板(我的是2代RS版本),DS18B20感測器(我的是論壇淘寶店,板載已新增上拉電阻的那個),杜邦線若干,足額5V電源,記憶體卡

	擴充套件板(可選),麵包板(可選),排線(可選)
 
 

 

二、接線: VCC 接  3.3V 的gpio介面

      GND 接  GND 的gpio介面

      DQ  接   GPIO7(#4)的gpio介面

 

三、然後採用VNC Viewer登陸,

 

四、溫度操作

 

1、首先升級核心(可忽略,但如果版本較老,可能影響裝置讀取)

1

2

apt-get update

apt-get upgrade

2、確認裝置是否生效

1

2

3

4

sudomodprobe w1-gpio

sudomodprobe w1-therm

cd/sys/bus/w1/devices/

ls

顯示結果:

1

2

3

[email protected]:~$ cd /sys/bus/w1/devices/

[email protected]:/sys/bus/w1/devices$ ls

28-00000494cb79 w1_bus_master1

28-00000494cb79就是筆者外接的溫度感測器裝置,但並不是每個客戶端都顯示一樣的,這個是感測器的序列號。

3、檢視當前溫度

1

2

cd28-00000494cb79

catw1_slave

顯示結果:

1

2

70 01 4b 46 7f ff 10 10 e1 : crc=e1 YES

70 01 4b 46 7f ff 10 10 e1 t=23000

第二行的t=23000就是當前的溫度值,要換算成攝氏度,除以1000,即當前溫度為23000/1000=23攝氏度。

 

接下來就可以程式設計讀出該溫度了:

 

 

#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  128

int 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;
}

 

五、然後就可以上傳到yeelink上,或者做個微信公眾平臺,控制獲取溫度。


參考:http://m.blog.csdn.net/blog/u011708919/23338239

—— 2018-08-05 ——