아두이노프로세싱 프로그래밍

아두이노 NodeMCU WiFI 웹서버 프로그램에서 LED Fading 제어

coding art 2017. 3. 17. 18:38
728x90

사물인터넷 프로그램의 기본은 공유기 WiFi 또는 핫스팟을 이용하여 원격에서 아두이노 NodeMCU에 설치된 예를 들면 LED를 on OFF 하는 것이다. 하지만 on OFF 라는 개념은 디지털적인 것으로서 대단히 단순한 제어이므로 사물을 좀 더 세밀하게 제어해 보도록 하자.


앞 블로그에서 다루었던 LED FADING 이 바로 그러한 좋은 예제가 될 수 있다. 즉 LED FADING 이란 단순 on OFF 가 아니라 좀 더 스무스하면서도 세밀한 제어가 요청되는 사물이기도 하다.


배선도 사진과 같이 극히 간단하다.


밝기 제어를 위해 brightness 와 fadeAmount 2가지의 변수를 추가로 사용해야 한다.
 항상 그래 왔듯이 아두이노 NodeMCU 프로그램을 깔끔하게 작성할 수 있도록 특별한 라이브러리 도입은 최대한 억제하기로 하며 단 하나 ESP8266WiFi.h 하나만 사용하는 것으로 한다.


 #include <ESP8266WiFi.h>
 const char* ssid = "AndroidHotspot1234";// 사용자 자신의 스마트 폰 핫스팟 ID 입력
 const char* password = "00000000";// 사용자 자신의 스마트 폰 핫스팟 비밀번호 입력


시험 대상 LED는 IOT 제어를 위해 아두이노 NodeMCU에 붙박이로 설치된 청색 LED 2번(GPIO 2, D4)은 그대로 두고 추가로 5번(D1)을 사용하기로 한다. 참고로 핀 배치 다이아그램을 참조하면 이 2 핀에는 물결(∼)표시가 있는 PWM 가능 핀이기도 하다. 즉 FADING 조절이 가능하다고 볼 수 있다.
 
int pin = D1;            //Fading LED
int ledPin = 2; //붙박이 청색 LED
int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by


setup() 문에서 FADING LED  OUTPUT 모드 선언 1행이 추가되어야 하며 그 외에 그다지 변동 사항은 없다.

loop() 문이 실행되게 되면 스마트 폰으로부터 버튼 키 명령을 사용하여 붙박이 LED를 on OFF 할 것인지에 대한 request가 아두이노 NodeMCU로 전달된다.


if문에서  request 전달 내용이 on 인지 아닌지 판독하여 아니라면 digitalWrite() 명령 수행을 통해 붙박이 LED를 on 시킨다. 아울러 이 루틴 안에서 디지털 핀 5번에 설치된 LED는 FADING 효과를 주어서 점차 밝아지게 된다.


반면에 스마트폰에서 OFF 버튼을 누르는 경우는 digitalWrite() 명령 수행을 통해 붙박이 LED를 즉각 OFF 시킨 후 동시에 5번 핀의  LED는 최고 밝기인 255로 시작하여 느낌상 잠깐 확 밝아 지는 느낌이 들 수 있는데 FADING 효과에 의해 점차 어두워지게 된다.


그밖에 HTML 프로그램 부분에서는 1줄의 타이틀 출력과 2줄의 버튼 프로그램 정도가 남아 있는 대단히 간단한 프로그램이다.
  
Webserver_NodeMCU_IOT_LED_fading_01


 #include <ESP8266WiFi.h>
 
 const char* ssid = "AndroidHotspot1234";// 자신의 스마트폰 핫스팟 ID 입력
 const char* password = "00000000";//자신의 스마트폰 핫스팟 비밀번호 입력
 
int pin = D1;            //Fading LED
int ledPin = 2; //

int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by

 
 WiFiServer server(80);

 
 void setup() {
   Serial.begin(115200);
   delay(10);

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

   pinMode(pin, OUTPUT);

  
   // 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);

// favicon.ico request이면 건너 뛰자.
   if( request.substring(5,16) != "favicon.ico") {
   client.flush();

   // Match the request
     
   if (request.indexOf("/LED=ON") != -1)  {
     digitalWrite(ledPin, LOW);
      brightness = 0;
      for( int i = 0; i<51; i++) {
      analogWrite(pin,brightness );
       brightness = brightness + fadeAmount;
       delay(30);
      }
   }
  
   if (request.indexOf("/LED=OFF") != -1)  {
     digitalWrite(ledPin, HIGH);
      brightness = 255;
      for( int i = 0; i<51; i++) {
      analogWrite(pin,brightness );
       brightness = brightness - fadeAmount;
       delay(30);
      }
   }

     
   // 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.println("<head>");
//배경 색 문자 색 사이즈 HTML CSS 설정  
   client.println("<style>");
   client.println("body {");
   client.println("background-color: lightblue;");
   client.println("}");
   client.println("p {");
   client.println("color:red;");
   client.println("font-size:250%;");
   client.println("}");
  
//버튼 HTML CSS 설정  
client.println(".button {");
    client.println("background-color: green;");
    client.println("border: none;");
    client.println("color: white;");
    client.println("padding: 15px 32px;");
    client.println("text-align: center;");
    client.println("text-decoration: none;");
    client.println("display: inline-block;");
    client.println("font-size: 20px;");
    client.println("margin: 14px 20px;");
    client.println("cursor: pointer;");
client.println("}");
   
   client.println("</style>");
   client.println("</head>");
   client.println("<body>");
   client.println("<p>");
   client.print("LED FADING TEST ");
   client.println("<br><br>");
   client.println("<a href=\"/LED=ON\"\" class='button'>Turn on </button></a>");//Built-in LED on
   client.println("<a href=\"/LED=OFF\"\" class='button'>Turn Off </button></a>");//Built-in LED OFF

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

   delay(1);
   Serial.println("Client disonnected");
   Serial.println("");
 }// if문 괄호 닫기
 }//프로그램 끝