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

in kr-dev 커뮤니티4 years ago

안녕하세요!! Jimae입니다.

오늘은 FND를 빠른시간안에 뿌리는 프로그램에대해 알아 보도록 하겠습니다.

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

우선 위의 간략하게 내용을 설명한거라 참고해서 보시길 바랍니다.

영상처럼 자리수를 하나하나 빠르게 켜야 전부 불이 들어오는대요.

#define POSITION_ON HIGH
#define POSITION_OFF LOW
#define SEGMENT_ON LOW
#define SEGMENT_OFF HIGH

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

unsigned int second = 0;
unsigned int minute = 0;
unsigned int hour = 0;

unsigned char fndDisplayBuffer[6] = {0,};

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);
     }
  }
}

벌써부터 어질어질 합니다.

프로그램이 시작하자마자 setup 함수가 실행되는대 여기서 FNDInit함수가 실행됩니다.


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

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);
  }
}

FNDInit 함수가 이렇게 보면 복잡 하지만 현재 FND 제어로만 사용하고 있는 모든 Pin을 전기적으로 초기화 하는 함수입니다.

3~13 번 Pin과 A4, A5 번 Pin을 모두 OUTPUT인 출력으로 초기화하고 모두 끄려고 OFF로 신호를 주었습니다.

#define POSITION_OFF LOW
#define SEGMENT_OFF HIGH

각각 OFF의 의미가 틀린대요 POSITION_OFF 같은경우 LOW가 OFF 이고
SEGMENT_OFF 경우 HIGH가 OFF인대

이러한 의미는 LOW는 GND(-)를 주겠다는 것이고 HIGH는 VCC(+)를 주겠다는 의미여서 회로 구성에 따라 틀리게 될것입니다.

극한의 아두이노 DIY생활 - 시간을 재는 방석5
이해 안되는 부분은 이것을 다시 참고하시면 될것같습니다.


unsigned int second = 0;
unsigned int minute = 0;
unsigned int hour = 0;

unsigned char fndDisplayBuffer[6] = {0,};

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);
}

FNDDisplay 함수가 이제 우리가 아는 FND에 데이터를 뿌려주는 함수인대요.

우선 처음 시작하자마자 fndDisplayBuffer 배열에다가 각 시간, 분, 초의 값을 계산해서 저장을 따로 합니다.

  for(unsigned char num = 0; num < sizeof(fndDisplayBuffer); num++)
  {
     FNDOneShow((num + 1),fndDisplayBuffer[num]);                
     delay(fndDelayTime);         
  }

그리고 이부분이 가장 핵심인대 이것은 원리를 알려드리는대 생각보다 오래걸릴것같아 내일 해보구요.

FNDOff 함수는 간단합니다. FND를 모두 꺼버리려고 쓰이는 함수입니다.

그런대 이함수는 시간을 재는 방석기능에 들어가 있지 않은 기능이어서 무시하셔도 될것 같습니다.

자 그럼 내일 FNDDisplay 를 다시 설명 드리겠습니다.

다들 좋은 하루 되세요!

극한의 아두이노 DIY생활 - 시간을 재는 방석1
극한의 아두이노 DIY생활 - 시간을 재는 방석2
극한의 아두이노 DIY생활 - 시간을 재는 방석3
극한의 아두이노 DIY생활 - 시간을 재는 방석4
극한의 아두이노 DIY생활 - 시간을 재는 방석5
극한의 아두이노 DIY생활 - 시간을 재는 방석6
극한의 아두이노 DIY생활 - 시간을 재는 방석7
극한의 아두이노 DIY생활 - 시간을 재는 방석8
극한의 아두이노 DIY생활 - 시간을 재는 방석9
극한의 아두이노 DIY생활 - 시간을 재는 방석10

Sort:  
 4 years ago 

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

Coin Marketplace

STEEM 0.04
TRX 0.32
JST 0.097
BTC 64114.13
ETH 1842.38
USDT 1.00
SBD 0.38