코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
2014-08-08 16:53:15
만약 시간을 표시하고 싶을 때 한 자리 7세그먼트를 4개 쓰는 것보다
네 자리 7세그먼트를 하나 쓰는 것이 편할 것입니다.
피에조부저 같은 센서를 같이 사용하여 자신만의 알람시계를 만들 수도 있습니다.
출처 : embedded-lab.com / www.ebay.com
온도 센서와 사용해서 특정 온도를 넘어가는 경우 경고를 하게 할 수도 있습니다.
출처 : openenergymonitor.org
이제 네 자리 7세그먼트를 연결해봅시다.
연결 후 스케치로 원하는 숫자를 출력해봅시다.
마지막으로 숫자를 하나씩 카운트 해봅시다.
NO
|
부품명
|
수량
|
상세설명
|
1
|
아두이노 우노 R3
|
1
|
|
2
|
브레드보드
|
1
|
|
3
|
점퍼케이블
|
12
|
|
4
|
4자리 7 세그먼트
|
1
|
MT03641BRD을 사용했습니다. 다른 모듈을 사용할 경우 핀의 개수와 연결방법이 다를 수 있습니다. |
부품명 | 아두이노 우노 R3 | 브레드보드 | 점퍼케이블 | 4자리 7 세그먼트 |
파트 | X1 | X1 | X12 | X1 |
/* 네 자리 7세그먼트 연결하기 이 스케치는 kocoaFAB에서 만들었습니다. 이 스케치는 무료로 사용할 수 있습니다. */ int position_pin[] = {1,2,3,4}; //4자리 결정 핀 int segment_pin[] = {5,6,7,8,9,10,11,12}; //세그먼트 제어 핀 const int delayTime = 5; //일시정지 시간 //0 ~ 9를 표현하는 세그먼트 값 byte data[] = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE4, 0xFE, 0xE6}; void setup() { //4자리 결정 핀 출력용으로 설정 for(int i = 0; i < 4; i++) { pinMode(position_pin[i], OUTPUT); } //세그먼트 제어 핀 출력용으로 설정 for(int i = 0; i < 8; i++) { pinMode(segment_pin[i], OUTPUT); } } void loop() { show(1,1); //첫 번째 자리, 1출력 delay(delayTime); //0.005초 일시정지 show(2,2); //두 번째 자리, 2출력 delay(delayTime); //0.005초 일시정지 show(3,3); //세 번째 자리, 3출력 delay(delayTime); //0.005초 일시정지 show(4,4); //네 번째 자리, 4출력 delay(delayTime); //count(); //count함수 호출, count 함수 실행시 주석 해제(//를 지우면 됩니다.) } void show(int position, int number) { //4자리 중 원하는 자리 선택 for(int i = 0; i < 4; i++) { if(i + 1 == position){ digitalWrite(position_pin[i], LOW); } else { digitalWrite(position_pin[i], HIGH); } } //8개 세그먼트를 제어해서 원하는 숫자 출력 for(int i = 0; i < 8; i++){ byte segment = (data[number] & (0x01 << i)) >> i; if(segment == 1){ digitalWrite(segment_pin[7 - i], HIGH); } else { digitalWrite(segment_pin[7 - i], LOW); } } } /* 0001부터 하나씩 카운트하는 함수 */ void count() { for(int i = 0; i < 10; i++) { for(int j = 0; j < 10; j++) { for(int k = 0; k < 10; k++) { for(int l = 0; l < 10; l++) { show(1,i); delay(delayTime); show(2,j); delay(delayTime); show(3,k); delay(delayTime); show(4,l); delay(delayTime); } } } } delay(1000); }
사실, 동시에 4자리를 표현하기 위해서는 32개의 핀이 필요합니다.
하지만 우노는 그 만큼의 핀이 없기 때문에 다음과 같은 방법을 사용합니다.
4개의 자리 선택 핀과 8개의 세그먼트 제어 핀을 공유합니다.
4개의 자리 선택 핀을 통해서 어느 자리에 숫자를 출력할 지를 선택합니다.
여기서 다음문제는 공유되는 세그먼트 제어 핀 때문에 한번에 같은 숫자만 출력된다는 것입니다.
그래서 잔상효과를 사용합니다. 빠르게 원하는 숫자를 원하는 위치에 하나씩 출력하지만
빠르기 때문에 우리 눈에는 동시에 나온 것 처럼 보이는 것입니다.
//0 ~ 9를 표현하는 세그먼트 값
byte data[] = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE4, 0xFE, 0xE6};
위의 값들은 16진수 입니다. 총 8개의 세그먼트 (A, B, C, D, E, F, G, DP)당 한 바이트 씩을 할당해서 표현했습니다.
void show(int position, int number) {
//4자리 중 원하는 자리 선택
for(int i = 0; i < 4; i++) {
if(i + 1 == position){
digitalWrite(position_pin[i], LOW);
} else {
digitalWrite(position_pin[i], HIGH);
}
}
출력을 원하는 위치에 LOW값을 줍니다.
//8개 세그먼트를 제어해서 원하는 숫자 출력
for(int i = 0; i < 8; i++){
byte segment = (data[number] & (0x01 << i)) >> i;
if(segment == 1){
digitalWrite(segment_pin[7 - i], HIGH);
} else {
digitalWrite(segment_pin[7 - i], LOW);
}
}
}
만약 숫자 8를 출력하기 위해서, A 세그먼트를 키고 싶다고 가정합시다.
i = 7일 때, 비트 연산자를 통해서 segment가 계산됩니다.
data[8] = 0xFE = 1111 1110입니다.
0x01 << 7은 0000 0001에서 7만큼 왼쪽으로 이동 하라는 뜻이기 때문에 1000 0000입니다.
두 바이트를 &연산 하면,
1111 1110
&1000 0000
--------------
1000 0000
1000 0000을 오른쪽으로 7번 이동하므로 1이됩니다.
결국 segment값이 1이 됩니다.
/* 0001부터 하나씩 카운트하는 함수 */ void count() { for(int i = 0; i < 10, i++) { for(int j = 0; i < 10, j++) { for(int k = 0; k < 10, k++) { for(int l = 0; l < 10, ㅣ++) { show(1,i); delay(delayTime); show(2,j); delay(delayTime); show(3,k); delay(delayTime); show(4,l); delay(delayTime); } } } }
delay(1000); }
위 함수는 0001부터 하나씩 카운트 하는 함수입니다.
카운트 올라가는 속도를 조절하려면 1000값을 조절하세요.
count함수를 실행하기 위해서는 주석을 해제하셔야 합니다.
주석 해제는 loop함수 안에 count함수 앞에 //를 지우시면 됩니다.
kocoafabeditor
항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!