webOS 프로젝트

webOS를 활용한 HomeIoT : 조명제어1 - 디바이스

하이하정 2021. 11. 27. 13:38

  • 전체 시습템 설계
  • 조명제어
  • 스마트 가습기
  • 수면 패턴 분석
  • 시스템 연동

 

회로구성


1. 회로 구성품

  • wifi 보드 : 아두이노 NodeMCU V1.0 와이파이 보드 /Lua WiFi ESP8266 - 12E CP2102 칩셋
  • LED

2. 회로도

LED를 모듈의 D1~D5의 PIN에 연결하여 사용하였습니다. 

 

 

코드


1.  클라이언트코드

전체코드

더보기
#include <ESP8266WiFi.h>
#include <WebSocketClient.h>
#include <ArduinoJson.h>
#include <string.h>

const int led1 = D1;
const int led2 = D2;
const int led3 = D3;
const int led4 = D4;
const int led5 = D5;
int led1Status = LOW;
int led2Status = LOW;
int led3Status = LOW;
int led4Status = LOW;
int led5Status = LOW;

// wifi 연결 정보
const char* ssid     = "Seoultech_dream";
const char* password = "";

// 서버 접속 정보
char path[] = "/";
char host[] = "10.50.51.32";
int port = 9999;

// Use WiFiClient class to create TCP connections

WiFiClient client;
WebSocketClient webSocketClient;

// JSON
StaticJsonDocument<200> jsonObj;

void setup() {
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);

  digitalWrite(led1, led1Status);
  digitalWrite(led2, led2Status);
  digitalWrite(led3, led3Status);
  digitalWrite(led4, led4Status);
  digitalWrite(led5, led5Status);
  
  Serial.begin(115200);
  delay(10);

  // We start by connecting to a 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");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  delay(1000);
  
  // Connect to the websocket server
  if (client.connect(host, port)) {
    Serial.println("Connected");
  } else {
    Serial.println("Connection failed.");
    while(1) {
      // Hang on failure
    }
  }

  // Handshake with the server
  webSocketClient.path = path;
  webSocketClient.host = host;
  if (webSocketClient.handshake(client)) {
    Serial.println("Handshake successful");
  } else {
    Serial.println("Handshake failed.");
    while(1) {
      // Hang on failure
    }  
  }
}

void loop() {
  String data;
  if(client.connected()){
    webSocketClient.getData(data);
    if(data.length() > 0) {
      Serial.println(data);
      auto ret = deserializeJson(jsonObj, data);
      if(!String(jsonObj["msgType"]).compareTo("command") && !String(jsonObj["deviceType"]).compareTo("led")) {
        if(!String(jsonObj["deviceID"]).compareTo("LED01") && !String(jsonObj["status"]).compareTo("on")) {
          led1Status = HIGH;
        }
        if(!String(jsonObj["deviceID"]).compareTo("LED01") && !String(jsonObj["status"]).compareTo("off")){
          led1Status = LOW;
        }
        if(!String(jsonObj["deviceID"]).compareTo("LED02") && !String(jsonObj["status"]).compareTo("on")) {
          led2Status = HIGH;
        }
         if(!String(jsonObj["deviceID"]).compareTo("LED02") && !String(jsonObj["status"]).compareTo("off")){
          led2Status = LOW;
        }
        if(!String(jsonObj["deviceID"]).compareTo("LED03") && !String(jsonObj["status"]).compareTo("on")) {
          led3Status = HIGH;
        }
         if(!String(jsonObj["deviceID"]).compareTo("LED03") && !String(jsonObj["status"]).compareTo("off")){
          led3Status = LOW;
        }
        if(!String(jsonObj["deviceID"]).compareTo("LED04") && !String(jsonObj["status"]).compareTo("on")) {
          led4Status = HIGH;
        }
         if(!String(jsonObj["deviceID"]).compareTo("LED04") && !String(jsonObj["status"]).compareTo("off")){
          led4Status = LOW;
        }
        if(!String(jsonObj["deviceID"]).compareTo("LED05") &&!String(jsonObj["status"]).compareTo("on")) {
          led5Status = HIGH;
        }
         if(!String(jsonObj["deviceID"]).compareTo("LED05") && !String(jsonObj["status"]).compareTo("off")){
          led5Status = LOW;
        }
      }
      digitalWrite(led1, led1Status);
      digitalWrite(led2, led2Status);
      digitalWrite(led3, led3Status);
      digitalWrite(led4, led4Status);
      digitalWrite(led5, led5Status);
    } // end of if-data.length>0
    else {
      delay(500);
    }
  }
  else {
    delay(500);
  } // end of if-client.connected   
}// end of loop

 

코드 상세 설명

 

기본설정

#include <ESP8266WiFi.h>
#include <WebSocketClient.h>
#include <ArduinoJson.h>
#include <string.h>

const int led1 = D1;
const int led2 = D2;
const int led3 = D3;
const int led4 = D4;
const int led5 = D5;
int led1Status = LOW;
int led2Status = LOW;
int led3Status = LOW;
int led4Status = LOW;
int led5Status = LOW;

// wifi 연결 정보
const char* ssid     = "Seoultech_dream";
const char* password = "";

// 서버 접속 정보
char path[] = "/";
char host[] = "10.50.51.32";
int port = 9999;

// Use WiFiClient class to create TCP connections

WiFiClient client;
WebSocketClient webSocketClient;

// JSON
StaticJsonDocument<200> jsonObj;

void setup() {
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);

  digitalWrite(led1, led1Status);
  digitalWrite(led2, led2Status);
  digitalWrite(led3, led3Status);
  digitalWrite(led4, led4Status);
  digitalWrite(led5, led5Status);
  
  Serial.begin(115200);
  delay(10);

  // We start by connecting to a 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");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  delay(1000);
  
  // Connect to the websocket server
  if (client.connect(host, port)) {
    Serial.println("Connected");
  } else {
    Serial.println("Connection failed.");
    while(1) {
      // Hang on failure
    }
  }

  // Handshake with the server
  webSocketClient.path = path;
  webSocketClient.host = host;
  if (webSocketClient.handshake(client)) {
    Serial.println("Handshake successful");
  } else {
    Serial.println("Handshake failed.");
    while(1) {
      // Hang on failure
    }  
  }
}

LED PIN 번호와 Status를 설정해줍니다.

연결할 WIFI의 이름과 비밀번호를 설정해주고 서버의 포트번호도 설정해 줍니다.

ESP8266보드가 클라이언트로 서버에 접속에 성공할 때까지 접속을 시도하고 접속에 성공하면 "Handshake successful"이라는 문구를 시리얼 모니터에 출력합니다.

 

동작코드

 

void loop() {
  String data;
  if(client.connected()){
    webSocketClient.getData(data);
    if(data.length() > 0) {
      Serial.println(data);
      auto ret = deserializeJson(jsonObj, data);
      if(!String(jsonObj["msgType"]).compareTo("command") && !String(jsonObj["deviceType"]).compareTo("led")) {
        if(!String(jsonObj["deviceID"]).compareTo("LED01") && !String(jsonObj["status"]).compareTo("on")) {
          led1Status = HIGH;
        }
        if(!String(jsonObj["deviceID"]).compareTo("LED01") && !String(jsonObj["status"]).compareTo("off")){
          led1Status = LOW;
        }
        if(!String(jsonObj["deviceID"]).compareTo("LED02") && !String(jsonObj["status"]).compareTo("on")) {
          led2Status = HIGH;
        }
         if(!String(jsonObj["deviceID"]).compareTo("LED02") && !String(jsonObj["status"]).compareTo("off")){
          led2Status = LOW;
        }
        if(!String(jsonObj["deviceID"]).compareTo("LED03") && !String(jsonObj["status"]).compareTo("on")) {
          led3Status = HIGH;
        }
         if(!String(jsonObj["deviceID"]).compareTo("LED03") && !String(jsonObj["status"]).compareTo("off")){
          led3Status = LOW;
        }
        if(!String(jsonObj["deviceID"]).compareTo("LED04") && !String(jsonObj["status"]).compareTo("on")) {
          led4Status = HIGH;
        }
         if(!String(jsonObj["deviceID"]).compareTo("LED04") && !String(jsonObj["status"]).compareTo("off")){
          led4Status = LOW;
        }
        if(!String(jsonObj["deviceID"]).compareTo("LED05") &&!String(jsonObj["status"]).compareTo("on")) {
          led5Status = HIGH;
        }
         if(!String(jsonObj["deviceID"]).compareTo("LED05") && !String(jsonObj["status"]).compareTo("off")){
          led5Status = LOW;
        }
      }
      digitalWrite(led1, led1Status);
      digitalWrite(led2, led2Status);
      digitalWrite(led3, led3Status);
      digitalWrite(led4, led4Status);
      digitalWrite(led5, led5Status);
    } // end of if-data.length>0
    else {
      delay(500);
    }
  }
  else {
    delay(500);
  } // end of if-client.connected   
}// end of loop

서버에서 온 데이터의 deviceID 통해 해당 LED를 찾고 status의 값에 맞춰 LED를 작동시킵니다.

 

2. 동작 

WIFI가 연결에 성공하고 클라이언트가 서버에 연결에 성공한 모습입니다.

 

서버와 클라이언트가 데이터를 주고 받는 시리얼 모니터의 모습입니다.

 

실제 동작하는 모습입니다.