아두이노 스마트 스위치 [ESP8266/MQTT]
프로젝트/스마트 홈

아두이노 스마트 스위치 [ESP8266/MQTT]

반응형

 

 

 

국내든 외국이든 ESP8266을 단독으로 사용하거나 ESP8266+아두이노 조합으로 릴레이 등을 이용해 전등이나 가전제품등을 제어하는 프로젝트는 이미 많이 시도된 방법이다. 다만 이 프로젝트의 치명적인 단점은 일반적인 스위치에 적용할 수 없다는 것이다. 스마트폰등으로 릴레이에 신호를 주어 전원을 내려도 이미 가전제품등에 달린 기계식 스위치는 계속 ON 상태를 유지할 것이다. 그래서 대부분 (특히 전등 스위치 부분은) 스위치를 제거하고 터치 스위치를 만들어 장착하는 등의 방법을 이용해 이를 해결한다. 하지만 원래 스위치를 제거해 미관상 좋은 방법은 아니다.

 

 

 

그래서 이번에는 기존의 스위치를 유지한 상태로 별도의 릴레이 없이(스위치를 그대로 사용하므로 릴레이가 필요없어진다.) 스마트 스위치를 구현해 볼 것이다. 이 프로젝트는 MQTT를 기반으로 하므로 아래 링크의 글을 읽으면 도움이 될 것이다.

 

반응형

http://diy-project.tistory.com/26

 

[하드웨어]

 

 

스위치는 다이소에서 2천원이면 구매 가능한 1구 스위치를 이용했다. 사진처럼 스위치 뒷면에 서보혼을 장착한 2개의 서보 모터를 붙여 스위치 뒤쪽에서 스위치를 누를 수 있도록 만들었다. 가장 오른쪽은 청소기에서 분해한 누름 스위치인데 (정확한 명칭은 기억이 나질 않는다.) 스위치가 눌리면 같이 눌려서 현재 스위치의 상태를 MQTT서버로 전송한다. 스위치의 허용전류와 크기가 용도에 맞지않게 큰 편이지만 서보모터 옆에 고정하기도 편하고 잘 눌린다.

 

 

원래 회로는 만능기판으로 꾸밀려고 했지만 귀찮기도해서 공중 납땜으로 마무리했다. 다만 연결하기 편하게 커넥터를 같이 달아주었다. 원래는 스위치를 wemos d1 mini의 D3에 연결하려 했으나 D3핀이 이미 풀업상태로 고정이라 D6으로 변경했다.

 

[소스코드] 

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Servo.h>

const char* ssid = "*****";            // your ssid
const char* password = "*****";       // your password of ssid

#define mqtt_server "*****"    // your MQTT server
#define mqtt_port XXXXX                    // your port number
#define mqtt_topic "*****"         // your topic
#define mqtt_user "*****"               // your username (Manage User of the CloudMQTT)
#define mqtt_password "*****"             // your password (Manage User of the CloudMQTT)

int pinLED = 2;                            // internal LED (1 for ESP-1, 2 for ESP-12F)
int pinSwitch = 12;                         // switch pin (2 for ESP-1, 5 for ESP-12F)
int pinState = HIGH;

Servo myServo;
Servo myServo1;

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) delay(500);

  pinMode(pinLED, OUTPUT);
  pinMode(pinSwitch, INPUT_PULLUP);

  myServo.attach(5);                                // pin of Servo Motor (D1 or GPIO5)

  myServo1.attach(4);
  
  pinState = digitalRead(pinSwitch);
  digitalWrite(pinLED, pinState);

  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);
}

void loop() {
  if (!client.connected()) {
    client.connect("ESP8266Client", mqtt_user, mqtt_password);
    client.subscribe(mqtt_topic); 
  }
  if (pinState != digitalRead(pinSwitch)) {
    pinState = !pinState;
    client.publish(mqtt_topic, pinState? "Switch A OFF" : "Switch A ON");
  }
  client.loop();
}

void callback(char* topic, byte* payload, unsigned int length) {
  String Msg = "";
  int i=0;
  while (i<length) Msg += (char)payload[i++];
  if (Msg == "Push A") {
    digitalWrite(pinLED, !digitalRead(pinLED));
    client.publish(mqtt_topic, (digitalRead(pinLED) ? "Switch A OFF" : "Switch A ON"));
    return;
  }
  if (Msg == "Switch A OFF") {
    
      digitalWrite(pinLED, LOW);
      myServo1.attach(4);
      myServo1.write(60);
      delay(200);
      myServo1.write(95);
      delay(300);
      myServo1.detach();
    
  }
  if (Msg == "Switch A ON"){
   
      digitalWrite(pinLED, HIGH);
      myServo.attach(5);
      myServo.write(60);
      delay(200);
      myServo.write(100);
      delay(300);
      myServo.detach();
    
  }
}
 

전에 올린 MQTT관련 글을 참고하여 소스를 수정해 사용하면 된다. 다만 추가적으로 휴대폰에서 사용하기 편리하게 MQTTDashboard라는 앱을 사용했다. https://play.google.com/store/apps/details?id=com.thn.iotmqttdashboard

 

 

앱을 적용한 예시 사진이다. 이 앱을 이용하는 방법은 아래의 작동영상을 보면 이해가 될것이다.

 

 

 

 

반응형
    # 테스트용