ESP8266 Node MCU는 ESP-12 모듈 + USB + 아두이노IDE환경 지원 등을 추가한 모듈
마이크로 5핀으로 연결되는데 Lolin 제품은 CH34x 드라이버가 설치되어야 하는데 연결후 반응이 없거나 USB 연결이 실패했다고 어쩌구 하면 케이블을 정품(S모사, L모사)으로 바꾸면 된다(이거 해결하느라 몇시간을 헤멤)
IOT(Internet Of Things)환경에서의 기본형 프로세서로 많이 사용된다. 즉, IOT환경을 위해서는 WIFI 통신기능이 필수인데 기존의 아두이노에 WIFI장치를 부착하는 것보다 NodeMCU 하나를 사용하는 것이 다음과 같은 장점이 있다.
- 아두이노+WIFI통신장치 보다 NodeMCU 하나를 사용하는 것이 가격도 저렴하고 부피도 적다.
- 하나의 모듈안에서 WIFI가 기본 지원되므로 사용하기 간편하다.
- NodeMCU내 내장된 프로세서(80MHz대)가 아두이노보다(16MHz대) 속도가 훨씬 빠르다.
단점은
- 아날로그핀은 1개, 디지털입력 핀은 5~8개뿐.
- WiFi 가동중일때, 전력소비가 큼
ESP12모듈을 기본으로 사용하므로 ESP12 모듈에서 사용하는 GPIO번호를 그대로 사용헤도 되고 보드에 적힌 A0, D0~D8 라는 명칭을 아두이노에서 처럼 사용해도 된다.
배열된 핀수는 많으나 많은 핀들의 기능이 특정 목적으로 이미 예약 사용되기 있기 사용자가 임의로 활용할 수 있는 범용 입출력 핀은 몇개 안된다.
- GPIO 0,2,15 번은 부팅모드를 설정하기 위해 내정되어 있어 사용시에 주의를 요한다.
- GPIO1,3 번은 시리얼 통신용이다.
- GPIO 6~11번은 플래시메모리용으로 이미 사용중이므로 사용할 수 없다.
- GPIO 16번 (D0) 은 Sleep mode에서 벗어나기 위한 Wake용으로 사용된다
따라서 사용자가 조건 없이 범용으로 사용할 수 있는 핀은 GPIO 4번(D2), GPIO 5번 (D1), GPIO 12~14번 (D6,D7,D5) 다섯개 밖에 되지 않는다.
내장LED는 GPIO 2번(D4) 에 연결되어 있다. (CP22102를 사용한 NodeMCU는 D0 16번, BUILTIN_LED을 사용할수 있음)
사용방법
아두이노 IDE에서 ESP8266기능을 사용하려면 다음과 같이 ESP8266 보드메니저를 추가해 주어야 한다.
1) Arduino IDE를 기동시키고 파일 -> 환경설정 메뉴를 선택한다.
2)환경설정화면 [추가적인 보드 메니저URL] 항목에 다음과 같이 추가한다.
http://arduino.esp8266.com/stable/package_esp8266com_index.json
3)아두이노 IDE메뉴에서 툴 -> 보드 -> 보드메니저 선택한다.
4)보드메니저에서 ESP8266을 선택하여 설치하고 아두이노 IDE를 종료하고 재가동 한다.
예제 프로그램 실행시켜 보기
ESP 8266 보드메니저가 설치되면 다음과 같이 예제 메뉴에 ESP8266 예제들이 추가되므로 여기에서 Blink를 선택해 본다.
아두이노 IDE 메뉴에서 툴->보드-> NodeMCU 1.0 을 선택하고, 포트연결을 확인한 후 실행시켜 보면 보드의 내장LED가 깜박이는 것을 확인할 수 있다. 예제의 설명문에 적혀 있는 것처럼 LED_BUILTIN은 LOW일 때 LED가 켜지고 HIGH일 때 꺼지는 것 임에 주의한다.
SLEEP모드 사용하기
ESP8266 모듈은 기본적으로 전력 소모량이 많기 때문에 사용하지 않을 때에는 거의 모든 기능이 정지되어 있는 상태(Sleep mode)에서 대기하고 있다가 어떤 조건이 만족되면 다시 깨어나 작동하는 기능이 지원된다. 이 sleep mode에서는 오로지 다시 깨어나기 위해 대기하는 기능만 작동되기 때문에 전력소모가 거의 없다.
1) 사전배선 : GPIO 16번 (D0) 핀을 RST(Reset) 핀을 연결한다.
2) 수면모드 진입 : 다음과 같이 Sleep mode를 지정하면 지정한 시간 만큼 Sleep 모드후 자동으로 다시 시작된다.
const unsigned long stime = 60000000; // 60초, 백반분의 1초 단위
ESP.deepsleep(stime);
3)수면모드 탈출 : 수면모드 진입시에 지정된 시간이 경과 되거나 RST핀에 LOW신호를 입력하면( GND에 연결되도록 스위치를 설치하여 누르기) 다시 깨어나게 된다.
다음 수면모드 샘플프로그램은 내장 LED를 5초간 켜고 나서 10초간 Sleep Mode에 진입했다가 다시 깨어나는 예제 프로그램이다. 여기에서 주의해야 할 점은 Sleep mode에서 깨어 나면 정지 되었던 다음부터 다시 시작하는 것이 아니고 프로그램이 완전히 재시작해서 setup 함수부터 다시 시작한다는 것이다.
const unsigned long sTime = 10000000; // 10초
void setup() {
Serial.begin(115200);
Serial.println("program start");
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, LOW);
delay(5000);
digitalWrite(LED_BUILTIN, HIGH);
ESP.deepSleep(sTime);
}
예를 들어 1시간 간격으로 온도 등 기상정보를 읽어 서버에 보내 주는 기능을 개발할 때 이러한 Sleep mode기능을 활용하면 실제 센싱 및 전송작업할 때에만 깨어나서 작업하고 59분 이상 대부분의 시간을 Sleep mode에서 대기하게 함으로써 배터리가동 시간을 획기적으로 늘릴 수 있다.
초기 가동 및 접속테스트
PC에 연결하고, 초기 가동하여 웹에 접속한 예제는 아래와 같다.
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#ifndef STASSID
#define STASSID "사용가능한 와이파이 SSID"
#define STAPSK "사용가능한 와이파이 SSID의 비번"
#endif
const char *ssid = STASSID;
const char *password = STAPSK;
ESP8266WebServer server(80);
const int led = 2; // built in led 와이파이 칩 근처에서 파란 LED
void handleRoot() {
digitalWrite(led, 1);
char temp[400];
int sec = millis() / 1000;
int min = sec / 60;
int hr = min / 60;
snprintf(temp, 400,
"<html>\
<head>\
<meta http-equiv='refresh' content='5'/>\
<title>ESP8266 Demo</title>\
<style>\
body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
</style>\
</head>\
<body>\
<h1>Hello from ESP8266!</h1>\
<p>Uptime: %02d:%02d:%02d</p>\
<img src=\"/test.svg\" />\
</body>\
</html>",
hr, min % 60, sec % 60
);
server.send(200, "text/html", temp);
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 drawGraph() {
String out;
out.reserve(2600);
char temp[70];
out += "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"400\" height=\"150\">\n";
out += "<rect width=\"400\" height=\"150\" fill=\"rgb(250, 230, 210)\" stroke-width=\"1\" stroke=\"rgb(0, 0, 0)\" />\n";
out += "<g stroke=\"black\">\n";
int y = rand() % 130;
for (int x = 10; x < 390; x += 10) {
int y2 = rand() % 130;
sprintf(temp, "<line x1=\"%d\" y1=\"%d\" x2=\"%d\" y2=\"%d\" stroke-width=\"1\" />\n", x, 140 - y, x + 10, 140 - y2);
out += temp;
y = y2;
}
out += "</g>\n</svg>\n";
server.send(200, "image/svg+xml", out);
}
void setup(void) {
pinMode(led, OUTPUT); // Built in LED
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
digitalWrite(led, 0); // Built in LED On = 0, Off = 1
delay(250);
digitalWrite(led, 1); // Built in LED On = 0, Off = 1
delay(250);
}
// WiFi 찾을때는 깜박이다가 찾아서 연결괴면 파란 LED 항상 LED On
digitalWrite(led, 0); // Built in LED On = 0, Off = 1
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("/test.svg", drawGraph);
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();
MDNS.update();
}
참조
https://arduino.stackexchange.com/questions/38477/does-the-node-mcu-v3-lolin-not-have-a-builtin-led