본문 바로가기

Embedded/Arduino

CH08 -1) 푸시버튼 사용하기 - II

int flag = 0;
int ledCount=0;
int buttonPin=6;

void setup()
{
  pinMode(buttonPin, INPUT);
  Serial.begin(9600);
}

void printValues()
{
  Serial.print("flag : "); 
  Serial.print(flag); 
  Serial.print("  ledCount : "); 
  Serial.println(ledCount); 

}

void loop()
{
  int inputValue = digitalRead(buttonPin);
  printValues();
  if (inputValue == HIGH) {           
    if (flag == 0){                    
      flag = 1;
      ledCount++;
      ledCount = ledCount % 3;
      printValues();
    }
  }
  else {                            
    if (flag == 1) {
      flag = 0;           
      printValues();
    }
  }
  delay(100);                         
}

 

 

버튼을 클릭하면 번갈아서 LED가 켜지고 꺼지고를 반복하는 예제

int flag = 0;
int ledCount=0;
int redPin=9;
int buttonPin=6;

void setup()
{
  pinMode(redPin, OUTPUT);
  pinMode(buttonPin, INPUT);
}
void loop()
{
  int inputValue = digitalRead(buttonPin);
  
  if (inputValue == HIGH) {           
    if (flag == 0){                    
      flag = 1;
      ledCount++;
    }
    
  } else {                            
    if (flag == 1) {
      if(ledCount == 1){          
        digitalWrite(redPin, HIGH);
      }
      else{          
        digitalWrite(redPin, LOW);
        ledCount = 0;
      }
      flag = 0;                       
    }
  }
  delay(100);                         
}

- 위의 코드의 원리를 확인해 보면

a) flag = 0,  count = 0 으로 초기화 

b) 버튼을 누르면 inputValue가 HIGH로 바뀜 -> 버튼의 상태가 HIGH 이고 flag의 상태가 0 인 경우

   flag의 상태가 (0 -> 1)로 바뀜 , count가 1더해져서  (0 -> 1)로 바뀜

c) delay(100)으로 100 ms 가 지남

d-1) 100ms 이후에도 버튼을 누르고 있는 경우

  inputValue가 HIGH로 바뀜 -> flag의 상태는 1이므로 16번 라인의 if문 만족하지 않음 -> if문 빠져나감

  delay(100)으로 100ms 가 지남

d-2) i) 100ms 이후에 버튼을 누르지 않는 경우

  inputValue가 LOW로 바뀜 -> 21번째줄의 else문 아래를 실행 -> flag의 상태는 1이므로 22번째 줄의 if문 만족

  -> 현재 ledCount가 1이므로 23번째 if문 만족 -> redPin ON -> 30번째 flag (1 -> 0) 으로 바뀜

  delay(100)으로 100ms 가 지남

d-2) ii) 버튼을 누르면 b) 상황 발생 flag의 상태는 (0->1)로 바뀜, count는 1더해져서 (1->2)로 바뀜

  다시 d-2) 상황으로 와서 21번째 else문 아래를 실행 -> flag의 상태는 1이므로 22번째 줄의 if문 만족

  -> ledCount 가 2이므로 26번째 라인의 else문 만족해서 ledCount가 (2->0)으로 바뀜 -> 30번 라인의 flag (1->0)바뀜

  

다시 처음으로 돌아감 (flag = 0,  count = 0)

 

int flag = 0;
int ledCount=0;
int redPin=9;
int bluePin=8;
int greenPin=7;
int buttonPin=6;

void setup()
{
  pinMode(redPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(buttonPin, INPUT);
}

void loop()
{
  int inputValue = digitalRead(buttonPin);
  
  if (inputValue == HIGH) {           
    if (flag == 0){                    
      flag = 1;
      ledCount++;
    }
    
  } else {                            
    if (flag == 1) {
      if(ledCount == 1){          
        digitalWrite(redPin, HIGH);
        digitalWrite(bluePin, LOW);
        digitalWrite(greenPin, LOW);
      }
      else if(ledCount == 2){          
        digitalWrite(redPin, LOW);
        digitalWrite(bluePin, HIGH);
        digitalWrite(greenPin, LOW);
      }
      else if(ledCount == 3){          
        digitalWrite(redPin, LOW);
        digitalWrite(bluePin, LOW);
        digitalWrite(greenPin, HIGH);
      }
      else if(ledCount == 4){          
        digitalWrite(redPin, HIGH);
        digitalWrite(bluePin, HIGH);
        digitalWrite(greenPin, HIGH);
      }
      else{          
        digitalWrite(redPin, LOW);
        digitalWrite(bluePin, LOW);
        digitalWrite(greenPin, LOW);
        ledCount =0;
      }
      flag = 0;                       
    }
  }
  delay(100);                         
}

- 코드를 그대로 두고 RGB LED를 사용하면 된다.

- 버튼을 누르면 LED의 상태가 

  OFF -> RED -> BLUE -> GREEN -> MAGENTA -> YELLOW -> CYAN -> WHITE -> OFF 순으로 변함

- Serial Monitor로 현재 RGB LED의 값을 출력 ( red, blue, green ... )

int flag = 0;
int ledCount=0;
int redPin=9;
int bluePin=8;
int greenPin=7;
int buttonPin=6;

void setup()
{
  pinMode(redPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  Serial.begin(9600);
}

void loop()
{
  int inputValue = digitalRead(buttonPin);
  
  if (inputValue == HIGH) {           
    if (flag == 0){                    
      flag = 1;
      ledCount++;
    }
    
  } else {                            
    if (flag == 1) {
      if(ledCount == 1){          
        digitalWrite(redPin, HIGH);
        digitalWrite(bluePin, LOW);
        digitalWrite(greenPin, LOW);
        Serial.println("Red");
      }
      else if(ledCount == 2){          
        digitalWrite(redPin, LOW);
        digitalWrite(bluePin, HIGH);
        digitalWrite(greenPin, LOW);
        Serial.println("blue");
      }
      else if(ledCount == 3){          
        digitalWrite(redPin, LOW);
        digitalWrite(bluePin, LOW);
        digitalWrite(greenPin, HIGH);
        Serial.println("Green");
      }
      else if(ledCount == 4){          
        digitalWrite(redPin, HIGH);
        digitalWrite(bluePin, HIGH);
        digitalWrite(greenPin, LOW);
        Serial.println("Magenta");
      }
      else if(ledCount == 5){          
        digitalWrite(redPin, HIGH);
        digitalWrite(bluePin, LOW);
        digitalWrite(greenPin, HIGH);
        Serial.println("Yellow");
      }
      else if(ledCount == 6){          
        digitalWrite(redPin, LOW);
        digitalWrite(bluePin, HIGH);
        digitalWrite(greenPin, HIGH);
        Serial.println("Cyan");
      }
      else if(ledCount == 7){          
        digitalWrite(redPin, HIGH);
        digitalWrite(bluePin, HIGH);
        digitalWrite(greenPin, HIGH);
        Serial.println("White");
      }
      else{          
        digitalWrite(redPin, LOW);
        digitalWrite(bluePin, LOW);
        digitalWrite(greenPin, LOW);
        Serial.println("Off");
        ledCount =0;
      }
      flag = 0;                       
    }
  }
  delay(100);                         
}

'Embedded > Arduino' 카테고리의 다른 글

01. Arduino 설치하기  (0) 2021.06.09
초음파센서+브라킷+서보모터  (0) 2021.05.26
Servo 제어  (0) 2020.11.21
CH07 -1) 푸시버튼으로 LED제어  (0) 2020.10.12
CH06 - 1)피에조(Piezo) 스피커  (0) 2020.10.10