NodeMCU V2 활용

NodeMCU V2를 활용하여 인터넷으로 전원을 제어해 봅니다.

Posted by 최일규 on 2018. 01. 20

NodeMCU V2를 활용하여 인터넷으로 전원을 제어해 봅니다.

지난 포스트에서 WeMos D1을 활용하여 전원을 제어하는 방법에 대해 연구해 보았습니다.

ESP8266 모듈에 대한 매력이 있어 다양한 디바이스를 테스트해보고 있는데요.

이번에는 NodeMCU V2라는 ESP8266통합 보드를 Aliexpress에서 주문해서 동일하게 구현해 보았습니다.

저는 맥북에서 작업했습니다.

NodeMCU V2는 CP210x 칩을 사용한다고 하네요. 다음 URL을 통해 OS에 맞는 드라이버를 설치해줍니다.

맥OS(High Sierra)의 경우 설치하고도 포트가 안잡혀서 좀 헤맸는데요. 시스템 환경설정 - 보안 및 개인정보 보호에서 해당 드라이버를 승인해 줘야 하더군요..

https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers

보드매니저가 설치되어있지 않다면, 아래 URL에서 참고하셔서 설치하시면 됩니다.

http://yazasu.net/blog/52

보드는 NodeMCU 1.0 (ESP-12E Module)을 선택해주시구요, 포트의 경우 저같은경우는 /dev/tty.SLAB_USBtoUART 로 잡혔네요..

 

이전 포스트와 같이 기존소스(http://yazasu.net/blog/52)를 약간 변형하였고, 스위치 상태에 따라 버튼상태를 변경하도록 하는 토글형 스위치로 바꿔봤습니다.

digitalRead(LED_PIN_1) == LOW 와 같이 PIN상태를 읽어 상태에 따라 버튼을 하나로 ON 또는 OFF로 표현합니다.

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

const char* ssid = "공유기 SSID";
const char* password = "패스워드";

ESP8266WebServer server(80);

const int LED_PIN_1 = 14;
const int LED_PIN_2 = 12;

String s = "";

void handleRoot() {
  //digitalWrite(led, 1);
  server.send(200, "text/html", s);
  //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/html", message);
  //digitalWrite(led, 0);
}

void htmlBind() {

  s =  "<!DOCTYPE html><html><head><meta name=\"viewport\" content=\"width=device-width, user-scalable=no\"></head><body>";

  //켜져있으면(LOW) OFF
  if (digitalRead(LED_PIN_1) == LOW) {
    s += "<input type=\"button\" name=\"b1\" value=\"OFF\" onclick=\"location.href='/off_1'\" style=\"width:100%;height:80px;font-weight:bold;font-size:1.5em;background-color:#5cb85c;color:white;\">";    
  } else {
    s += "<input type=\"button\" name=\"b1\" value=\"ON\" onclick=\"location.href='/on_1'\" style=\"width:100%;height:80px;font-weight:bold;font-size:1.5em;background-color:#d9534f;color:white;\">";
  }
  
  s += "<br/>";

  //켜져있으면(LOW) OFF
  if (digitalRead(LED_PIN_2) == LOW) {
    s += "<input type=\"button\" name=\"b2\" value=\"OFF\" onclick=\"location.href='/off_2'\" style=\"width:100%;height:80px;font-weight:bold;font-size:1.5em;background-color:#5cb85c;color:white;\">";
  } else {
    s += "<input type=\"button\" name=\"b2\" value=\"ON\" onclick=\"location.href='/on_2'\" style=\"width:100%;height:80px;font-weight:bold;font-size:1.5em;background-color:#d9534f;color:white;\">";
  }
  s += "</body></html>";
  
}

void setup(void){

  htmlBind();
  
  //pinMode(led, OUTPUT);
  //digitalWrite(led, 0);
  Serial.begin(115200);
  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);

  //on
  server.on("/on_1", [](){    
    digitalWrite(LED_PIN_1, LOW);
    Serial.println("BUTTON_1 ON");

    htmlBind();
    
    server.send(200, "text/html", s);
  });

  //off
  server.on("/off_1", [](){
    digitalWrite(LED_PIN_1, HIGH);
    Serial.println("BUTTON_1 OFF");

    htmlBind();
    
    server.send(200, "text/html", s);
  });


    //on
  server.on("/on_2", [](){    
    digitalWrite(LED_PIN_2, LOW);
    Serial.println("BUTTON_2 ON");

    htmlBind();
    
    server.send(200, "text/html", s);
  });

  //off
  server.on("/off_2", [](){
    digitalWrite(LED_PIN_2, HIGH);
    Serial.println("BUTTON_2 OFF");

    htmlBind();
    
    server.send(200, "text/html", s);
  });

  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");

  pinMode(LED_PIN_1, OUTPUT); //GPIO14 is an OUTPUT pin;
  digitalWrite(LED_PIN_1, HIGH); //Initial state is OFF

  pinMode(LED_PIN_2, OUTPUT); //GPIO15 is an OUTPUT pin;
  digitalWrite(LED_PIN_2, HIGH); //Initial state is OFF

}

void loop(void){
  server.handleClient();  
}

 

소스를 업로드 후

시리얼 모니터에서 아이피가 할당되면 아이피가 출력됩니다.

저는 192.168.0.14로 잡혔네요. 접속해 봅니다.

다음과 같이 두개의 토글스위치가 보입니다. 정상적으로 눌러지고, 상태에 따라 값을 유지되고 있음을 확인하였습니다.

NodeMCU V2는 WeMos D1에 비해 사이즈가 1/3밖에 안되고 귀엽네요.. 다만 Vcc출력이 3V만 있어 제약적인 부분은 있을수 있습니다.

그래도 5V용 릴레이가 잘 동작하는것을 확인했으니, 서비스 모델만 고민하면 되겠군요.. ㅎㅎ

 

그럼 이상 NodeMCU 사용기를 마칩니다. 감사합니다.