개발자/Arduino

아두이노 가변 저항 7-segment 에 표시하기 smart knob

지구빵집 2022. 4. 4. 18:41
반응형

 

 

가변저항 값이 약간 오차가 생기는 이유를 찾고 있다.

 

 

가변저항 값을 읽어 표시하는 코드

 

//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 segPin[8]={7,3,11,A1,A0,6,10,A2}; //사용핀{a,b,c,d,e,f,g,dp} 순서대로임
const byte digitPin[4] = {8,5,4,9}; //segment 위치 핀

const byte interruptPin = 2;//인터럽트핀
extern volatile unsigned long timer0_millis; //타이머변수

boolean state = true; //false //처음 타이머 동작 제어

unsigned int readTime=0; //현재시간
int d1 = 0; //1의 자리
int d2 = 0; //10의 자리
int d3 = 0; //100의 자리
int d4 = 0; //1000의 자리

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<4;j++){
        pinMode(digitPin[j], OUTPUT);    
        digitalWrite(digitPin[j], HIGH); 
    }
}

void loop() {    
    
        readTime = analogRead(A5);    //1000: 1sec, 10: 10milisecond
        Serial.println(readTime);        
        d1 = readTime % 10;              //1의 자리
        d2 = (readTime/10)%10;      //10의 자리
        d3 = (readTime/100)%10;     //100의 자리
        d4 = (readTime/1000)%10;    //1000의 자리 
    

    segOutput(3,d1,0);
    segOutput(2,d2,0);
    segOutput(1,d3,0);
    segOutput(0,d4,0);

 
    //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); 
}

 

씨리얼 모니터에 나오는 값

 

아두이노 가변 저항 7-segment 에 표시하기

 

아두이노 가변 저항 7-segment 에 표시하기

 

참고 이미지 - 이런 식으로 구현한 Smart Knob 스마트 노브 참고 

 

https://youtu.be/ip641WmY4pA

 

 

 

반응형