[INTERFACE]/ESP82662017. 9. 15. 04:29

[ESP8266-SSM EVM] 웹서버 테스트

[ESP8266-SSM EVM] ESP8266 웹서버 테스트




ESP8266의 가장 강점은 저렴한 가격의 WiFi 를 구현 할 수 있는것이 아닐까...

우선 가장 간단하게 테스트 해 볼 수 있는 웹서버 예제를 돌려 보자


Arrduino설치시 기본으로 제공하는 웹서버 예제를 다운로드 해서 테스트 해 보았다.

#include <ESP8266WiFi.h>

#include <WiFiClient.h>

#include <ESP8266WebServer.h>

#include <ESP8266mDNS.h>


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

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


ESP8266WebServer server(80);


const int led = 13;


void handleRoot() {

  digitalWrite(led, 1);

  server.send(200, "text/plain", "hello from esp8266!");

  digitalWrite(led, 0);

}


void handleNotFound(){

  digitalWrite(led, 1);

  String message = "File Not Found\n\n";

  message += "URI: ";

  message += server.uri();

  message += "\nMethod: ";

  message += (server.method() == HTTP_GET)?"GET":"POST";

  message += "\nArguments: ";

  message += server.args();

  message += "\n";

  for (uint8_t i=0; i<server.args(); i++){

    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";

  }

  server.send(404, "text/plain", message);

  digitalWrite(led, 0);

}


void setup(void){

  pinMode(led, OUTPUT);

  digitalWrite(led, 0);

  Serial.begin(115200);

  WiFi.mode(WIFI_STA);

  WiFi.begin(ssid, password);

  Serial.println("");


  // Wait for connection

  while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    Serial.print(".");

  }

  Serial.println("");

  Serial.print("Connected to ");

  Serial.println(ssid);

  Serial.print("IP address: ");

  Serial.println(WiFi.localIP());


  if (MDNS.begin("esp8266")) {

    Serial.println("MDNS responder started");

  }


  server.on("/", handleRoot);


  server.on("/inline", [](){

    server.send(200, "text/plain", "this works as well");

  });


  server.onNotFound(handleNotFound);


  server.begin();

  Serial.println("HTTP server started");

}


void loop(void){

  server.handleClient();

}




실행하면 접속 정보가 나온다.


Connected to KT_GiGA_DC3E

IP address: 172.30.1.19

MDNS responder started

HTTP server started



그 정보를 이용해서 해당 IP로 접속하면 간단한 웹페이지가 표시되는것을 확인 할 수 있다.







기본 코드는 확인되었으니 이제 좀더 복잡한 웹서버 예제를 돌려 보자


// Load Wi-Fi library

#include <ESP8266WiFi.h>


// Replace with your network credentials

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

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


// Set web server port number to 80

WiFiServer server(80);


// Variable to store the HTTP request

String header;


// Auxiliar variables to store the current output state

String output5State = "off";

String output4State = "off";


// Assign output variables to GPIO pins

const int output5 = 5;

const int output4 = 16;


void setup() {

  Serial.begin(115200);

  // Initialize the output variables as outputs

  pinMode(output5, OUTPUT);

  pinMode(output4, OUTPUT);

  // Set outputs to LOW

  digitalWrite(output5, LOW);

  digitalWrite(output4, LOW);


  // Connect to Wi-Fi network with SSID and password

  Serial.print("Connecting to ");

  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    Serial.print(".");

  }

  // Print local IP address and start web server

  Serial.println("");

  Serial.println("WiFi connected.");

  Serial.println("IP address: ");

  Serial.println(WiFi.localIP());

  server.begin();

}


void loop(){

  WiFiClient client = server.available();   // Listen for incoming clients


  if (client) {                             // If a new client connects,

    Serial.println("New Client.");          // print a message out in the serial port

    String currentLine = "";                // make a String to hold incoming data from the client

    while (client.connected()) {            // loop while the client's connected

      if (client.available()) {             // if there's bytes to read from the client,

        char c = client.read();             // read a byte, then

        Serial.write(c);                    // print it out the serial monitor

        header += c;

        if (c == '\n') {                    // if the byte is a newline character

          // if the current line is blank, you got two newline characters in a row.

          // that's the end of the client HTTP request, so send a response:

          if (currentLine.length() == 0) {

            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)

            // and a content-type so the client knows what's coming, then a blank line:

            client.println("HTTP/1.1 200 OK");

            client.println("Content-type:text/html");

            client.println("Connection: close");

            client.println();

            

            // turns the GPIOs on and off

            if (header.indexOf("GET /13/on") >= 0) {

              Serial.println("GPIO 13 on");

              output5State = "on";

              digitalWrite(output5, HIGH);

            } else if (header.indexOf("GET /13/off") >= 0) {

              Serial.println("GPIO 13 off");

              output5State = "off";

              digitalWrite(output5, LOW);

            } else if (header.indexOf("GET /12/on") >= 0) {

              Serial.println("GPIO 12 on");

              output4State = "on";

              digitalWrite(output4, HIGH);

            } else if (header.indexOf("GET /12/off") >= 0) {

              Serial.println("GPIO 12 off");

              output4State = "off";

              digitalWrite(output4, LOW);

            }

            

            // Display the HTML web page

            client.println("<!DOCTYPE html><html>");

            client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");

            client.println("<link rel=\"icon\" href=\"data:,\">");

            // CSS to style the on/off buttons 

            // Feel free to change the background-color and font-size attributes to fit your preferences

            client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");

            client.println(".button { background-color: #195B6A; border: none; color: white; padding: 16px 40px;");

            client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");

            client.println(".button2 {background-color: #77878A;}</style></head>");

            

            // Web Page Heading

            client.println("<body><h1>ESP8266 Web Server</h1>");

            client.println("<hr width=\"50%\" color=\"blue\"/>");



            // Display current state, and ON/OFF buttons for GPIO 5  

            client.println("<p>GPIO 13 - State " + output5State + "</p>");

            // If the output5State is off, it displays the ON button       

            if (output5State=="off") {

              client.println("<p><a href=\"/13/on\"><button class=\"button\">ON</button></a></p>");

            } else {

              client.println("<p><a href=\"/13/off\"><button class=\"button button2\">OFF</button></a></p>");

            } 

               

            // Display current state, and ON/OFF buttons for GPIO 4  

            client.println("<p>GPIO 12 - State " + output4State + "</p>");

            // If the output4State is off, it displays the ON button       

            if (output4State=="off") {

              client.println("<p><a href=\"/12/on\"><button class=\"button\">ON</button></a></p>");

            } else {

              client.println("<p><a href=\"/12/off\"><button class=\"button button2\">OFF</button></a></p>");

            }

            client.println("</body></html>");

            

            // The HTTP response ends with another blank line

            client.println();

            // Break out of the while loop

            break;

          } else { // if you got a newline, then clear currentLine

            currentLine = "";

          }

        } else if (c != '\r') {  // if you got anything else but a carriage return character,

          currentLine += c;      // add it to the end of the currentLine

        }

      }

    }

    // Clear the header variable

    header = "";

    // Close the connection

    client.stop();

    Serial.println("Client disconnected.");

    Serial.println("");

  }

}





Posted by nexp

댓글을 달아 주세요

Cortex-M/INFINEON2013. 12. 1. 23:00

XMC1300 EVM - Simple Embedded Web Server Test

[XMC1300 EVM] Simple Embedded Web Server Test



XMC1300과 W5200을 이용하여 TCP/IP 통신이 테스트 되었기 때문에 활용 방안으로 간단히 임베디드 웹서버응 테스트 해 보았다

XMC1300은 저렴한 MCU이지만 16Kbyte의 램과 200Kbyte의 플래시 메모리를 가지고 있기 때문에 웹페이지를 저장 할 수 있는 공간이 충분하다. 웹서버는 이러한 XMC1300의 장점을 잘 살릴 수 있는 어플리 케이션이다



XMC1300 EVM을 이용한 임베디드 웹서버 테스트 동영상





XMC1300 Embedded WebServer 테스트 소스코드

간한히 테스트 하기 위해 코드를 최대한 단순하게 작성하였다.

void ProcessTCPS(unsigned int sock)

{

    int i;

int len;

unsigned int port = MY_LISTEN_PORT;

int wait_send=0;

switch (getSn_SR(SOCK_TCPS))

{

case SOCK_ESTABLISHED:

if(m_SokStatus1==1)

{

DebugPrint("%d : Connected by %s(%u)\r\n");

m_SokStatus1 = 2;

}

if ((len = getSn_RX_RSR(sock)) > 0)

{

if (len > TX_RX_MAX_BUF_SIZE) len = TX_RX_MAX_BUF_SIZE;

len = recv(sock, data_buf, len);


            U0_PutBuf(data_buf, len);


//LED 제어 처리 

            if(strstr(data_buf, "ledr_on.jpg"))

{

                for(i=0;i<(IMG_BUF_SIZE/TX_RX_MAX_BUF_SIZE);i++)

                {

    send(sock, &img_buf[i*TX_RX_MAX_BUF_SIZE], TX_RX_MAX_BUF_SIZE, 0);

                }

                

                send(sock, &img_buf[i*TX_RX_MAX_BUF_SIZE], IMG_BUF_SIZE%TX_RX_MAX_BUF_SIZE, 0);

}             

else if(strstr(data_buf, "ledr_of.jpg"))

{

                for(i=0;i<(IMG_BUF_SIZE2/TX_RX_MAX_BUF_SIZE);i++)

                {

    send(sock, &img_buf2[i*TX_RX_MAX_BUF_SIZE], TX_RX_MAX_BUF_SIZE, 0);

                }

                

                send(sock, &img_buf2[i*TX_RX_MAX_BUF_SIZE], IMG_BUF_SIZE2%TX_RX_MAX_BUF_SIZE, 0);

}

            else if(strstr(data_buf, "led_off.html"))

{

                send(sock, str_msg3, strlen(str_msg3), 0);

Led1Off();

                Led2Off();

DebugPrint("led off\r\n");

}            

            else if(strstr(data_buf, "led_on.html"))

{

                send(sock, str_msg, strlen(str_msg), 0);

Led1On();

                Led2On();


DebugPrint("led on\r\n");

}

else if(strstr(data_buf, "index.html"))

{

                send(sock, str_msg, strlen(str_msg), 0);

                DebugPrint("main\r\n");

}

            else

            {

                if(led_flag == 0)

                {

                    led_flag = 1;

                    

                send(sock, str_msg, strlen(str_msg), 0);

                DebugPrint("main\r\n");                    

                }

            }

while(getSn_TX_FSR(sock)!= getIINCHIP_TxMAX(sock))

{

if(wait_send++ > 1500)

{

DebugPrint( "HTTP Response send fail");

break;

}

Delay(1);

}

disconnect(sock);

DebugPrint("closed\r\n");

}

break;

case SOCK_CLOSE_WAIT:                          

disconnect(sock);

m_SokStatus1 = 0;

break;

case SOCK_CLOSED:

if(!m_SokStatus1)

{

DebugPrint("[%d] : Web Server Started.",sock);

m_SokStatus1 = 1;

}


if(socket(sock, Sn_MR_TCP, DEFAULT_HTTP_PORT, 0x00) == 0)

{

DebugPrint("\a%d : Fail to create socket.",sock);

m_SokStatus1 = 0;

}

else listen(sock);

break;

        

    default:

        break;

}

}




Posted by nexp

댓글을 달아 주세요

  1. 비밀댓글입니다

    2013.12.12 09:55 [ ADDR : EDIT/ DEL : REPLY ]

Cortex-M/EFM322013. 5. 4. 21:30

EFM32G210 EVM - 웹서버를 이용한 온습도 모니터링 예제

EFM32G210 EVM - 웹서버를 이용한 온습도 모니터링 예제

 

 

 

 

 

EFM32의 저전력 기능을 활용하기 위해 저전력으로  온습도 모니터링 가능한 임베디드 웹서버를 제작했다.

온도, 습도 센서는 STH10 온습도 센서 모듈을 이용하였다.

 

 

SHT10 온습도 센서 드라이버 소스

//-----------------------------------------------------------------------------
// SHT10 Sensor
#define SHT_DAT_BIT      BIT13
#define SHT_DAT_PORT     GPIOB

#define SHT_DATA_H()     sbi(SHT_DAT_PORT, SHT_DAT_BIT);
#define SHT_DATA_L()     cbi(SHT_DAT_PORT, SHT_DAT_BIT)

#define SHT_SCK_BIT      BIT14
#define SHT_SCK_PORT     GPIOB
#define SHT_DAT_DDR      DDRD 
#define SHT_DAT_READ()     ((pGPIO->P[1].DIN&SHT_DAT_BIT)?1:0)

#define SHT_SCK_H()      sbi(SHT_SCK_PORT, SHT_SCK_BIT);
#define SHT_SCK_L()      cbi(SHT_SCK_PORT, SHT_SCK_BIT)

#define SHT_PORT_INIT()     GPIO_PinModeSet(gpioPortB, 14, gpioModePushPull, 1);\
                                        GPIO_PinModeSet(gpioPortB, 13, gpioModeInputPull, 0)


#define OUT_MODE()      GPIO_PinModeSet(gpioPortB, 13, gpioModePushPull, 1)
#define IN_MODE()      GPIO_PinModeSet(gpioPortB, 13, gpioModeInputPull, 0)
#define _SHT_DELAY()     Delay_us(10);
//-----------------------------------------------------------------------------

 

 

 

EFM32 Embedded Webserver - Temperature and Humidity Web Monitoring 동영상

EFM32 웹서버에 접속하면 2초에 한번씩 온습도 데이터를 전송하는 테스트 이다. 인터넷이 연결되는 핸드폰이나 모바일 기기에서 온습도 모니터 가능하다.

 

 

 

 

EFM32 Webserver Test Page

웹서버 IP 로 접속하면 가장 최근의 온습도 데이터를 확인할 수 있다.

Posted by nexp

댓글을 달아 주세요

Cortex-M/EFM322013. 5. 1. 23:00

EFM32G210 EVM - 저전력 Embedded Web Server 테스트

EFM32G210 EVM - 저전력 Embedded Web Server 테스트




EFM32G210의 장점으로 Cortex-M3코어(128k Flash/16k RAM)에 저전력으로 구동 된다. 소형에 저렴하면서 플래시와 램이 풍부해서 소형 임베디드 웹서버 제작하기에 좋을것 같다.


간단히하기 위해 내부 플레쉬메모리에 웹서버를 구현 해 보았다.




할당된 IP에 접속하면 출력될 Web Page

간단한 이미지와 입출력 제어를 위한 CGI코드로 구성되어 있다.




EFM32 Web Server 테스트 동영상


Posted by nexp

댓글을 달아 주세요

[INTERFACE]/Ethernet2012. 12. 31. 02:28

실시간 임베디드 웹서버 테스트 - 가속도 센서 그래프출력

실시간 임베디드 웹서버 테스트 - 가속도 센서 그래프출력



W5200을 이용하여 실시간 임베디드 웹서버 테스트 (참고 adStar 을 이용한 웹서버 테스트)



실시간 업데이트 웹서버 테스트 동영상

실시간성 테스를 위해 3축 가속도 센서 데이터를 모니터링 하는 예제를 테스트 했다. 

 

 


SD Card를 이용한 Embedded Webserver 테스트 동영상 

SD card에 웹페이지를 저장하고 네으웍으로 접속하여 간단한 웹서버 기능을 테스트 하고 있다. 디지털 입력, 디지털 출력, 아날로그 입력 등을 웹브라우저나 스마트폰등에서 접속하여 테스트할수 있다.

 

 

Posted by nexp
TAG webserver

댓글을 달아 주세요