본문 바로가기

RaspberryPi/RaspberryPi PicoW

Raspberry Pi PicoW - Ajax 를 이용한 실시간 웹 전압 디스플레이

 

 

 

ESP32-S2 웹서버 테스트 - Ajax 를 이용한 실시간 데이터 수신 테스트 코드를 이용하여 실시간 웹 디스플레이 테스트를 해보자. 코드는 거의 동일하게 구동된다.

 

Pi Pico 확장 테스트 보드에는 ADC를 테스트 할 수 있는 가변저항(VR8)이 RP2040의 A0(GP26)에 할당되어 있다. 가변저항을 돌리면 전압변화가 생기고 이 전압을 웹페이지에 출력하는 코드를 작성해 보자.

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

#ifndef STASSID
#define STASSID "****"
#define STAPSK "****"
#endif

const char* ssid = STASSID;
const char* password = STAPSK;
 

WebServer server(80);

// HTML 페이지
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<head>
  <title> Ajax Web Server </title>
</head>
<html>
<!----------------------------CSS---------------------------->
<style>
</style>
<!----------------------------HTML--------------------------->
<body>
  <div class="card">
	<p>ADC Value</p>
	<h1><span id="ADCValue">0</span>mV</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(int(analogRead(A0)*3.3*1000/4096));
 Serial.println(POTval);
 server.send(200, "text/plane", POTval);
}


void handleNotFound() 
{
  String message = "File Not Found\n\n";
  server.send(404, "text/plain", message);
}

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

void InitWiFi(void)
{
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
}

void setup(void) {
  analogReadResolution(12);

  Serial.begin(115200);

  InitWiFi();

  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  InitWebServer();

  server.begin();
  Serial.println("HTTP server started");
}

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

 

펌웨어 다운로드 하고 웹페이지 접속하면 가변저항의 전압값을 실시간으로 웹페이지에 출력 하는것을 확인 할 수 있다.

 


웹페이지의 CSS 스크립트를 추가 하면 좀더 보기 좋은 웹페이지를 표현 할 수 있다.

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<head>
  <title> Ajax Web Server </title>
</head>
<html>
<!----------------------------CSS---------------------------->
<style>
body {
  margin: 1em;
  background: #333;
  color: #ccc;
  }
  
.box-green,  
.box-grey,
.box-yellow {
	color: #555;
	text-align : center;
	font-size: 10vw;
	margin:0 0 50px;
	overflow:hidden;
	padding:20px;
	-webkit-border-radius: 10px;
        border-radius: 10px; 
}
.box-grey {
	background-color:#F5F5F5;
	border:2px solid #DDDDDD;
}
.box-green {
	background-color:#d9edc2;
	border:1px solid #b2ce96;
}
.box-yellow {
	background-color:#fef5c4;
	border:1px solid #fadf98;
}
h1 {
  font-size: 5vw;
}
.material-symbols-outlined {
  font-variation-settings:
  'FILL' 0,
  'wght' 400,
  'GRAD' 0,
  'opsz' 24
}
</style>
<!----------------------------HTML--------------------------->
<body>
<center><h1>ADC Value</h1></center>
  <div class="card">
	<p>[ADC0]</p>
	<div class="box-green"><h1><span id="ADCValue">38</span></h>mV</div>
	<p>[ADC1]</p>
	<div class="box-yellow"><h1><span id="ADCValue1">250</span></h>mV</div>	
  </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";

 

 

 

모바일 폰에서 확인해도 동일한 결과를 확인 할 수 있다.

반응형