아두이노 버튼 누르면 숫자 증가 감소 - adu-ino beoteun nuleumyeon susja jeung-ga gamso


프로그래밍/Arduino

버튼스위치로 숫자 변경하기

2017. 4. 20. 12:04

  1. 준비물
    - 7segment 1개
    - 버튼스위치 2개
    - 10㏀ 저항 2개
    - 220Ω 저항 1개
  2. 코드
  3. int digit = 0;
    byte digits[10][7] = {
      {1, 1, 1, 1, 1, 1, 0},
      {0, 1, 1, 0, 0, 0, 0},
      {1, 1, 0, 1, 1, 0, 1},
      {1, 1, 1, 1, 0, 0, 1},
      {0, 1, 1, 0, 0, 1, 1},
      {1, 0, 1, 1, 0, 1, 1},
      {0, 0, 1, 1, 1, 1, 1},
      {1, 1, 1, 0, 0, 0, 0},
      {1, 1, 1, 1, 1, 1, 1},
      {1, 1, 1, 0, 0, 1, 1},
    };
    
    const int minusButtonPin = 2;
    const int plusButtonPin = 3;
    
    void setup() {
      //pin mode setup
      for (int i = 2 ; i < 12 ; i++) {
        if (i < 4) {
          pinMode(i, INPUT);
        }
        else {
          pinMode(i, OUTPUT);
        }
      }
      //dot pin off
      digitalWrite(11, LOW);
    }
    
    void loop() {
      //push minus button
      if (digitalRead(minusButtonPin) == HIGH) {
        if (digit == 0) {
          digit = 9;
        }
        else {
          digit--;
        }
      }
      
      //push plus button
      else if (digitalRead(plusButtonPin) == HIGH) {
        if (digit == 9) {
          digit = 0;
        }
        else {
          digit++;
        }
      }
    
      outputDigit(digit);
      delay(200);
    }
    
    //output 7segment number
    void outputDigit(int digit) {
      for (int i = 4 ; i < 11 ; i++) {
        for (int j = 0 ; j < 6 ; j++) {
          digitalWrite(i, digits[digit][i - 4]);
        }
      }
    }
    
    
  4. 영상

'프로그래밍/Arduino' Related Articles


2개의 push button으로 FND의 숫자 카운트를 up/down 시키는 실습

회로도...여기서는 Common Anode 타입의 FND를 사용

아두이노 버튼 누르면 숫자 증가 감소 - adu-ino beoteun nuleumyeon susja jeung-ga gamso

 

브레드보드 연결도

아두이노 버튼 누르면 숫자 증가 감소 - adu-ino beoteun nuleumyeon susja jeung-ga gamso

4번핀에 연결된 스위치로 숫자 카운트를 up, 5번핀에 연결된 스위치로 숫자 카운트를 down하는 스케치

#define FND_A 13
#define FND_B 12
#define FND_C 11
#define FND_D 10
#define FND_E 9
#define FND_F 8
#define FND_G 7
#define FND_DP 6

#define UP  4 
#define DN  5

#define dW digitalWrite
#define ON LOW
#define OFF HIGH

int gCnt = 0;

void setup() {
  for (int i=6;i<14;i++) pinMode(i, OUTPUT);
  pinMode(UP, INPUT_PULLUP);
  pinMode(DN, INPUT_PULLUP);  
}

void loop() {
  readUpSw();  // UP 스위치 처리
  readDnSw();  // DOWN 스위치 처리
  dispFnd(gCnt);
}

void dispFnd(int val)
{
  static int prevVal = -1;

  if (prevVal != val) {   // FND에 표시할 값이 바뀐 경우에만 표시를 변경
    switch (val) {
      case 0:
        dW(FND_A, ON); dW(FND_B, ON); dW(FND_C, ON); dW(FND_D, ON); dW(FND_E, ON); dW(FND_F, ON); dW(FND_G, OFF); 
        break;
      case 1:
        dW(FND_A, OFF); dW(FND_B, ON); dW(FND_C, ON); dW(FND_D, OFF); dW(FND_E, OFF); dW(FND_F, OFF); dW(FND_G, OFF); 
        break;
      case 2:
        dW(FND_A, ON); dW(FND_B, ON); dW(FND_C, OFF); dW(FND_D, ON); dW(FND_E, ON); dW(FND_F, OFF); dW(FND_G, ON); 
        break;
      case 3:
        dW(FND_A, ON); dW(FND_B, ON); dW(FND_C, ON); dW(FND_D, ON); dW(FND_E, OFF); dW(FND_F, OFF); dW(FND_G, ON); 
        break;
      case 4:
        dW(FND_A, OFF); dW(FND_B, ON); dW(FND_C, ON); dW(FND_D, OFF); dW(FND_E, OFF); dW(FND_F, ON); dW(FND_G, ON); 
        break;
      case 5:
        dW(FND_A, ON); dW(FND_B, OFF); dW(FND_C, ON); dW(FND_D, ON); dW(FND_E, OFF); dW(FND_F, ON); dW(FND_G, ON); 
        break;
      case 6:
        dW(FND_A, ON); dW(FND_B, OFF); dW(FND_C, ON); dW(FND_D, ON); dW(FND_E, ON); dW(FND_F, ON); dW(FND_G, ON); 
        break;
      case 7:
        dW(FND_A, ON); dW(FND_B, ON); dW(FND_C, ON); dW(FND_D, OFF); dW(FND_E, OFF); dW(FND_F, ON); dW(FND_G, OFF); 
        break;
      case 8:
        dW(FND_A, ON); dW(FND_B, ON); dW(FND_C, ON); dW(FND_D, ON); dW(FND_E, ON); dW(FND_F, ON); dW(FND_G, ON); 
        break;
      case 9:
        dW(FND_A, ON); dW(FND_B, ON); dW(FND_C, ON); dW(FND_D, ON); dW(FND_E, OFF); dW(FND_F, ON); dW(FND_G, ON); 
        break;
    }
    prevVal = val;
  }
}

boolean readUpSw()
{
  static boolean prev = HIGH;
  static unsigned long last;
  boolean curr;

  if ((millis()-last)>10) {
    curr = digitalRead(UP);
    if ((HIGH==prev)&&(LOW==curr)) {   // UP SW가 눌린 시점
      gCnt = (gCnt+1)%10;
    }
    prev = curr;
    last = millis();
  }
}

boolean readDnSw()
{
  static boolean prev = HIGH;
  static unsigned long last;
  boolean curr;

  if ((millis()-last)>10) {
    curr = digitalRead(DN);
    if ((HIGH==prev)&&(LOW==curr)) {  // DOWN SW가 눌린 시점


      gCnt = gCnt-1;
      if (-1 == gCnt) gCnt = 9;
    }
    prev = curr;
    last = millis();
  }
}