본문 바로가기

RaspberryPi/RaspberryPi PicoW

Raspberry Pi PicoW - LittleFS를 사용한 웹서버

기존에 테스트 했던 웹서버는 저장소가 없이 소스코드 내에서 웹페이지의 정보를 전송 했는데 복잡한 웹페이지나 이미지가 많이 들어가는 웹페이지는 다루기가 어렵다. 그래서 파일 시스템(LittleFS)에 웹페이지 관련 파일들을 저장 해 두고 처리하면 상당히 편리 하다. 

특히 웹페이지를 자주 바꾸어서 테스트 해야 하는 테스트에서는 파일시스템 내용만 바꾸면 되기 때문에 정말 빠르고 편리하게 개발 할 수 있다.

 

ESP32 SPIFFS 웹서버 예제를 참고 해서 Pi Pico에서 제공하는 LittleFS로 웹서버를 구현하는 코드를 작성해 보자

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

#define _FS       LittleFS

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

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

WebServer server(80);
const int Led1Pin = 9;


//페이지 요청이 들어 오면 처리 하는 함수
 
//On 버튼 페이지 처리함수
void SetLedStatusOn()
{
    Serial.println("On");
    digitalWrite(Led1Pin, 0);
 
    server.send(200, "text/html", "");
}

//Off 버튼 페이지 처리함수
void SetLedStatusOff()
{
    Serial.println("Off");
    digitalWrite(Led1Pin, 1);
 
    server.send(200, "text/html", "");
}


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

void InitWebServer()
{
  //페이지 요청 처리 함수 등록
  server.on("/on", HTTP_GET, SetLedStatusOn);
  server.on("/off", HTTP_GET, SetLedStatusOff);

  server.serveStatic("/", _FS, "/index.html");
  server.serveStatic("/", _FS, "/");
 
  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 listAllFilesInDir(String dir_path)
{
  int cnt = 0;
  Dir dir = LittleFS.openDir(dir_path);
  while(dir.next()) {
    if (dir.isFile()) {
      // print file names
      Serial.print("File: ");
      Serial.println(dir_path + dir.fileName());
      Serial.printf("File Content:%d\r\n", 1+cnt++);
    }
    if (dir.isDirectory()) {
      // print directory names
      Serial.print("Dir: ");
      Serial.println(dir_path + dir.fileName() + "/");
      // recursive file listing inside new directory
      listAllFilesInDir(dir_path + dir.fileName() + "/");
    }
  }
}


void setup(void) {
  pinMode(Led1Pin, OUTPUT);
  digitalWrite(Led1Pin, 0);
  analogReadResolution(12);

  Serial.begin(115200);

  while (!Serial)
  {
    if (Serial) {
      Serial.println("Waiting for other USB ports");
       }
   }

  if(!LittleFS.begin()){
    Serial.println("An Error has occurred while mounting LittleFS");
    return;
    }
 
  listAllFilesInDir("/");

  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();
}

 

 

RP2040 Pico LittleFS 파일 시스템 테스트 를 참고 해서 data 폴더를 파일시스템에 넣을 수 있다.

 


index.html 파일은 간단히 LED 이미지를 출력하고 버튼을 추가 해서 입력 처리를 할수 있도록 했다.

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
	<script src="ctrl.js"></script>	
</head>

<body>
	<center>
    <header>
        <h1>PicoW Webserver LED On/Off(javascript)</h1>
    </header>
    <section>
        <img src="bulb-off.png" id="bulb" width="200">
        <div class="btn_container">
		<button id="on" class="bulb_btn" onclick="led_on()">on</button>
        <button id="off" class="bulb_btn" onclick="led_off()">off</button>
		</div>		
    </section>
	</center>
</body>
</html>

 

ctrl.js 제어를 위한 코드는 자바스크립트로 별도의 파일로 만들어 다양한 처리를 할수 있도록 할수 있다.

function led_on(){
  document.getElementById('bulb').src='bulb-on.png';
  
  var POTvalRequest = new XMLHttpRequest();
  POTvalRequest.open("GET", "on", true);
  POTvalRequest.send()	  
}

function led_off(){
  document.getElementById('bulb').src='bulb-off.png';
  
  var POTvalRequest = new XMLHttpRequest();
  POTvalRequest.open("GET", "off", true);
  POTvalRequest.send()	  
}

 

펌웨어를 다운로드 하고 웹페이지에 접속하면 기본 페이지를 출력 하고 버튼의 상태에 따라 LED 출력이 변경되는 것을 확인 할수 있다.

 

반응형