본문 바로가기

프로젝트형 IoT 서비스 개발 4회차/2. 엣지 디바이스 제어

[Day39] 2022-03-24(목) 아두이노4 - LED제어3(Push button, 풀업/풀다운) - 김서연 강사님

728x90

[1] LED제어3

  1. Push button 구조

    - 구조는 아래와 같고, 버튼을 누르면 a쪽과 b쪽이 연결된다.

출처 - https://eduino.kr/product/detail_menual.html?product_no=251

  2. 플로팅 현상

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=gu04005&logNo=221235520661

 

Arduino) 풀다운 저항, 풀업 저항, 플로팅 현상 이해하기

오늘도 어김없이 방문해주신 여러분 안녕하세요 드미입니드아아아아아앗! 오우예스! 오늘은 쉬어가는타임으...

blog.naver.com

    - 다음과 같이 회로 구성하고, 코드를 짠 상태에서 시리얼 모니터를 보면, 0과 1이 제멋대로 찍힌다.

    - 주변 회로 등 주변 환경에 영향을 받아, 핀에 입력되는 전압이 0~5V를 왔다갔다 하게되어 발생한다.

    - 이를 플로팅 현상이라고 한다.

    - 이를 해결하기 위해서, 핀에 입력되는 전압을 고정시켜주는 작업이 필요하다.

    - 그 작업은 풀다운 혹은 풀업 저항을 추가하여 주는 것

int push_btn =12;
int btn_state = 0; // 버튼의 현재 상태값을 저장하는 변수 => 0,1
void setup() {
  Serial.begin(9600);
  pinMode(push_btn, INPUT); //디지털 신호를 읽기 위해 핀모드를 설정
}

void loop() {
  delay(1000);
  // 입력핀으로 설정한 12번 핀의 입력된 현재 값을 읽어서 btn_state에 저장하기
  btn_state = digitalRead(push_btn);
  Serial.println(btn_state);
}

  3. 풀다운 저항

    - 위 회로에 풀다운 저항을 추가하면 다음과 같다.

    - 이렇게 연결하면, 버튼을 안 눌렀을 때는 0이 정상적으로 나오고, 버튼을 눌렀을 때만 1이 나오게 된다.

 

  4. 풀다운 방식 + LED제어 예제1

    - 풀다운 방식으로 스위치를 연결해서 입력값을 읽고, 읽은 입력값을 출력해서 LED를 켜보자.

    - 하나의 보드와 하나의 브래드보드에 연결했지만, 실제론 버튼 디바이스, LED 디바이스가 별도로 있다고 생각

    - LED도 풀다운 방식으로 연결 : (+)를 입력핀, (-)를 GND에 연결

    1) CODE

// push_btn_led_exam1
// push버튼을 누르면 led가 켜지도록 작성
// 풀다운 방식으로 처리하기
// 입력핀 12
// 출력핀 8
int push_btn = 12;
int led = 8;
int btn_state = 0;

void setup() {
  Serial.begin(9600);
  pinMode(push_btn, INPUT);
  pinMode(led, OUTPUT);
}

void loop() {
  delay(100);
  btn_state = digitalRead(push_btn);
  digitalWrite(led, btn_state);
  Serial.println(btn_state);
  if(btn_state==HIGH){
    Serial.println("push버튼을 누름");
  }else{
    Serial.println("push버튼을 해제");
  }
}

    2) 회로 모델

    3) 동작

 

  5. 풀다운 방식 + LED제어 예제2

    - 4.의 회로 그대로 사용하고, 버튼을 누르면 켜진 상태로 유지하고, 다시 누르면 꺼진 상태로 유지하도록 코드 수정

    1) CODE

      ① 버튼 누르고 있어도 변하지 않도록 하는 방법1

        - 무한루프 사용 --> while(digitalRead(push_btn)){ }

// push_btn_led_exam2
// push버튼을 누르면 led가 켜지고, 다시 누르면 led가 꺼지도록
// 풀다운 방식으로 처리하기
// 입력핀 12
// 출력핀 8
int push_btn = 12;
int led = 8;
int btn_state = 0;
int led_state = 0;

void setup() {
  Serial.begin(9600);
  pinMode(push_btn, INPUT);
  pinMode(led, OUTPUT);
}

void loop() {
  delay(100);
  btn_state = digitalRead(push_btn);
  Serial.println(btn_state);
  if(btn_state==HIGH){
    Serial.println("push버튼을 누름");
    if(led_state==0){
      digitalWrite(led, HIGH);
      led_state = 1;
      Serial.println("led_on:"+(String)led_state);
    }else{
      digitalWrite(led, LOW);
      led_state = 0;
      Serial.println("led off:"+(String)led_state);
    }
  }
  while(digitalRead(push_btn)){}    // 버튼을 누르고 있는 경우 변하지 않도록
}

 

      ② 버튼 누르고 있어도 변하지 않도록 하는 방법2

        - 이전 버튼 상태를 저장

        - btn_state_pre 변수에 btn_state의 이전 loop에서의 상태를 저장

        - btn_state_pre 가 LOW(0) 이면, 이전 loop에서 버튼이 눌리지 않은 상태이므로 이번 loop에서 LED ON/OFF

 

        - btn_state_pre 가 HIGH(1) 이면, 이전 loop에서 버튼이 눌렸던 상태이므로 이번 loop에서 LED ON/OFF X

// push_btn_led_exam2
// push버튼을 누르면 led가 켜지고, 다시 누르면 led가 꺼지도록
// 풀다운 방식으로 처리하기
// 입력핀 12
// 출력핀 8
int push_btn = 12;
int led = 8;
int btn_state = 0;
int btn_state_pre = 0;  // btn의 이전 loop에서의 상태를 저장
int led_state = 0;

void setup() {
  Serial.begin(9600);
  pinMode(push_btn, INPUT);
  pinMode(led, OUTPUT);
}

void loop() {
  delay(100);
  btn_state = digitalRead(push_btn);
  Serial.println(btn_state);
  if(btn_state_pre!=HIGH){
    if(btn_state==HIGH){
      Serial.println("push버튼을 누름");
      if(led_state==0){
        digitalWrite(led, HIGH);
        led_state = 1;
        Serial.println("led_on:"+(String)led_state);
      }else{
        digitalWrite(led, LOW);
        led_state = 0;
        Serial.println("led off:"+(String)led_state);
      }
    }
  }
  btn_state_pre = btn_state;
}

    2) 동작

 

  6. 풀업 저항

    - 풀다운 저항과 반대로, 버튼을 누르면 0, 누르지 않으면 1을 읽어온다.

int push_btn =12;
int btn_state = 0; // 버튼의 현재 상태값을 저장하는 변수 => 0,1
void setup() {
  Serial.begin(9600);
  pinMode(push_btn, INPUT); //디지털 신호를 읽기 위해 핀모드를 설정
}

void loop() {
  delay(1000);
  // 입력핀으로 설정한 12번 핀의 입력된 현재 값을 읽어서 btn_state에 저장하기
  btn_state = digitalRead(push_btn);
  Serial.println(btn_state);
  
  if(btn_state==HIGH){
    Serial.println("push버튼을 해제");
  }else{
    Serial.println("push버튼을 누름");
  }
}

 

  7. 풀업/풀다운 방식 스위치 + LED 제어 예제

    - 스위치 2개, LED 1개로 작업

    - 스위치1은 풀업 방식, 스위치2는 풀다운 방식으로 연결

    - 스위치1을 누르면 LED가 켜지고, 스위치2를 누르면 LED가 꺼지도록 구현

    - LED가 켜지고 꺼지는 것은 함수로 구현

 

    1) CODE

// push_btn_led_exam3
// 스위치 2개, led 1개를 이용해서 작업
// - 스위치1 : 풀업 방식 연결
// - 스위치2 : 풀다운 방식 연걸
// - 스위치1을 누르면 led가 켜지고, 스위치2를 누르면 led가 꺼지도록 구현
// led가 켜지고 꺼지는 것은 함수로 구현

int push_btn1 = 12;
int push_btn2 = 11;
int led_pin = 8;
int btn1_state = 0;
int btn2_state = 0;

void setup() {
  Serial.begin(9600);
  pinMode(push_btn1, INPUT);
  pinMode(push_btn2, INPUT);
  pinMode(led_pin, OUTPUT);
}

void loop() {
  delay(100);
  btn1_state = digitalRead(push_btn1);
  btn2_state = digitalRead(push_btn2);
  Serial.println("push_btn1: "+(String)btn1_state);
  Serial.println("push_btn2: "+(String)btn2_state);
  if(btn1_state==LOW){
    led_on(led_pin);
  }
  if(btn2_state==HIGH){
    led_off(led_pin);
  }
}

// LED ON
void led_on(int pin){
  digitalWrite(pin, HIGH);
}

// LED OFF
void led_off(int pin){
  digitalWrite(pin, LOW);
}

    2) 회로

    3) 동작

- 끝 -

728x90