극한의 아두이노 DIY생활 - 시간을 재는 방석6
안녕하세요! Jimae입니다.
저번까지 하드웨어적인 원리에 대해 설명 드렸고 오늘은!! 이제 프로그램을 해야죠? 소프트웨어쪽으로 설명을 드려야죠!
시간을 재는 방석 자체가 사람이 방석위에 앉았을때 시간이 1초마다 카운트해서 FND에 표시를 해주면 됩니다.
뭔가 쉽죠? 막상 들어가보면 어렵습니다.
방석안에 압력센서 2개를 각각 사람이 앉은 자리를 생각해서 배치해서 넣어야 합니다.
압력센서 끝부분을 납땜을 하여 아두이노와 연결한채로 압력센서만 방석안에 사람 엉덩이 부분이라고 할까요?
그러한 부분에 위치를 잡고 넣어야 압력센서가 잘 인식해서 데이터를 주다보니 그런식으로 배치했어요.
그때 당시의 이미지가 없어서 대충 그림으로 그려보았는대 방석 안에 압력센서가 있다보니 선이 보기싫게 삐죽 튀어나왔죠. ㅋㅋㅋㅋ
그 상태에서 선만 따로 빼서 아두이노로
이런식으로 배선했습니다.
자 그러면 중요한 부분인대 압력센서를 저렇게 배치하고 아두이노에 따로 FND와 압력센서의 선만 따와서 연결하면 하드웨어적인 부분은 다 끝난 상태에서 이제 어떤식으로 프로그램 만들어야 하는지 고민을 해야 합니다.
프로그램에는 몇가지 기능이 들어가야 하는지 따져보자면
FND를 주기적으로 Display해주는 기능
시간을 카운트 해주는 기능
압력센서의 데이터를 감지하는 기능
사용자가 자리를 이탈했을때 시간을 초기화 해주는 기능
총 이렇게 4가지의 기능을 구현을 해야합니다.
이렇게 4가지만 우선 구성을 하더라도 허접하지만 어느정도의 퀄리티가 나올거라고 생각하고 시작을 했습니다.
#include <MsTimer2.h>
#define START 1
#define STOP 0
#define POSITION_ON HIGH
#define POSITION_OFF LOW
#define SEGMENT_ON LOW
#define SEGMENT_OFF HIGH
#define SITDETECTION 500
#define SWITCHPIN 2
#define SWITCHDELAY 70
const unsigned char position_pin[] = {10,11,12,13,A5,A4}; //4자리 결정 핀 1,2,3,4,5,6
const unsigned char segment_pin[] = {3,4,5,6,7,8,9}; //세그먼트 제어 핀 A,B,C,D,E,F,G
const unsigned char pressure_pin[] = {A0,A1};
const int fndDelayTime = 3; //일시정지 시간
byte data[] = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE4, 0xFE, 0xE6}; // 0~9
unsigned char timeFlag = STOP;
unsigned int second = 0;
unsigned int minute = 0;
unsigned int hour = 0;
unsigned char fndDisplayBuffer[6] = {0,};
void setup() {
// put your setup code here, to run once:
FNDInit();
TimeCountInit();
SwitchInit();
MsTimer2::set(1000, TimeCount); // TimeCount함수를 1초마다 호출한다
MsTimer2::start();
Serial.begin (9600);
}
void loop() {
// put your main code here, to run repeatedly:
if(analogRead(pressure_pin[0]) >= SITDETECTION || analogRead(pressure_pin[1]) >= SITDETECTION)
{
timeFlag = START;
}
else
{
timeFlag = STOP;
}
FNDDisplay();
}
void FNDInit(void)
{
for(unsigned char num = 0; num < sizeof(position_pin); num++)
{
pinMode(position_pin[num], OUTPUT);
digitalWrite(position_pin[num], POSITION_OFF);
}
for(unsigned char num = 0; num < sizeof(segment_pin); num++)
{
pinMode(segment_pin[num], OUTPUT);
digitalWrite(segment_pin[num], SEGMENT_OFF);
}
}
void FNDDisplay(void)
{
fndDisplayBuffer[0] = hour / 10;
fndDisplayBuffer[1] = hour % 10;
fndDisplayBuffer[2] = minute / 10;
fndDisplayBuffer[3] = minute % 10;
fndDisplayBuffer[4] = second / 10;
fndDisplayBuffer[5] = second % 10;
for(unsigned char num = 0; num < sizeof(fndDisplayBuffer); num++)
{
FNDOneShow((num + 1),fndDisplayBuffer[num]);
delay(fndDelayTime);
}
}
void FNDOff(void)
{
for(unsigned char num = 0; num < sizeof(position_pin); num++) digitalWrite(position_pin[num], POSITION_OFF);
for(unsigned char num = 0; num < sizeof(segment_pin); num++) digitalWrite(segment_pin[num], SEGMENT_OFF);
}
void FNDOneShow(unsigned char position, unsigned char number) {
//4자리 중 원하는 자리 선택
for(unsigned char i = 0; i < sizeof(position_pin); i++) {
if(i + 1 == position){
digitalWrite(position_pin[i], POSITION_ON);
} else {
digitalWrite(position_pin[i], POSITION_OFF);
}
}
//8개 세그먼트를 제어해서 원하는 숫자 출력
for(unsigned char i = 0; i < 8; i++){
byte segment = (data[number] & (0x01 << i)) >> i;
if(segment == 1){
digitalWrite(segment_pin[7 - i], SEGMENT_ON);
} else {
digitalWrite(segment_pin[7 - i], SEGMENT_OFF);
}
}
}
void SwitchInit(void)
{
pinMode(SWITCHPIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(SWITCHPIN), swInput, FALLING);
}
void swInput(void)
{
TimeCountInit();
}
void TimeCountInit(void)
{
second = 0;
minute = 0;
hour = 0;
}
void TimeCount(void)
{
if(timeFlag != START) return;
second++;
if(second >= 60)
{
minute++;
if(minute >= 60)
{
hour++;
if(hour >= 24) hour = 0;
minute = 0;
}
second = 0;
}
}
짜잔! 그래서 나온 프로그램이 이렇습니다!!
라고 하기에는 너무길다... 오늘은 일정이 있어서 다음에 다시 설명을 이어갈까 합니다.
우선 프로그램 코드만 이렇게 올려놓고 가볼게요!!
좋은 하루 되세요!
극한의 아두이노 DIY생활 - 시간을 재는 방석1
극한의 아두이노 DIY생활 - 시간을 재는 방석2
극한의 아두이노 DIY생활 - 시간을 재는 방석3
극한의 아두이노 DIY생활 - 시간을 재는 방석4
극한의 아두이노 DIY생활 - 시간을 재는 방석5
[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.
@jimae 님 안녕하세요. 오늘부터 [일파만파 구독] 시작할께요~ 구독기간은 언제까지로 할까요? 일단은 연말까지로 해놓긴 했습니다만, 적당한 기간 말씀해주시면 수정할께요.
으음... 연말까지 해주시면 될것같아요... 제가 3~4일 마다 제로부터 시작하는 극한의 아두이노 DIY생활 기준으로 글을쓰고 있어서 그쪽으로 구독 받고싶습니다;;;
이글은 그냥 중급자 + 어느정도 아는사람이 이해할수있는 수준이라서요 ㅠㅠ
네~ 포스팅 주제에 따라 보팅드릴 수 있는 툴이 없기 때문에 @jimae 계정으로 매일 한번 보팅 드릴수 밖에 없습니다~
열심히 활동 하겠습니다 ㅠㅠ