메이커 Maker

욕실, 창고의 내부 상태를 알려주는 래빗 Rabbit 1

지구빵집 2021. 3. 12. 10:37
반응형

 

 

욕실, 창고의 내부 상태를 알려주는 Rabbit 1

 

아침에 바쁘든 바쁘지 않든 가끔 자주 욕실의 등을 켜두고 나온다. 집이 넓지 않고 문이 다 열려 있으므로 방의 불을 전부 끈다. 화장실이 방 앞에 있어 습관적으로 화장실 문을 닫아두는데 퇴근 하고 와보면 화장실 불이 켜져 있다. 그래서 욕실이나 창고와 같이 내부가 직접 보이지 않는 곳의 내부 상태, 간단하게 사람이 있는지 없는지, 전등이 켜져 있는지, 소리가 나는지 상태를 외부에 알려주는 장치를 만든다. 초기에 그려본 구성 블럭도를 첨부하니 참고하기? 안 하기?

 

욕실, 창고 등 가려진 내부 상태를 알려주는 Rabbit

 

왜 이름이 래빗, 토끼일까? 물속을 운행하는 잠수함에 토끼를 키우면 공기중의 산소에 민감하게 반응하므로 환기를 시키키 위해 잠수함은 부상한다. 이처럼 징후를 알려주는 토끼를 연상해 Rabbit 으로 지었다.

 

처음엔 초음파, 스피커, 진동, 블루투스와 같이 어렵고 현란하게 접근했더니 생각이 복잡해서 그런지 계속 미루기만 했다. 생각을 단순화 하고 가장 작게 빠른 시간에 구현하려고 했더니 바로 프로타입이 나온다. 원래 구현하고자 했던 기능을 적어보면 아래와 같다. 복잡하다.

 

  • 내부에 마이크로 컨트롤러 MCU 하나, 외부에 하나
  • 통신방식으로 진동, 블루투스, 초음파, 저주파 고주파 신호 송수신기
  • 외부에 불을 켜서 알려주는 방식

위에 기술한 것처럼 복잡하게 만들 생각을 하였지만, 조금이라고 시작할 수 없게 된 원인이 바로 큰 생각이었다. 큰 생각은 접근하기가 어렵고 시작하기 어렵다. 단순하고, 작고, 빠른 과정을 반복한다. 무엇보다도 지름길이다. 다 무시하고 아래와 같은 기능을 갖도록 구상하고 만들었다.

 

  • 아두이노 우노에 연결하여 테스트하고 조립은 아두이노 나노에 조립한다.
  • 내부에 하나의 아두이노 MCU 만 사용한다.
  • 외부로 스피커 선을 50cm 정도 문틈으로 연장하여 밖에서 소리를 듣고 알 수 있게 한다.
  • 현재는 사람이 없으면서 불이 켜져 있으면 액 0.2초 부저 소리를 반복해서 낸다. 

 

필요 부품

 

아두이노 우노 보드나 아두이노 나노 보드

인체감지 센서

조도센서

부저나 작은 스피커

충전 배터리

충전 보호회로

부저나 스피커 선 확장 전선 50cm

 

인체감지 센서 연결 참고

 

이미지 https://kocoafab.cc/tutorial/view/63

 

 

작동 소스코드는 아래와 같고, 논리적으로 개선한 코드와 결과는 다음 포스팅으로 이사중. ^^ 

 

//function
//Arduino nano
//3.3V 동작, 충전 배터리
//부저 외부로 빼기


int buzzer = 7; //부저 연결 7번
int human = 8;
int light = A0;

int inputValue;
void setup()
{
    Serial.begin(9600);
  
    pinMode(buzzer,OUTPUT);
    pinMode(LED_BUILTIN, OUTPUT);
    pinMode(human,INPUT);
    pinMode(light,INPUT);
}

//다 귀찮음
//이렇게 하자. 사람이 없고, 불이 켜져 있으면 1초마다 소리를 내고
//사람이 없고 불이 겨져 있으면 소리 0.2초 소리, 3초 쉬고
//불이 꺼져 있으면 중지 sleep 등등
//불나면 소리 무지크게
//사람이 있으면 무조건 소리 중지
//기타 있는 조건 다 걸어~^^

void loop() {

    //test_all();

    inputValue = analogRead(light);
    if(digitalRead(human) && (inputValue > 300))
    {
        Serial.println("Human Detect");
        digitalWrite(LED_BUILTIN, HIGH);
        noTone(buzzer);        
    }
    if(!(digitalRead(human)) && (inputValue < 300))
    {
        Serial.println("No human");
        digitalWrite(LED_BUILTIN, LOW);
        set_buzzer();
    }
}

//구성품 test를 위해 준비
void test_all()
{   
    while(1)
    {
       test_buzzer();
    }
}

void set_buzzer()
{
    tone(buzzer, 2000);
    delay(200);
    noTone(buzzer); 
    delay(3000);
}

void test_buzzer()
{
    tone(buzzer, 2000);
    delay(200);
    noTone(buzzer); 
    delay(3000);
}

void test_humansensor()
{
    if(digitalRead(human))
    {
        Serial.println("Human Detect");
    }
    else
    {
        Serial.println("No human");
    }
}

void test_light_analog()
{
    inputValue = analogRead(light);     /* read input value of A5 pin */
    Serial.println(inputValue); 
    //analog light <300 - light
    //analog light > 300 - dark
}

void test_light_digitl()
{
    if(digitalRead(light))
    {
        Serial.println("light");
    }
    else
    {
        Serial.println("dark");
    }
}

 

보완할 점

 

  • 인체 감지 센서가 감지하고 디레이가 있고 나서 비감지 상태로 돌아가는 시간 계산
  • 부저 작동시  delay 타임 있는데 그거 없애는 방식으로 코드 개선
  • 내부에 위급 사항 발생시 소리 변경하는 방안 고려
  • 논리적으로 조금 생각할 부분이 있고
  • 동작을 계속하는 게 아니라 5초 마다 하면 좋아? 안 좋아?
  • 충전 배터리 사용해서 전원 조금 먹게 해야 한다고 말했어? 안 했어?
  • 다시 개선해서 올린다고 말했어? 안 했어?

 끝.

 

실내 상태를 외부로 알려주는 래빗 

 

 

 

 

 

반응형