Make-A-Thon STOKIT #1 Toilet Counter

의도

영화관이나 이벤트, 파티 등에서 여자 화장실만 붐비는 경우가 많다. 근처에 화장실이 많음에도 불구하고 위치를 파악하기도 힘들지만, 그쪽의 상황또한 알 수 없기 때문에 함부로 이동하기가 어렵다.

이에 화장실의 위치를 서버에 업로드하고, 화장실의 붐비는 상황을 알기 쉽도록 Toilet Counter 를 제안해보았다. 단, Make-A-Thon 이라는 제한된 리소스에 맞춰 화장실 내부의 사람 수를 카운팅 하는 기능에 집중하여 개발하였다.

재료

  • 아두이노
  • 적외선 거리 센서 2개
  • LED 매트릭스 + 제어 백팩
  • 네오픽셀

알고리즘

적외선 출입문에 바닥에 평행하도록 설치하고, 적외선 센서가 켜지는 순서에 따라 사람의 출입을 기록하도록 한다. 예를 들어, 화장실 바깥쪽 센서가 작동한 후 일정 시간안에 화장실 안쪽 센서에 동작이 인식된다면 이를 한사람이 들어왔다고 가정하였다.

코드

#include <SharpIR.h>
#include <Wire.h>
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"
#include <Adafruit_NeoPixel.h>
#include <avr/power.h>

#define IR1 A0
#define IR2 A1
#define MODEL 1080
#define PIN  6
#define NUMPIXELS  3

Adafruit_BicolorMatrix matrix = Adafruit_BicolorMatrix();
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int delayval = 500;

SharpIR disSensor1(IR1, 25, 93, MODEL);
SharpIR disSensor2(IR2, 25, 93, MODEL);

// ir: the pin where your sensor is attached
// 25: the number of readings the library will make before calculating a mean distance
// 93: the difference between two consecutive measurements to be taken as valid
// MODEL: an int that determines your sensor:  1080 for GP2Y0A21Y
//                                            20150 for GP2Y0A02Y
//                                            (working distance range according to the datasheets)

void setup () {
  Serial.begin(9600);
  matrix.begin(0x70);  // pass in the address
  pinMode (IR1, INPUT);
  pinMode (IR2, INPUT);
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);

#if defined (__AVR_ATtiny85__)
  if (F_CPU == 16000000) clock_prescale_set(clock_div_1);

#endif
  pixels.begin();
}

int CountNum = 0;

void loop () {
  unsigned long pepe1 = millis();

  int dis1 = disSensor1.distance();
  int dis2 = disSensor2.distance();
  int count = 0;

  // when ppl come in a toilet
  if (dis1 < 80)
    for (count = 0; count < 10; count++)
    {
      delay(30);
      int dis1 = disSensor1.distance();
      int dis2 = disSensor2.distance();
      if (dis2 < 80)
      {
        CountNum++;

        { if (CountNum >= 6)
            CountNum = 6;
        }
        break;
      }
    }

  // when ppl go out a toilet
  if (dis2 < 80)
    for (count = 0; count < 10; count++)
    {
      delay(30);
      int dis1 = disSensor1.distance();
      int dis2 = disSensor2.distance();
      if (dis1 < 80)
      {
        CountNum--;
        { if (CountNum < 0)
            CountNum = 0;
        }
        break;
      }
    }

  // Num of people in an integer
//  Serial.print("The Num of Ppl: ");
  Serial.println(CountNum);
//  Serial.println();
//  delay(30);

  // Num of ppl in 3-LED lights
  if (CountNum == 0) {
    lightOn(0);
  } else if (CountNum >= 1 && CountNum <= 2) {
    lightOn(1);
  } else if (CountNum >= 3 && CountNum <= 4) {
    lightOn(2);
  } else if (CountNum >= 5) {
    lightOn(3);
  }

  //Num of ppl in LED matrix
  matrix.setTextSize(1);
  matrix.setTextColor(LED_GREEN);

  matrix.clear();
  matrix.setCursor(0, 0);
  matrix.print(CountNum);
  matrix.writeDisplay();
}

void lightOn(int num) {
  for ( int i = 0; i < NUMPIXELS; i++ ) {
    pixels.setPixelColor(i, pixels.Color(0, 0, 0));
  }
  for ( int i = 0; i < num; i++ ) {
    pixels.setPixelColor(i, pixels.Color(150, 0, 0));
  }

  pixels.show();
}

디자인

Rhino 를 사용하여 설계하였다.

Status

상황 보기. 실제 화장실의 변기가 몇퍼센트 사용되고 있는지 표시하는 장치.

Counter

화장실 카운터. 좌측 상단의 작은 사각형 안쪽에 LED Matrix 를 장착하였다.

완성 모습

디자인 파일은 이곳 에서 다운 받을 수 있다.

동영상

TO DO

  • 중복 체크가 되는 경우가 있어서 코딩을 수정할 필요가 있음
comments powered by Disqus