아두이노 fnd 코딩 - adu-ino fnd koding

아두이노 fnd 코딩 - adu-ino fnd koding

멀터펑션실드를 사용한 FND 기본 사용법이다. 별도 라이브러리없이 기능할 수 있는 소스코드이다.

라이브러리를 사용하면 편리하지만 제공되는 기능 외에 다른 기능을 쓸수 없다. 반면 이렇게 만들면 원하는 기능을 사용자가 추가할 수 있다.

버튼 사용 소스

#include <TimerOne.h>
#include <Wire.h>
#include <MultiFuncShield.h>

void setup() 
{
  Serial.begin(9600);
  Timer1.initialize();
  MFS.initialize(&Timer1);
}

int count = 0;

void loop() 
{
  byte btn = MFS.getButton();
  
  if (btn)
  {
    byte buttonNumber = btn & B00111111;    // 1, 2, 3
    byte buttonAction = btn & B11000000;

    if ((buttonNumber == 1) && (buttonAction == BUTTON_SHORT_RELEASE_IND))
      count++;
  }
  if (count%2==0) 
  {
    MFS.write(1234);
    Serial.println("1234");
  }
  else 
  {
    MFS.write(5678);
    Serial.println("5678");
  }

}

기본 소스

/* Define shift register pins used for seven segment display */
#define LATCH_DIO 4
#define CLK_DIO 7
#define DATA_DIO 8
 
/* Segment byte maps for numbers 0 to 9 */
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};
/* Byte maps to select digit 1 to 4 */
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};
 
void setup ()
{
  /* Set DIO pins to outputs */
  pinMode(LATCH_DIO,OUTPUT);
  pinMode(CLK_DIO,OUTPUT);
  pinMode(DATA_DIO,OUTPUT);
  }
 
/* Main program */
void loop()
{
 
  /* Update the display with the current counter value */
  WriteNumberToSegment(0 , 0);
  WriteNumberToSegment(1 , 1);
  WriteNumberToSegment(2 , 2);
  WriteNumberToSegment(3 , 3);
}
 
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */
void WriteNumberToSegment(byte Segment, byte Value)
{
  digitalWrite(LATCH_DIO,LOW);
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );
  digitalWrite(LATCH_DIO,HIGH);
}

아두이노 fnd 코딩 - adu-ino fnd koding

블로그 독자분들 중에 내용을 어려워하는 분들이 계실 수 있는데 이 시리즈 블로그의 목적이 해보는 데에 있지 단순 읽기용은 아닐 수 있습니다, 그렇다고 어려운 것은 당연 아닙니다, 어렵다고 느껴지시는 분들은 “초보자를 위한 아두이노 코딩 입문- 1 에서 10” 까지 훑어 보시면 되겠습니다. 당연히 눈팅하는 것이 아니라 직접 배선 코딩을 곁들여 재미로 해 보시기 바랍니다

7세그먼트 LED는 점(DP)을 포함하여 위그림에서 처럼 8개의 조각으로 구성된다. 이 7세그먼트LED는 그림의 좌측에서 볼 수 있듯이 가운데가 공통 즉 Common으로 사용된다. 2가지 종류의 즉 양극(Anode:애노우드) 형과 음극(Cathode:케소우드) 형이 있을 수 있는데 상기의 그림은 양극 형이다. 즉 공통 단자에 양의 전압 또는 HIGH 상태 즉 + 를 가한 상태에서 나머지 8개(A,B,C,D,E,F,G,DP)를 아두이노 우노 디지털 출력 단자 2번부터 9번까지 연결하여 0V 또는 LOW 상태를 가하면 7세그먼트가 ON 된다. 반대로 HIGH 상태를 걸어주면 LED 양단이 동시에 HIGH 상태가 되어 전압 차이가 없어지므로 LED 가 OFF 된다.

양극 형인지 음극 형인지 여부는 3.3V 이하의 전압을 공통(Common)과 아래 8개 중 하나의 핀에 가해서 ON 이 되는지 ON 이 안되면 전압 방향을 바꿔 확인해 보면 된다. 한번 잠깐 전류제한 저항 없이 전압을 가해도 큰 문제는 없다.

7세그먼트 배선에 있어서도 전류를 제한하기 위한 저항은 필수적이다. 300Ω 저항을 1개 사용하였으나 사실 200∼470옴 사이의 값을 가지면 무방하다,

7세그먼트 LED를 ON OFF 하기 위한 8개의 배선을 아두이노 우노의 디지털 출력 핀 2에서 9번까지를 할당하여 연결한다. 즉 프로그램에서 FND[8]에 지정된 값이 바로 디지털 출력 핀 설정이다. 참고로 핀 0 과 1은 시리얼 통신에 할당되어 있어 USB 케이블에 의해 코드 업로딩에 사용된다.

그 다음 FND_DATA[] 배열(Array)에서는 0,1,2,3,4,5,6,7,8,9,A,b,C,d,E 및 점(.) 에 해당하는 데이터를 사전에 설정해야 한다.

첫 번째 데이터 0xC0 예를 보기로 하자. 0x는 단지 16진법 또는 Hexa 라는 뜻이다. 중요한 부분은 C0이다. 16진법에서 C는 십진법으로는 12에 해당한다. 12를 2진법의 비트 형태로 풀어서 표현하면 즉 1X2^3+1X2^2+0X2^1+0X2^0 이므로 앞 계수를 따내면 1100이 된다. 아울러 16진법의 0은 2진법에서 0000 이 된다. 즉 16진법의 C0는 2진법으로 1100 0000 이 된다.

1 1 0 0 0 0 0 0

H G F E D C B A

지금 사용하는 7세그먼트가 양극 형이라면 3.3V 또는 5V의 전압이 가해진 전류제한 저항과 함께 공통(Common) 단자가 HIGH 상태이므로 출력 데이터 핀 G 와 H에 같이 HIGH 상태를 출력해 주면 8번 핀 G 와 9번 핀 H 세그먼트에는 전압 차가 0이 되어 OFF가 되며 나머지 출력 데이터 핀에는 LOW를 출력하게 되어 F,E,D,E,B,A 세그먼트의 LED는 ON이 된다. 결과는 “0”을 보여주게 된다.

끝에서 두 번째 데이터 0xF7은 2진법으로 1111 0111이 되어 D만 ON 즉 HIGH가 되는데 이는 언더 바 즉(_)를 나타낸다.

마찬가지로 0x7F는 2진법으로 0111 1111이 되어 H만 ON 즉 HIGH가 되는데 이는 점(.)을 나타낸다.

정수형 변수 cnt는 0에서 17까지 즉 18개 7세그먼트 문자 개수를 나타낸다.

setup()에서 아두이노 2번 핀에서 9번 핀에 해당하는 8개의 데이터 핀을 출력 즉 OUTPUT으로 설정한다.

loop()에서 처음 FND_display(FND_DATA[cnt]);를 실행하면 cnt = 0이므로 0xC0가 data 변수로 FND_display()로 넘겨지고 bitRead(data,z)에서 z를 0에서 7까지 8번 loop를 돌려 7번째(G) 와 8번째(H)가 “1” 이라는 점을 확인하고 FND(z)의 값을 HIGH 상태로 설정해 준다. 그러면 digitalWrite() 명령에 의해 해당 핀에 HIGH 상태를 출력해 주면 현재 양극 형 7세그먼트 LED 이므로 나머지 세그먼트들만 ON이 되어 “0”을 보여 주게 된다.

//7segment_LED_ON_OFF

byte FND[8] = {2,3,4,5,6,7,8,9};
byte FND_DATA[] = {0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XD8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E,0XF7,0X7F};

byte cnt = 0;

void setup() {
byte z;
for(z=0; z<8; z++) {
pinMode(FND[z],OUTPUT);
}
}

void FND_display( byte data) {
byte z;
for(z=0; z<8; z++) {
digitalWrite(FND[z],bitRead(data,z));
}
}

void loop() {
FND_display(FND_DATA[cnt]);
cnt++;
if( cnt>17) cnt = 0;
delay(1000);
}//끝