Arduino 버튼

푸쉬버튼을 준비하고 5V와 12번째에 연결해주자.

 

int push_btn = 12;
int btn_state = 0; // 버튼의 현재 상태값을 저장하는 변수 - 0,1
void setup() {
  Serial.begin(9600);
  pinMode(12, INPUT);
}
void loop() {
  delay(1000);
  btn_state = digitalRead(push_btn);
  Serial.println(btn_state);
}

시리얼 모니터를 보면 0 0 0 이렇게 나올거다

스위치를 누르면 1 1 1 이렇게 나올거고

 

근데 간혹 스위치를 안눌러도 1 1 1 나오는 경우가 있다

그럼 브레드보드에 전류가 겹치는 경우다

위에 경우는 잘못된 방식이다.

 

 

그래서 풀다운 방식을 적용할거다

 

저항은 10k옴이다

위에 처럼 구성해주면 된다.

 

평상시에 동작은

12번핀에서 저항을 타고 GND통해 전기가 나간다

 

스위치를 누르면

5V에서 버튼을 타고 12번핀으로 전기가 나가게 된다.

그리고 코드를 다시 동작시키면

이제 0 이 잘 나올거다

푸쉬버튼 길게 누르면 1이 나올거고 완성~~

 

이제 풀 업 방식으로 다시 만들어보자.

풀업 방식은 이런 식이다.

 

회로도는 이렇다.

 

 

이렇게 실행을 하면 1 1 1 1 1 이렇게 나올거다

이게 풀업이다

 

문제)

스위치2개, LED1개 이용해서 작업하기

- 스위치 1개는 풀업방식 연결, 누르면 LED가 켜짐

- 스위치 1개는 풀다운방식 연결, 누르면 LED가 꺼짐

- led가 켜지고 꺼지는 것은 함수로 구현하세요.

더보기
void setup() {
  pinMode(12, INPUT);
  pinMode(11, INPUT);
  pinMode(8, OUTPUT);
}
void loop() {
  int btn_state1 = digitalRead(12);
  int btn_state2 = digitalRead(11);
  if(btn_state1 == HIGH)
    led(1);
  if(btn_state2 == LOW)
    led(0);
}
void led(int data) {
    digitalWrite(8, data);
}

 

버튼을 누를 때 버튼이 안켜진다던가

안꺼진다던가 이런 버그가 발생한다

 

그렇기에 다른 코드를 적용해보자

delay를 써서 해도 되긴하는데 delay를 쓰면 프로그램 전체가 멈춘다

delay를 안쓰고 해보겟다

 

int push_btn = 13;
int led_pin = 4;
//여러가지 상태값을 저장할 변수
boolean btn_state; // push버튼의 현재 상태값을 저장하는 변수
boolean led_state; // boolean으로 led의 상태를 정의
boolean lastBtnState = 0; // push버튼의 마지막 상태값을 저장할 변수
long lastTime = 0; //스위치가 눌려진 시점의 시간을 측정 - chattering구간을 체크하기 위해서 필요
void setup() {
  Serial.begin(9600);
  pinMode(push_btn, INPUT);
  pinMode(led_pin, OUTPUT);
}

void loop() {
  //입력핀으로 설정한 13번 핀의 입력된 현재 값을 읽어서 저장
  //1. 디지털핀의 입력된 값을 읽기
  int read_data = digitalRead(push_btn);
  //2. 스위치의 이전 상태가 지금과 다르면 작업한 시점의 milli초를 기록
  //push버튼이 눌려지면 현재상태를 파악해서 이전과 다른 값이 경우 push버튼이 눌려진 시간을 기록한다.

  if(read_data != btn_state) {
    lastTime = millis(); // 1/1000초
  }
  if(millis()-lasttime>50) {
    //최초로 측정된 시간보다 경과한 시간이 50정도면 chattering기간으로 인지
    if(read_data != btn_state) {
      btn_state = readdata;
      if(read_data == HIGH) {
        led_state = !ledstate; //led의 상태값을 반전시켜서(true->false, false->true) 저장
      }
    }
  }
  digitalWrite(led_pin, led_state);
  lastBtnState = read_state;
}

 

A0~A5는 아날로그 신호를 읽어들이는 핀들이다

오른쪽 핀들을 보면 ~11, ~10 이런 물결표가 있는데

~표는 아날로그 신호를 보내는 핀들이다.

 

댓글

Designed by JB FACTORY