2017年12月3日 星期日

用DS18B20讀溫度,就這麼簡單!

前面有提到要建構Sous Vide的系統架構,但飯要一口一吃,路要一步一步走,首先,就從溫度感測元件開始!
首先,我會說明選擇DS18B20的原因,再者,介紹使用DS18B20的快速、標準程序,最後,感恩一下前輩的努力讓我們可以方便、快速的上手,但想吃魚,除了市場買,也可以自己釣喲!

為什麼是DS18B20?

首先,以【Arduino 溫度】作為關鍵字於淘寶查詢,簡略的整理出以下的訊息

就溫度量測的範圍,都滿足加熱控制區段(40~80℃)的要求,接下來就是選擇的問題,首先,先去除不要的,我的想法是
1、DHT22溫濕度計:不能入水,去掉
2、RTD電阻傳感器:太貴,去掉
3、LM35及NTC傳感器:類比介面,太簡單沒挑戰性,去掉
最從,就剩下DS18B20與K型熱電偶(MAX6675)兩種,最後價格考量,選用DS18B20!

花個四分鐘了解DS18B20吧!

底下這個影片,用說圖的方式簡單的介紹DS18B20,簡單又不失其要,可讓各位有一必要的認識,參考一下


使用DS18B20的標準程序



專案製作前基本功

真心的建議您於實作前,您最好已具有以下幾項基本功:
  • 會安裝Arduino IDE和如何編譯與燒錄程式(這個必須有)
  • 至少實際執行過「LED閃爍控制程式」(不知道沒關係,可以趕快上網Google一下)
  • 了解Arduino程式語言的基本架構(至少要知道void setup()和void loop()的使用)
  • 會安裝第三方程式庫(這很重要,因為後續都會用到)

專案說明

此程式之目的是使用Arduino 連接一個DS18B20於外部供電模式下,讀取環境溫度並顯示於序列埠中。

STEP-1-善用網路資源:Datasheet/他山之石

我們要作的專案主角是DS18B20,所以,先上網下載一下它的Datasheet(使用說明書),英文的沒關係,先放著,我們後面會慢慢看!

DS18B20之原廠說明書

接下來列出三個使用DS18B20的網頁,參考一下,各有千秋

葉難: Arduino練習:溫度感測DS18B20
『物聯網』的生活應用實作:用DS18B20溫度感測器偵測天氣溫度
Arduino 溫度傳感器DS18B20

STEP-2-下載/安裝程式庫

目前使用DS18B20,大都引用二個程式庫:OneWire及DallasTemperature,前者是1-Wire通訊協定,後者是此元件的專用程式庫。Arduino UNO需要使用DallasTemperature函式庫來使用DS18B20溫度感測模組,而DallasTemperature函數庫則需使用OneWire函數庫(通訊協定)

Library01-->One-Wire程式庫

Library02-->DallasTemperature程式庫


下載程式庫的方式可由Arduino IDE中處理,亦可手動安裝,此處介紹手動安裝的方式。
點連結後先將程式庫下載到電腦後解壓縮,將程式庫目錄整個其放入Arduino的程式庫集中區(媒體櫃/文件/Arduino/libraries)
※注意:DallasTemperature程式庫下載後,其檔案名稱為"DallasTemperature_SparkCore-master",請將其改為DallasTemperature後,再置於程式庫集中區中

STEP-3-零配件清單及接線圖

此圖依序為Datasheet上之外部接線圖、材料清單及零件示意圖

此圖為Arduino與DS18B20接線圖及其局部放大,要注意的是DS18B20之接腳的接線:
   1- GND 為電源地。
   2- DQ 為數位資號輸入/輸出端。
   3-VDD 為外接供電電源輸入端。


STEP-4-程式碼說明

【這樣的連接方式是最簡單的情況,既一台Arduino連接單一的DS18B20,且使用外部電源,而非寄生電源】
首先,先將引用程式庫,並設定DQ (Data input/output)腳為pin 2
然後生成物件sensors

要讀取DS18B20的程序有二,先要求它作溫度的轉換,然後再取得攝氏溫度值,關鍵的代碼為19-20行
1、先要求Pin上所有的DS18B20進行溫度轉換
      sensors.requestTemperatures();

2、讀取DS18B20之攝氏溫度值
[ 函式sensors.getTempCByIndex之解析]
 感測器(sensors)使用編號的方式(ByIndex)讀取攝氏溫度(getTempC)
     Serial.println(sensors.getTempCByIndex(0));

 由於是1對1的連接狀況,就像是1對1的相親,而非1對多的狀況,DallsTemperature會自動將PIN腳上的DS18B20列為第一個,序號為0。整個程式碼就是先取得第1個(序號為0)DS18B
20的感測器中所測到的攝氏溫度值,再將其值送到序列埠中顯示。

STEP-5-範例程式及輸出

//注意:此程式只適用於一台Arduino連接一個DS18B20的狀況
#include <OneWire.h>
#include <DallasTemperature.h>

#define DQ_pin 2  

OneWire oneWire(DQ_pin);
DallasTemperature sensors(&oneWire);

void setup(void)
{
  Serial.begin(9600);
  sensors.begin();
}

void loop(void)
{
  Serial.print("Temperatures->");
  sensors.requestTemperatures();
  Serial.println(sensors.getTempCByIndex(0));
  delay(2000);
}

程式輸出



感恩Seafood!

Arduino許多的元件都是依此模式,參考範例,取得程式庫,下載安裝,再依圖接線,然後,取出範例程式,執行,搞定!
不得不說,Arduino對於初學者而言,真的是十分容易上手,且有成就感!當然,這是它的特色,高手開發,眾人享用並分享心得,讓新手可以既時享用,快則十分鐘,慢則半小時,都可以得到溫度值,真是偉大,感恩Seafood(師傅)!讚嘆Seafood(鮪魚)!回家吃Seafood(海鮮)!
但這不是我要的!

"Me too” is not my style

我當然還是要使用DS18B20來讀取溫度值,但如果只懂得依樣畫葫蘆,就像是每次都等著別人給魚,但其實我想要的是要釣魚的技巧,想吃魚,自己釣!那就意味著,我的目標就是使用自己寫的程式庫,讀到我要的溫度值,就這麼簡單!

5 則留言:

  1. 這是我看過寫得最好的教學網頁

    回覆刪除
  2. 受益良多,非常精闢的統整

    回覆刪除
  3. Casinos Near Casino at El Paso - MapyRO
    Search for 공주 출장샵 Casinos Near 전라북도 출장마사지 El 울산광역 출장마사지 Paso Casino in El Paso, TX, including latitude and longitude, 당진 출장마사지 The United States, however, is no longer considered an 군포 출장마사지

    回覆刪除