사물인터넷 프로그램의 기본은 공유기 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문 괄호 닫기
}//프로그램 끝
'아두이노프로세싱 프로그래밍' 카테고리의 다른 글
구글 트렌드에 의한 4차 산업혁명과 아두이노 빅데이터 분석 (0) | 2017.03.19 |
---|---|
초보자를 위한 프로세싱과 아두이노 시리얼 통신 인터페이스: 가변 저항에서 발생하는 전압 데이터 Processing에서 실시간 그래픽 (0) | 2017.03.19 |
초보자를 위한 아두이노 LED Fading 코딩 예제 및 아두이노 NodeMCU와 비교 (0) | 2017.03.17 |
초보자를 위한 아두이노 통전 시험기 사용 자동차 엔진 파워TR 점검 및 코딩 예제 (0) | 2017.03.16 |
초보자를 위한 통전 시험기와 아두이노 우노와의 인터페이스 및 코딩 예제 (0) | 2017.03.15 |