본문 바로가기

ESPRESSIF/ESP32

ESP32 웹서버 - 실시간 ADC 데이터 그래프 출력

지금까지 테스트 한 웹서버 예제는 출력 관련 예제 였는데 이번에는 웹페이지 측에서 입력을 받을 수 있는 테스트를 해보자

기존에 실시간 웹서버를 구현 하기 위해 AJAX를 사용 했지만 비동기 방식 웹서버를 이용하면 이벤트 방식으로 쉽게 구현이 가능하다.

 

우선 웹서버 초기화 시에 사용할 이벤트를 등록 한다.

AsyncEventSource events("/events");

void InitWebServer() 
{
    server.addHandler(&events);

    server.on("/", onRootRequest);
    server.serveStatic("/", SPIFFS, "/");
    server.begin();
}

 

웹페이지에 데이터를 보내기 위해 ESP32 보드에서는 event.send 함수를 사용하면 쉽게 구현 가능하다.

events.send(String(analogRead(adcPin)).c_str(),"update", millis());

 

 

ESP32 이벤트 방식 실시간 웹서버 구현 예제

// Import required libraries
#ifdef ESP32 // ESP32 libraries
#include <WiFi.h>
#include <AsyncTCP.h>
#else // ESP8266 libraries
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#endif
#include <ESPAsyncWebServer.h>
#include <SPIFFS.h>
// SSID & Password

const char *ssid = " ";
const char *password = " ";

// Create AsyncWebServer object on port 80
AsyncWebServer server(80);
AsyncEventSource events("/events");

void InitSPIFFS() {
  if (!SPIFFS.begin()) {
    Serial.println("Cannot mount SPIFFS volume...");

    while (1) {
    }
  }
}

String processor(const String& var){
  //Serial.println(var);
  return var;
}

void onRootRequest(AsyncWebServerRequest *request) {
  request->send(SPIFFS, "/index.html", "text/html", false, processor);
}

void InitWebServer() 
{
  	server.addHandler(&events);
    
    server.on("/", onRootRequest);
    server.serveStatic("/", SPIFFS, "/");
    server.begin();
}


void setup(){
  // Serial port for debugging purposes
  Serial.begin(115200);

  InitSPIFFS();

  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }
  // Print ESP32 Local IP Address
  Serial.println(WiFi.localIP());

 
  InitWebServer();
}
 

static const unsigned long EVENT_INTERVAL_MS = 30;
void ProcessUpdate()
{
  static uint32_t prev_ms = millis();
  if (millis() > prev_ms + EVENT_INTERVAL_MS)
  {
      //이벤트 발송
    events.send(String(analogRead(adcPin)).c_str(),"update", millis());
    prev_ms = millis();
  }
}

void loop()
{ 
  ProcessUpdate(&events);
}

 


 

ESP32에서 이벤트 등록하고 보내면 웹페이지 쪽에서는 Listener 를 등록해서 이벤트를 받아 올 수 있다.

받아온 이벤트 데이터는 웹페이지에 적절히 출력 해 주면 된다.

<!DOCTYPE HTML><html>
<head>
  <title>ESP IOT DASHBOARD</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <style>
  </style>
<script>
    if (!!window.EventSource) {
        var source = new EventSource('/events');
        source.addEventListener('open', function(e) {
         console.log("Events Connected");
        }, false);

        source.addEventListener('update', function(e) {
            var ad_value = e.data;
            document.getElementById("ad_val").innerHTML = ad_value;
           }, false);
       }
</script>
</head>
<body>
    <center>
    <h1>ESP32 RealTime Analg Input Examples</h1>
    <div>ADC = <span id="ad_val"></span></div><p></p>
</body>
</html>

 

 

 

가장 간단히 ESP32의 ADC값을 실시간으로 전송하고 웹페이지에 이값을 출력 하도록 해 보았다. 거의 실시간으로 출력 되는것을 확인 할 수 있다.

 

 

https://youtube.com/shorts/ILP4qp-3kS4?feature=share 


좀더 복잡하게 받아온 ADC값을 그래프로 출력 하도록 웹페이지를 수정해 보았다.

 

 

 

반응형