BASIC4MCU | 질문게시판 | 답변 : 아두이노 74138 시계 소스코드 여기까지 해봤는데..
페이지 정보
작성자 master 작성일2018-08-04 15:43 조회37,063회 댓글12건본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2018-08-04 오후 3:46:50// by Ok-Hyun Park//int PBA1=A0,PBA2=A1,PBA3=A2,PBA4=A3;int SDA=A4,SCL=A5;int PBS1=2,PBS2=3,,PBS3=4,PBS4=5; // 시간설정int LED1=6; // RED_LEDint LED2=7; // dpconst byte la_74138=8,lb_74138=9;int pins[]={10,11,12,13};//int ON=HIGH,OFF=LOW;int s1,s2,s3,s4,a1,a2,a3,a4;int ms=0,s=0,m=0,h=0; // 시계int ss=0,mms=0,mm=0; // 스톱워치char t;//void setup(){for(int i=0; i<4; i++)pinMode(pins[i],OUTPUT);pinMode(LED1,OUTPUT); pinMode(LED2,OUTPUT);pinMode(la_74138,OUTPUT); pinMode(lb_74138,OUTPUT);pinMode(SCL,OUTPUT); pinMode(SDA,OUTPUT);}//void out7447(char t,char d){for(int j=0;j<4;j++){ if(t&(1<<j))digitalWrite(pins[j],1); else digitalWrite(pins[j],0); }switch(d){case 0: digitalWrite(lb_74138,0); digitalWrite(la_74138,0); break; // 분10case 1: digitalWrite(lb_74138,0); digitalWrite(la_74138,1); break; // 분1case 2: digitalWrite(lb_74138,1); digitalWrite(la_74138,0); break; // 초10case 3: digitalWrite(lb_74138,1); digitalWrite(la_74138,1); break; // 초1}delayMicroseconds(2500);}//void loop(){s1=digitalRead(PBS1); s2=digitalRead(PBS2); s3=digitalRead(PBS3); s4=digitalRead(PBS4);a1=digitalRead(PBA1); a2=digitalRead(PBA2); a3=digitalRead(PBA3); a4=digitalRead(PBA4);//if(s1==HIGH&&s2==LOW){digitalWrite(LED1,LOW);if(s3==LOW&&s4==HIGH){ digitalWrite(LED2,HIGH); }if(s3==HIGH&&s4==LOW){ digitalWrite(LED2,LOW); }}//if(s1==LOW&&s2==HIGH){ digitalWrite(LED1,LOW); }//if(s1==HIGH&&s2==HIGH){if(ms%50==0){ digitalWrite(LED1,!digitalRead(LED1)); }if(++ms>=100){ ms=0; if(++s>59)s=0; m++; }//out7447(m/10,0); out7447(m%10,1); out7447(s/10,2); out7447(s%10,3);}}
댓글 12
조회수 37,063hktsakura님의 댓글
hktsakura 작성일분과 초부분이 같이움직입니다;;;
master님의 댓글
master
아직도 138 출력이 제대로 연결되지 않았나봅니다.
최종 수정한 회로를 첨부하시고요
증상을 확인할 수 있도록 동영상 첨부해보세요
hktsakura님의 댓글
hktsakura 작성일
일단 프로그램을 이렇게 수정해봤는데여.
int PBA1=A0,PBA2=A1,PBA3=A2,PBA4=A3;
int PBS1=2,PBS2=3,PBS3=4,PBS4=5; // 시간설정
int LED1=6; // RED_LED
const byte la_74138=8,lb_74138=9;
int pins[]={10,11,12,13};
//
int ON=HIGH,OFF=LOW;
int s1,s2,s3,s4,a1,a2,a3,a4;
int ms=0,s=0,m=0; // sigye
int ss=0,mms=0,mm=0; // 스톱워치
char t;
//
void setup(){
for(int i=0; i<4; i++)
pinMode(pins[i],OUTPUT);
pinMode(LED1,OUTPUT);
pinMode(la_74138,OUTPUT);
pinMode(lb_74138,OUTPUT);
pinMode(SCL,OUTPUT);
pinMode(SDA,OUTPUT);
}
//
void out7447(char t,char d){
for(int j=0;j<4;j++){ if(t&(1<<j))digitalWrite(pins[j],1); else digitalWrite(pins[j],0); }
switch(d){
case 0: digitalWrite(lb_74138,0); digitalWrite(la_74138,0); break; // 분10
case 1: digitalWrite(lb_74138,0); digitalWrite(la_74138,1); break; // 분1
case 2: digitalWrite(lb_74138,1); digitalWrite(la_74138,0); break; // 초10
case 3: digitalWrite(lb_74138,1); digitalWrite(la_74138,1); break; // 초1
}
delayMicroseconds(2500);
}
//
void loop(){
s1=digitalRead(PBS1); s2=digitalRead(PBS2); s3=digitalRead(PBS3); s4=digitalRead(PBS4);
a1=digitalRead(PBA1); a2=digitalRead(PBA2); a3=digitalRead(PBA3); a4=digitalRead(PBA4);
//
if(s1==HIGH&&s2==LOW){ // 시간설정
out7447(m/10,0); out7447(m%10,1); out7447(s/10,2); out7447(s%10,3);
digitalWrite(LED1,LOW);
if(s3==LOW&&s4==HIGH){
out7447(m,0); out7447(m,1);
}
if(s3==HIGH&&s4==LOW){
out7447(s,2); out7447(s,3);
}
}
//
if(s1==LOW&&s2==HIGH){ // 스톱워치
digitalWrite(LED1,LOW);
out7447(mm/10,0); out7447(mm%10,1); out7447(ss/10,2); out7447(ss%10,3);
if(s3==LOW){
if(mms%50==0){
digitalWrite(LED1,!digitalRead(LED1));
}
if(++mms>=1){mms=0;}
if(++ss>99){ss=0; mm++;}
//
out7447(mm/10,0); out7447(mm%10,1); out7447(ss/10,2); out7447(ss%10,3);
}
if(s4==LOW){
out7447(mm=0,0); out7447(mm=0,1); out7447(ss=0,2); out7447(ss=0,3);
}
}
//
if(s1==HIGH&&s2==HIGH){
if(ms%50==0){ digitalWrite(LED1,!digitalRead(LED1));}
if(++ms>=10){ms=0; if(++s>59)s=0; m++;}
//
out7447(m/10,0); out7447(m%10,1); out7447(s/10,2); out7447(s%10,3);
}
}
시계 부분 코드를 약간 바꿔서 스톱워치 부분에 적용해보니 스톱워치 부분은 초 부분 따로 분 부분 따로 움직이긴 하지만, 시계모드에선 똑같이 움직이더군여..
master님의 댓글
master
if(++ms>=10){ ms=0; if(++s>59)s=0; m++; }
위 코드에 버그가 있군요
if(++ms>=10){ ms=0;
if(++s>59){ s=0; if(++m>59)m=0; }
}
hktsakura님의 댓글
hktsakura
고치니 시계가 잘 작동 됩니다.ㅎㅎ 스톱워치부분은 s3을 누르면 스톱워치 시작,정지, s4를 누르면 00초 00으로 초기화 되도록 만들었는데 s3부분을 누르면 스톱워치가 돌아가고 s3 버튼에서 손을떼면 스톱워치가 멈추는 상황입니다.
코드는 이렇게 되어있는데...
if(s1==LOW&&s2==HIGH){ // STOPWATCH
digitalWrite(LED1,LOW);
out7447(mm/10,0); out7447(mm%10,1); out7447(ss/10,2); out7447(ss%10,3);
if(s3==LOW){
if(mms%50==0){
digitalWrite(LED1,!digitalRead(LED1));
}
if(++mms>=1){mms=0;}
if(++ss>99){ss=0; mm++;}
}
if(s4==LOW){
out7447(mm=0,0); out7447(mm=0,1); out7447(ss=0,2); out7447(ss=0,3);
}
}
master님의 댓글
master
if(s4==LOW){
out7447(mm=0,0); out7447(mm=0,1); out7447(ss=0,2); out7447(ss=0,3);
}
리셋은 이렇게 해도 됩니다.
위 코드가 여러번 실행되더라도 아무런 문제가 없죠
//
if(s3==LOW){
srart/stop 스위치 경우에는 엣지 검출해서 1회만 실행 하도록 만들어야합니다.
//------------------------------------------------------
char run=0; // 전역변수에서 선언, 초기값 정지
char flag3=0;
//
if(s1==LOW&&s2==HIGH){ // STOPWATCH
digitalWrite(LED1,LOW);
out7447(mm/10,0); out7447(mm%10,1); out7447(ss/10,2); out7447(ss%10,3);
if(s3==LOW){
if(flag3==0){ flag3=1; run^=1; } // run 상태를 토글(start<->stop)
}
else flag3=0;
//
if(run){
if(mms%50==0){
digitalWrite(LED1,!digitalRead(LED1));
}
if(++mms>=1){ mms=0;}
if(++ss>99){ss=0; mm++;}
}
if(s4==LOW){
out7447(mm=0,0); out7447(mm=0,1); out7447(ss=0,2); out7447(ss=0,3);
}
}
hktsakura님의 댓글
hktsakura 작성일
8비트 로터리 스위치 돌리면서 시와 분 부분을 1씩증가시키는 부분인데 코드는 아래와같이 했습니다만...
a1=analogRead(PBA1); a2=analogRead(PBA2); a4=analogRead(PBA4); a8=analogRead(PBA8);
s1=digitalRead(PBS1); s2=digitalRead(PBS2); s3=digitalRead(PBS3); s4=digitalRead(PBS4);
//
if(s1==HIGH&&s2==LOW){ // 시간설정
out7447(m/10,0); out7447(m%10,1); out7447(s/10,2); out7447(s%10,3);
digitalWrite(LED1,LOW);
if(s3==LOW&&s4==HIGH){ // 시 설정
out7447(m/10,0); out7447(m%10,1);
m=a8 * 8 + a4 * 4 + a2 * 2 + a1;
if(m>23){
m=0;
}
delay(300);
}
if(s3==HIGH&&s4==LOW){ // 분 설정
out7447(s/10,2); out7447(s%10,3);
s = a8 * 8 + a4 * 4 + a2 * 2 + a1;
if(s>59){
s=0;
}
delay(300);
}
}
로터리스위치를 돌리면서 숫자를 올려야하는데 로터리스위치 부분은 전혀 모르겠네여;;
master님의 댓글
master
로터리 스위치도 일반 스위치와 마찬가지로 엣지 검출해서 처리하면 됩니다만
기계식 로터리 스위치는 채터링이 심해서 처리가 만만치 않을겁니다.
hktsakura님의 댓글
hktsakura 작성일혹시 여기에 DS1307을 적용시키면 코드 전체를 바꿔야하나여??
master님의 댓글
master
DS1307은 시계이고
스톱워치와는 상관없죠
코드가 좀 복잡해질 뿐
알고리즘만 잘 만들어서 코드를 만들면 되지 않을까요?
hktsakura님의 댓글
hktsakura
그러면 시계부분만 바꾸면 되는건가여??
if(s1==HIGH&&s2==HIGH){ // 시계
if(run){ // 시계모드때도 스톱워치 가동중
if(++mms>=1){ mms=0;}
if(++ss>99){ss=0; mm++;}
}
if(ms%50==0){ digitalWrite(LED1,!digitalRead(LED1));}
if(++ms>=5639){ ms=0;
if(++s>59){ s=0; if(++m>23)m=0; }
}
//
out7447(m/10,0); out7447(m%10,1); out7447(s/10,2); out7447(s%10,3);
}
이부분입니다.
master님의 댓글
master
만들고나서 잘 안되면 고민하세요
알고리즘을 만드는 것과
코드를 작성하고 디버깅하는 것
이런 것들도 스스로의 힘으로 자꾸 해야지 실력이 늘어납니다.