극한의 아두이노 DIY생활 - 시간을 재는 방석12

in kr-dev 커뮤니티2 years ago

안녕하세요!! 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 의 숫자를 키는 방법중 어떤식으로 해야하는지 저번에 설명 드린부분이 있습니다.

image.png

극한의 아두이노 DIY생활 - 시간을 재는 방석5

byte data[] = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE4, 0xFE, 0xE6}; // 0~9

이값이 의미하는것은 FND를 0~9까지 숫자를 키는대에 필요한 자리수라고 보시면됩니다.

image.png

즉 이표를 저렇게 데이터로 구현한것 이라고 보시면 되요.

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

Sort:  

Hello friend!
I'm @steem.history, who is steem witness.
Thank you for witnessvoting for me.
image.png
please click it!
image.png
(Go to https://steemit.com/~witnesses and type fbslo at the bottom of the page)

 2 years ago 

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.


안녕하세요.
이 글은 SteemitKorea팀(@jungjunghoon)님께서 저자이신 @jimae님을 추천하는 글입니다.
소정의 보팅을 해드렸습니다 ^^ 항상 좋은글 부탁드립니다
SteemitKorea팀에서는 보다 즐거운 steemit 생활을 위해 노력하고 있습니다.
이 글은 다음날 다시 한번 포스팅을 통해 소개 될 예정입니다. 감사합니다!

Coin Marketplace

STEEM 0.18
TRX 0.16
JST 0.030
BTC 68180.36
ETH 2642.05
USDT 1.00
SBD 2.70