아두이노 보드를 사용하여 웹 서버로 사용하기 위한 방법은 크게 두가지가 있다. 첫째는 이더넷 쉴드 보드를 사용하여 유선 인터넷 망에 연결시키는 방법이며 두 번째는 무선 와이파이를 통해 공유기에 의해 인터넷 망에 연결하는 방법이다.
아두이노 보드에 무선 와이파이를 설치하는 방법에도 크게는 와이파이 쉴드를 설치하거나 그렇지 않으면 ESP-01 칩을 직접 배선하든지 아니면 ESP-12 또는 ESP-12E가 설치된 ESP8266 NodeMCU 보드를 활용하는 방안이다.
ESP8266WiFi NodeMCU 보드를 웹서버로 활용하기 위한 예제로서 아두이노 편집기 파일 탭의 예제 탭의 WiFIWebServer가 있으나 이 프로그램은 클라이언트 입력 방식에 다소의 문제가 있어 본 블로그에 제시된 프로그램으로 대치하기로 한다. 프로그램의 골격은 거의 같으나 초보자에게는 확실하게 프로그램이 동작하는 것이 중요하기 때문에 본 블로그의 프로그램을 성공 시킨 후에 예제탭의 WiFIWebServer 프로그램을 실행시킨다면 필자가 의미하는 바를 즉갈 이해할 수 있을 것이다.
자신의 스마트 폰에서 데이터 네트워크 및 핫스팟을 켜 공유기(AP:Acess Point)로 사용하기로 하자. 이번 예제가 데이터 통신 예제이므로 반드시 데이터 통신 기능도 켜진 상태라야 한다. 아울러 바로 앞에서 기술했던 Scan 프로그램을 돌리면 이용 가능한 핫스팟이나 공유기(AP)를 파악할 수 있다. 자신의 스마트 폰의 핫스팟이 켜졌는지 반드시 확인 후 불러온 프로그램 초반에 사용자 명과 비밀 번호를 입력하도록 한다.
단 주의할 점은 핫스팟은 클라이언트 웹화면이 준비된 상태에서 핫스팟을 켜도록 하고 시리얼 모니터를 통해서 아두이노 NodeMCU의 IP를 확인하도록 해야 한다.
#include <ESP8266WiFi.h>
const char* ssid = "AndroidHotspot1234";
const char* password = "00000000";
상기의 입력 데이터 사례는 가칭 사용자명 AndroidHotspot1234에 스마트 폰 개통 시에 별도의 보안 조치가 없었다면 비밀 번호가 00000000 으로 잡혀 있는 것이 보통이다. 각자 확인해 보도록 한다.
int ledPin = 2;
WiFiServer server(80);
void setup() {
Serial.begin(115200);
delay(10);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
WiFIServer server(80); 명령에 의해 아두이노 ESP8266 NodeMCU의 포트를 80번으로 설정한다. NodeMCU 보드의 baud 는 9600 이 아니라 115200 으로 설정된다. 보드 뒷면에 baud 9600 으로 설정하라고 되어 있지만 이는 ESP-01 모듈의 사례이다. 각자가 baud 설정을 바꾸어 보면서 확인이 가능하다.
ledPin 번호가 2로 지정된 상태에서 pinMode(ledPin,OUT) 명령에 의한 디지털 핀 설정은 외부의 클라이언트 컴퓨터와 통신 즉 LOW, HIGH 정보를 주고 받는 통신에서 ESP8266 NodeMCU PCB에 설치되어 있는 2번 청색 LED 점등 여부를 확인하기 위함이다. 이 2번 핀은 업로딩 시에 빠른 속도로 점멸하며 업로딩 완료 시 본 프로그램의 명령에 의해 On 상태에 머무르게 된다. 사진에서 ON 및 OFF 시 LED의 위치 및 빛깔을 확인해 본다.
아두이노 툴에서 반드시 NodeMCU 0.9와 포트 번호를 지정하고 확인한 후 다음의 프로그램을 컴파일하여 업로딩하도록 한다. 업로딩 완료 후는 다음 프로그램 이후에서 계속 설명하기로 한다.
WebServer_acrowifi_02
#include <ESP8266WiFi.h>
const char* ssid = "AndroidHotspot1234";
const char* password = "00000000";
int ledPin = 2;
WiFiServer server(80);
void setup() {
Serial.begin(115200);
delay(10);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
// Set WiFi to station mode and disconnect from an AP if it was previously connected
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
Serial.println("Setup done");
// Connect to WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
// Start the server
server.begin();
Serial.println("Server started");
// Print the IP address
Serial.print("Use this URL to connect: ");
Serial.print("http://");
Serial.print(WiFi.localIP());
Serial.println("/");
}
void loop() {
// Check if a client has connected
WiFiClient client = server.available();
if (!client) {
return;
}
// Wait until the client sends some data
Serial.println("new client");
while(!client.available()){
delay(1);
}
// Read the first line of the request
String request = client.readStringUntil('\r');
Serial.println(request);
client.flush();
// Match the request
int value = LOW;
if (request.indexOf("/LED=ON") != -1) {
digitalWrite(ledPin, LOW);
value = HIGH;
}
if (request.indexOf("/LED=OFF") != -1) {
digitalWrite(ledPin, HIGH);
value = LOW;
}
// Set ledPin according to the request
//digitalWrite(ledPin, value);
// Return the response
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println(""); // do not forget this one
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.print("Led pin is now: ");
if(value == HIGH) {
client.print(on");
} else {
client.print("Off");
}
client.println("<br><br>");
client.println("<a href=\"/LED=ON\"\"><button>Turn on </button></a>");
client.println("<a href=\"/LED=OFF\"\"><button>Turn Off </button></a><br />");
client.println("</html>");
delay(1);
Serial.println("Client disonnected");
Serial.println("");
}
주의: 업로딩이 완료되면 즉시 핫스팟을 켜고 시리얼 모니터 창을 열면 핫스팟을 찾기 위한 약간의 검색 시간이 필요하다.
WiFI가 연결되면 NodeMCU의 IP가 나타난다.
미리 핫스팟을 켰을 경우 IP주소 확인이 안되므로 IP를 외우고 있든지 아니면 핫스팟을 껐다가 다시 켜야 할 것이다.
다음 순서로서 스마트 폰 인터넷 화면을 열고 IP를 입력하고 엔터 키를 치는 순간 다음과 같이 ON OFF 버튼을 포함한 웹화면이 나타난다.
Turn on
버튼을 누르면 url 주소창에 LED=ON이 추가됨과 동시에 NodeMCU의 2번 LED가 청색으로 바뀌었음을 확인하도록 한다.
Turn Off 버튼을 누르면 url 주소창에 LED=OFF가 추가됨과 동시에 NodeMCU의 2번 LED가 꺼짐을 확인하도록 한다.
ON OFF를 반복하게 되면 시리얼 모니터 창에서 즉각적으로 반응이 나타난다.
그밖에 이 웹서버 예제는 하나의 클라이언트와 연결이 되면 다른 클라이언트와의 연결이 불가능하다는 점을 지적한다.
이상으로 외부 클라이언트 기기에서 아두이노 NodeMCU의 LED 스위치를 ON OFF 하는 제어 프로그램을 제시하였다. 이러한 프로그램 구조를 기본으로 다양한 사물 인터넷 시스템(IOT: Internet Of Things)을 구현하는 일은 독자들의 몫이 될 것이다.
'아두이노프로세싱 프로그래밍' 카테고리의 다른 글
아두이노 NodeMCU ESP8266WiFi 웹서버 예제:아날로그 입력 데이터 생성 및 전송 (0) | 2017.01.12 |
---|---|
아두이노 NodeMCU ESP8266WiFi 모듈의 핀배치 프로그래밍 주의 사항 (0) | 2017.01.12 |
아두이노 ESP8266WiFi NodeMCU 12E 모듈사용 와이파이 공유기 Scan 예제:I (0) | 2017.01.09 |
아두이노 RF(Radio requency)모듈에 의한 센서 측정값 전송 및 프로세싱 그래픽 (0) | 2016.12.30 |
아두이노 RF(Radio requency)모듈에 의한 문자 캐릭터 통신 (0) | 2016.12.27 |