[목차]
1탄 - 아두이노 세팅 및 코딩
2탄 - 벽 스위치에 교체 설치
3탄 - HomeKit 연동
============================
올해 2월달에 했던건데, 미루고 미루다 더 잊기 전에 써본다.
따라서 기억이 안나는 부분, 사진이 없는 부분 등등이 많을 예정....ㅠ
어쩌다 형과 방을 같이 쓰게되면서 방에 2층 침대를 놓게 되었는데, 2층 침대에서 불을 끄기 위해 내려가는게 매우 귀찮았다.
2층 침대가 아니더라도 침대와 전등 스위치가 끝과 끝이라서 귀찮기도 하고....
요즘에 휴대폰으로 전등 스위치를 제어하는 제품들이 많이 있지만, 직접 만들어보기로 했다.
나의 조건은 3가지 정도였고,,
1. 기존 전등 스위치 외관을 그대로 가지고 있으며, 그 스위치 사용도 가능할 것
2. 휴대폰으로 손쉽게 제어가능할 것 - iOS HomeKit 을 사용하였다.
3. 차라리 배선이 조금 지저분해지더라도 배터리를 사용하지 않을 것
필요한 부품들을 사야했다면 안했겠지만, 모든 부품을 다 가지고 있었다... 걍 생각만 하고 사모으기만한 부품들이 많아서..ㅎㅎ
먼저 주요 부품은,
1. 아두이노
2. 형광등 전원을 on/off 해줄 릴레이
3. 어떤 방식이든 통신할 수 있는 모듈
일테고, 난 각각 이렇게 사용했다.
1. 아두이노 나노 호환보드
저렴하며, 코드 업로드가 편하고 나에게 남아돌았음.
2. 제어 5V, 220AVC 1채널 릴레이 모듈
모듈이 아닌건 기판을 만들지 않는 이상 사용하기 매우 까다롭다.
3. HM-10 BLE 모듈
가지고 있는 무선통신 모듈들 중에 가장 만만했음
3-2. 3.3-5V 2CH 로직 레벨 컨버터
HM-10 은 3.3v 로 구동되어서 레벨 컨버터가 필요하다. 컨버터가 이미 붙어있는 모듈은 몇개 없었기 때문에 남아도는 레벨컨버터를 사용하기로 함.
사진은 번호 순서대로... 개별 부품 가격은 마지막에 따로 다 정리할 예정.
1. 릴레이/BLE 모듈 작동 테스트 및 기본 코드 작성
간단하게 버튼으로 릴레이를 토글시키는 스케치를 업로드해서, 작동테스트를 해본다. 잘됨.
HM-10 의 경우 테스트할때는 브레드보드에 장착이 쉬우며 로직레벨컨버터가 달려있는 모듈버전으로 코드를 작성했다.
HM10 의 경우 AT 커맨드로 간단한 세팅을 해줬던 것 같은데.. 기억이 나지 않는다ㅠㅠ
AT 커맨드를 위한 스케치는 아래와 같다. pin 번호는 알아서 세팅해주자.
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(11, 12);
void setup() {
Serial.begin(9600);
BTSerial.begin(9600);
}
void loop() {
while (BTSerial.available()){
byte data = BTSerial.read();
Serial.write(data); // write it to BT
}
while (Serial.available()){
byte data = Serial.read();
BTSerial.write(data); // write it to BT
}
}
2. 아두이노 스케치 작성
아두이노에서 해줘야하는 것은 원래 있던 물리적인 스위치와 블루투스로 제어되는 신호를 적당히 처리해서 릴레이를 on/off 해줘야한다.
또한 현재 on/off 상태를 블루투스를 통해 전달해주는 기능정도 까지.
대충 작성한 다음에 업로드하고, 테스트해보자. 릴레이 모듈은 친절하게 LED 가 달려있어서 결과를 확인하기도 용이하다.
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(11, 12);
static int PinRelay = 9;
static int PinPhysicalSwitch = 4;
static bool isPowered = false;
static int lastPhysicalSwitch = -1;
void setup() {
Serial.begin(9600);
BTSerial.begin(9600);
pinMode(PinRelay, OUTPUT);
pinMode(PinPhysicalSwitch, INPUT_PULLUP);
digitalWrite(PinRelay, HIGH);
}
void switchLight(bool power) {
if (power == isPowered) return;
isPowered = power;
if (power == true) {
digitalWrite(PinRelay, LOW);
BTSerial.write('n');
}else {
digitalWrite(PinRelay, HIGH);
BTSerial.write('f');
}
}
void loop() {
while (BTSerial.available()){
byte data = BTSerial.read();
Serial.print("data:");
Serial.println((char)data);
if (data == 'n') { // on
switchLight(true);
}else if (data == 'f') { // off
switchLight(false);
}else if (data == 'o') { // check power
if (isPowered) {
BTSerial.write('n');
} else {
BTSerial.write('f');
}
}
}
int psState = digitalRead(PinPhysicalSwitch);
if (lastPhysicalSwitch != psState) {
lastPhysicalSwitch = psState;
Serial.println(psState);
if (psState == LOW) { // 스위치가 떨어져 있음
switchLight(false);
}else{
switchLight(true);
}
}
delay(10);
}
3. 회로 구성... 및 납땜
회로를 제대로 그렸다고 할 순 없고, 종이에 대충 그린 후 제작하였다. 다만,, 수개월의 시간이 지나면서 어디갔는지 모르겠음ㅠㅠ
스위치 뒤의 빈공간에 우겨넣어야 했기 때문에, 그리고 귀찮았기 때문에 납땜 자체도 상당히 대충했다.
사진을 올리기 부끄럽지만 결과물은 아래와 같다.
위로 뻗은 두개의 가닥은 원래 전등 스위치와 연결할 선이고, 저항은 아두이노 안에 풀업저항이 있는지 모르고 물리 스위치 풀업 저항용으로 달아둔 것.
만능보드를 적당히 잘라낸 후, 점퍼선을 남발하여 회로를 구성하였다. 랜선도 잘라서 종종 쓰는데 쓸만하다..ㅋㅋ
pcb 기판을 만들지 않고 만능보드를 사용하면서도, 가로세로 크기가 작아야했기 때문에 반쯤은 어쩔 수 없는 선택이였으나.. 납땜할때 매우 짜증났다.
설치 및 HomeKit 연동은 다음 글에...
부록(?). 부품 가격
제작에 사용된 각 부품가격을 대충 계산해보면
품명 |
구매방식 |
가격 |
아두이노 |
ebay | $22.5/10개 |
$2.25 |
HM-10 |
ebay | $24.7/5개 |
$5 |
3.3-5V 2CH 로직레벨컨버터 |
ebay | $5.88/10개 |
$0.6 |
220AVC Relay |
국내 부품몰 어딘가.. |
아마.. 1,500원? |
만능보드, 저항, 전선 등등.. |
국내 부품몰 어딘가... |
계산이 필요함? |
합계 |
|
약 1만원 |
개당 가격으로 따지면 저렇지만 다른 부품이든 저항/전선이든 딱 필요한 만큼만 살 수 없으며,
땜납이나 인두 등등을 고려하고, 소요 시간을 고려하면 절대 저렴하진 않다.
인생에 한번쯤 만들어볼만한걸로...
다만 pcb 기판을 만들어서 예쁘게 제작을 해볼 기회가 생긴다면, 해보고 싶은 생각은 계속 든다.
이미 시중에 나온 제품들도 있지만.. 아무래도 그런건 내 맘대로 가지고 놀기가 어려워서.. 대표적으로 HomeKit 이라던가....