본문 바로가기

ESPRESSIF/ESP32-S2

ESP32-S2 웹서버 테스트 - Ajax 를 이용한 실시간 데이터 수신

웹브라우즈에서 데이터 수신 하기 위한 가장 간단한 방법은 페이지 요청시에 변경된 데이터를 전송하면 된다.

 

#include <WiFi.h>
#include <WebServer.h>

// SSID & Password
const char* ssid = "SSSID";
const char* password = "PASS";

WebServer server(80);  // Object of WebServer(HTTP port, 80 is defult)
void handle_root();

// HTML 페이지
#if 1
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<head>
  <title> Simple Web Server </title>
</head>
<html>
<style>
</style>
<body>
  <center>	
  <div class="card">
	<p>ADC Value</p>
	<h1><span id="ADCValue">$VAL</span></h1>
  </div>
  </center>
</body>
</html>
)rawliteral";
#endif

//페이지 요청이 들어 오면 처리 하는 함수
void handle_root()
{
  String str_new_page(index_html);
  char str_val[32];
  int index = 0;
  index = str_new_page.indexOf("$VAL");
  
  sprintf(str_val, "%d", analogRead(A0));
  str_new_page.setCharAt(index, str_val[0]);
  str_new_page.setCharAt(index+1, str_val[1]);
  str_new_page.setCharAt(index+2, str_val[2]);
  str_new_page.setCharAt(index+3, str_val[3]);
  Serial.println(str_new_page); 
  server.send(200, "text/html", str_new_page);
}

void InitWebServer() 
{
  //페이지 요청 처리 함수 등록
  server.on("/", handle_root);
  server.on("/readVal", handleReadVal);
  server.begin();
}

void setup() {
  Serial.begin(115200);
  Serial.println("ESP32 Simple web Start");
  Serial.println(ssid);
  //WiFi 접속
  WiFi.begin(ssid, password);
  //접속 완료 하면
  while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  Serial.print(".");
  }
    
  Serial.print("Wifi IP: ");
  Serial.println(WiFi.localIP());  //Show ESP32 IP on serial
  InitWebServer(); 
    
  Serial.println("HTTP server started");
  delay(100); 
}

void loop() {
  server.handleClient();
}

 

 


페이지 갱신 방법은 페이지 전체를 송신해야 하기 때문에 부하도 많이 걸리고 갱신주기가 길어서 실시간 데이터 표시에는 적합하지 않다.

실시간 데이터를 전송하기 위해서는 Ajax 라는 자바 스크립트를 이용하면 쉽고 간단하게 구현 할 수 있다.

 

HTML 코드에서 변경할 데이터의 ID를 설정하고 자바스크립트에서 id의 value  값을 변경하면 된다. 

<!----------------------------HTML--------------------------->
<body>
  <div class="card">
	<p>ADC Value</p>
	<h1><span id="ADCValue">0</span></h1>
  </div>

 

자바스크립트에서 sentInterval 함수로 일정 시간 주기로 요청해서 데이터를 수신 할 수 있다.

<!-------------------------JavaScrip------------------------->
  <script>
    setInterval(function()
    {
      getReadval();
    }, 30);
    
    function getReadval()
    {
      var POTvalRequest = new XMLHttpRequest();
      POTvalRequest.onreadystatechange = function()
      {
        if(this.readyState == 4 && this.status == 200)
        {
          document.getElementById("ADCValue").innerHTML = this.responseText;
        }
      };
      POTvalRequest.open("GET", "readVal", true);
      POTvalRequest.send();
    }
    //-------------------------------------------------------
  </script>

 

이렇게 하면 실시간으로 ESP32-S2의 ADC 값을 웹페이지에 표시할 수 있다.

 

 

최종 소스코드

#include <WiFi.h>
#include <WebServer.h>
// SSID & Password
const char* ssid = "SSID";
const char* password = "PASS";

WebServer server(80);  // Object of WebServer(HTTP port, 80 is defult)
void handle_root();

// HTML 페이지
#if 1
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<head>
  <title> ESP32 Web Server </title>
</head>
<html>
<!----------------------------CSS---------------------------->
<style>
body {
  margin: 1em;
  background: #333;
  color: #ccc;
  font: normal 3vw/1 "Montserrat", sans-serif;
  text-align: center;
  text-transform: uppercase;
}

h1 {
  font-size: 25vw;
}
</style>
<!----------------------------HTML--------------------------->
<body>
  <div class="card">
	<p>ADC Value</p>
	<h1><span id="ADCValue">120</span></h1>
  </div>
<!-------------------------JavaScrip------------------------->
  <script>
    setInterval(function()
    {
      getReadval();
    }, 50);
    //-------------------------------------------------------
    function getReadval()
    {
      var POTvalRequest = new XMLHttpRequest();
      POTvalRequest.onreadystatechange = function()
      {
        if(this.readyState == 4 && this.status == 200)
        {
          document.getElementById("ADCValue").innerHTML = this.responseText;
        }
      };
      POTvalRequest.open("GET", "readVal", true);
      POTvalRequest.send();
    }
    //-------------------------------------------------------
  </script>
</body>
</html>
)rawliteral";
#endif

//페이지 요청이 들어 오면 처리 하는 함수
void handle_root()
{
  server.send(200, "text/html", index_html);
}

void handleReadVal()
{
 String POTval = String(analogRead(A0));
 server.send(200, "text/plane", POTval);
}

void InitWebServer() 
{
  //페이지 요청 처리 함수 등록
  server.on("/", handle_root);
  server.on("/readVal", handleReadVal);
  server.begin();
}

void setup() {
  Serial.begin(115200);
  Serial.println("ESP32 Simple web Start");
  Serial.println(ssid);
  //WiFi 접속
  WiFi.begin(ssid, password);
  //접속 완료 하면
  while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  Serial.print(".");
  }
    
  Serial.print("Wifi IP: ");
  Serial.println(WiFi.localIP());  //Show ESP32 IP on serial
  InitWebServer(); 
    
  Serial.println("HTTP server started");
  delay(100); 
}

void loop() {
  server.handleClient();
}

 

 

 

반응형