프로젝트

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

[조도센서X피에조센서] 아침이오면 알려주는 스마트 침대 만들기

2018-04-10 09:04:52

 

 

1. 개요

 

매일 아침 우리는 전쟁을 치룹니다. 

바로 기상 전쟁을 말이죠.

 

매일 아침 제시간에 일어나기 위해 스마트폰 알람을 맞추고는 하지만, 울리는 휴대폰 알람을 끄고, 다시 잠에 든 경험은 누구나 한 번쯤 있을 것 입니다. 

 

출처 : 뉴발란스 퍼포먼스 블로그

 

매일 아침 물리치기 힘든 '아침잠'을 깨워줄 스마트한 디바이스가 있으면, 어떨까요?

침대에서 일어날 때까지 계속해서 알람을 울리게 한다면, 우리는 비로소 침대 위를 벗어나게 될 것 입니다. 

 

스마트 홈 키트에 구성되어 있는 조도 센서와 피에조 부저를 이용해 '일어날 때까지 알람을 울려주는 스마트한 알람 침대'를 구현해보도록 하겠습니다.

 

조도 센서와 피에조 부저의 활용 용도는 아래와 같습니다. 

 

- 조도 센서 :

  침대에 부착하여, 사람이 있는지, 없는지의 유무를 파악합니다.(사람이 누워있다면 조도 값이 어둡게 측정되고, 사람이 없다면 조도 값이 밝게 측정되는 원리를 활용합니다)

 

- 피에조 부저 :

  알람 멜로디를 출력합니다.

 

 

 

 

2. 준비물 / 부품 목록

 

NO 부품명 수량 상세설명
MDF 외관  
2 우드락 가구 2 침대 / 스피커
3 오렌지보드 BLE 1 블루투스 4.0 포함 보드
4 조도 센서 모듈 1  
5 피에조 부저 1  
6 브레드보드 1  
7 점퍼케이블    

 

부품명 MDF, 우드락 외관 오렌지보드 BLE 조도 센서 모듈
파트

 

부품명 피에조 부저 브레드보드 점퍼케이블
파트

 

 

TIP / 조도센서와 피에조 부저의 사용 방법을 알아보도록 하겠습니다. 

조도 센서 사용법 알아보기

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

 

 

TIP / MDF 및 가구 제작 방법에 대해 알아보도록 하겠습니다. 

MDF 외관 조립하기

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

 

 

 

 

3. 하드웨어 메이킹

 

 

 

4. 소프트웨어 코딩

 

int C 1047 // 도
int D 1175 // 레 
int E 1319 // 미 
int F 1397 // 파 
int G 1568 // 솔 
int A 1760 // 라 
int B 1976 // 시 

int piezoPin = 2; // 피에조 부저의 +극을 오렌지보드 2번에 연결
int cdsPin = A0; // 조도센서를 오렌지보드 A0번에 연결

int notes[25] = { G, G, A, A, G, G, E, G, G, E, E, D, G, G, A, A, G, G, E, G, E, D, E, C };
// 학교종이 땡땡땡 멜로디 작성
int tempo = 200; // 멜로디의 음 길이 설정

void setup() {
  // 시리얼 통신을 위해 통신속도(Baudrate)를 9600으로 설정
  Serial.begin(9600);
  pinMode(piezoPin, OUTPUT); // 피에조 핀을 출력핀으로 설정
}

void loop() {
  // 조도센서 값 측정 후 시리얼 모니터에 출력
  int cdsValue = analogRead(cdsPin);
  Serial.println(cdsValue);

  // 조도센서로 측정되는 빛의 밝기가 어두울 경우
  if (cdsValue > 700) {
    // 멜로디 재생
    for (int i = 0; i < 12; i++) {
      tone (piezoPin, notes[ i ], tempo);
      delay (300);
    }
    delay(100); // 멜로디 중간에 짧게 멈추는 용도

    for (int i = 12; i < 25; i++) {
      tone (piezoPin, notes[ i ], tempo);
      delay(300);
    }
  }
}

 

 

소프트웨어 코드 설명

 

int C 1047 
int D 1175 // 레 
int E 1319 // 미 
int F 1397 // 파 
int G 1568 // 솔 
int A 1760 // 라 
int B 1976 // 시 

int piezoPin = 2; // 피에조 부저의 +극을 오렌지보드 2번에 연결
int cdsPin = A0; // 조도센서를 오렌지보드 A0번에 연결
int notes[25] = { G, G, A, A, G, G, E, G, G, E, E, D, G, G, A, A, G, G, E, G, E, D, E, C };
// 학교종이 땡땡땡 멜로디 작성
int tempo = 200; // 멜로디의 음 길이 설정

 

알람에 사용할 멜로디를 미리 셋팅하는 코드입니다.

 

아래 이미지를 모시면 옥타브 및 음계별 주파수가 정해져 있습니다. 여기서 6옥타브 음계를 미리 C~B까지 변수에 저장을 한 후 notes배열 안에 멜로디 음계를 저장해 둡니다.

 

각 음계 주파수교컴 - 각 음계 주파수

 

 

  if (cdsValue > 700) {
    // 멜로디 재생
    for (int i = 0; i < 12; i++) {
      tone (piezoPin, notes[ i ], tempo);
      delay (300);
    }
    delay(100); // 멜로디 중간에 짧게 멈추는 용도

    for (int i = 12; i < 25; i++) {
      tone (piezoPin, notes[ i ], tempo);
      delay(300);
    }
  }

 

조도센서 측정값 700 기준으로 700보다 클 경우(어두울 경우) 멜로디를 재생하는 코드입니다.

 

조도센서의 측정값이 700이 넘으면 notes배열에 저장한 멜로디를 재생하고, 그다음 멜로디 재생이 끝나면 다시 조도센서로 주변 조도를 측정하게 됩니다.

 

멜로디 재생은 notes배열에 저장되어 있는 음계를 1개씩 재생하고 멜로디 중간 쉼표 부분에 delay(100)을 주어서 한박자 쉬고 남은 멜로디를 재생하게 됩니다.

(학교종이 땡땡땡 기준)

 

이 코드는 멜로디 재생 중에 다른 동작을 하지 않으므로, 멜로디 재생이 끝나야 그 다음 측정을 진행합니다.

 

주변 환경에 따라서 조도센서 측정값의 범위가 바뀔 수 있으니, 우선 조도센서를 측정해보고 측정값의 범위를 확인 한 후 위 코드의 조건문 'cdsValue > 700' 에 숫자를 바꿔주세요!

 

 

 

5. 프로젝트 시연 영상

 

kocoafabeditor

코코아팹, 오렌지보드, 아두이노, 오픈소스하드웨어, SW교육, SW코딩, 코딩, 코딩 교육, 스마트홈, IoT 홈, IoT, DIY, 키트, kit, kocoafab, ornage board, arduino, opensource hardware, Software, education, physical computing, 조도 센서, CdS 센서, 피에조 부저, piezo buzzer
profile

압구정양아치 2018-05-11 11:52:52

이 회로도 그대로 우노보드 사용해도 지장이없나요?

profile

미숙합니다 2018-06-11 17:17:39

제가 학생인데 요즘 학교 수업에서 아두이노를 이제 갓 배우고 있습니다. 그런데 학교에서는 LED1~9까지 동작시킬 때도 와일문 if문 등 많이 사용하게 하는데 요기는 더 어려운거 같은데 소스는 제가 배우는 LED동작보다 간단한거 같아서요
흥미가 있어서 둘러보다가 해보고 싶어서 살려고하는데 금전적 여유가 없다보니깐 한번 사면은 다시 살 돈같은건 없어서요 저 소스 그대로 치면 동작이 되는건가요? 알려주세요 부탁드립니다.

profile

이한진 2018-08-03 13:06:29

압구정양아치- 네. 지장없습니다.
미숙합니다- 소스코드 그대로 동작하고요 문제 생길시 질문하시면 답변해드리겠습니다.

profile

이한진 2018-08-03 13:08:54

전자부품은 한번 사시면 반 영구적으로 재사용하실 수 있습니다. 키트말고 부품만 따로 구매하신후 사용하셔도 문제없습니다.

profile

둠벙 2018-08-27 13:22:37

int C 1047 // 도
int D 1175 // 레
int E 1319 // 미
int F 1397 // 파
int G 1568 // 솔
int A 1760 // 라
int B 1976 // 시

이부분 define 해줘야 하는거 아닌가요?

profile

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

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

profile

모모노스케 2018-11-29 15:05:54

sketch_nov29a:12:79: error: 'E' was not declared in this scope

int notes[25] = { G, G, A, A, G, G, E, G, G, E, E, D, G, G, A, A, G, G, E, G, E, D, E, C };

^
이런식으로 에러가 많이 뜨느데 무슨문제인가요??