2016년 4월 12일 화요일

Digital lock&lock (음식물 보관 날짜 알려주기)

최근 부품을 여기저기서 많이 구매하다 보니 '작은 선물' 이라고 조그만 부품을 덤으로 주는 곳도 있었다. 버튼식 스위치 몇 개와 9V 전원 단자? 같은 손톱보다 작은 자잘한 부품을 random 하게 넣어 주는 것 같았다.
 막상 받았을 때는 이걸 뭐에 쓰지? 하지 그냥 구석에 처박아 두었다가, 문득 냉장고 정리를 하다가 유통기한이 기억나지 않는 식자재을 보니 '엇.. 이거 보관 기한을 보여 주면 안되나?' 라는 생각이 들었다.

그래서~ 이번 취미는 이름하야 '디지털 락&락' ~
이름은 그럴싸 한데, 이런 종류의 제품들이 저렴해야 하므로 어떻게 기능을 구현해야 할지 고민이 필요했다.

최대한 적은 비용, 적은 부품으로 최대의 효과를~

그래서 생각한 것은,
1. bubble display 로 남은 보관 기간을 보여 준다.
 - 버튼 스위치를 달아서 볼 때만 display 하게 배터리를 아껴 준다.
2. 버튼 스위치를 하나 더 달아서 보관 날짜를 세팅할 수 있게 해 준다.
3. time library 를 사용해서 24시간 지날 때 마다 보관 날짜를 하루씩 빼준다.

여기서 사용할 bubble display 는 요놈.
가이드는 이곳을 참조하면 된다.

가이드대로 아두이노 나노와 연결 해 주면
요런 모양이 나온다. 실제 용기에 부착 할 때는 나노보다 좀 더 작은 놈과 수은 건전지를 사용하면 부피를 확~ 줄일 수 있지 않을까? 

이 버튼을 누르면 bubble display 에 앙증맞게 보관 기간이 나온다.
부팅 시 초기값이 1일 이다. 
'설정' 버튼을 누르면 날짜를 하나씩 더해서 바꿔 줄 수 있다.

마지막으로 '리셋'.
설정했던 보관 날짜가 다 지나면 '0' 이 되는데, 이때는 expired 라는 값이 설정이 되서 리셋한 뒤 다시 사용해야 한다.
음.. 이부분이 좀 찜찜한데.. time library 에 reset 관련된 api 를 찾을 수가 없어서 일단 이렇게 구현했다.

코드는 이렇게 된다.

#include <TimeLib.h>
#include <Time.h>
#include "SevSeg.h"
SevSeg myDisplay;
int days = 0;
int expires = 0;
void setup()
{
  Serial.begin(9600);
... /* 이 부분은 bubble display 가이드 코드를 넣어 주면 된다. */
  days = day();
}
void loop()
{
  char tempString[10];
  sprintf(tempString, "%04d", days);
  while (Serial.available()) {
    myDisplay.DisplayString(tempString, 0);
    if (expired)
      break;
   
    if (!Serial.read()) {
      days++;
      Serial.println(days);
      if (days == 10) {
        days = 0;
        expired = 1;
      }
    }
  }
  if (days - day() < 0)
    days--;
 
  myDisplay.DisplayString(tempString, 0);
  delay(5);
}

댓글 없음: