2020年9月6日 星期日

六、6-1 類比電壓輸入量測實習

六、6-1 類比電壓輸入量測實習

ESP8266這顆晶片和Arduino系列一樣內部建有一顆10位元的類比至數位轉換電路(ADCAnalog to Digital Converter)但是晶片外面只有一隻類比數入腳(A0)而已而且最大輸入電壓為1.0V不過許多廠商把它做成模組板之後例如在我們範例中使用的NodeMcu或WeMos D1/R2等為了配合晶片本身的工作電壓為3.3V所以在A0這根輸入腳的前面加上了分壓電阻使得最大輸入電壓變成3.3V因此在使用時要注意不要輸入超過3.3V的電壓在這根類比的輸入腳上


功能與動作說明

1、以ESP8266建立一無線WiFi AP存取點(即Soft—AP模式),這個AP存取點的SSID名稱為

『ESP_softAP01』,而且不使用連線密碼。

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

3、當有客戶端(Client)裝置以瀏覽器連線上此伺服器時,會將類比接腳A0的轉換值及電壓值訊

息回傳給連線的客戶端(手機、平板或筆電上的瀏覽器)。

4如果客戶端裝置持續的連線則系統會以固定的時間(在此為5秒)更新A0接腳的輸入電壓值

圖六、6-1_1 客戶端瀏覽器連線後畫面


【圖六、6-1_1】是本範例程式在客戶端瀏覽器連線後預期出現的畫面其中標記1的部分是本實習名稱的提示訊息而標題2的部分則是A0類比接腳的輸入轉換結果其範圍由0~1023及對應的輸入電壓值為了方便使用者閱讀所以同時以中英文的方式呈現出來。由於當輸入電壓固定不變時使用者可能會無法感覺到轉換的結果不斷在更新所以特地加上了一個計數器(Count)好讓使用者可以得知目前已經量測過多少次了這就是標記3內容的意義。


電路圖

圖六、6-1_2 類比電壓輸入測量電路


【圖六、6-1_2】是本範例所使用的兩種ESP8266開發模組板測試電路,為了可以得到不同的輸入電壓值,電路中使用了一顆電阻值為10K的可變電阻去調整輸入電壓,為了避免輸入電壓過高損壞了ESP8266,所以這個可變電阻的兩端分別接在模組板上的3.3V與接地(Gnd)端,而可變電阻中間抽頭點則接在模組板的A0輸入腳調整可變電阻的角度便可以看到從0~3.3V(或是0~1023)的測量結果。


程式列表與說明

#include <ESP8266WiFi.h>

#include "index.h"

 

// change these values to match your network

String softSsid = "ESP_softAP01";

const char* softPassword = "12345678";

 

WiFiServer server(80);

 

String tmpString = "";

unsigned int count = 0; 

 

void setup() 

{

    Serial.begin(115200);

    Serial.println();

    Serial.println("Serial started at 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"); 

} // setup()結束

 

void loop() 

{

    // 測試是否有客戶端連線上系統

    WiFiClient client = server.available();

    if (!client)    

      return;  

 

  count++;

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

 

    int AnalogIn=analogRead(A0);

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

    tmpString = MAIN_page;

    tmpString.replace("%aInput%", String(AnalogIn) );

    float VoltageIn=AnalogIn*3.3/1024;

    Serial.print("Voltage In = "); Serial.print(VoltageIn); Serial.println(" V");

    tmpString.replace("%vInput%", String(VoltageIn) );

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

 

    client.flush();

    client.println( tmpString );  

 

    delay(5);

} // void 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='5'>

 <style>

   body {font-size:100%;} 

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

 </style>

   <title> 類比電壓輸入測量實習</title>

 </head>

 

 <body> 

   <div id='main'>

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

         類比電壓輸入測量實習<br></center><br>

        類比輸入轉換值 = %aInput%<br>

        輸入電壓 = %vInput% V<br>

        Analog input = %aInput%<br>

        Voltage In = %vInput% V<br>

        Count = %count%<br>

     </h2>

   </div> 

 </body>

</html>

)=====";

程式名稱:ESP_CH6_6_1_VoltageIn.ino


為了方便程式設計與版面的簡潔所以在本範例程式一樣把和網頁有關的html程式放在另外的「index.h」標籤頁面中上面程式列表的62~93行便是這個伺服器的網頁首頁程式碼整個html程式的字串變數名稱跟之前一樣命名為「MAIN_page[]」為了能讓客戶端的瀏覽器能自動的定時讀取更新的量測結果我們在其中檔頭(即69~78行的<head>…</head>中間)部分加入了下面這一行程式:


72. <meta http-equiv='refresh' content='5'>


其中的’5’便是代表網頁頁面更新的時間在此為5秒更新一次

至於【圖六、6-1_1】中標記1的部分是由下面兩行程式所完成:


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

83.         類比電壓輸入測量實習<br></center><br>


而標題23的部分則是由下面幾行程式去實現:


84.        類比輸入轉換值 = %aInput%<br>

85.        輸入電壓 = %vInput% V<br>

86.        Analog input = %aInput%<br>

87.        Voltage In = %vInput% V<br>

88.        Count = %count%<br>


由於A0類比入的測量結果是動態變化的為了配合這個特性所以在此使用了三個字串置換變數「aInput」、「 vInput 」、「count」分別代表A0的轉換結果、對應輸入電壓與網頁刷新的次數。

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


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


由於我們的程式是在Arduino IDE底下開發的因此雖然使用的的是ESP8266這顆晶片可是許多指令還是可以直接沿用Arduino的資源所以使用下面這行程式便可以讀取到A0這根類比入腳的轉換值


46.    int AnalogIn=analogRead(A0);


接著的47~53行程式會先把轉換的結果顯示在Arduino IDE的序列監控視窗中,以便我們偵錯之用,同時也把A0輸入的轉換結果換算成輸入電壓值(50行)然後再分別帶入「aInput」、「 vInput 」、「count」這三個變數中,最後執行下列程式,便可以把從A0輸入接腳所讀取到的電壓值回應給連線的客戶端瀏覽器。


56.    client.println( tmpString );  


執行結果:

圖六、6-1_3 客戶端瀏覽器連線後不同輸入電壓量測畫面


【圖六、6-1_3】是客戶端瀏覽器連線後旋轉可變電阻以產生不同輸入電壓的量測畫面,由於設定的網頁刷新時間為5秒所以在調整輸入電壓時可能會覺得有些延遲因為網路通訊本來就不是及時(Real Time)的所以不要期望能立即反應如果想加快速度可將時間所短到2或3秒再快就不保證效果會更好

沒有留言:

張貼留言