Front-end_dev
FND 점등 (알고리즘) 본문
문제 : 2개의 FND를 아두이노 보드에 점등하세요
솔루션1 : FND는 7핀이니까 아두이노 보드에 0~13핀에 꽃아서 구현한다.
솔루션2 : 흠... 더 좋은 방법이 잇을텐데...
제가 처음에 생각한 솔루션2는 다음과 같습니다.
두개의 FND를 매우빠르게 구현하면 되지않을까?? 어,,, 그다음에는..... time control을 구현할까? 아 잠깐... 똑같은포트를공유하면 둘다같은것을 출력하게되는데... 각각 제어를 해야겠네... 어떻게하지??.... 하...
고민을 하면 할수록 더 이상한 쪽으로 빠지게되었습니다.
근데 같은반에 자바쪽으로 공부하던 동생이 한 명 잇었는데 그 동생하고 저만 솔루션2쪽으로 생각을 하고있었습니다.
그리고 좀 있다가 그동생이 성공을 하게 됐습니다. 그 동생의 알고리즘을 듣고 그자리에서 온몸에 소름끼치면서 감탄했습니다ㅡㅡ; 그 동생의 솔루션을 듣고 그 알고리즘을 바탕으로 코드를만들고 약간 응용하여 마무리하게 됬습니다.
다시문제로..
FND 1개의 포트(7개 dot는뻇음)를 이용하여 FND2개를 순차점등해보기.
알고리즘 : 사람이 인지하지 못할 속도(매우빠르게)로 FND하나씩 점등하는 식으로 구현한다.
1. GND or VCC 제어 (디코더의구현)
2. time control 구현
우선포트를 공유하므로 1을출력하거나 2를 출력하거나 3을출력하거나 n을출력할때 m개의 FND는 같은숫자를 출력하데 될 것 입니다. 이때, 필요한게 바로 1번(디코더) 구현의 필요성입니다!!
그림으로 보면 이해하기 쉽습니다.
자, 이제 각각의 FND를 제어 할 수 있게 됬습니다. 90%가 끝났다고 봐도 됩니다.
이제 마지막인 time control을 구현 해야합니다.
예를들어, 1초동안 왓다갓다하는 표시를 50번표시하고싶다. 그럼 pesudo code로 다음과같이 할 수 있습니다.
for(index = 0; index < 50; index++) {
display_left();
delay(1); // millisecond , 0,01 second
display_right();
delay(1); // sum = 0.02 second
}
2번은 정말 별거아닌데 time control을 한번도 구현해보지 못한 사람은 코드로 구현할 떄 멍해집니다.. 제가그랫어요...
결론 : 이것의 구현은 포트절약뿐아니라 동시에 그 FND4개같이달려있는거잇잖아요? 그거구현햇다고 보심됩니다. 이런 간단한문제에서 이런 귀한 경험을... ㅎㅎ 마무리로 코드와 시연 동영상 올리고 끝내겠습니다.
FND 2개
FND 3개
아 그리고 지금 점등되는거 보면 희미하게 불들어오는거는 애노드FND로 구현하면 없어지더라고요... 혹은 제가 회로의 이해가 부족해서 그럴 수도 있고용.....
마지막으로 코드
const int a = 2;const int b = 3;const int c = 4;const int d = 5;const int e = 6;const int f = 7;const int g = 8;const int LEFT_FND_GND = 9;const int RIGHT_FND_GND = 10;const int Hundred_FND_GND = 11;int decimal_value = 0;int Hundred_value = 0;void flash(int cnt) {// cnt(1의자리)가 10의 배수가 되면 10의자리를 1씩 증가시킨다if(cnt % 10 == 0 && cnt != 0) decimal_value++;// 1의자리 추출cnt = cnt % 10;// 1초 구현 : 0.02초 X 50// 1.5초 구현 0.03초 X 50for(int i=0; i<50; i++) {//1의자리 FND 출력digitalWrite(Hundred_FND_GND,HIGH);digitalWrite(RIGHT_FND_GND,HIGH);digitalWrite(LEFT_FND_GND,LOW);display_num(decimal_value);delay(1); // 0.01 second//10의자리 FND 출력digitalWrite(Hundred_FND_GND,HIGH);digitalWrite(LEFT_FND_GND,HIGH);digitalWrite(RIGHT_FND_GND,LOW);display_num(cnt);delay(1);//100의자리 FND 출력digitalWrite(LEFT_FND_GND,HIGH);digitalWrite(RIGHT_FND_GND,HIGH);digitalWrite(Hundred_FND_GND,LOW);display_num(Hundred_value);delay(1); // sum = 0.03 second}}void display_num(int cnt) {switch(cnt) {case 0 : {digitalWrite(b,HIGH);digitalWrite(c,HIGH);digitalWrite(a,HIGH);digitalWrite(d,HIGH);digitalWrite(e,HIGH);digitalWrite(f,HIGH);digitalWrite(g,LOW);}break;case 1 : {digitalWrite(b,HIGH);digitalWrite(c,HIGH);digitalWrite(a,LOW);digitalWrite(d,LOW);digitalWrite(e,LOW);digitalWrite(f,LOW);digitalWrite(g,LOW);}break;case 2 : {digitalWrite(a,HIGH);digitalWrite(b,HIGH);digitalWrite(g,HIGH);digitalWrite(e,HIGH);digitalWrite(d,HIGH);digitalWrite(c,LOW);digitalWrite(f,LOW);}break;case 3 : {digitalWrite(a,HIGH);digitalWrite(b,HIGH);digitalWrite(g,HIGH);digitalWrite(c,HIGH);digitalWrite(d,HIGH);digitalWrite(f,LOW);digitalWrite(e,LOW);}break;case 4 : {digitalWrite(f,HIGH);digitalWrite(g,HIGH);digitalWrite(b,HIGH);digitalWrite(c,HIGH);digitalWrite(a,LOW);digitalWrite(d,LOW);digitalWrite(e,LOW);}break;case 5 : {digitalWrite(a,HIGH);digitalWrite(f,HIGH);digitalWrite(g,HIGH);digitalWrite(c,HIGH);digitalWrite(d,HIGH);digitalWrite(b,LOW);digitalWrite(e,LOW);}break;case 6 : {digitalWrite(a,HIGH);digitalWrite(c,HIGH);digitalWrite(d,HIGH);digitalWrite(e,HIGH);digitalWrite(f,HIGH);digitalWrite(g,HIGH);digitalWrite(b,LOW);}break;case 7 : {digitalWrite(a,HIGH);digitalWrite(b,HIGH);digitalWrite(c,HIGH);digitalWrite(f,HIGH);digitalWrite(d,LOW);digitalWrite(e,LOW);digitalWrite(g,LOW);}break;case 8 : {digitalWrite(a,HIGH);digitalWrite(b,HIGH);digitalWrite(c,HIGH);digitalWrite(d,HIGH);digitalWrite(e,HIGH);digitalWrite(f,HIGH);digitalWrite(g,HIGH);}break;case 9 : {digitalWrite(a,HIGH);digitalWrite(b,HIGH);digitalWrite(c,HIGH);digitalWrite(d,HIGH);digitalWrite(f,HIGH);digitalWrite(g,HIGH);digitalWrite(e,LOW);}break;}}void setup() {for(int i=2; i<=11; i++) {pinMode(i,OUTPUT);}}void loop() {for(int i=0; i<100; i++) {flash(i);}decimal_value = 0;//Hundred_value = Hundred_value == 9 ? 0 : Hundred_value++; 삼항연산자안먹히는듯??if(Hundred_value == 9) Hundred_value = 0;else Hundred_value++;}