팅커캐드 7세그먼트 4자리 - tingkeokaedeu 7segeumeonteu 4jali


  • 온라인 가상시뮬레이터 : https://www.tinkercad.com
  • 공개회로도
    https://www.tinkercad.com/things/gfxPtEALiPU (숫자 카운터)
    https://www.tinkercad.com/things/cZMIpmyS1DC (시/분 아두이노시계)
    https://www.tinkercad.com/things/6IoV7yvXbE5 (6-Digit 7-Segment Display 아두이노 시계)

4-Digit 7-Segment Display 지난 시간에 실험했던 것을 가상시뮬레이터로 회로도을 만들어 보았습니다. 시계 회로도에서 추가로 6-Digit 7-Segment Display 형식으로 아두이노 시계를 만들어 보았으니깐 가상시뮬레이터로 한번 체험해보시고 수정할 코딩이 있으면 추가 코딩을 해보시기 바랍니다.

1. 4-Digit 7-Segment Display


1) 숫자 카운트 (0~9999)


  • 준비물 : 7-Segment Display 4개, 아두이노우노
  • 내용 : 7-Segment Display 부품의 핀 번호 순서에 맞게 아두이노우노에 연결하시오.

팅커캐드 7세그먼트 4자리 - tingkeokaedeu 7segeumeonteu 4jali

2-Digit 7-Segment Display 회로도에서 2개를 더 추가해서 4-Digit 7-Segment Display 회로도를 완성 했네요.


  • 참조 : 4-Digit 7-Segment Display 제어(아두이노)

참조 링크 post에서 숫자 카운트 (0~9999) 소스를 실험하시면 됩니다. 주의할 점은 아두이노 핀 번호에 대한 변수지정은 수정해야 합니다.

const byte segPin[8]={7,3,A3,A1,A0,6,A4,A2}; //사용핀{a,b,c,d,e,f,g,dp} 순서대로임 const byte digitPin[4] = {8,5,4,A5}; //segment 위치 핀

이 부분을 아래와 같이 수정하시고 소스는 동일합니다.

const byte segPin[8]={2,3,4,5,6,7,8,9}; //사용핀{a,b,c,d,e,f,g,dp} 순서대로임 const byte digitPin[4] = {A0,A1,A2,A3}; //segment 위치 핀

결과


0.01초 단위로 카운트를 하는 결과입니다.

팅커캐드 7세그먼트 4자리 - tingkeokaedeu 7segeumeonteu 4jali

2) 시간 출력


  • 준비물 : 7-Segment Display 4개, 스위치버턴 1개, 아두이노우노
  • 내용 : 7-Segment Display 부품의 핀 번호 순서에 맞게 아두이노우노에 연결하고, 스위치 버턴은 2번핀에 연결하시오.

팅커캐드 7세그먼트 4자리 - tingkeokaedeu 7segeumeonteu 4jali

스위치 버턴이 추가 된 회로도 입니다. 지난시간의 실제 4-Digit 7-Segment Display 부품으로 생각하시면 됩니다.


  • 참조 : 4-Digit 7-Segment Display 시계 만들기(아두이노)

참조 링크 post에서 아두이노 시계 소스를 실험하시면 됩니다. 여기에서 주의 할 점은 아두이노 핀 번호에 대한 변수지정입니다. 그 부분은 방금 했던 방식으로 그대로 변경하시면 됩니다.

const byte segPin[8]={7,3,A3,A1,A0,6,A4,A2}; //사용핀{a,b,c,d,e,f,g,dp} 순서대로임 const byte digitPin[4] = {8,5,4,A5}; //segment 위치 핀

이 부분을 아래와 같이 수정하시고 소스는 동일합니다.

const byte segPin[8]={2,3,4,5,6,7,8,9}; //사용핀{a,b,c,d,e,f,g,dp} 순서대로임 const byte digitPin[4] = {A0,A1,A2,A3}; //segment 위치 핀

결과


시리얼 모니터로 입력하면 시/분이 가상시뮬레이터의 7-Segment Display 부품에 출력됩니다. 참고로, 가상시뮬레이터가 회로도 복잡해서 실행 시 지연이 발생해서 1초 단위의 움직임이 발생하지 않습니다. "23:59:57"시간을 입력해서 3초 후 "00:00:00"이 되어야 하는데 움짤에 몇십초가 걸렸네요. 감안하시고 결과를 보시기 바랍니다. 그리고 스위치버턴을 누르면 12시 기준으로 시간 표시와 아니면 24시 기준으로 시간 표시로 변경할 수 있는 기능을 추가했습니다.

팅커캐드 7세그먼트 4자리 - tingkeokaedeu 7segeumeonteu 4jali

2. 6-Digit 7-Segment Display 회로도


  • 준비물 : 7-Segment Display 6개, 스위치버턴 1개, 아두이노우노
  • 내용 : 7-Segment Display 부품의 핀 번호 순서에 맞게 아두이노우노에 연결하고, 스위치 버턴은 2번핀에 연결하시오.

팅커캐드 7세그먼트 4자리 - tingkeokaedeu 7segeumeonteu 4jali

위에서 만든 회로도에서 2개의 7-Segment Display을 추가 연결했네요.


  • 참조 : 4-Digit 7-Segment Display 시계 만들기(아두이노)

참조 링크 post에서 아두이노 시계 소스를 실험하시면 됩니다. 시/분 출력을 시/분/초까지 출력시키면 됩니다. 마무리 부분이니 이부분은 지난 시간의 소스를 가져와서 수정된 부분을 보도록 할까요.

[종합소스]

//a,b,c,d,e,f,g 상태값 byte segValue[10][7] = { {1,1,1,1,1,1,0}, //0 {0,1,1,0,0,0,0}, //1 {1,1,0,1,1,0,1}, //2 {1,1,1,1,0,0,1}, //3 {0,1,1,0,0,1,1}, //4 {1,0,1,1,0,1,1}, //5 {1,0,1,1,1,1,1}, //6 {1,1,1,0,0,0,0}, //7 {1,1,1,1,1,1,1}, //8 {1,1,1,1,0,1,1} //9 }; const byte segPin[8]={3,4,5,6,7,8,9,10}; //사용핀{a,b,c,d,e,f,g,dp} 순서대로임 const byte digitPin[6] = {A0,A1,A2,A3,A4,A5}; //segment 위치 핀 const byte interruptPin = 2;//인터럽트핀 boolean state = false;//시간 출력형식 지정 extern volatile unsigned long timer0_millis; //타이머변수 unsigned long readTime; //현재타이머시간 int hour, min, sec; void setup() { Serial.begin(9600); pinMode(interruptPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(interruptPin), switchFn, FALLING); for(int i=0;i<10;i++){ pinMode(segPin[i], OUTPUT); } for(int j=0;j<6;j++){ pinMode(digitPin[j], OUTPUT); digitalWrite(digitPin[j], HIGH); } } void loop() { if(Serial.available()){ String inString = Serial.readStringUntil('\n'); int index1 = inString.indexOf(':'); int index2 = inString.indexOf(':',index1+1); int index3 = inString.length(); hour = inString.substring(0, index1).toInt(); min = inString.substring(index1+1,index2).toInt(); sec = inString.substring(index2+1,index3).toInt(); timer0_millis = ((long)hour*3600+min*60+sec)*1000; } readTime = millis()/1000; if(millis()>=86400000){ timer0_millis=0; } sec = readTime%60; min = (readTime/60)%60; hour = (readTime/(60*60))%24; if(state==true){ //12시 or 24시 출력모드 hour = hour%12; } segOutput(5,sec%10,0); //sec 1의 자리 segOutput(4,sec/10,0); //sec 10의 자리 segOutput(3,min%10,1); //min 1의 자리 segOutput(2,min/10,0); //min 10의 자리 segOutput(1,hour%10,1); //hour 1의 자리 segOutput(0,hour/10,0); //hour 10의 자리 } //12시 or 24시 출력 변경 void switchFn(){ state=!state; } //LED 초기화 void segClear(){ for(int i=0;i<8;i++){ digitalWrite(segPin[i], LOW); } } //LED 출력 void segOutput(int d, int Number, int dp){ segClear(); digitalWrite(digitPin[d], LOW); for(int i=0;i<7;i++){ digitalWrite(segPin[i], segValue[Number][i]); } digitalWrite(segPin[7], dp); delayMicroseconds(1000); digitalWrite(digitPin[d], HIGH); }

결과


"23:59:57" 시간을 입력하지만 이 역시 회로도가 복잡하게 디자인 되어 지연 렉이 발생하네요. 3초가 꽤 길게 걸리네요. 코딩에 문제가 있는게 아니라 지연 렉이니깐 감안하시고 동영상을 보시기 바랍니다.