스마트홈 기능 요구 사항 명세 파악하기
시리얼 통신으로 기능 구현하기
스마트기기 화면 설계
스마트기기로 앱 구현
스마트홈 기능 테스트
문서화, 소감 나누기
현관문 제어: 수동 or Rfid 연동
차고문 제어: 설정 거리 이내로 접근 시 열림
전등 제어: 수동 or 조도연동(설정 밝기에 따라)
환풍 제어: 수동 or 온도연동(설정 온도에 따라)
경비: 침입자 감지(설정 거리 이내로 접근 시 경보)
경보: 소리와 빛으로 알림
표시기: 시스템 or 원격스마트기기 (시스템 현황 표시)
원격제어기: 스마트기기에서 원격으로 감시 및 제어
스마트기기로 원격 감시 및 제어 기능 구현
수동 및 자동 제어 기능 구현
스마트기기에 현재 시스템 상태 원격 표시
시스템 디스플레이 장치에 현재 상태 표시
온도, 습도
조도(밝기)
거리: 차량 접근 거리 , 외부 침입자 접근 거리
Rfid 카드
블루투스 통신 명령
경보 알림
현재 상태 표시
차고문
출입문
전등
환풍기
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(문턱) 값을 송신
1) 모바일 앱 설치 [https://www.keuwl.com/apps/bluetoothelectronics/ ]
안드로이드에 설치 가능함. 안타깝지만 아이폰에는 안됨.
구글플레이에서 'Bluetooth Electronics'앱을 검색하여 설치
프로그램 설치 시 '출처를 알 수 없는 앱 설치' 를 허용해야 한다.
2) Bluetooth Electronics 앱에 SmartHomeV1.3 패널을 설치하는 세가지 방법
// Bluetooth Electronics App앱에 자동 패널 생성 www.keuwl.com
// 작업 순서:
// 1) 아래 코드를 아두이노에 업로드
// 2) 스마트기기에 Bluetooth Electronics 앱을 실행하고 아두이노와 연결
// 3) 아두이노 리셋버튼 누르기
// 이 자동 생성 코드 템플릿은 시작하기 위한 제안일 뿐입니다.
// 불완전하며 프로젝트에 특정한 수정이 필요합니다.
// 아두이노 Serial 통신에서 유니코드를 지원하지 않아서 영문으로 보냄.
#include <SoftwareSerial.h> // Serial 통신 라이브러리
SoftwareSerial BTSerial(2, 3); // BTSerial(Rx, Tx): Adu-Rx(2)<->BT(Tx), Adu-Tx(3)<->BT(Rx) 연결
void setup() {
Serial.begin(57600);
Serial.println("Serial begin.");
BTSerial.begin(57600);
BTSerial.println("Hi! Bluetooth.");
delay(500);
// 앱에 패널 만들기
BTSerial.println("*.kwl");
BTSerial.println("clear_panel()");
BTSerial.println("set_grid_size(17,10)");
BTSerial.println("add_text(10,3,large,L,',245,122,245,)");
BTSerial.println("add_text(0,8,large,L,TX,245,240,245,)");
BTSerial.println("add_text(9,6,large,L,<DistU>,245,142,70,)");
BTSerial.println(F("add_text(1,5,medium,C,Setting the threshold,245,240,245,)"));
BTSerial.println(F("add_text(1,4,small,L,Auto,245,0,2,)"));
BTSerial.println(F("add_text(4,4,small,L,Auto,2,240,3,)"));
BTSerial.println(F("add_text(9,2,large,L,<TempT>,247,143,252,)"));
BTSerial.println(F("add_text(9,3,large,R,22.8,245,140,245,T)"));
BTSerial.println(F("add_text(13,2,large,L,<HumiH>,127,240,245,)"));
BTSerial.println(F("add_text(14,3,large,L,%,131,240,245,)"));
BTSerial.println(F("add_text(13,3,large,R,34.0,128,240,245,H)"));
BTSerial.println(F("add_text(14,9,large,L,cds,131,240,130,)"));
BTSerial.println(F("add_text(9,8,large,L,<BrightB>,131,246,133,)"));
BTSerial.println(F("add_text(0,0,xlarge,L, LampL,255,255,255,)"));
BTSerial.println(F("add_text(3,0,xlarge,L, FanF,245,240,245,)"));
BTSerial.println(F("add_text(6,0,xlarge,L, DoorD,245,240,245,)"));
BTSerial.println(F("add_text(3,5,small,L,Cds threshold Bxx,245,2,1,)"));
BTSerial.println(F("add_text(3,6,small,L,Temp threshold Txx ,1,240,2,)"));
BTSerial.println(F("add_text(3,7,small,L,Dist threshold Uxx,245,242,13,)"));
BTSerial.println(F("add_text(7,5,medium,L, Armed A,244,242,9,)"));
BTSerial.println(F("add_text(7,6,medium,L, GarageG,245,244,7,)"));
BTSerial.println(F("add_text(7,3,medium,L, Open 1,246,245,5,)"));
BTSerial.println(F("add_text(7,4,medium,L, Close0,246,242,10,)"));
BTSerial.println(F("add_text(13,7,large,R,100,255,148,64,U)"));
BTSerial.println(F("add_text(14,7,large,L,cm,245,128,60,)"));
BTSerial.println(F("add_text(8,5,medium,R,AlarmY,245,245,245,)"));
BTSerial.println(F("add_text_box(9,5,8,L,\" SmartHomeV1.3\\n\",245,240,245,Y)"));
BTSerial.println("add_text(13,9,large,L,500,130,240,132,B)");
BTSerial.println("add_text(5,5,small,C,300,245,2,2,b)");
BTSerial.println("add_text(5,6,small,C,25,3,240,2,t)");
BTSerial.println("add_text(5,7,small,C,10,243,242,15,u)");
BTSerial.println("add_text(5,8,large,R,StateS,245,240,245,)");
BTSerial.println("add_button(3,3,7,F1,)");
BTSerial.println("add_button(4,3,6,F0,)");
BTSerial.println("add_button(6,5,9,D2,)");
BTSerial.println("add_button(6,4,6,D0,)");
BTSerial.println("add_button(6,6,20,D3,)");
BTSerial.println("add_button(0,4,18,L2,)");
BTSerial.println("add_button(3,4,18,F2,)");
BTSerial.println("add_button(6,3,7,D1,)");
BTSerial.println("add_button(0,3,7,L1,)");
BTSerial.println("add_button(1,3,6,L0,)");
BTSerial.println("add_gauge(15,0,3,0,100,34,H,0%,100%,10,5)");
BTSerial.println("add_gauge(11,0,2,0,50,22,T,0',50',5,5)");
BTSerial.println("add_led(0,1,2,L,80,0,0)");
BTSerial.println("add_led(6,1,2,D,0,0,80)");
BTSerial.println("add_led(3,1,2,F,0,80,0)");
BTSerial.println("add_gauge(11,6,4,0,200,100,U,0cm,200cm,10,5)");
BTSerial.println("add_gauge(11,8,5,0,1000,500,B,0_Dark,Bright_1000,10,5)");
BTSerial.println("add_send_box(0,6,3,B400,,)");
BTSerial.println("add_monitor(6,8,3,S,3)");
BTSerial.println("add_monitor(1,8,3,,2)");
BTSerial.println("set_panel_notes(Smart Home v1.3,KSYUN 2022.1.19. GNU,,)");
BTSerial.println("run()");
BTSerial.println("*");
}
void loop() {
}
SmartHome20220119.kwl 파일 내려받기
안드로이드 기기의 앱 폴더에 SmartHome20220119.kwl 파일 이동
/storage/emulated/keuwlsoft/ SmartHome20220119.kwl
빈 패널을 선택 > Edit > import > SmartHome20220119.kwl 파일 선택
웹에서 패널 가져오기 웹 주소> https://raw.githubusercontent.com/yunkyusung/Arduino/master/SmartHome20220119all.kwl
웹 주소 복사
https://raw.githubusercontent.com/yunkyusung/Arduino/master/SmartHome20220119all.kwl
디스켓 아이콘 클릭
Loat from Web Link 선택
복사해둔 웹 주소를 넣고, Load 클릭
3) SmartHome 프로젝트 전체 코드