樹莓派 Zero W+溫度傳感器DS18B20


樹莓派 Zero W+溫度傳感器DS18B20

作者:陳拓chentuo@ms.xab.ac.cn 2018.05.28/2018.06.01

0.  概述

用樹莓派 Zero W讀取DS18B20溫度,上傳到物聯網平台。

1.  准備

1.1 硬件

  • 樹莓派Pi Zero W
  • DS18B20溫度傳感器
  • 杜邦線3根
  • 電腦(我用Windows 7)
  • 4.7KΩ電阻

1.2 GPIO接口 

 

1.3 接線   

首先我們把18B20和樹莓派連接。樹莓派的GPIO4是W1(一線)設備的接口,所以我們需要把18B20的數據腳接到GPIO4上。GPIO4是GPIO的第7個插針。

為什么用GPIO4作為DS18B20的IO,我們在后面第5小節說明。

2.  測試

2.1 連接電腦和Pi Zero W

用putty連接電腦和Pi Zero W,看本文最后的參考文檔。Host Name填raspberrypi.local,端口22,用戶名pi,密碼raspberry

2.2 更新樹莓派軟件源

登錄樹莓派之后,先升級軟件源,在終端下輸入以下代碼,等待一段時間即可。

  • 更新列表

pi@raspberrypi:~ $ sudo apt-get update

這個命令,會訪問源列表里的每個網址,並讀取軟件列表,然后保存在本地電腦。我們在新立得軟件包管理器里看到的軟件列表,都是通過update命令更新的。

  • 更新軟件

pi@raspberrypi:~ $ sudo apt-get upgrade

這個命令,會把本地已安裝的軟件,與剛下載的軟件列表里對應軟件進行對比,如果發現已安裝的軟件版本太低,就會提示你更新。

2.3 修改配置

pi@raspberrypi:~ $ sudo nano /boot/config.txt

在dtoverlay=dwc2之前添加一行:

dtoverlay=w1-gpio-pullup,gpiopin=4

保存並檢查修改是否正確:

pi@raspberrypi:~ $ cat /boot/config.txt

重啟樹莓派:

pi@raspberrypi:~ $ sudo reboot

注意:reboot容易丟失ssh文件,建議如下操作:

  • pi@raspberrypi:~ $ sudo shutdown -h now
  • 等待電源指示燈熄滅后,關閉電源
  • 重新上電連接ssh

2.4 加載模塊,查看溫度傳感器DS18B20設備

  • 加載2個模塊

pi@raspberrypi:~ $ sudo modprobe w1-gpio

pi@raspberrypi:~ $ sudo modprobe w1-therm

    • w1-gpio是單總線的IO操作模塊,用於模擬單總線時序;w1_therm是DS18B20的內部操作模塊(讀寫寄存器),和IO時序無關;

我們可以將驅動結構看成是將w1_therm掛接到w1-gpio總線上,由w1-gpio控制w1_therm工作。

    • modprobe命令用於向內核中加載模塊或者從內核中移除模塊。

查看幫助:

pi@raspberrypi:~ $ modprobe -h

列出內核中所有已經或者未掛載的所有模塊:

  • 查看溫度傳感器DS18B20設備

pi@raspberrypi:~ $ cd /sys/bus/w1/devices/

pi@raspberrypi:~ $ ls

 

28-000004d618fa就是溫度傳感器DS18B20設備,這是傳感器的序列號,每個傳感器都不一樣。

2.5 查看當前溫度

依次在終端輸入以下命令:

pi@raspberrypi:/sys/bus/w1/devices $ cd 28-000004d618fa

pi@raspberrypi:/sys/bus/w1/devices/28-000004d618fa $ cat w1_slave

 

第一行最后為CRC校驗“YES”表示校驗正確,為“NO”則代表校驗出錯,或讀不到溫度值。

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

3.  用python讀取溫度值

文件存放:/home/pi/temperature.py

操作如下:

  • 回到家目錄

pi@raspberrypi:/sys/bus/w1/devices/28-000004d618fa $ cat ~

pi@raspberrypi:~ $ pwd   #看看回家了沒有

/home/pi

  • 創建temperature.py

pi@raspberrypi:~ $ sudo touch temperature.py

  • 編輯temperature.py

pi@raspberrypi:~ $ sudo nano temperature.py

寫進如下內容:

#/home/pi/temperature.py

# open the ds18b20 file.

tfile = open("/sys/bus/w1/devices/28-000004d618fa/w1_slave")

# Read all of the text in the file.

text = tfile.read()

# close the file

tfile.close()

# Split the text with new lines (\n) and select the second line.

secondline = text.split("\n")[1]

# Split the line into words, referring to the spaces, and select the 10th word (counting from 0).

temperaturedata = secondline.split(" ")[9]

# The first two characters are "t=", so get rid of those and convert the temperature from a string to a number.

temperature = float(temperaturedata[2:])

# Put the decimal point in the right place and display it.

temperature = temperature / 1000

print temperature

注意修改28-000004d618fa。

  • 查看

pi@raspberrypi:~ $ cat temperature.py

  • 運行temperature.py

python temperature.py

 

4.  上傳數據到樂聯網

樂聯網是國內比較知名的免費物聯網數據平台,下面我們先申請樂聯網賬號,並添加設備和傳感器。

4.1 申請樂聯網賬號

網址:https://www.lewei50.com/,注冊一個新賬號,登錄。

4.2 添加新設備

先添加設備,一個設備里可以有多個不同的傳感器。

選擇“我的物聯” > 在“菜單列表”中選擇“我的設備” > 點擊“添加新設備”標簽,按下圖添加設備:

 

添加好的設備是這樣的:

 

免費可以添加2個設備。

4.3 添加傳感器

接下來在新設備中添加傳感器。

在“菜單列表”中選擇“傳感器與控制器” > 在“傳感器列表”標簽頁點擊“新建”按鈕。

 

點擊“保存”。注意“標識”要唯一。

 

傳感器添加好了。免費可以添加8個傳感器。

4.4 獲取Userkey

選擇“我的賬戶” > 在“菜單列表”中選擇“設置個人信息” > 查看“設置個人信息”標簽:

 

記住這個Userkey:30346d2762e64cb99336443e0ae84e02

4.5 數據上傳測試

樂聯網提供了一個“API在線測試工具”,網址是:

http://www.lewei50.com/dev/apitest/3

  • 將你的網關號改成設備ID:01
  • 將Post數據改成:

[

    {

        "Name":"RT001",

        "Value":"15.28"

    }

]

點擊“調用接口”:

 

數據成功發送"Message": "Successful. "!記住Request詳情:

URL:http://www.lewei50.com/api/V1/gateway/UpdateSensors/01

Method:post

--Header:userkey:30346d2762e64cb99336443e0ae84e02

POST Data:

[

    {

        "Name":"RT001",

        "Value":"15.28"

    }

]

回到樂聯網,在“傳感器列表”標簽頁查看數據。

 

4.6樹莓派Zero W上傳數據到樂聯網

  • 修改temperature.py,將溫度值用JSON格式保存到一個文本文件:

pi@raspberrypi:~ $ sudo nano temperature.py

#/home/pi/temperature.py

tfile = open("/sys/bus/w1/devices/28-000004d618fa/w1_slave")

text = tfile.read()

tfile.close()

secondline = text.split("\n")[1]

temperaturedata = secondline.split(" ")[9]

temperature = float(temperaturedata[2:])

temperature = temperature / 1000

print temperature

res = '[{"Name":"RT001","Value":"%f"}]' %temperature

output = open('/home/pi/datafile.txt', 'w')

output.write(res)

output.close

用python將溫度寫入文本文件:/home/pi/datafile.txt

運行python temperature.py進行測試。

 

  • 新增lewei50.sh腳本

文件位置:/home/pi/lewei50.sh,命令:

pi@raspberrypi:~ $ sudo nano lewei50.sh

參考Request詳情寫lewei50.sh腳本:

sudo python /home/pi/temperature.py

curl --request POST --data-binary @"/home/pi/datafile.txt" --header "userkey:30346d2762e64cb99336443e0ae84e02" http://www.lewei50.com/api/V1/gateway/UpdateSensors/01

  • 修改lewei50.sh權限

pi@raspberrypi:~ $ sudo chmod 777 lewei50.sh

 

  • 運行lewei50.sh測試

pi@raspberrypi:~ $ ./lewei50.sh

 

看看樂聯網上的新數據,在“菜單列表”中選擇“實時數據”查看:

 

  • 添加到計划任務定時采集數據

將腳本加入定時任務cronjob,cronjob用於安排那些需要被周期性執行的命令。

編輯定時任務:pi@raspberrypi:~ $ sudo crontab -e

 

選擇一個編輯器,我選默認的2。

在cornjob文件中添加下面一行,並保存(表示10分鍾執行一次lewei50.sh腳本)

*/10 * * * * /home/pi/lewei50.sh

    • Crontab語法

一個crontab文件用五個段來定義:天,日期和時間,和一個要定期執行的命令代碼。

*     *   *   *    *  command to be executed
-     -    -    -    -
|     |     |     |     |
|     |     |     |     +----- day of week (0 - 6) (Sunday=0)
|     |     |     +------- month (1 - 12)
|     |     +--------- day of month (1 - 31)
|     +----------- hour (0 - 23)
+------------- min (0 - 59)

斜線“/”表示周期性,/10表示每10分鍾;星號“*” 代表所有可能的值;逗號“,” 指定列表值,如: "1,3,4,7,8";中橫線“-” 指定范圍值,如 "1-6", 代表 "1,2,3,4,5,6"。

編輯完畢后,很重要的一點是一定要執行如下命令:

pi@raspberrypi:~ $ sudo /etc/init.d/cron restart

否則,定時任務不會執行。

 

4.7 樂聯網數據展示

樂聯網提供了很多數據展示的方法,下面是其中的幾種。

  • 實時數據

請看上節相關的圖。

  • 查看門戶

 

  • 歷史走勢分析

 

  • 歷史數據查詢

 

  • 微信互動,樂為物聯還支持你的設備與微信互動,關注樂為物聯公眾號。

5.  多個DS18B20溫度傳感器

5.1 硬件連接

將所有的DS18B20並聯。

 

沒有焊接工具的同學,可以這樣連接,這是2個DS18B20: 

為什么用GPIO4作為DS18B20的IO?

在2015-02-16之後的Raspbain版本,為了防止GPIO的沖突,使用了新的設備樹DT(Device Tree)策略。Raspberry Pi的最新內核和固件(包括Raspbian和NOOBS版本)現在默認使用設備樹DT來管理某些資源分配和模塊加載。

在新內核boot分區下多了個overlays文件夾,里面有很多dtb文件,這些其實就是樹莓派的設備樹,打開README,就可以知道該怎么使用了。查看相關說明:

pi@raspberrypi:~ $ cat /boot/overlays/README

 

  • w1-gpio

名稱:w1-gpio

信息:配置w1-gpio一線接口模塊。

如果不需要GPIO驅動外部上拉使用這個覆蓋(overlay)。

加載:dtoverlay=w1-gpio,<param>=<val>

參數param: 

gpiopin   用於IO的GPIO(默認是4)

   pullup     非零,on或y以啟用寄生電源(2線,電源在數據線上)

  • w1-gpio-pullup

名稱:w1-gpio-pullup

信息:配置w1-gpio一線接口模塊。

如果需要GPIO驅動外部上拉使用這個覆蓋(overlay)。

加載:dtoverlay=w1-gpio-pullup,<param>=<val>

參數Params:

gpiopin   用於IO的GPIO(默認是4)

pullup 非零,on或y以啟用寄生電源(2線,電源在數據線上)

extpullup 用於外部上拉的GPIO(默認是5)

注釋:寄生電源就是利用數據傳輸的高電平供電,用法請看DS18B20數據手冊。

5.2 查看溫度傳感器DS18B20設備

pi@raspberrypi:~ $ ls /sys/bus/w1/devices/

 

28-000004d6162f和28-000004d627c6就是溫度傳感器DS18B20設備,這是傳感器的序列號,每個DS18B20出廠時都設置了一個序列號,可以通過IO口讀出。

5.3 查看當前溫度

pi@raspberrypi:~ $ cat /sys/bus/w1/devices/28-000004d6162f/w1_slave

pi@raspberrypi:~ $ cat /sys/bus/w1/devices/28-000004d627c6/w1_slave

 

第一行最后為CRC校驗“YES”表示校驗正確,為“NO”則代表校驗出錯,或讀不到溫度值。

第二行的t=27375和t=27437就是當前的溫度值,要換算成攝氏度就是27.375度和27,437度。放在一起的兩個傳感器溫度值怎么不一樣?看看數據手冊,DS18B20的測量精度是0.5℃。

5.4 使用其他的GPIO作為DS18B20的IO引腳

下面我們將DS18B20的IO引腳從GPIO4改到GPIO17上,看第1節的圖,就是引腳11上。

pi@raspberrypi:~ $ sudo nano /boot/config.txt

將gpiopin=4修改為gpiopin=17:

dtoverlay=w1-gpio-pullup,gpiopin=17

保存,重啟樹莓派(注意:按我前面說的方法重啟):

pi@raspberrypi:~ $ sudo reboot

將DS18B20的數據線插到引腳11上,查看溫度傳感器DS18B20設備:

 

5.5 用C語言讀取溫度值

WiringPi

 

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

    int fd; 

    int ret; 

 

    char buf[BUFSIZE]; 

    char tempBuf[5]; 

 

    fd = open("/sys/bus/w1/devices/28-00000495db35/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; 

 

 

 

參考文檔

  1. 樹莓派介紹
  2. 電腦連接樹莓派PiZeroW
  3. 樹莓派+溫度感測器實現室內溫度監控:http://shumeipai.nxez.com/2013/10/03/raspberry-pi-temperature-sensor-monitors.html
  4. Raspberry Pi Temperature Sensor
    http://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/temperature/

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM