아두이노 WeMos로 wifi 통신하기

by 조혜인 | 2017-03-02 16:32
arduino http iot r2 wemos wifi 도어락 스마트홈 아두이노 위모스

이번 스토리는 아두이노 WeMos를 HTTP 서버로 이용해 Web 브라우저와 통신합니다. Web 브라우저에서 LED On/Off 상태를 변경하면 WeMos의 LED의 상태가 바뀌는 미니 프로젝트입니다. 좋은 레퍼런스를 발견해서 소개해 드립니다(Programming a HTTP Server on ESP-8266-12E, Instructables). 아두이노 서버와 웹클라이언트 간 통신에 대해서 자세히 설명되어 있습니다. WeMos 환경 셋팅은 이전 스토리를 참고하세요.



STEP 1. 웹서버 코드 업로드하기

아래 소스코드를 업로드 하세요.

1. ESP8266 라이브러리 ESP8266WiFi.h를 포함합니다.

2.  "WiFiServer"의 인스턴스(instance) "server"를 만들고, 포트(Port) 80으로 지정합니다.

WiFiServer server(80);

3. ESP8266의 모드를 액세스 포인트 (AP)로 설정합니다. 
WiFi.mode();

4.SSID와 암호를 입력하세요. 암호 / 암호는 8 자 이상이어야합니다. 
Wif.softAP("SSID", "password");
 

5. begin () 메소드를 호출하여 서버를 가동시킵니다.
server.begin();

#include <ESP8266WiFi.h>

WiFiServer server(80); //Initialize the server on Port 80

void setup() {

WiFi.mode(WIFI_AP); //Our ESP8266-12E is an AccessPoint
WiFi.softAP("Hello_IoT", "12345678"); // Provide the (SSID, password); .
server.begin(); // Start the HTTP Server

}

void loop() { }














STEP 2. 설정한 서버 확인하기

PC의 Wifi 연결리스트에서 우리 서버를 확인합니다. 아래 과정이 잘 된다면, WeMos보드가 HTTP 서버로 올바르게 작동하는 것입니다.

1. "네트워크에 연결"창을 열어서 목록에 SSID "Hello_IoT"가 있는지 확인합니다.
2. Hello_IoT 네트워크를 선택하고 패스워드를 입력해 연결합니다.







STEP 3. HTTP 서버 정보 얻어오기

우리가 서버로 만든 WeMos 보드에서 HTTP 서버 정보를 얻어옵니다.

1) 다음 코드를 setup 함수에 추가한 후 업로드 합니다.

Serial.begin(115200); //Start communication between the ESP8266-12E and the monitor window
IPAddress HTTPS_ServerIP= WiFi.softAPIP(); // Obtain the IP of the Server
Serial.print("Server IP is: "); // Print the IP to the monitor window
Serial.println(HTTPS_ServerIP);





2) 시리얼 창을 켜서 IP주소를 아래와 같이 확인합니다. IP주소는 "192.168.4.1" 입니다.





STEP 4. 웹 브라우저에서 HTTP서버 연결됐는지 확인하기

1) 다음 소스코드를 loop문에 추가합니다. 그리고 업로드 합니다.
서버에 client가 접속했는지 확인하는 코드 입니다.

WiFiClient client = server.available();
if (!client) {
return;
}
//Looking under the hood
Serial.println("Somebody has connected :)");






2) 시리얼 창을 켭니다. PC에서 웹브라우저 주소창에 "http://192.168.4.1"를 입력한 후 Enter를 칩니다.
그럼 시리얼창에 아래 그림과 같은 메세지를 확인할 수 있습니다.
Client(웹브라우저)에서 Server(WeMos보드)에 접속했다는 의미입니다.





STEP 5. 브라우저에서 보낸 정보 확인하기

웹 브라우저는 HTTP 서버에 연결된 후, request를 보냅니다.
서버는 request를 받은 후, 그에 맞는 명령을 수행하겠죠? 

1) 다음 코드를 loop문에 추가해 주세요. 그리고 업로드 합니다.

//Read what the browser has sent into a String class and print the request to the monitor
String request = client.readStringUntil('\r');
//Looking under the hood
Serial.println(request);



2) 아두이노 시리얼창을 켜 두세요.

PC의 웹브라우저 주소창에 "http://192.168.4.1/PARAM"를 넣고 Enter를 칩니다.

브라우저는 GET request를 서버로 보냅니다. "/PARAM"이 바로 그 GET request입니다. 시리얼 창에서 확인할 수 있습니다.





STEP 6. 웹브라우저에서 아두이노의 LED On/Off하기

자, 이제 웹브라우저에서 LED를 On/Off 해 봅시다.

1. 회로 연결하기


2. 소스코드 업로드 하기

1) 전역변수를 만들어 줍니다. setup 위쪽에 추가해 주면 됩니다.

int LED_PIN = 14;


2) setup 부분에 다음 코드를 추가해 줍니다.

pinMode(LED_PIN, OUTPUT); //GPIO14 is an OUTPUT pin;
digitalWrite(LED_PIN, LOW); //Initial state is ON



3) loop 부분에 다음 코드를 추가해 줍니다. 그리고 업로드 합니다.

// Handle the Request

if (request.indexOf("/OFF") != -1){
digitalWrite(LED_PIN, HIGH); }
else if (request.indexOf("/ON") != -1){
digitalWrite(LED_PIN, LOW);
}







3. 웹 브라우저에서 작동해 보기

시리얼 창을 켜 둡니다.

그리고 웹 브라우저에서 다음 URL을 입력해 봅니다.

- LED On : http://192.168.4.1/ON

- LED Off : http://192.168.4.1/OFF




STEP 7. 웹브라우저에 버튼 추가하기

간단하게 버튼을 추가해 보겠습니다.

1) 다음 코드를 loop문에 추가해주신 후, 업로드해 주세요.

그럼 서버에서 다음 코드를 웹브라우저에 전송합니다.

  String s = "HTTP/1.1 200 OK\r\n";
  s += "Content-Type: text/html\r\n\r\n";
  s += "<!DOCTYPE HTML>\r\n<html>\r\n";
  s += "<br><input type=\"button\" name=\"b1\" value=\"Turn LED ON\" onclick=\"location.href='/ON'\">";
  s + = "<br><br><br>";
  s += "<input type=\"button\" name=\"b1\" value=\"Turn LED OFF\" onclick=\"location.href='/OFF'\">";
  s += "</html>\n";

  client.flush(); //clear previous info in the stream
  client.print(s); // Send the response to the client
  delay(1);
  Serial.println("Client disonnected"); //Looking under the hood


2) 버튼을 클릭하면 다음 GET request를 전송합니다.

- Turn LED On : /ON

- Turn LED Off : /OFF

각 request를 받았을 때, LED가 On/Off되겠죠?



마무리

WeMos보드 정말 편리한 것 같습니다. 스마트도어락 프로젝트에서 사진을 서버로 전송하는 것을 해 보도록 하겠습니다.

댓글 0

MADE BY

조혜인

arduino, processing, rhino, sketchup, 아두이노, 에프터이펙트, 포토샵, 프리미어