스마트홈/교사연수/2일차

0. 오늘의 목표

  • 스마트홈 기능 요구 사항 명세 파악하기

  • 시리얼 통신으로 기능 구현하기

  • 스마트기기 화면 설계

  • 스마트기기로 앱 구현

  • 스마트홈 기능 테스트

  • 문서화, 소감 나누기

1. 구현할 기능 명세 (요구사항 정의)

가. 구현할 기능 명세 요약

  • 현관문 제어: 수동 or Rfid 연동

  • 차고문 제어: 설정 거리 이내로 접근 시 열림

  • 전등 제어: 수동 or 조도연동(설정 밝기에 따라)

  • 환풍 제어: 수동 or 온도연동(설정 온도에 따라)

  • 경비: 침입자 감지(설정 거리 이내로 접근 시 경보)

  • 경보: 소리와 빛으로 알림

  • 표시기: 시스템 or 원격스마트기기 (시스템 현황 표시)

  • 원격제어기: 스마트기기에서 원격으로 감시 및 제어

나. UI(화면 및 상호작용)

  • 스마트기기로 원격 감시 및 제어 기능 구현

  • 수동 및 자동 제어 기능 구현

  • 스마트기기에 현재 시스템 상태 원격 표시

  • 시스템 디스플레이 장치에 현재 상태 표시

다. 입력(센싱)

  • 온도, 습도

  • 조도(밝기)

  • 거리: 차량 접근 거리 , 외부 침입자 접근 거리

  • Rfid 카드

  • 블루투스 통신 명령

라. 출력(엑추에이터)

  • 경보 알림

  • 현재 상태 표시

  • 차고문

  • 출입문

  • 전등

  • 환풍기

2. 설계

가. 기능별 HW/SW 컴포넌트 설계 (아키텍처, 클래스, 컴포넌트 설계)

나. 사용자 인터페이스(UI) 설계

1) 시스템 UI

시스템의 현재 상태를 화면에 표시

: 온도, 습도, 접근 거리, 조도, 현재 동작모드

2) 원격 사용자 UI

사용자의 스마트기기에서 시스템의 현재 상태를 원격으로 살펴보거나 제어한다.

화면 구성 요소는 표시기, 입력창, 제어기로 구분한다.

<표시기>

  • A1, A2, A3: 전등, 환풍(팬), 출입(차고)문의 열림/닫힘을 표시

  • D1: 제어버튼으로 송신한 명령어를 표시

  • D2: 시스템의 현재 상태를 표시

  • E1: 현재 온도를 그래픽으로 표시

  • E2: 현재 습도를 그래픽으로 표시

  • F: 시스템의 경보나 안내 사항을 문자로 표시

  • G1: 접근 물체의 거리를 그래픽으로 표시

  • G2: 현재 밝기를 표시

<입력창>

  • C1: 온도, 습도, 거리 threshold 값을 입력

<제어 버튼>

  • B1, B2: 전등, 환풍기를 제어. On/Off/Auto

  • B3: 출입문, 차고문 모드 설정 및 제어. Open/Close/경비/차고

  • C2: 새로 설정한 온도, 조도, 거리 threshold(문턱) 값을 송신

라. 메인 프로그램 설계

3. 구현

가. 컨트롤러( 아두이노) 핀 배치

나. 전체 회로도

다. 원격 제어 구현

  • 안드로이드에 설치 가능함. 안타깝지만 아이폰에는 안됨.

  • 구글플레이에서 'Bluetooth Electronics'앱을 검색하여 설치

  • 2020.09.25. 현재 구글플레이에 있는 설치 버전(v1.41)은 "패널 업로드/다운로드 , import/export , 웹링크 기능" 오류 있음

  • 따라서 바로 전 v1.3 버전을 수동으로 설치하여야함

프로그램 설치 시 '출처를 알 수 없는 앱 설치' 를 허용해야 한다.

  • 2021년 1월 v1.42버전 배포함.

  • 패널 파일을 import하여 설치 가능함.


<앱 실행 화면>



2) Bluetooth Electronics 앱에 SmartHomeV1.3 패널을 설치하는 세가지 방법

  • 아두이노에서 스마트기기로 판넬 생성 코드 전송 [ autoGen.ino ]

  1. // Bluetooth Electronics App앱에 자동 패널 생성 www.keuwl.com

  2. // 작업 순서:

  3. // 1) 아래 코드를 아두이노에 업로드

  4. // 2) 스마트기기에 Bluetooth Electronics 앱을 실행하고 아두이노와 연결

  5. // 3) 아두이노 리셋버튼 누르기

  6. // 이 자동 생성 코드 템플릿은 시작하기 위한 제안일 뿐입니다.

  7. // 불완전하며 프로젝트에 특정한 수정이 필요합니다.

  8. // 아두이노 Serial 통신에서 유니코드를 지원하지 않아서 영문으로 보냄.


  9. #include <SoftwareSerial.h> // Serial 통신 라이브러리

  10. SoftwareSerial BTSerial(2, 3); // BTSerial(Rx, Tx): Adu-Rx(2)<->BT(Tx), Adu-Tx(3)<->BT(Rx) 연결


  11. void setup() {

  12. Serial.begin(57600);

  13. Serial.println("Serial begin.");

  14. BTSerial.begin(57600);

  15. BTSerial.println("Hi! Bluetooth.");

  16. delay(500);


  17. // 앱에 패널 만들기

  18. BTSerial.println("*.kwl");

  19. BTSerial.println("clear_panel()");

  20. BTSerial.println("set_grid_size(17,10)");

  21. BTSerial.println("add_text(10,3,large,L,',245,122,245,)");

  22. BTSerial.println("add_text(0,8,large,L,TX,245,240,245,)");

  23. BTSerial.println("add_text(9,6,large,L,<DistU>,245,142,70,)");

  24. BTSerial.println(F("add_text(1,5,medium,C,Setting the threshold,245,240,245,)"));

  25. BTSerial.println(F("add_text(1,4,small,L,Auto,245,0,2,)"));

  26. BTSerial.println(F("add_text(4,4,small,L,Auto,2,240,3,)"));

  27. BTSerial.println(F("add_text(9,2,large,L,<TempT>,247,143,252,)"));

  28. BTSerial.println(F("add_text(9,3,large,R,22.8,245,140,245,T)"));

  29. BTSerial.println(F("add_text(13,2,large,L,<HumiH>,127,240,245,)"));

  30. BTSerial.println(F("add_text(14,3,large,L,%,131,240,245,)"));

  31. BTSerial.println(F("add_text(13,3,large,R,34.0,128,240,245,H)"));

  32. BTSerial.println(F("add_text(14,9,large,L,cds,131,240,130,)"));

  33. BTSerial.println(F("add_text(9,8,large,L,<BrightB>,131,246,133,)"));

  34. BTSerial.println(F("add_text(0,0,xlarge,L, LampL,255,255,255,)"));

  35. BTSerial.println(F("add_text(3,0,xlarge,L, FanF,245,240,245,)"));

  36. BTSerial.println(F("add_text(6,0,xlarge,L, DoorD,245,240,245,)"));

  37. BTSerial.println(F("add_text(3,5,small,L,Cds threshold Bxx,245,2,1,)"));

  38. BTSerial.println(F("add_text(3,6,small,L,Temp threshold Txx ,1,240,2,)"));

  39. BTSerial.println(F("add_text(3,7,small,L,Dist threshold Uxx,245,242,13,)"));

  40. BTSerial.println(F("add_text(7,5,medium,L, Armed A,244,242,9,)"));

  41. BTSerial.println(F("add_text(7,6,medium,L, GarageG,245,244,7,)"));

  42. BTSerial.println(F("add_text(7,3,medium,L, Open 1,246,245,5,)"));

  43. BTSerial.println(F("add_text(7,4,medium,L, Close0,246,242,10,)"));

  44. BTSerial.println(F("add_text(13,7,large,R,100,255,148,64,U)"));

  45. BTSerial.println(F("add_text(14,7,large,L,cm,245,128,60,)"));

  46. BTSerial.println(F("add_text(8,5,medium,R,AlarmY,245,245,245,)"));

  47. BTSerial.println(F("add_text_box(9,5,8,L,\" SmartHomeV1.3\\n\",245,240,245,Y)"));

  48. BTSerial.println("add_text(13,9,large,L,500,130,240,132,B)");

  49. BTSerial.println("add_text(5,5,small,C,300,245,2,2,b)");

  50. BTSerial.println("add_text(5,6,small,C,25,3,240,2,t)");

  51. BTSerial.println("add_text(5,7,small,C,10,243,242,15,u)");

  52. BTSerial.println("add_text(5,8,large,R,StateS,245,240,245,)");

  53. BTSerial.println("add_button(3,3,7,F1,)");

  54. BTSerial.println("add_button(4,3,6,F0,)");

  55. BTSerial.println("add_button(6,5,9,D2,)");

  56. BTSerial.println("add_button(6,4,6,D0,)");

  57. BTSerial.println("add_button(6,6,20,D3,)");

  58. BTSerial.println("add_button(0,4,18,L2,)");

  59. BTSerial.println("add_button(3,4,18,F2,)");

  60. BTSerial.println("add_button(6,3,7,D1,)");

  61. BTSerial.println("add_button(0,3,7,L1,)");

  62. BTSerial.println("add_button(1,3,6,L0,)");

  63. BTSerial.println("add_gauge(15,0,3,0,100,34,H,0%,100%,10,5)");

  64. BTSerial.println("add_gauge(11,0,2,0,50,22,T,0',50',5,5)");

  65. BTSerial.println("add_led(0,1,2,L,80,0,0)");

  66. BTSerial.println("add_led(6,1,2,D,0,0,80)");

  67. BTSerial.println("add_led(3,1,2,F,0,80,0)");

  68. BTSerial.println("add_gauge(11,6,4,0,200,100,U,0cm,200cm,10,5)");

  69. BTSerial.println("add_gauge(11,8,5,0,1000,500,B,0_Dark,Bright_1000,10,5)");

  70. BTSerial.println("add_send_box(0,6,3,B400,,)");

  71. BTSerial.println("add_monitor(6,8,3,S,3)");

  72. BTSerial.println("add_monitor(1,8,3,,2)");

  73. BTSerial.println("set_panel_notes(Smart Home v1.3,KSYUN 2022.1.19. GNU,,)");

  74. BTSerial.println("run()");

  75. BTSerial.println("*");

  76. }


  77. void loop() {


  78. }


*.kwlclear_panel()set_grid_size(17,10)add_text(10,3,large,L,℃,245,122,245,)add_text(0,8,large,L,송신,245,240,245,)add_text(9,6,large,L,<거리U>,245,142,70,)add_text(1,5,medium,C,자동제어 경계값 설정,245,240,245,)add_text(1,4,small,L,자동제어,245,0,2,)add_text(4,4,small,L,자동제어,2,240,3,)add_text(9,2,large,L,<온도T>,247,143,252,)add_text(9,3,large,R,22.8,245,140,245,T)add_text(13,2,large,L,<습도H>,127,240,245,)add_text(14,3,large,L,%,131,240,245,)add_text(13,3,large,R,34.0,128,240,245,H)add_text(14,9,large,L,cds,131,240,130,)add_text(9,8,large,L,<조도B>,131,246,133,)add_text(0,0,xlarge,L, 전등L,255,255,255,)add_text(3,0,xlarge,L, 환풍F,245,240,245,)add_text(6,0,xlarge,L, 출입D,245,240,245,)add_text(3,5,small,L,전등제어 조도값 Bxx,245,2,1,)add_text(3,6,small,L,환풍제어 온도값 Txx ,1,240,2,)add_text(7,5,medium,L, 경비A,244,242,9,)add_text(7,6,medium,L, 차고G,245,244,7,)add_text(7,3,medium,L, 열기1,246,245,5,)add_text(7,4,medium,L, 닫기0,246,242,10,)add_text(3,7,small,L,출입제어 거리값 Uxx,245,242,13,)add_text(13,7,large,R,100,255,148,64,U)add_text(14,7,large,L,cm,245,128,60,)add_text(8,5,medium,R,알림Y,245,245,245,)add_text_box(9,5,8,L," SmartHomeV1.3\n",245,240,245,Y)add_text(13,9,large,L,500,130,240,132,B)add_text(5,5,small,C,300,245,2,2,b)add_text(5,6,small,C,25,3,240,2,t)add_text(5,7,small,C,10,243,242,15,u)add_text(5,8,large,R,상태S,245,240,245,)add_button(3,3,7,F1,)add_button(4,3,6,F0,)add_button(6,5,9,D2,)add_button(6,4,6,D0,)add_button(6,6,20,D3,)add_button(0,4,18,L2,)add_button(3,4,18,F2,)add_button(6,3,7,D1,)add_button(0,3,7,L1,)add_button(1,3,6,L0,)add_gauge(15,0,3,0,100,34,H,0%,100%,10,5)add_gauge(11,0,2,0,50,22,T,0℃,50℃,5,5)add_led(0,1,2,L,80,0,0)add_led(6,1,2,D,0,0,80)add_led(3,1,2,F,0,80,0)add_gauge(11,6,4,0,200,100,U,0cm,200cm,10,5)add_gauge(11,8,5,0,1000,500,B,0 어두움,밝음 1000,10,5)add_send_box(0,6,3,B400,,)add_monitor(6,8,3,S,3)add_monitor(1,8,3,,2)set_panel_notes(Smart Home v1.3,KSYUN 2022.1.19. GNU,,)run()*
  • SmartHome20220119.kwl 파일 내려받기

  • 안드로이드 기기의 앱 폴더에 SmartHome20220119.kwl 파일 이동
    /storage/emulated/keuwlsoft/ SmartHome20220119.kwl

  • 빈 패널을 선택 > Edit > import > SmartHome20220119.kwl 파일 선택

  • 웹에서 패널 가져오기 웹 주소> https://raw.githubusercontent.com/yunkyusung/Arduino/master/SmartHome20220119all.kwl

*.kwlclear_panel()set_grid_size(17,10)add_text(10,3,large,L,℃,245,122,245,)add_text(0,8,large,L,송신,245,240,245,)add_text(9,6,large,L,<거리U>,245,142,70,)add_text(1,5,medium,C,자동제어 경계값 설정,245,240,245,)add_text(1,4,small,L,자동제어,245,0,2,)add_text(4,4,small,L,자동제어,2,240,3,)add_text(9,2,large,L,<온도T>,247,143,252,)add_text(9,3,large,R,22.8,245,140,245,T)add_text(13,2,large,L,<습도H>,127,240,245,)add_text(14,3,large,L,%,131,240,245,)add_text(13,3,large,R,34.0,128,240,245,H)add_text(14,9,large,L,cds,131,240,130,)add_text(9,8,large,L,<조도B>,131,246,133,)add_text(0,0,xlarge,L, 전등L,255,255,255,)add_text(3,0,xlarge,L, 환풍F,245,240,245,)add_text(6,0,xlarge,L, 출입D,245,240,245,)add_text(3,5,small,L,전등제어 조도값 Bxx,245,2,1,)add_text(3,6,small,L,환풍제어 온도값 Txx ,1,240,2,)add_text(7,5,medium,L, 경비A,244,242,9,)add_text(7,6,medium,L, 차고G,245,244,7,)add_text(7,3,medium,L, 열기1,246,245,5,)add_text(7,4,medium,L, 닫기0,246,242,10,)add_text(3,7,small,L,출입제어 거리값 Uxx,245,242,13,)add_text(13,7,large,R,100,255,148,64,U)add_text(14,7,large,L,cm,245,128,60,)add_text(8,5,medium,R,알림Y,245,245,245,)add_text_box(9,5,8,L," SmartHomeV1.3\n",245,240,245,Y)add_text(13,9,large,L,500,130,240,132,B)add_text(5,5,small,C,300,245,2,2,b)add_text(5,6,small,C,25,3,240,2,t)add_text(5,7,small,C,10,243,242,15,u)add_text(5,8,large,R,상태S,245,240,245,)add_button(3,3,7,F1,)add_button(4,3,6,F0,)add_button(6,5,9,D2,)add_button(6,4,6,D0,)add_button(6,6,20,D3,)add_button(0,4,18,L2,)add_button(3,4,18,F2,)add_button(6,3,7,D1,)add_button(0,3,7,L1,)add_button(1,3,6,L0,)add_gauge(15,0,3,0,100,34,H,0%,100%,10,5)add_gauge(11,0,2,0,50,22,T,0℃,50℃,5,5)add_led(0,1,2,L,80,0,0)add_led(6,1,2,D,0,0,80)add_led(3,1,2,F,0,80,0)add_gauge(11,6,4,0,200,100,U,0cm,200cm,10,5)add_gauge(11,8,5,0,1000,500,B,0 어두움,밝음 1000,10,5)add_send_box(0,6,3,B400,,)add_monitor(6,8,3,S,3)add_monitor(1,8,3,,2)set_panel_notes(Smart Home v1.3,KSYUN 2022.1.19. GNU,,)run()*
  • 웹 주소 복사
    https://raw.githubusercontent.com/yunkyusung/Arduino/master/SmartHome20220119all.kwl

  • 디스켓 아이콘 클릭

  • Loat from Web Link 선택

  • 복사해둔 웹 주소를 넣고, Load 클릭

3) SmartHome 프로젝트 전체 코드

<모듈 테스트>

ModuleTestV20220117.zip


< 전체 코드>

SmartHomeV20220117.zip

<라이브러리>

libraries.zip