2020年9月10日 星期四

六、6-2 類比式溫度感測器(LM35)實習



LM35是一顆溫度感測元件可以測量攝氏(Celsius)溫度並將溫度轉換成直流電壓輸出其主要的特性如下列所示


1.工作電壓範圍:4~30V(以TI公司為準)

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

3.輸出信號類型:直流類比電壓

4.溫度與輸出比:10mV/C

5.溫度精確度:0.5C(在25C)

圖六、6-2_1  TI公司LM35外觀接腳與相關特性

(本圖取材自TI公司技術手冊僅此致謝)


由前面的技術資料可知我們只要測量Vout這隻接腳的輸出電壓然後再除以10mV便可以得知LM35周邊的溫度值也就是說只要把前一個範例的A0類比輸入腳接到LM35的Vout腳就可以得到一個溫度測量電路這也就是本範例打算要進行的工作




功能與動作說明

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

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

3、當有客戶端(Client)裝置以瀏覽器連線上此伺服器時,會將接在類比接腳A0的LM35溫度感測器所量測到的溫度/電壓訊息經過換算之後回傳給連線的客戶端(手機、平板或筆電上的瀏覽器)。

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

圖六、6-2_1  LM35溫度感測器客戶端瀏覽器連線後畫面


【圖六、6-2_1】是本範例程式在客戶端瀏覽器連線後預期出現的畫面其中標記1的部分是本實習名稱的提示訊息而標記2內容的是LM35文度感測器接到A0類比接腳的輸入轉換結果為了方便使用者閱讀所以同時以中英文的方式呈現出來。在此還是加上了一個量測次數計數器(Count)好讓使用者可以得知目前已經量測過多少次了。


電路圖

圖六、6-2_2 類比式溫度感測器LM35溫度測量電路


在【圖六、6-2_2】的電路中,由於LM35的工作電壓範圍為4~30V,所以我們把LM35的正電源腳接在模組板的5V電源上(在NodeMCU模組上為Vin腳),而中間的量測電壓輸出腳Vout則接在模組板的A0腳,整個電路可說是非常簡單。


程式列表與說明

 

  1. #include <ESP8266WiFi.h>

  2. #include "index.h"

  3.  

  4. // change these values to match your network

  5. String softSsid = "ESP_softAP01";

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

  7. const char* softPassword = "12345678";

  8.  

  9. WiFiServer server(80);

  10.  

  11. String tmpString = "";

  12. unsigned int count = 0; 

  13.  

  14. void setup() 

  15. {

  16.     Serial.begin(115200);

  17.     Serial.println();

  18.     Serial.println("Serial started at 115200");

  19.     Serial.println();

  20.  

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

  22.  

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

  24.   if(result==true)

  25.   {

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

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

  28.     Serial.println(softSsid);

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

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

  31.   server.begin();

  32.   }  

  33.   else

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

  35. } // setup()結束

  36.  

  37. void loop() 

  38. {

  39.     // Check if a client has connected

  40.     WiFiClient client = server.available();

  41.     if (!client)    

  42.       return;  

  43.  

  44.   count++;

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

  46.  

  47.     int AnalogIn=analogRead(A0);

  48.     Serial.print("Analog In = "); Serial.println(AnalogIn); 

  49.     tmpString = MAIN_page;

  50.     float Temp=AnalogIn*3.3*100/1024;

  51.     Serial.print("Temperature  = "); Serial.print(Temp); Serial.println(" 'C");

  52.     tmpString.replace("%Temp%", String(Temp) );

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

  54.  

  55.     client.flush();

  56. //    client.print( header );

  57.     client.print( tmpString );  

  58.  

  59.     delay(5);

  60.   // The client will actually be disconnected when the function returns and 'client' object is destroyed

  61. } // void loop()結束

  62.  

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

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

  65. HTTP/1.1 200 OK

  66. Content-Type:text/html

  67. Connection: close

  68.  

  69. <!DOCTYPE html>

  70. <html>

  71.  <head>

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

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

  74.  <meta http-equiv='refresh' content='3'>

  75.  <style>

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

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

  78.  </style>

  79.    <title>類比式溫度感測器LM35實習</title>

  80.  </head>

  81.  

  82.  <body> 

  83.    <div id='main'>

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

  85.          類比式溫度感測器LM35實習<br></center><br>

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

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

  88.          Count = %count%

  89.      </h2>

  90.    </div> 

  91.  </body>

  92. </html>

  93. )=====";



程式名稱:ESP_CH6_6_2_LM35.ino


本範例程式和上一個【ESP_CH6_6_1_VoltageIn.ino】非常類似上面程式列表的64~93行便是這個伺服器的網頁首頁程式碼整個html程式的字串變數名稱跟之前一樣命名為「MAIN_page[]」為了能讓客戶端的瀏覽器能更快的自動定時讀取更新的量測結果在下面這一行程式中把更新時間加快到3秒鐘:


74. <meta http-equiv='refresh' content='3'>


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


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

85.         類比式溫度感測器LM35實習<br></center><br>


而標記2的部分則修改成下面幾行程式去實現:


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

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

88.         Count = %count%


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

在主迴圈(loop())程式中一開始便是在等待客戶端連線(40~42行)接著把前網頁首頁程式MAIN_page[]傳送到tmpString這個字串變數中


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


接著使用下面這行程式讀取到A0這根類比入腳的轉換值


47.    int AnalogIn=analogRead(A0);


然後再把由A0輸入的量測值轉換成對應的溫度值


50.    float Temp=AnalogIn*3.3*100/1024;



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


57.    client.println( tmpString );  


執行結果:

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


【圖六、6-2_3】是客戶端瀏覽器與系統連線後開始量測溫度的畫面,由於自然界中一般溫度改變的速度本來就很慢,所以即使將測量更新的時間縮短到3秒,也不容易看到溫度的快速變化;一般要觀察溫度的改變可以用手指去觸摸LM35的外殼,不過能上升的溫度有限,如果手邊有吹風機或是烙鐵可以靠近試看看,但要注意不要把LM35的塑膠外殼燒焦了


1 則留言:

  1. 可以請問為什麼您轉換為攝氏溫度是用*3.3*100/1024嗎?
    為什麼是這樣轉換? 感謝

    回覆刪除