본문 바로가기

메이커 자료/NodeMCU

NodeMCU ( 4 / 4 ) : WiFi를 통해 LED 원격 조정하기

 

 

안녕하세요~ 지난 글에서는 NodeMCU와 네트워크를 연결하고, 주변 WIFI를 스캔해서 검색해보는 것을 공부해봤습니다.

2019/07/17 - [메이커 자료/NodeMCU] - NodeMCU ( 3 / 4 ) : WiFi 연결, 스캔하기

이번 글은 NodeMCU가 WiFi연결을 해서 네트워크를 통해 원격으로 LED를 조정하는 예제를 해보겠습니다.

1. NodeMCU의 소개

2. 아두이노 IDE에서 NodeMCU 환경 설정하기

3. NodeMCU - LED / 푸시버튼 연결하기

4. NodeMCU - WiFi 네트워크에 연결하기

5. NodeMCU 주변 WiFi 스캔하기

6. NodeMCU 네트워크로 LED원격 조정하기

 

6. NodeMCU 네트워크로 LED 원격 조정하기

이번 예제는 NodeMCU에서 클라이언트를 생성하고, 인터넷에서 접속하여 LED를 원격 조정하는 예제입니다.

#include <ESP8266WiFi.h>

const char* ssid = "와이파이 이름";
const char* password = "비밀번호";

int ledPin=2;
WiFiServer server(80); //NODE MCU를 서버로 사용하겠다 // 포트번호는 80

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  delay(100);

  pinMode(ledPin,OUTPUT);
  digitalWrite(ledPin,LOW);

  Serial.println();
  Serial.print("CONNECTING TO ");
  Serial.println(ssid);

  WiFi.begin(ssid, password); // 와이파이 이름과 비밀번호를 통해 WIFI연결을 시작하겠다 
  // WL_CONNECTED라는 값을 돌려준다

  while(WiFi.status() != WL_CONNECTED){ // 네트워크의 연결 상태, 8개의 리턴값 
  / STATUS와 WL_CONNECTED 값이 같은지를 통해 제대로 연결이 되있는지를 확인할 수 있다
    delay(500);
    Serial.print(".");
    
  }
  Serial.println();
  Serial.println("Wifi connected!");

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

  Serial.print("Use this URL to connect: ");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
  //서버 IP주소를 알려준다. 브라우저의 주소란에 치면 NODE MCU가 서버로 있는 것으로 접근할 수 있다.
  Serial.println("/");
  Serial.println("");
  
}

void loop() {
  // put your main code here, to run repeatedly:
  WiFiClient client = server.available();
  if(!client) {
    return;
  }
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
//서버와 연결된 클라이언트가 있으면 다음으로 넘어가라

  String request = client.readStringUntil('\r'); 
  // \r 명령어, 즉 줄 바꿈 명령어가 나오기 전까지 계속 데이터를 읽어라
  
  Serial.println(request);
  client.flush();
//버퍼에 남은것을 없애라

  int value = LOW;
  if(request.indexOf("/LED=ON") != -1){
    digitalWrite(ledPin,HIGH);
    value=HIGH;
  }
  // 읽어들인 문자에 /LED=ON 이 있는지 없는지 확인하라, (즉 /LED=ON 이 -1 인 상태) 
  //그리고 digitalWrite에 적용되는 핀에 맞추어서 값을 HIGH로 가져라 ==> 불을 켜라
  
  if(request.indexOf("/LED=OFF") != -1){
    digitalWrite(ledPin,LOW);
    value=LOW;
  }
  //
  // 읽어들인 문자에 /LED=OFF 이 있는지 없는지 확인하라, (즉 /LED=OFF 이 -1 인 상태) 
  //그리고 digitalWrite에 적용되는 핀에 맞추어서 값을 LOW로 가져라 ==> 불을 꺼라

  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type : text/html");
  client.println("");
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
  client.println("LED is turned ");
  if(value)
    client.println("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>");
  client.println("</html>");
//HTML로 서버에 버튼을 생성하고 사이트를 만들어라
  delay(1);

  Serial.println(client.connect("http://newsky2.kma.go.kr/service/SecndSrtpdFrcstInfoService2/ForecastSpaceData?serviceKey=VlJoz90r6QOqEXPQIwP0jdLqCtgkQbgXo%2Fy0L%2B4x6z6VjH5LPx3RPYAH4RAJmaqSWCh7BM7s5KCSDPR5s%2F27Lg%3D%3D&base_date=20190704&base_time=0500&nx=60&n=127&numOfRows=10&pageNo=1&_type=xml",8));
  Serial.println("Client disconnected !! ");
  Serial.println();
  }

<setup 부분>

네트워크 연결시 led의 불을 끄고 시작합니다.

<loop문>

WiFiClient client = server.available();

=>서버와 연결된 클라이언트가 있으면 다음으로 넘어갑니다.

String request = client.readStringUntil('\r');

=>\r 명령어, 즉 줄 바꿈 명령어가 나오기 전까지 계속 데이터를 읽습니다

 

if(request.indexOf("/LED=ON") != -1){

    digitalWrite(ledPin,HIGH);

    value=HIGH; }

 읽어 들인 문자에 /LED=ON 이 있는지 없는지 확인하고, ( /LED=ON  -1 인 상태) 그리고 digitalWrite에 적용되는 핀에 맞추어서 값을 HIGH로 가져갑니다 ==> LED 전구를 켜라.

 

if(request.indexOf("/LED=OFF") != -1){

    digitalWrite(ledPin,LOW);

    value=LOW; }

읽어 들인 문자에 /LED=OFF 이 있는지 없는지 확인하고, ( /LED=OFF  -1 인 상태) 그리고 digitalWrite에 적용되는 핀에 맞추어서 값을 LOW로 가져갑니다 ==> LED 전구를 꺼라

 

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

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

  client.println("");

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

  client.println("<html>");

  client.println("LED is turned ");

  if(value)

    client.println("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>");

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

=>Html을 활용해서 접속 사이트에 Turn On, Turn Off 버튼을 만들고 주소에 Turn On 상태 일시 /LED=ON을 추가하며, Turn Off 일시 주소에 /LED=OFF를 추가합니다.

 

주의! 같은 wifi로 접속해야만 가능합니다.

알려주는대로 192.168.43.217로 접속해보자
Turned On 상태이므로 불이 켜져있다.

 

 

 

 

Turn Off를 누를시에는 LED가 꺼진다.

 

 

이렇게 WiFi를 통해 원격 LED 조정하기 예제가 완성되었습니다.

알기 쉽게 풀어서 쓰려고 노력을 했는데,

NodeMCU에 대해 좀 이해가 되셨을런지 모르겠네요.

NodeMCU의 기초는 여기까지입니다.

고생하셨습니다.

사업자 정보 표시
메이크잇나우 | 김건욱 | (우 : 13487) 경기도 성남시 분당구 대왕판교로645번길 12 (경기창조경제혁신센터) 9층 | 사업자 등록번호 : 646-35-00394 | TEL : 070-8887-0703 | Mail : kgu0724@makeitnow.kr | 통신판매신고번호 : 2018-성남분당-0517호 | 사이버몰의 이용약관 바로가기