1. 程式人生 > >Raspberry Pi 樹莓派連線溫度感測器DS18B20

Raspberry Pi 樹莓派連線溫度感測器DS18B20

DS18B20是一個比較常用的溫度感測器,採用單匯流排控制,以前用微控制器程式設計控制時嚴格按照單匯流排的時序控制,今天來看看在linux系統下如何控制DS18B20,體驗一下在linux世界,一切都是檔案。

一、修改配置檔案

1 sudo 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編號)

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

/boot/overlays/README中有關於樹莓派Device Tree的詳細介紹,在其中我們找到下面關於w1-gpio-pullup裝置的介紹如下圖。

二、檢視模組是否啟動

重啟樹莓派是設定生效,執行lsmod命令,如果發現紅色方框的兩個模組說明模組已啟動。

如果沒有發現,也可以執行如下命令載入模組

1 sudo modprobe w1_gpio
2 sudo modprobe w1_therm

三、 讀取溫度

如果沒有問題,在/sys/bus/w1/devices中發現一個28-XXXX開頭的資料夾,這個就是DS18B20ROM,每個DS18B20都一樣,在這個資料夾中讀取w1_slave檔案則會返回當前溫度值。操作如下圖:

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

返回資料中,第一行最後的YRS

表示CRC校驗成功,資料有效。第二行最後t=30500表示當前溫度為30.5攝氏度。

如果接多個DS18B20,將會看到多個28-xxxx的檔案,分別對應各個DS18B20

四、軟體程式設計

1、sysfs

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

編譯並執行,結果如圖

1 gcc –Wall ds18b20.c –o ds18b20
2 sudo 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

01 import os
02 import glob
03 import time
04
05 os.system('modprobe w1-gpio')
06 os.system('modprobe w1-therm')
07
08 base_dir = '/sys/bus/w1/devices/'
09 device_folder = glob.glob(base_dir + '28*')[0]
10 device_file = device_folder + '/w1_slave'
11 def read_rom():
12 name_file=device_folder+'/name'
13 f = open(name_file,'r')
14 return f.readline()
15
16 def read_temp_raw():
17 f = open(device_file, 'r')
18 lines = f.readlines()
19 f.close()
20 return lines
21
22 def read_temp():
23 lines = read_temp_raw()
24 while lines[0].strip()[-3:] != 'YES':
25 time.sleep(0.2)
26 lines = read_temp_raw()
27 equals_pos = lines[1].find('t=')
28 if equals_pos != -1:
29 temp_string = lines[1][equals_pos+2:]
30 temp_c = float(temp_string) / 1000.0
31 temp_f = temp_c * 9.0 / 5.0 + 32.0
32 return temp_c, temp_f
33
34 print(' rom: '+ read_rom())
35 while True:
36 print(' C=%3.3f  F=%3.3f'% read_temp())
37 time.sleep(1)

執行程式,執行結果如圖

1 sudo 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

相關推薦

Raspberry Pi 樹莓連線溫度感測器DS18B20

DS18B20是一個比較常用的溫度感測器,採用單匯流排控制,以前用微控制器程式設計控制時嚴格按照單匯流排的時序控制,今天來看看在linux系統下如何控制DS18B20,體驗一下在linux世界,一切都是檔案。 一、修改配置檔案 1 sudo vi /boot/config.txt (注:執

樹莓進階之路 (012) - 關於Raspberry Pi樹莓無線網卡配置

linu names interface 文件內容 動態ip down run 表示 無線網絡 Raspberry Pi樹莓派無線網卡配置[多重方法備選] 要想讓樹莓派方便操作,肯定需要配置無線網卡,這樣可以大大增強樹莓派的移動性和便利性,其實配置無線網卡基本就是和普通li

Raspberry Pi(樹莓)銷量過百萬,國內已有代購渠道

茶話匯在前面的文章已有多篇文章介紹Raspberry Pi(中文名“樹莓派”或“山莓派”),基於Linux作業系統的迷你電腦Raspberry Pi電腦板自去年3月份上市,便成為熱銷品,據估計目前銷售量已達百萬臺,對於這樣的簡單裝置來說能達到這樣的業績是非常出色的。 “樹莓派”是一款基於ARM的微型

我的Raspberry Pi/樹莓有線網和無線網接通了------不需要樹莓顯示器,鍵盤,滑鼠,串列埠

       以前, 總是登入公司的linux伺服器, 有時候, 因為許可權問題, 玩得並不爽, 甚至連伺服器長得什麼樣,物理位置在哪裡都不知道, 當然, 也沒必要知道。         之後, 經常用ssh/串列埠/adb登入公司某linux/android裝置,進行操作

【教程】Raspberry PI 樹莓使用XBMC的五種方式

為什麼要用XBMC呢?先說下它能幹什麼吧:   它可以任何發電影,看電視直播,視訊直播,網路電視,看圖片,聽音樂,看電影能夠直接本地載入字幕,射手網自動搜尋字幕,使用HDP外掛庫可以看各種各樣的網路直播,網路聚合視訊。由於PI的硬解碼能力和專有XBMC的不斷優化,本地視訊看

手動一步一步來製作備份Raspberry Pi樹莓SD卡的img映像檔案(不用dd命令)

之前複製或者備份樹莓派的SD卡,都是用dd命令全盤複製,可以用,但是這樣有兩大缺點: 1. 慢 2. 一個大的SD卡,比如64G,即使只用了2G,經過dd命令生成的img檔案也會生成一個和整個SD卡容量一樣大小的檔案,即64G   於是,需要有一個可以解決上述問題的製作樹莓

Raspberry Pi樹莓上的自定義動態開機畫面

指南:Raspberry Pi上的自定義動態開機畫面,Raspbian Jessie 網際網路上有許多指南在Linux上建立自定義啟動螢幕,但大多數Raspbian都基於SysV init,並且不能與Raspbian現在使用的systemd介面良好。因此,我已經寫了這個指南,直接將簡單的init風格的s

Raspberry Pi樹莓無線網絡卡配置[多重方法備選]

要想讓樹莓派方便操作,肯定需要配置無線網絡卡,這樣可以大大增強樹莓派的移動性和便利性,其實配置無線網絡卡基本就是和普通linux平臺下配置無線網絡卡一樣,幾種方法大同小異,具體如下: 一、第一種方法:通過配置 /etc/network/interfaces 檔案實現 sud

多方法配置Raspberry Pi樹莓無線網絡卡

配置無線網絡卡,可以大大增強樹莓派的移動性和便利性,其實配置無線網絡卡基本就是和普通linux平臺下配置無線網絡卡一樣,幾種方法大同小異,具體如下: 一、第一種方法:通過配置 /etc/network/interfaces 檔案實現 sudo nano /etc/net

樹莓連線觸控式螢幕方法(Raspberry Pi 3.5寸 B/B+/2B LCD液晶屏)

資料 3.5inch RPi LCD (A) 產品介紹使用者手冊 開發資料開發軟體樹莓派映象演示視訊 FAQ 在自定義Raspbian系統映象上怎麼使用樹莓派LCD? 先確保自定義映象可正常進入桌面,執行命令 sudo raspi-config 確定已選擇:Enable Bo

樹莓DHT11溫溼度感測器+BMP280大氣氣壓感測器

bmp: #ifndef _RASPI_BMP280_H_ #define _RASPI_BMP280_H_ #include <stdio.h> #include <wiringPi.h> #include <wiringPiI2C.h> un

5、樹莓連線官方CSI攝像頭的使用

本篇博文大部分轉https://blog.csdn.net/u013162035/article/details/78580486 其中有部分細節根據自己的實際操作進行了修改 5.1樹莓派基本操作       目前提供了三個應用程式,分別為:raspis

4、樹莓連線USB轉串列埠的使用

      樹莓派上自帶一個串列埠,用於連線藍芽或是串列埠命令列,串列埠資源很少,對於嵌入式的應用來說串列埠裝置很多,需要的串列埠數量也很多,因為通過USB外接串列埠是一個不錯的選擇。樹莓派的 raspberry 2018.04.18 stretch版本的系統中已經

詳解溫度感測器DS18B20程式設計與使用

DS18B20是由DALLAS半導體公司推出的一種的“一線匯流排”介面的溫度感測器, 與傳統的熱敏電阻等測溫元件相比,它是一種新型的體積小、適用電壓寬、與微處理器介面簡單的數字化溫度感測器。 1.測量溫度範圍:-55~+125℃ 2.精度:±0.5℃ 3.資料傳輸:“一線匯流排”的數字方

樹莓連線到顯示器

本文參考樹莓派實驗室的文章: 樹莓派是最經典的卡片式電腦,擁有一臺pc機的所有功能。比較典型的使用方法是通過vnc遠端登陸進行操作。不過,raspbian雖然集成了vncserver,預設卻是不開啟的。這時候我們就需要將其連線到顯示器,配合鍵鼠進行操作

樹莓+DHT11溫溼度感測器+yeelink物聯網雲

一、配置準備 1.DHT11簡介 DHT11是一款有已校準數字訊號輸出的溫溼度感測器。 精度溼度+-5%RH, 溫度+-2℃,量程溼度20-90%RH, 溫度0~50℃。 DHT11有四個引腳,分別是VCC,DATA,NC,GND 2.電路連線

樹莓連線無線網wifi配置方法

Wifi配置 我的Wifi配置基本上是跟著這個教程來的,下面將過程簡述,並解釋每個命令/語句的作用。 1、檢查USB無線網絡卡是否已經正確識別 將無線USB網絡卡插入樹莓派後啟動樹莓派,比較不建議熱插拔,因為插入的一瞬間會有比較高的電流,如果電源輸出不夠可能導致樹莓派重啟。用自己的方法進入shell介面後

自動跟隨機器人教程(七)軟體部分 樹莓程式 多感測器綜合

現在樹莓派的各個感測器就都用上了,超聲波模組、影象識別、聲源定位各司其職,都能對周邊環境做出反應,以便對電機做操作。這樣就不需要電腦的遠端控制了,能真正做到自主執行。 問題是這些感測器都是獨立的,控制電機時以誰為主呢? 經過多次除錯,本人摸索出如下原則: 超聲波模組由於

樹莓連線有線網路配置

本教程使用浙江大學玉泉校區的網路。其它網路同理可得。 1、配置mac地址 sudo ifconfig eth0 down hw ether xx:xx:xx:xx:xx:xx sudo ifconfig eth0 up 將上面兩行程式碼複製進/etc/rc.local即

[Raspberry]搭建樹莓3開發環境

        Raspberry Pi(中文名為“樹莓派”,簡寫為RPi,(或者RasPi / RPI) 。         其有如下型號。         樹莓派僅使用 TF卡作為儲存裝置,因此樹莓派的作業系統也是燒寫到TF卡上的。         若在T