目前市面上常可見的溫度感測器,除了前面介紹過的類比式LM35之外,就數DS18B20這顆數位式的溫度感測器了,這顆IC最先是由美國的Dallas Semiconductor公司所推出的,後來該公司被 Maxim Integrated併購,不過目前市面看到的元件封裝上仍然保持著原來的編號方式。這顆溫度感測器其主要的規格與特性如下:
1.工作電壓範圍:3~5.5V
2.工作溫度範圍:-55∘~125∘C
3.輸出信號類型:數位式9~12位元資料
4.輸出入介面:一線式匯流排(1-Wire Bus)
5.溫度精確度:0.5∘C
下面【圖六、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為宜。
◎ 程式列表與說明:
#include <ESP8266WiFi.h>
#include "index.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
String softSsid = "ESP_softAP01";
//String softSsid = "ESP"+String(ESP.getChipId());
const char* softPassword = "12345678";
WiFiServer server(80);
String tmpString = ""; // html網頁程式字串變數
unsigned int count = 0; // 測輛次數值
int rTime=3; // 網頁更新時間
// 初始化程式區setup()開始 :
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.println("Setting soft-AP Mode... ");
boolean result=WiFi.softAP(softSsid);
if(result==true)
{
Serial.println("soft-AP ready!");
Serial.print("softAP = ");
Serial.println(softSsid);
Serial.print("softIP = ");
Serial.println(WiFi.softAPIP());
server.begin();
}
else
Serial.println("soft-AP failed");
// Start up the library
sensors.begin();
} // setup()結束
// 主迴圈 loop()開始 :
void loop()
{
// Check if a client has connected
WiFiClient client = server.available();
if (!client)
return;
count++;
tmpString = MAIN_page; // 取出html網頁回應程式
tmpString.replace("%rTime%", String(rTime) ); // 帶入測量的時間值到網頁html程式中
Serial.print("Requesting temperatures...");
sensors.requestTemperatures(); // Send the command to get temperatures
Serial.println("DONE");
Serial.print("Temperature = ");
float t=sensors.getTempCByIndex(0);
Serial.print(t);
Serial.println(" 'C");
tmpString.replace("%temper%", String(t) ); // 帶入測量的溫度值到網頁html程式中
tmpString.replace("%count%", String(count) ); // 帶入測量次數
client.flush();
client.print( tmpString );
delay(5);
} // loop() 結束
// 以下部分為「index.h」標籤頁面的內容:
const char MAIN_page[] PROGMEM = R"=====(
HTTP/1.1 200 OK
Content-Type:text/html
Connection: close
<!DOCTYPE html>
<html>
<head>
<meta name='viewport' content='width=device-width, initial-scale=1.0'/>
<meta charset='utf-8'>
<meta http-equiv='refresh' content='%rTime%'>
<style>
body {font-size:100%;}
#main {display: table; margin: auto; padding: 0 10px 0 10px; }
</style>
<title>Soft AP模式-DS18B20溫度測量</title>
</head>
<body>
<div id='main'>
<h2><center>[Soft AP模式] <br>
DS18B20溫度量測實習<br></center><br>
溫度 = %temper% 'C<br>
Temperature = %temper% 'C<br>
Count = %count%<br>
</h2>
</div>
</body>
</html>)=====";
程式名稱:ESP_CH6_6_3_DS18B20.ino
本範例程式和前面幾個非常類似,但是由於DS18B20在Arduino中並不是標準的內建元件,所以必須另外加裝相關的函示庫之後才能引用,下面4、5兩行便是使用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建議測試溫度不要超過100∘C!
沒有留言:
張貼留言