극한의 아두이노 DIY생활 - 시간을 재는 방석12
안녕하세요!! Jimae입니다!!
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
byte data[] = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE4, 0xFE, 0xE6}; // 0~9
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 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);
}
}
}
자 오늘은 이부분에 대해 알아 볼까요?
fndDisplayBuffer[0] = hour / 10;
fndDisplayBuffer[1] = hour % 10;
fndDisplayBuffer[2] = minute / 10;
fndDisplayBuffer[3] = minute % 10;
fndDisplayBuffer[4] = second / 10;
fndDisplayBuffer[5] = second % 10;
FND가 총 6개가 있기 때문에 데이터를 fndDisplayBuffer 배열에 6개씩 각각 이렇게 저장했어요.
시간 단위, 분 단위, 초 단위 이렇게 각각 계산해서 각 자리에 어떤 숫자가 들어가야하는지 따로 저장 한거죠
for(unsigned char num = 0; num < sizeof(fndDisplayBuffer); num++)
{
FNDOneShow((num + 1),fndDisplayBuffer[num]);
delay(fndDelayTime);
}
이 부분은 FND를 하나씩 키는거라고 보시면 됩니다.
FNDOneShow((num + 1),fndDisplayBuffer[num]);
이 함수 안에 FND를 ON시킬수 있는거죠 fndDisplayBuffer는 마찬가지로 아까 시간, 분, 초로 나눈 데이터가 들어있고
num은 현재 ON시키려는 FND의 자리수를 이렇게 함수로 넘겨주고 있습니다.
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);
}
}
}
자이제 FND를 키는 함수에 대해 분석을 해볼까요?
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);
}
}
현재 이문구는 FND를 position 기준으로 한개만 키고 나머지는 전부 OFF 시키겠다는 겁니다.
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);
}
}
이부분이 중요한것인대요.
FND 의 숫자를 키는 방법중 어떤식으로 해야하는지 저번에 설명 드린부분이 있습니다.
byte data[] = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE4, 0xFE, 0xE6}; // 0~9
이값이 의미하는것은 FND를 0~9까지 숫자를 키는대에 필요한 자리수라고 보시면됩니다.
즉 이표를 저렇게 데이터로 구현한것 이라고 보시면 되요.
byte segment = (data[number] & (0x01 << i)) >> i;
저 데이터를 저런식으로 비트 연산을 하는대요.
이것이 의미하는것은 예를 들면 첫번째 데이터인 0xFC를 보시면
이것은 2진수의 값으로 1111 1100 으로 보실수 있습니다. 이 데이터를 맨 오른쪽 부터 하나하나씩 1인지 0인지 판단하여 그값을 기준으로 그와 대응되는 a,b,c,d,e,f,g FND Pin을 제어하는 동작들 입니다.
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);
}
}
약간 이해하는대 복잡할수 있지만 아무래도 반복문 이라던지 비트연상을 처음보시는 분들은 어려우실것 같습니다.
하지만 기능적으로 보면 저렇게 한것도 그냥 저의 임의대로 만든것이기 때문에 그냥 그런갑다 넘어가 주시길 바랍니다.
지금 확인해보니 왜 이런식으로 구현했는지 과거의 저에게 멱살을 잡고 싶어지는 군요.
이상!! 오늘로!! 시간을 재는 방석 시리즈는 여기까지 하겠습니다.
다음에는 좀 간단한주제로 쉬어가며 글을썻다가 다른 주제로 다시 들고올게요!!
다들 안녕히 주무세요!
극한의 아두이노 DIY생활 - 시간을 재는 방석1
극한의 아두이노 DIY생활 - 시간을 재는 방석2
극한의 아두이노 DIY생활 - 시간을 재는 방석3
극한의 아두이노 DIY생활 - 시간을 재는 방석4
극한의 아두이노 DIY생활 - 시간을 재는 방석5
극한의 아두이노 DIY생활 - 시간을 재는 방석6
극한의 아두이노 DIY생활 - 시간을 재는 방석7
극한의 아두이노 DIY생활 - 시간을 재는 방석8
극한의 아두이노 DIY생활 - 시간을 재는 방석9
극한의 아두이노 DIY생활 - 시간을 재는 방석10
극한의 아두이노 DIY생활 - 시간을 재는 방석11
Hello friend!
I'm @steem.history, who is steem witness.
Thank you for witnessvoting for me.
please click it!
(Go to https://steemit.com/~witnesses and type fbslo at the bottom of the page)
[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.
@추천해
안녕하세요.
이 글은 SteemitKorea팀(@jungjunghoon)님께서 저자이신 @jimae님을 추천하는 글입니다.
소정의 보팅을 해드렸습니다 ^^ 항상 좋은글 부탁드립니다
SteemitKorea팀에서는 보다 즐거운 steemit 생활을 위해 노력하고 있습니다.
이 글은 다음날 다시 한번 포스팅을 통해 소개 될 예정입니다. 감사합니다!