분명 고3일 때 하라는 공부는 안 하고 블로그에 글을 쓰고 있었는데, 정신차려보니 어느덧 군 복무도 끝나가고 있습니다.
    새로운 마음으로 공부하고 작업한 내용을 기록하고자 새 Jekyll 블로그를 만들었습니다.

    댓글을 쓰셔도 보기가 어려우니, 불편하시더라도 궁금한 점은 옮긴 새 블로그에 댓글로 달아 주시면 성심성의껏 답변해 드리겠습니다. 감사합니다.
    2021년 2월 14일

    새 블로그 주소는 https://luftaquila.io입니다.
     

    LUFT - AQUILA

    A sky sailing Electron.

    luftaquila.io




    블로그를 이전하면서 글도 같이 옮기고 있습니다.

    블로그 이전 공지 : https://luftaquila.tistory.com/56

     

    이 글은

     

     

    https://luftaquila.io/blog/diy/arduino-turn-fan-into-iot/

     

    멀쩡한 선풍기 IoT 선풍기로 만들기

    아두이노로 만드는 사물인터넷

    luftaquila.io

    로 이동되었습니다!


    댓글을 쓰셔도 보기가 어려우니, 불편하시더라도 궁금한 점은 옮긴 새 블로그에 댓글로 달아 주시면 성심성의껏 답변해 드리겠습니다.

     

     

    원래 글을 보려면 더 보기를 누르세요

    더보기

    아아 역시 귀차니즘은 모든 과학기술과 공학의 근원인게 확실합니다.

    탁자에 앉은 상태로 2m 떨어진 선풍기 키러 일어서는게 귀찮아서, 선풍기를 폰으로 제어하는 걸 만들어 버렸습니다.

    오늘은 작동영상 먼저 보고 오시겠습니다.

     

     

     

    회로를 안쪽에 잘 쑤셔넣은 덕에 외부가 아주 깔끔합니다. 외형에 전혀 변화가 없어요.

    맨날 제가 만든 걸 조잡하다고 까시는 어머니도 이번건 아무 말도 못하시더군요. 훗

    물론 저딴걸 왜 하고 있는지 나는 도대체 이해를 못 하겠다고 중얼대시긴 하셨지만....

     

    준비물도 아주 간단합니다!

    아두이노 보드 한 개(나노 사용)

    HC-06 블루투스 모듈 한 개

    2N3904 NPN 트랜지스터 세 개

     

    끗.

     

    구상하면서 이번에는 꼭 와이파이로 통신해야지...! 했는데 또 아무 생각 없이 블루투스 모듈로 구입해 버리고 말았습니다...

     

    아아참 저전압 DC로 동작하는 아두이노에게 전원을 공급해줄 대책이 필요합니다.

    가장 쉬운 방법은 스마트폰 충전기 하나 분해해서 회로만 빼다가 넣으시는 거에요.

    다이소같은 곳에서 파는 2천원짜리 싸구려 충전기로도 충분합니다. 아두이노가 워낙 저전력이라서요.

     

     

    아니면 이런 AC-DC 어댑터를 사용하셔도 되지만 솔직히 비추입니다.

    부피가 충전기 회로랑 뭐 엄청 차이나는 것도 아닌데 가격은 두 배에요. 효율도 훨 떨어지고.

     

    뭘 선택하시든 자유입니다. 아무튼 전원 공급 대책도 구비해 두시고, 선풍기를 한 번 분해해 보겠습니다.

     

     

    뙇.

     

    요즘 선풍기는 죄다 저렇게 전자식으로 나오더군요. 사실 고전적인 푸쉬스위치형 선풍기가 더 나았던 것 같은데 말입니다.

    더 최신 선풍기는 전원 버튼이 따로 달려있는데, 저놈은 애매한 과도기적 선풍기라 그런지 전원 버튼조차 없습니다.

    전원 버튼 누르면 미풍-약풍-강풍-꺼짐 순으로 바뀝니다.

     

    미풍 틀다가 끄고 싶으면 전원버튼 세 번 눌러야 한다는 말이죠. 어찌나 귀찮은지...

     

     

    회로 앞, 뒷면입니다. 사실 뒷면은 완성된 상태지만 뒷면 사진이 없어서...

    저 회로를 뜯어고쳐서 블루투스로 통신할 수 있게 만드는건 사실상 불가능에 가깝습니다. 애초에 MCU 프로그래밍부터 안 되니까요.

    대신 흔히 말하는 하드웨어 해킹으로 아두이노가 스위치를 누르게 만드는 건 가능하죠.

     

    하지만 아두이노가 스위치를 '직접' 누르게 하는 건 여러모로 귀찮겠죠. 기계 동작이 필요하니까요.

    대신 우리는 스위치 접점 두 곳을 합선만 시켜주면 됩니다.

     

    여기에도 물론 릴레이라는 훌륭한 부품이 있습니다만, 릴레이는 부피도 크고 3채널로 넣기도 귀찮고 무엇보다 비싸죠.

    2천원밖에 안 한다지만 같은 동작을 50원짜리 훨씬 작은 트랜지스터로도 할 수 있습니다.

     

    바로 고등학교 1학년 때 배우는 트랜지스터의 스위칭 동작입니다!

     

     

    트랜지스터로 아주 다양한 동작이 가능하지만, 기본적으로 NPN 트랜지스터는 그냥 아주 좋은 스위치입니다.

    간단하게 베이스에 전압을 걸어 주면(즉, HIGH 상태로 만들면) 컬렉터와 이미터 사이가 도통돼요.

     

    먼저 스위치의 양쪽 접점에 이미터와 컬렉터를 하나씩 연결해 주면 됩니다.

    그리고 아두이노의 디지털 핀 하나를 베이스에 연결하고, HIGH상태로 만들면 끝!

    참, 물론 이미터를 아두이노의 GND와 하나로 묶어줘야 합니다.

     

    기가 막히게 간단한 스위치입니다. HIGH로 만들면 연결되고, LOW로 만들면 끊깁니다.

    거기에 이러쿵저러쿵 HC-06을 연결시켜서 블루투스 되게 만들고, 상황에 따라 연결했다 끊었다만 해 주면 되죠.

     

     
     

     

    쨘. 트랜지스터들은 여분 만능기판 하나 톱질해서 크기 맞추고 땜질했습니다.

    핀 배열이 사진에서 좀 바뀌었는데, HC-06의 TX, RX만 디지털 6, 7번 핀으로 옮겼습니다.

     

    아무튼 이렇게 연결하고, 이미터들은 GND랑 묶고 스위치 한 쪽에 연결하고, 컬렉터는 다른 한 쪽에 연결하시면 됩니다.

     

     

    이렇게요.

    아래쪽 스위치 핀들에 납땜된 걸 보실 수 있습니다. 회로 위쪽에 붙은 건 충전기 뜯어넣은 전원 공급 회로구요.

    선풍기 회로로 들어가는 220VAC 부분에 납땜해서 충전기에도 공급해주시면 됩니다.

     

     

    다음은 신나는 코드 업로드 차례! 이게 제일 짜증나요! 와!

    왜 한방에 모든 기능이 잘 동작하는 코드를 만들 수는 없는 걸까요... (슬픔)(매우슬픔)

     

     

     

     

     

    본문 중간에 잠깐 광고! 가난한 고딩 필자가 트랜지스터 하나라도 더 살 수 있도록 광고 한 번만 클릭해 주세요! 감사합니다 ㅠㅠㅠ

     

    바람 세기와 타이머 돌아가는 사이클 순서에 맞춰서 스위치를 누르(트랜지스터가 작동하)도록 짜면 됩니다.

    바로 코드로 들어가볼까요? 소스 파일 다운로드도 가능하도록 올려 두었습니다.

     

    Fan_IoT_CTRL.zip
    다운로드

     

    아래의 소스 파일은 모든 코드가 한 곳에 들어가야 하기에 다 합쳐놨습니다만, 위의 압축 파일은 새 탭 기능을 이용해 분할해 놓았습니다.

    분할해놓은 쪽이 훨씬, 훠어어얼씬 보기 편합니다. 사용하실 땐 이렇게 분할해놓는걸 추천드립니다.

     

    새 탭 기능으로 코드 분할하는 방법을 보시려면 : 아두이노 코드 분할 - 새 탭 기능 사용하기

    #include <SoftwareSerial.h> SoftwareSerial BT(6, 7); //블루투스 TX, RX핀 지정 boolean ROT = false; boolean POWER = false; int mode = 0; int timer = 0; String cmd = ""; void setup() { BT.begin(9600); pinMode(2, OUTPUT); // 회전 버튼 pinMode(3, OUTPUT); // 전원/모드 버튼 pinMode(4, OUTPUT); // 타이머 버튼 } void loop() { while(BT.available()) //블루투스 수신 코드 { char RCV = (char)BT.read(); cmd += RCV; delay(5); } if(!cmd.equals("")) //수신 내용이 있으면 { if(cmd == "power" && POWER == false) //각종 스위치 동작 { pressButton(3, 1); POWER = true; mode = 1; } else if(cmd == "power" && POWER == true) Power_Off(); if(cmd == "slow" && POWER == true) Wind_Slow(); if(cmd == "mid" && POWER == true) Wind_Midium(); if(cmd == "fast" && POWER == true) Wind_Fast(); if(cmd == "rot" && POWER == true) { pressButton(2, 1); ROT = !ROT; } if(cmd == "timerReset" && POWER == true) Timer_Reset(); if(cmd == "1h" && POWER == true) Timer_1h(); if(cmd == "2h" && POWER == true) Timer_2h(); if(cmd == "4h" && POWER == true) Timer_4h(); } cmd = ""; //문자열 delay(50); } void pressButton(int buttonNum, int pressTime) { for(int i = 1; i <= pressTime; i++) { digitalWrite(buttonNum, HIGH); delay(100); digitalWrite(buttonNum, LOW); delay(100); } } //이건 스위치 누르는 함수입니다. //누를 핀 번호와 횟수를 지정하면 눌러(?)줍니다. void Power_Off() //선풍기 끄는 함수 { if(mode == 1) pressButton(3, 4); else if(mode == 2) pressButton(3, 3); else if(mode == 3) pressButton(3, 2); POWER = false; mode = 0; } void Timer_Reset() //타이머 끄는 함수 { if(timer == 1) pressButton(4, 7); else if(timer == 2) pressButton(4, 6); else if(timer == 4) pressButton(4, 4); timer = 0; } void Timer_1h() //타이머 설정 함수들 { Timer_Reset(); pressButton(4, 1); timer = 1; } void Timer_2h() { Timer_Reset(); pressButton(4, 2); timer = 2; } void Timer_4h() { Timer_Reset(); pressButton(4, 4); timer = 4; } void Wind_Slow() //바람세기 지정 함수들 { Power_Off(); POWER = true; pressButton(3, 1); mode = 1; } void Wind_Midium() { Power_Off(); POWER = true; pressButton(3, 2); mode = 2; } void Wind_Fast() { Power_Off(); POWER = true; pressButton(3, 3); mode = 3; }

    사실 별로 완성도 있는 코드는 아닙니다.

    오동작도 종종 있고 무엇보다도 선풍기에서 물리적으로 버튼을 누르면 동기화가 안 되기 때문에 바로 꼬여요.

    이걸 해결하려면 INPUT 모드 핀 3개를 추가로 만들어서 스위치에 똑같이 물려주면 됩니다.

     

    digitalRead()로 누르기 동작 추적해서 소프트웨어적으로 누른게 아닌 걸 검출하면 돼요. 물론 귀찮아서 생략했습니다(?!)

    혹시 이 부분까지 구현하고 싶으신데 모르시겠다면 댓글 남겨 주세요.

     

    아무튼 이렇게 하면 맨 처음에 봤던 동영상처럼 동작합니다. 송신측은 Bluetooth Controller 앱 사용했습니다.

    앱에서 송신 문자열 값만 세팅해 주시면 됩니다.

     

    귀차니즘으로 시작했지만 항상 만드는 과정이 더 귀찮아져 버리는 전자제품 개조기, 오늘도 이렇게 마치겠습니다.

    앞으로 전자제품 몇개 더 이렇게 IoT화 시켜버리면 전부 wifi 모듈로 묶어서 한 번에 제어 가능하도록 해야겠어요.

     

     

    Posted by LUFT - AQUILA
    • 향덕
      2017.09.19 14:03

      npn트렌지스터를 언급하시며
      pnp트렌지스터 구조를 올리셨네요
      물론 내용 전달적 차원에서는
      문제 없지만요
      잘 봤습니다
      재밌네요


    • 2017.11.16 18:43

      비밀댓글입니다

      • BlogIcon LUFT - AQUILA
        2017.11.16 19:50 신고

        택트 스위치는 누르면 끊어져 있던 접점 두 개가 도통됩니다. NPN 트랜지스터의 경우에도 베이스에 전압을 걸어주면 이미터와 컬렉터가 도통돼요. 스위치를 손으로 누르는 것과 NPN TR의 베이스에 전압을 걸어주는게 똑같다는 말이죠. 택트스위치의 양 접점에 이미터와 컬렉터를 하나씩 연결하고, 베이스에 전압을 걸었다가 풀어주면 스위치를 누른 것과 똑같이 동작합니다.
        요약하자면, 스위치 양 단자에 이미터와 컬렉터를 각각 연결하고, 베이스는 아두이노 디지털 핀 중 하나에, 이미터를 아두이노 GND에 연결해 주시면 됩니다.


    • 2017.11.17 15:03

      비밀댓글입니다

      • BlogIcon LUFT - AQUILA
        2017.11.23 22:08 신고

        어.. 모델명은 모르겠고 요즘 나오는 선풍기들 다 저렇게 전자식으로 나오던데요?


    • 2017.11.23 18:54

      비밀댓글입니다

      • BlogIcon LUFT - AQUILA
        2017.11.23 22:12 신고

        선풍기 전원을 껐다 켜도 아두이노 전원 공급이 안 끊기면 데이터가 남는건 어쩔 수가 없습니다. 해결하려면 플러그를 뽑는 경우엔 아두이노 전원 공급도 끊기니 상관없고, 전원 버튼 스위치를 아두이노에도 연결해서 digitalRead로 전원 버튼이 눌렸는지를 검사해 리셋해주면 됩니다.

        직류 전원을 사용하는 극히 일부의 선풍기를 제외하곤 대부분 교류 선풍기인데, 교류 선풍기는 풍속을 저항으로 조절하지 않고 권선비로 조절합니다. 모터에 이미 미풍, 약풍, 강풍용 권선이 감겨 있어 스위치를 누르면 어떤 권선에 전원을 공급해 주느냐 원리로 작동합니다. 릴레이 사용하시면 적당히 컨트롤하실 수 있을 것 같습니다.


    • 2017.11.24 15:34

      비밀댓글입니다

    • ㅇㅇ
      2017.12.17 03:40

      근데 스위치쪽 전류도 220V 가 흘러서
      트랜지스터에 과전류 흘러가서 죽는거아닌가요??

      • BlogIcon LUFT - AQUILA
        2017.12.17 04:23 신고

        스위치에는 220V가 걸리지 않습니다. 아두이노랑 택트스위치로 220V 릴레이 제어하는 경우를 생각하시면 됩니다. 릴레이가 220V를 제어한다고 아두이노에 연결된 스위치에도 그 전압이 걸리는 건 아니니까요.

    • 굳잡!
      2018.01.15 18:00

      잘 보고 갑니다~~
      선풍기 풍량 확인문제는
      현재 풍량 표기가 되는 LED에서
      아날로그 I/O로 전압 읽어오면 될것 같네요.
      스위치 연결하면서 GND는 자동으로연결이 되..겠죠?ㅎㅎ

      (물론... 귀찮.......겠네요..ㅋㅋ)


    • 2018.09.05 20:32

      비밀댓글입니다

      • BlogIcon LUFT - AQUILA
        2018.09.09 23:04 신고

        글 읽어보시면 아시겠지만 블루투스는 아두이노가 통제하고 연결이랄 것도 없이 트랜지스터가 스위치 눌러주는 것뿐입니다


    • 2019.09.22 14:06

      비밀댓글입니다