반응형
시계, 숫자 표시 등 활용 분야가 많은 7 segment 제어를 실습한다. 시계 알람 설정을 다이얼 노브를 사용하여 설정하는 방법을 알아보는 중이다.
회로 연결도는 아래와 같다. 여기서 부저는 연결하지 않아도 되고, 주로 7 segment 연결도를 참고하시면 됩니다.
잘 동작하는 소스코드
//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
};
byte segPin[8]={7,3,A3,A1,A0,6,A4,A2}; //사용핀{a,b,c,d,e,f,g,dp} 순서대로임
byte digitPin[4] = {8,5,4,A5}; //segment 위치 핀
unsigned long readTime=0; //현재시간
int d1 = 0; //1의 자리
int d2 = 0; //10의 자리
int d3 = 0; //100의 자리
int d4 = 0; //1000의 자리
void setup() {
for(int i=0;i<10;i++){
pinMode(segPin[i], OUTPUT);
}
for(int j=0;j<4;j++){
pinMode(digitPin[j], OUTPUT);
digitalWrite(digitPin[j], HIGH);
}
}
void loop() {
readTime = millis()/10; //10msec -> 1000 : 1sec
d1 = readTime%10; //1의 자리
d2 = (readTime/10)%10; //10의 자리
d3 = (readTime/100)%10; //100의 자리
d4 = (readTime/1000)%10; //1000의 자리
segOutput(3,d1,0); //1의 자리
if(readTime>=10) segOutput(2,d2,0); //10의 자리
if(readTime>=100) segOutput(1,d3,0); //10의 자리
if(readTime>=1000) segOutput(0,d4,0); //10의 자리
}
//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);
}
버튼 인터럽트 처리 반영한 소스코드를 참고하세요.
//a,b,c,d,e,f,g 상태값
const 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]={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 interruptPin = 2;//인터럽트핀
extern volatile unsigned long timer0_millis; //타이머변수
boolean state = true; //false //처음 타이머 동작 제어
unsigned long readTime=0; //현재시간
int d1 = 0; //1의 자리
int d2 = 0; //10의 자리
int d3 = 0; //100의 자리
int d4 = 0; //1000의 자리
void setup() {
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<4;j++){
pinMode(digitPin[j], OUTPUT);
digitalWrite(digitPin[j], HIGH);
}
}
void loop() {
if(state==true){ //스위치 상태가 true일때 카운트
readTime = millis()/1000; //1sec, 10: 10milisecond
d1 = readTime%10; //1의 자리
d2 = (readTime/10)%10; //10의 자리
d3 = (readTime/100)%10; //100의 자리
d4 = (readTime/1000)%10; //1000의 자리
}
//digit 0 display
segOutput(3,d1,0);
segOutput(2,d2,0);
segOutput(1,d3,0);
segOutput(0,d4,0);
//digit 0 no display
//if(readTime>=0)segOutput(3,d1,0); //1의 자리
//if(readTime>=10) segOutput(2,d2,0); //10의 자리
//if(readTime>=100) segOutput(1,d3,0); //10의 자리
//if(readTime>=1000) segOutput(0,d4,0); //10의 자리
}
//스위치 버튼 인터럽트 결과 처리
void switchFn(){
state=!state;
if(state==true){ // false
timer0_millis=0; //타이머 변수 리셋
}
}
//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);
}
참고
반응형
'개발자 > Arduino' 카테고리의 다른 글
아두이노 우노 보드와 브레드 보드 고정 아크릴 받침 (0) | 2022.04.07 |
---|---|
아두이노 가변 저항 7-segment 에 표시하기 smart knob (0) | 2022.04.04 |
아두이노 dht22 온도 습도 센서 테스트 (0) | 2022.04.04 |
아두아노 millis()함수 시간 다루기 (0) | 2022.04.04 |
아두이노 버튼처리 한번, 버튼 길게, 더블 클릭 감지하기 (0) | 2022.03.09 |
ATtiny13a 기반 가장 작은 제어 시스템 (0) | 2022.03.03 |
Arduino 에서 ATtiny13, ATtiny13a 프로그래밍하는 방법 (0) | 2022.02.18 |
Nano 33 IoT 보드 IoT Application (0) | 2022.02.16 |
더욱 좋은 정보를 제공하겠습니다.~ ^^