BASIC4MCU | 질문게시판 | 답변 : (도와주세요..ㅜㅜ) 신호등 led 세그먼트 버튼 에러
페이지 정보
작성자 master 작성일2022-12-04 09:58 조회2,354회 댓글1건본문
위 사진의 파란색으로 동그랗게 해놓은 부분빼고
다른 led,세그먼트와 버튼들이 다 작동을 안하네요 ㅜㅠㅠㅠ
어떤게 문제인지 도와주실 수 있으신가요??
힘들게 결선 했는데 안되니 선들도 복잡하기도 해서 짐작이 안되네요 ㅜㅜ
https://blog.naver.com/yunc26/222585456600
위 주소의 블로그에서 참고하였습니다,,
아래의 코드대로 진행하였습니다..!
//
#include
// C++ type
const int carRed1=4,carYellow1= 5,carGreen1= 6,pedRed1= 7,pedGreen1= 8;
const int carRed2=9,carYellow2=10,carGreen2=11,pedRed2=12,pedGreen2=13;
const int pedButton=2,pedNotify=3;
// For 7-segment
uint8_t pinout1[7]={22,23,24,25,26,27,28};
uint8_t pinout2[7]={32,33,34,35,36,37,38};
uint8_t disp[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//
volatile int timerCount=0,buttonPressed=0mbuttonFlag=0,segmentCount=0;
//
void setup(){
pinMode(carRed1,OUTPUT); pinMode(carYellow1,OUTPUT); pinMode(carGreen1,OUTPUT); pinMode(pedRed1,OUTPUT); pinMode(pedGreen1,OUTPUT);
pinMode(carRed2,OUTPUT); pinMode(carYellow2,OUTPUT); pinMode(carGreen2,OUTPUT); pinMode(pedRed2,OUTPUT); pinMode(pedGreen2,OUTPUT);
pinMode(pedButton,INPUT); pinMode(pedNotify,OUTPUT);
for(int i=0;i<7;i++)pinMode(pinout1[i],OUTPUT);
for(int i=0;i<7;i++)pinMode(pinout2[i],OUTPUT);
initSegment();
MsTimer2::set(500,flashLED);
MsTimer2::start();
attachInterrupt(0,pedButtonPress,RISING);
}
//
void loop(){}
//
void flashLED(){
if(timerCount==1){
digitalWrite(carRed1,1); digitalWrite(carGreen2,1); digitalWrite(pedRed2,1);
//
if(buttonFlag==1){ digitalWrite(pedGreen1,1); digitalWrite(pedRed1,0); segmentCount=8; displaySegment(segmentCount,0,true); }
else{ digitalWrite(pedRed1,1); digitalWrite(pedGreen1,0); }
}
else if(timerCount<17){
if(buttonFlag==1){
if(timerCount%2){ segmentCount--; displaySegment(segmentCount,0,true); }
}
//
if(timerCount>=11){
if(buttonFlag==1)digitalWrite(pedGreen1,!digitalRead(pedGreen1));
}
//
if(timerCount==15){ digitalWrite(carGreen2,0); digitalWrite(carYellow2,1); }
}
else if(timerCount==17){
initSegment();
digitalWrite(carRed1,0); digitalWrite(pedGreen1,0); digitalWrite(carGreen1,1); digitalWrite(pedRed1,1); digitalWrite(carYellow2,0);
digitalWrite(carRed2,1);
if(buttonFlag==1){ digitalWrite(pedGreen2,1); digitalWrite(pedRed2,0); segmentCount=8; displaySegment(segmentCount,1,false); }
else { digitalWrite(pedRed2,1); digitalWrite(pedGreen2,0); }
}
else if(timerCount<33){
if(buttonFlag==1){
if(timerCount%2){ segmentCount--; displaySegment(segmentCount,1,false); }
}
//
if(timerCount>=27){
if(buttonFlag==1)digitalWrite(pedGreen2,!digitalRead(pedGreen2));
}
//
if(timerCount==31){ digitalWrite(carGreen1,0); digitalWrite(carYellow1,1); }
}
else if(timerCount==33){
initSegment(); segmentCount=0; buttonFlag=buttonPressed; buttonPressed=0;
digitalWrite(pedNotify,0); digitalWrite(carYellow1,0); digitalWrite(carRed1,1);
if(buttonFlag==1){ digitalWrite(pedGreen1,1); digitalWrite(pedRed1,0); }
else { digitalWrite(pedRed1,1); digitalWrite(pedGreen1,0); }
//
digitalWrite(pedGreen2,0); digitalWrite(pedRed2,1); digitalWrite(carRed2,0); digitalWrite(carGreen2,1);
timerCount=0;
}
timerCount++;
}
//
void pedButtonPress(){ buttonPressed=1; digitalWrite(pedNotify,1); }
//
void initSegment(){
for(int i=0;i<7;i++){ digitalWrite(pinout1[i],0); digitalWrite(pinout2[i],1); }
}
//
void displaySegment(int num,int index,bool isCathode){
for(int i=0;i<7;i++){
if(isCathode==true){
if(index==0)digitalWrite(pinout1[i],bitRead(disp[num],i));
else digitalWrite(pinout2[i],bitRead(disp[num],i));
}
else{
if(index==0)digitalWrite(pinout1[i],!bitRead(disp[num],i));
else digitalWrite(pinout2[i],!bitRead(disp[num],i));
}
}
}
소스코드는 정성을 들여서 자신의 스타일로 들여쓰기를 하세요
가독성이 좋아야지 수정이나 디버깅이 좀 더 쉬워집니다.
![]()
동그라미 치지 않은 우측의 세그먼트 부터 볼까요?
좌측은 common 단자가 GND에 연결되어서 콤몬 캐소드 타입의 세그먼트이고
우측은 common 단자가 5V에 연결되어서 콤몬 애노드 타입의 세그먼트임을 알 수 있습니다.
void initSegment(){
for(int i=0;i<7;i++){ digitalWrite(pinout1[i],0); digitalWrite(pinout2[i],1); }
}
세그먼트 초기화 코드도 좌측은 0으로 세그먼트 출력하고 있고, 우측은 1로 초기화 하고 있습니다.콤몬단자를 제대로 연결하지 않았는지 체크하세요//이번엔 신호등 LED를 체크 해보죠const int carRed1=4,carYellow1= 5,carGreen1= 6,pedRed1= 7,pedGreen1= 8;const int carRed2=9,carYellow2=10,carGreen2=11,pedRed2=12,pedGreen2=13;적색의 LED가 안들어온다는 것이죠?pinMode(carRed2,OUTPUT); pinMode(carYellow2,OUTPUT); pinMode(carGreen2,OUTPUT); pinMode(pedRed2,OUTPUT); pinMode(pedGreen2,OUTPUT);셋업함수에서 초기화 설정은 잘 되어 있고요carYellow2 LED 1개만 체크 해보겠습니다.//if(timerCount==15){ digitalWrite(carGreen2,0); digitalWrite(carYellow2,1); }}else if(timerCount==17){initSegment();digitalWrite(carRed1,0); digitalWrite(pedGreen1,0); digitalWrite(carGreen1,1); digitalWrite(pedRed1,1); digitalWrite(carYellow2,0);timerCount 15에서 ON, 17에서 OFF 됩니다.
다른 LED가 정상동작 한다면 타이머2 인터럽트도 정상적으로 실행 된다는 것이니 특별히 문제가 될만한 것이 소스코드에는 안보입니다.
LED 연결을 반대로 한 것이 아닌지 체크 해보세요
LED는 극성이 있어서 반대로 연결하면 동작하지 않습니다.
//
마지막으로 pedButton=2 을 체크 해보죠
//
attachInterrupt(0,pedButtonPress,RISING);
셋업함수에서 외부 인터럽트를 설정해서
void pedButtonPress(){ buttonPressed=1; digitalWrite(pedNotify,1); }
버튼을 누르면 인터럽트가 실행 됩니다.인터럽트 함수에서는 그 옆의 pedNotify LED를 켜고 있군요else if(timerCount==33){initSegment(); segmentCount=0; buttonFlag=buttonPressed; buttonPressed=0;digitalWrite(pedNotify,0); digitalWrite(carYellow1,0); digitalWrite(carRed1,1);이 LED는 timerCount==33 (마지막 값) 에서 끕니다.
댓글 1
조회수 2,354승천님의 댓글
승천 작성일
신호등 led 부분에서 동그리미 친 부분 제외한 led 극성은 +- 잘 되어있는데 안되더라구요 ㅜ
- 넣어야할 곳에 + 를 넣으니 불이 들어오긴하던데 그냥 켜 지기만하고 해야할 일을 수행을 못했어요
세그먼트는 숫자가 2 3 9 가 제대로 안들어오긴했지만 둘다 불 들어오긴 하네욥
그리고 여기서 버튼 인터럽트가 무슨 기능을 하는 것인지 잘 모르겠어요,,