2020年9月21日 星期一

六、6-3 數位式溫度感測器(DS18B20)實習


目前市面上常可見的溫度感測器除了前面介紹過的類比式LM35之外就數DS18B20這顆數位式的溫度感測器了這顆IC最先是由美國的Dallas Semiconductor公司所推出的後來該公司被 Maxim Integrated併購不過目前市面看到的元件封裝上仍然保持著原來的編號方式這顆溫度感測器其主要的規格與特性如下


1.工作電壓範圍:3~5.5V

2.工作溫度範圍:-55~125C

3.輸出信號類型:數位式9~12位元資料

4.輸出入介面:一線式匯流排(1-Wire Bus)

5.溫度精確度:0.5C


下面【圖六、6-3_1】所示是DS18B20這顆溫度感測器的外觀與接腳圖其中左邊那條具有金屬探測棒的電纜線是一些廠商為了使用在液體的環境中所作的改良包裝


圖六、6-3_1  Dallas公司DS18B20數位式溫度感測器外觀接腳


功能與動作說明

1、以ESP8266建立一無線WiFi AP存取點(即Soft—AP模式),這個AP存取點的SSID名稱為『ESP_softAP01』,而且不使用連線密碼。

2、此AP存取點內建伺服器的IP位址為:[ 192.168.4.1 ]

3、當有客戶端(Client手機、平板或筆電)裝置以瀏覽器連線上此伺服器時,會將接在模組板上的DS18B20溫度感測器所量測到的溫度訊息回傳給連線客戶端並顯示在瀏覽器的螢幕上。

4如果客戶端裝置持續的連線則系統會以固定的時間(在此為3秒)重新測量溫度感測器所量測到的溫度值並主動傳送給客戶端裝置


    下面的【圖六、6-3_2】是本範例程式在客戶端瀏覽器連線後預期出現的畫面和上一個範例很類似差別只在標記1實習名稱的提示訊息部分改成了『DS18B20溫度量測實習』而已。


圖六、6-3_2  DS18B20溫度感測器客戶端瀏覽器連線後預期畫面


電路圖

圖六、6-3_3 數位式溫度感測器DS18B20溫度感測器測量電路


在【圖六、6-3_3】的電路中,由於DS18B20的工作電壓範圍為3~5.5V,所以在此一樣將它的正電源腳接在ESP8266模組板的5V電源上(在NodeMCU模組上為Vin腳)因為DS18B20中間的資料介面腳(Data)是採用所謂的一線式匯流排(1-Wire Bus)這種匯流排具有雙向性而且可以同時並接許多個元件只是在使用時必須在外面並接上一個共用的提升電阻一般這個電阻的大小以4.7K為宜


程式列表與說明

 

  1. #include <ESP8266WiFi.h>

  2. #include "index.h"

  3.  

  4. #include <OneWire.h>

  5. #include <DallasTemperature.h>

  6.  

  7. #define ONE_WIRE_BUS 2

  8.  

  9. OneWire oneWire(ONE_WIRE_BUS);

  10. DallasTemperature sensors(&oneWire);

  11.  

  12. String softSsid = "ESP_softAP01";

  13. //String softSsid = "ESP"+String(ESP.getChipId());

  14. const char* softPassword = "12345678";

  15.  

  16. WiFiServer server(80);

  17.  

  18. String tmpString = "";    // html網頁程式字串變數

  19. unsigned int count = 0;   // 測輛次數值

  20. int rTime=3;              // 網頁更新時間

  21.  

  22.   // 初始化程式區setup()開始 :

  23. void setup() 

  24. {

  25.     Serial.begin(115200);

  26.     Serial.println();

  27.  

  28.   Serial.println("Setting soft-AP Mode... ");

  29.  

  30.   boolean result=WiFi.softAP(softSsid);

  31.   if(result==true)

  32.   {

  33.     Serial.println("soft-AP ready!");

  34.     Serial.print("softAP = ");

  35.     Serial.println(softSsid);

  36.     Serial.print("softIP = ");

  37.     Serial.println(WiFi.softAPIP());

  38.   server.begin();

  39.   }  

  40.   else

  41.     Serial.println("soft-AP failed"); 

  42.   // Start up the library

  43.   sensors.begin();

  44.  

  45. } // setup()結束

  46.  

  47. // 主迴圈 loop()開始 :

  48. void loop() 

  49. {

  50.     // Check if a client has connected

  51.     WiFiClient client = server.available();

  52.     if (!client)    

  53.       return;  

  54.   count++;

  55.     tmpString = MAIN_page;    // 取出html網頁回應程式

  56.     tmpString.replace("%rTime%", String(rTime) ); // 帶入測量的時間值到網頁html程式中

  57.  

  58.   Serial.print("Requesting temperatures...");

  59.   sensors.requestTemperatures(); // Send the command to get temperatures

  60.   Serial.println("DONE");

  61.   Serial.print("Temperature = ");

  62.   float t=sensors.getTempCByIndex(0);

  63.   Serial.print(t);

  64.   Serial.println(" 'C");

  65.     tmpString.replace("%temper%", String(t) );    // 帶入測量的溫度值到網頁html程式中

  66.     tmpString.replace("%count%", String(count) ); // 帶入測量次數

  67.  

  68.     client.flush();

  69.     client.print( tmpString );

  70.       

  71.     delay(5);

  72. } // loop() 結束

  73.  

  74. // 以下部分為「index.h」標籤頁面的內容:

  75. const char MAIN_page[] PROGMEM = R"=====(

  76. HTTP/1.1 200 OK

  77. Content-Type:text/html

  78. Connection: close

  79.  

  80. <!DOCTYPE html>

  81. <html>

  82.  <head>

  83.  <meta name='viewport' content='width=device-width, initial-scale=1.0'/>

  84.  <meta charset='utf-8'>

  85.  <meta http-equiv='refresh' content='%rTime%'>

  86.  <style>

  87.    body {font-size:100%;} 

  88.    #main {display: table; margin: auto;  padding: 0 10px 0 10px; } 

  89.  </style>

  90.    <title>Soft AP模式-DS18B20溫度測量</title>

  91.  </head>

  92.  

  93.  <body> 

  94.    <div id='main'>

  95.      <h2><center>[Soft AP模式] <br>

  96.          DS18B20溫度量測實習<br></center><br>

  97.        溫度 =  %temper% 'C<br>

  98.        Temperature =  %temper% 'C<br>

  99.       Count = %count%<br>

  100.       </h2>

  101.    </div> 

  102.  </body>

  103. </html>)=====";



程式名稱:ESP_CH6_6_3_DS18B20.ino


本範例程式和前面幾個非常類似,但是由於DS18B20在Arduino中並不是標準的內建元件所以必須另外加裝相關的函示庫之後才能引用下面45兩行便是使用DS18B20時必須因引用到的兩個函示庫此外還必須宣告DS18B20的Dada腳使用的接腳在此為GPIO2(第7行)


4. #include <OneWire.h>

5. #include <DallasTemperature.h>

6.

7. #define ONE_WIRE_BUS 2


要按裝上列兩個函示庫請先在Arduino IDE中點選上方的【草稿碼】🡺【匯入程式庫】🡺【管理程式庫】,在看到下面的【圖六、6-3_4】程式庫管理員視窗後在標記1的欄位輸入『OneWire』搜尋字串便可以找到標記2的目標函式庫然後在標記3的地方選擇所需的版本(一般都會選擇最新的版本)並按下[安裝]鍵便可安裝成功。至於【圖六、6-3_5】則是『DallasTemperature.h』這個函式庫的安裝內容

圖六、6-3_4 『OneWire.h』函式庫安裝畫面


圖六、6-3_5 『DallasTemperature.h』函式庫安裝畫面


接下來就是要為使用到的DS18B20宣告一個對應的物件變數名稱,下面兩行程式便是定義了程式中使用的DS18B20名稱為「sensors」:


9. OneWire oneWire(ONE_WIRE_BUS);

10. DallasTemperature sensors(&oneWire);



上面程式列表的74~103行便是這個伺服器的網頁首頁程式碼整個html程式的字串變數名稱跟之前一樣命名為「MAIN_page[]」為了能讓客戶端的瀏覽器能更快的自動定時讀取更新的量測結果在行程式中一樣把更新時間加快到3秒鐘不過為了能讓程式更有彈性所以在此是以參數(即'%rTime%')的方式去定義這樣我們在主程式中或者說使用者就可以更方便的去決定系統測量更新的時間了:


85. <meta http-equiv='refresh' content='%rTime%'>


而【圖六、6-3_2】中標記1本實習名稱的提示訊息的部分改成下面兩行程式:


95.     <h2><center>[Soft AP模式] <br>

96.         DS18B20溫度量測實習<br></center><br>


而溫度顯示的部分和上一個範例的內容是一樣也是由下面幾行程式去實現:


97.         溫度  = %Temp% 'C<br>

98.         Temperature  = %Temp% 'C <br>

99.         Count = %count%


由於溫度的測量結果是動態變化的為了配合這個特性所以在此使用了兩個字串置換變數「Temp」、「count」分別代表DS18B20測量的結果與網頁刷新的次數。

在主迴圈(loop())程式中一開始是在等待客戶端連線(51~53行),當有客戶端裝置連線之後,便把網頁首頁程式MAIN_page[]傳送到tmpString這個字串變數中同時也把測量的時間值(即'rTime')帶入到網頁html程式中:


45.    tmpString = MAIN_page;    // 取出html網頁回應程式

46,    tmpString.replace("%rTime%", String(rTime) ); 


由於DS18B20是一顆數位感測IC必須先下指令給它後才會執行轉換的動作下面這行程式便是DS18B20的轉換指令


59.      sensors.requestTemperatures(); // Send the command to get temperatures


然後再以下面這行程式讀取DS18B20的溫度測量結果


62.    float t=sensors.getTempCByIndex(0);


接著的58~66行程式會先把轉換的結果顯示在Arduino IDE的序列監控視窗中,以便我們偵錯之用,同時也把溫度的轉換結果(Temp)與量測次數值(count)分別帶入tmpString這個字串變數中的「Temp」、「count」這兩個變數中,最後執行下列程式,便可以把從DS18B20的溫度測量結果回應給連線的客戶端瀏覽器。


69.    client.println( tmpString );  


執行結果:

圖六、6-3_4  使用DS18B20溫度感測器客戶端瀏覽器連線後不同溫度量測畫面


【圖六、6-3_4】是客戶端瀏覽器與系統連線後開始量測溫度的畫面,由於自然界中一般溫度改變的速度本來就很慢,所以除非是人工的方式急速升溫,一般不容易看到溫度的快速變化;上面的測量結果是使用前面【圖六、6-3_1】左邊那條具有金屬探測棒外殼的DS18B20來測試的,圖右邊的高溫(61.44’C)是用烙鐵靠近當熱源,如果手邊有吹風機也可以試看看,如果使用塑膠包裝的DS18B20建議測試溫度不要超過100C


沒有留言:

張貼留言