FND란 위같은 부품을 뜻하며 7-segment라고도 불리는 전자부품임
0~9까지의 숫자를 표시할수 있으며 한칸당 led가 하나씩 들어있다고 생각하면됨
다리가 총 10개있는데
이렇게 연결되어있슴 저 세모난거에 짝때기 그어져있는게 led이며 총 7개의 led와 dp가 있음
dp는 맨위 사진 숫자밑에 있는 . 을 말함
만약 숫자 1을 표시 하고 싶다고 하면 led b와 led c만 on하면 됨 아주 젓밥이기때문에 아두이노 핀 출력만 할수있으면 쉽게 숫자를 표시할수잇음
그리고 왼쪽은 공통애노드 오른쪽은 공통 캐소드인데 걍 led가 달려있는 방향이 다르다고 생각하면됨
이 한칸짜리 fnd를 4개 붙혀놓은게 있는데 저는 오늘 그것을 제어해볼것임
이렇게 생겼고 위에랑 비교해보면 com1,com2,com3,com4가 생긴것을 알수있음
각각 com1에 신호를 주면 첫번째 칸이 켜지고 com2에 신호를 주면 두번째 칸이 켜짐
즉 4개 붙어있는것도 아주 젖밥이라고 생각하고 해봤으나 생각한것 처럼 잘안되었음
이유는 회로도를 보면 알수있음
이게 4칸짜리 fnd의 회로도인데 잘보면 4칸의 각각 a는 a끼리,b는 b끼리 전부 연결되어있음
이말은 즉 만약 1을 표시하기 위해 b와 c에 신호를 주면 모든 칸에서 숫자 1이 표시됨
각각 칸에서 따로 제어하는게 아니라 묶여있기때문에 모든 칸에 똑같은 숫자가 나오게되는것임....
그래서 여기서 우리는 새로운 방법을 생각해봐야함 각각의 칸은 선택할수있지만 어떻게 하든 숫자를 표시하는 a~g까지의 포트는 서로 공유하고 있음...
그렇기에 사람들이 생각한 방법은 눈을 속이는 방법임
눈을 속이는 방법이 무엇이냐면 말그대로 fnd를 개빠르게 동작시켜서 사람들의 눈을 속이는것임
a~f의 칸을 공유하지만 각각의 칸은 선택할수 있으므로 1번째 칸을 선택하고 숫자를 개빠르게 뿌리고 그다음 두번째 칸을 선택하고 다른 숫자를 재빠르게 뿌리는것임 ㅡ..
이러한 방식으로 fnd를 고속동작 시키면 사람들은 각각 칸에 다른숫자가 표시되는것처럼 보이게 할수있음
사실은 빠르게 한칸씩 켜지고 있는것인데 말임...
어쨋든 설명은 이정도로 하고 저는 오늘 간단하게 카운터를 만들어볼것임 스위치를 누르면 숫자가 커지는 간단한 프로그램임
제가 팅커캐드로 개힘들게 그린 회로도임 아두이노 우노핀에 맞춰서 0번핀~7번은 a~f에 연결
com1 ~ com4 는 8번 핀 ~ 11번핀 마지막으로 스위치는 12번 핀에 연결하였음
#include <Arduino.h>
int seg[8] = {0,0,0,0,0,0,0,0}; //0:A ~ 7:dp
int com[4] = {8,9,10,11}; //0: com1 ~ 3:com4
int num = 0000;
int com1 = 0;
int com2 = 0;
int com3 = 0;
int com4 = 0;
void setup() {
pinMode(12,INPUT);
for(int i=0 ; i<=7 ; i++){
seg[i] = i;
pinMode(seg[i],OUTPUT);
}
for(int i=8 ; i<=11; i++){
com[i-8] = i;
pinMode(com[i-8],OUTPUT);
}
}
void seg_select(int num){
switch (num)
{
case 0:
seg[7] = 0; seg[6] = 0; seg[5] = 1; seg[4] = 1; seg[3] = 1; seg[2] = 1; seg[1] = 1; seg[0] = 1;
break;
case 1:
seg[7] = 0; seg[6] = 0; seg[5] = 0; seg[4] = 0; seg[3] = 0; seg[2] = 1; seg[1] = 1; seg[0] = 0;
break;
case 2:
seg[7] = 0; seg[6] = 1; seg[5] = 0; seg[4] = 1; seg[3] = 1; seg[2] = 0; seg[1] = 1; seg[0] = 1;
break;
case 3:
seg[7] = 0; seg[6] = 1; seg[5] = 0; seg[4] = 0; seg[3] = 1; seg[2] = 1; seg[1] = 1; seg[0] = 1;
break;
case 4:
seg[7] = 0; seg[6] = 1; seg[5] = 1; seg[4] = 0; seg[3] = 0; seg[2] = 1; seg[1] = 1; seg[0] = 0;
break;
case 5:
seg[7] = 0; seg[6] = 1; seg[5] = 1; seg[4] = 0; seg[3] = 1; seg[2] = 1; seg[1] = 0; seg[0] = 1;
break;
case 6:
seg[7] = 0; seg[6] = 1; seg[5] = 1; seg[4] = 1; seg[3] = 1; seg[2] = 1; seg[1] = 0; seg[0] = 1;
break;
case 7:
seg[7] = 0; seg[6] = 0; seg[5] = 0; seg[4] = 0; seg[3] = 0; seg[2] = 1; seg[1] = 1; seg[0] = 1;
break;
case 8:
seg[7] = 0; seg[6] = 1; seg[5] = 1; seg[4] = 1; seg[3] = 1; seg[2] = 1; seg[1] = 1; seg[0] = 1;
break;
case 9:
seg[7] = 0; seg[6] = 1; seg[5] = 1; seg[4] = 0; seg[3] = 0; seg[2] = 1; seg[1] = 1; seg[0] = 1;
break;
default:
break;
}
}
void com_select(int comd){
switch (comd)
{
case 1:
for(int i=0 ; i<=3;i++){
if(i == 0) digitalWrite(com[i],0);
else digitalWrite(com[i],1);
}
break;
case 2:
for(int i=0 ; i<=3;i++){
if(i == 1) digitalWrite(com[i],0);
else digitalWrite(com[i],1);
}
break;
case 3:
for(int i=0 ; i<=3;i++){
if(i == 2) digitalWrite(com[i],0);
else digitalWrite(com[i],1);
}
break;
case 4:
for(int i=0 ; i<=3;i++){
if(i == 3) digitalWrite(com[i],0);
else digitalWrite(com[i],1);
}
break;
default:
break;
}
}
void loop() {
if(digitalRead(12)){
num++;
}
com1 = (num/1000)%10;
com2 = (num/100)%10;
com3 = (num/10)%10;
com4 = (num/1)%10;
com_select(1);
seg_select(com1);
for(int i=0;i<=7;i++){
digitalWrite(i,seg[i]);
}
delay(5);
com_select(2);
seg_select(com2);
for(int i=0;i<=7;i++){
digitalWrite(i,seg[i]);
}
delay(5);
com_select(3);
seg_select(com3);
for(int i=0;i<=7;i++){
digitalWrite(i,seg[i]);
}
delay(5);
com_select(4);
seg_select(com4);
for(int i=0;i<=7;i++){
digitalWrite(i,seg[i]);
}
delay(5);
}
코딩에 대한 전문적인지식은 별로없기에 주먹구구식으로 코딩해보았음
loop 함수에서 1번칸 선택후 num숫자를 표시하고 다음은 2번칸 선택후 num숫자표시하고 ㅡ 이렇게 해서 모든칸을 무한반복해서 표시하고
따로 스위치가 눌리면 num을 증가해서 숫자가 커지도록 하엿음
KakaoTalk_20220505_132000166.mp4
잘됨 ㅇㅇ