프로젝트

나도 메이커! 메이커스 여러분들의 작품/프로젝트를 공유하는 공간입니다.

[스마트폰X오렌지보드BLE] 스마트폰(블루투스 통신) 활용해 스마트홈 제어하기

2018-04-26 09:13:26

 

1. 개요

 

1) IoT란 무엇인가? 

 

출처 : https://www.linkedin.com/

 

 

사물 인터넷이란 각종 사물에 센서와 통신 기능을 내장하여, 인터넷에 연결되는 기술을 의미합니다. 

인터넷으로 연결된 사물들이 서로 데이터를 주고 받거나 상호 연결되어 통신되며, 사용자가 인터넷에 연결된 

사물들을 원격으로 제어할 수 있는 기술이기도 합니다. 

 

내용 출처 : 위키 백과 사전

 

 

2) Home IoT란 무엇인가? 

 

출처 : https://medium.com/iotforall/

 

출처 : 블로터

 

 

위에서 살펴본 바와 같이 IoT가 사물들을 인터넷에 연결하는 것이라면, Home IoT의 개념은 집에서 사용하는 사물들을 인터넷에 

연결하는 것을 의미합니다.

 

가령 에어컨, 전등, 냉장고, 도어락, 가스 밸브 같은 사물들을 인터넷에 연결하여, 사용자가 집 밖에서도 집의 상황을 파악하거나

원격으로 집을 제어하는 것이 Home IoT의 대표적인 사례입니다. 

 

스마트폰을 가지고 집 안의 모든 것을 제어하고 또 파악할 수 있다면 우리의 미래는 조금 더 편리해질 것 입니다. 

 

본래 사물인터넷은 사물을 인터넷 환경에 연결시켜야 하는 것이나, 스마트 홈 키트에 구성되어 있는 오렌지보드 BLE를 활용해 

스마트폰으로 집안의 각 종 사물들을 어떻게 제어할 수 있는지 사물인터넷의 과정을 이해하고 기능을 구현해보도록 하겠습니다. 

 

 

 

 

2. 준비물

 

NO 부품명 수량 상세설명
MDF 외관  
2 우드락 가구 2 침대 / 스피커
3 오렌지보드 BLE 1 블루투스 4.0 포함 보드
4 RGB LED 모듈 3  
5 조도 센서 모듈 1  
6 온습도 센서 모듈 1  
7 적외선 장애물 감지 센서 1  
피에조 부저 1  
9 서보 모터 1  
10 I2C LCD 1  
11 점퍼 케이블  30 이상  
12 브레드보드 1  

 

부품명 MDF, 우드락 외관 오렌지보드 BLE RGB LED 모듈
파트 ky-016에 대한 이미지 검색결과

 

부품명 조도 센서 모듈 온·습도 센서 모듈 적외선 장애물 감지 센서
파트 ky-015에 대한 이미지 검색결과

 

부품명 피에조 부저 서보 모터 I2C LCD
파트

관련 이미지

 

부품명 서보 모터 점퍼케이블
파트
 

 

 

 

※ 각 부품에 대한 상세한 예제는 아래 링크를 참조해주세요.

RGB LED 모듈 사용법 알아보기

조도 센서 모듈 사용법 알아보기

온·습도 센서 모듈 사용법 알아보기

적외선 장애물 감지 센서 사용법 알아보기

피에조 부저 사용법 알아보기

서보 모터 사용법 알아보기

I2C_LCD 사용법 알아보기

 

 

 

※ MDF외관 조립 방법과 가구 제작 방법은 아래의 링크를 참조해주세요. 

MDF 외관 조립하기

스마트 홈 구성하는 우드락 가구 만들기

 

 

 

※ 스마트폰 어플 설치 방법은 아래 링크를 참조해주세요.

아이폰에서 nRF Toolbox 어플 설치하기

안드로이드에서 nRF Toolbox 어플 설치하기

 

 

3. 하드웨어 메이킹

 

※ BLE를 사용할 경우 디지털 4, 5번핀은 사용할 수 없으므로 회로를 연결할 때 이 핀을 피해서 연결해 주세요.

 

 

 

 

 

 

4. 소프트웨어 코딩

 

#include <SoftwareSerial.h>
#include <Servo.h>  // 서보모터를 사용하기 위한 라이브러리 호출하기
#include <Wire.h>
#include <LiquidCrystal_I2C.h>  // I2C LCD를 사용하기 위한 라이브러리 호출하기
#include <SimpleDHT.h>  // 온습도 센서를 사용하기 위한 라이브러리 호출하기

// I2C LCD에 출력할 아이콘 생성
byte temp[] = {
  B00100,
  B01010,
  B01010,
  B01110,
  B01110,
  B11111,
  B11111,
  B01110
};

byte humi[] = {
  B00100,
  B00100,
  B01010,
  B01010,
  B10001,
  B11111,
  B11111,
  B01110
};

byte C[] = {
  B10000,
  B00110,
  B01001,
  B01000,
  B01000,
  B01001,
  B00110,
  B00000
};

int DHTPin = 3;   // 온습도센서를 오렌지보드 3번핀에 연결

LiquidCrystal_I2C TV(0x3F, 16, 2);  // I2C LCD를 TV라는 이름으로 선언
SoftwareSerial BTSerial(4, 5);  // 블루투스를 사용하기 위해 BTSerial 이름으로 선언
SimpleDHT11 dht11;  // 온습도센서를 dht11이라는 이름으로 선언
Servo blind;  // 서보모터를 blind라는 이름으로 선언

// 현재 LED와 LCD의 상태를 저장하는 변수 선언
boolean ledR = false;
boolean ledG = false;
boolean ledB = false;
boolean led1R = false;
boolean led1G = false;
boolean led1B = false;
boolean ledGAS = false;
boolean LCD1 = false;
boolean LCD2 = false;

// 현재 온습도 값을 저장하는 변수 선언
byte temperature = 0;
byte humidity = 0;

//
int notes[] = {4186, 6271};
int tempo = 200;

void setup() {
  pinMode(2, OUTPUT);  // 피에조 핀을 출력핀으로 설정
  blind.attach(6); // 서보모터를 6번핀에 연결

  // 모든 LED 핀을 출력핀으로 설정
  for (int i = 7; i <= 13; i++) {
    pinMode(i, OUTPUT);
  }

  TV.init();  // I2C LCD의 기본 설정
  Serial.begin(9600);  // 시리얼 통신을 위해 시리얼 통신속도를 9600으로 설정
  BTSerial.begin(9600);  // 블루투스 통신을 위해 블루투스 통신속도를 9600으로 설정

  // 위에서 만든 I2C LCD에 출력할 아이콘을 메모리에 저장(0, 1, 2번 메모리)
  TV.createChar((byte)0, temp);
  TV.createChar(1, humi);
  TV.createChar(2, C);
}


void loop() {
  // 조도 센서 값 측정
  int cdsVal = analogRead(A0);

  // 블루투스 통신을 통해 데이터가 들어오면
  if (BTSerial.available()) {
    // c라는 변수에 블루투스를 통해 전달받은 데이터를 넣어줍니다.(문자 1개)
    char c = BTSerial.read();

    // 전달받은 데이터에 따라 그에 맞는 동작을 해줍니다.
    if (c == 'a')
      setLED(8, ledR);

    else if (c == 'b')
      setLED(9, ledG);

    else if (c == 'c')
      setLED(10, ledB);

    else if (c == 'd')
      setLED(7, ledGAS);

    else  if (c == 'e') {
      if (!LCD1) {
        TV.backlight();
      }
      else {
        TV.noBacklight();
        TV.clear();
      }
      LCD1 = !LCD1;
    }
    else if (c == 'f') {
      TV.clear();
      LCD2 = !LCD2;
    }
    else  if (c == 'g') {
      setLED(11, led1R);
    }
    else if (c == 'h') {
      setLED(12, led1G);
    }
    else if (c == 'i') {
      setLED(13, led1B);
    }
  }

  // 온습도센서로 온도와 습도값 측정(잘못 연결됬을 경우 failed 메세지 출력)
  if (dht11.read(DHTPin, &temperature, &humidity, NULL)) {
    Serial.print("Read DHT11 failed.");
    return;
  }
  
  // I2C LCD가 온습도 출력 모드면 현재 온도와 습도를 I2C LCD에 출력
  if (LCD2) {
    TV.setCursor(0, 0);
    TV.print("Today's weather");

    TV.setCursor(0, 1);
    TV.write((byte)0);
    TV.print(" ");
    TV.print((int)temperature);
    TV.write(2);

    TV.setCursor(6, 1);
    TV.write(1);
    TV.print(" ");
    TV.print((int)humidity);
    TV.print("%");
    delay(100);
  }
  else {  // I2C LCD가 조도 출력 모드면 조도 값에 따라 현재 블라인드 동작을 I2C에 출력
    if (cdsVal > 200) {
      TV.print("blind open");
    }
    else {
      TV.print("blind close");
    }
    delay(100);
  }

  // 조도 센서로 측정된 값이 어두우면 블라인드를 올리고 경보음을 냅니다.
  if (cdsVal > 450) {
    TV.setCursor(0, 0);
    blind.write(80);
    for (int i = 0; i < 2; i++) {
      tone(2, notes[i], tempo);
      delay(100);
    }
  }
  else {  // 조도 센서로 측정된 값이 밝으면 블라인드를 내립니다.
    TV.setCursor(0, 0);
    blind.write(180);
  }
}


// LED의 현재 상태에 따라 LED를 키거나 꺼줍니다.
void setLED(int PIN, boolean &LED) {
  if (!LED) {
    digitalWrite(PIN, HIGH);
  }
  else {
    digitalWrite(PIN, LOW);
  }
  LED = !LED;
}

 

소프트웨어 코드 설명

 

  else {  // I2C LCD가 조도 출력 모드면 조도 값에 따라 현재 블라인드 동작을 I2C에 출력
    if (cdsVal > 200) {
      TV.print("blind open");
    }
    else {
      TV.print("blind close");
    }
    delay(100);
  }

  // 조도 센서로 측정된 값이 어두우면 블라인드를 올리고 경보음을 냅니다.
  if (cdsVal > 450) {
    TV.setCursor(0, 0);
    blind.write(80);
    for (int i = 0; i < 2; i++) {
      tone(2, notes[i], tempo);
      delay(100);
    }
  }
  else {  // 조도 센서로 측정된 값이 밝으면 블라인드를 내립니다.
    TV.setCursor(0, 0);
    blind.write(180);
  }

조도센서의 측정값은 주변환경에 따라 값의 범위가 바뀝니다.

 

위 부분에서 조도센서 부분(cdsVal)의 조건 범위을 현재 주변 환경에 맞게 변경해주세요.

 

 

 

5. 프로젝트 시연 영상

 

 

 

 

kocoafabeditor

코코아팹, 오렌지보드, 아두이노, 오픈소스하드웨어, SW교육, SW코딩, 코딩, 코딩 교육, 스마트홈, IoT 홈, IoT, DIY, 키트, kit, kocoafab, ornage board, arduino, opensource hardware, Software, education, physical computing,사물인터넷, IoT, 블루투스, bluetooth, BLE
profile

SigongJoa 2018-08-11 11:04:41

좋은 프로젝트 감사드립니다.

profile

나야나 2018-09-26 11:07:06

괜찮습니다. 적외선 센서도 포함되었스면 합니다.

profile

창정신 2018-10-24 17:15:34

감사합니다

profile

로버트 2018-10-26 01:19:01

좋은 프로젝트 감사합니다.

profile

나다그래 2018-11-16 23:19:01

좋은 프로젝트 감사합니다.