Arduino/Button

버튼과 인터럽트

DesignatedRoom 2020. 10. 23. 18:23

 

버튼이 눌리면, 값을 증가하는 예제

소스 코드

더보기
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  //  2번핀이 0번 인터럽트를 의미한다.
  //  인터럽트는 2번핀과 3번핀에만 적용된다.
  pinMode(2,INPUT_PULLUP);
  
  //  인터럽트(CHANGE, FALLING, RISING,LOW)
  attachInterrupt(0,func, CHANGE);  //  인터럽트 발생 시키는 함수. 0번째 인터럽트
                                    //  인터럽트는 2개만 발생가능 0과1
                                    //  CHANGE상태일때 인터럽트 발생(값이 바뀔 때)
                                    //  인터럽트 시,func 함수 호출
} 

int cnt = 0;

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("*******");

  delay(1000);
}

void func()
{
  //  버튼이 눌리면
  if (!digitalRead(10)){
    cnt += 100;
    Serial.println(cnt);
    }
}

 

 

각 버튼의 눌림에 따라 LCD에 출력되는 글자의 빠르기 조절.

LCD에 대한 내용은 아래에서 참고하자.

designatedroom87.tistory.com/217?category=898308

 

LCD의 문자열 출력

LCD에 "hello" 문자열을 출력하기 기본적인 하드웨어 연결은 LCD의 RX선에 아두이노의 3번핀에 연결한다. 꼭 3번핀이 아니어도 된다. 그리고 LCD의 +선은 아두이노의 5V선에 연결하고, -선은 아두이노

designatedroom87.tistory.com

소스 코드

더보기
//  각 버튼의 눌림에 따라 LCD에 출력되는 글자의 빠르기 조절.
//  전화번호lcd속도조절
//  풀업저항으로 설정한다.
//  LCD의 RX선을 아두이노의 7번핀에 연결
//  풀업 저항이므로 버튼이 눌리면 0을 리턴해야 한다.
#include <SoftwareSerial.h>
SoftwareSerial lcd = SoftwareSerial(6,7);//rx,tx

String tel = "010-1234-5678";
int i = 1;
int t = 1000;

void setup() 
{
  lcd.begin(9600);
  Serial.begin(9600);
  
  pinMode(2,INPUT_PULLUP);
  pinMode(3,INPUT_PULLUP);

  attachInterrupt(0,incre, CHANGE); //  2번핀의 버튼
  //  attachInterrupt(1,dec, CHANGE);   //  3번핀의 버튼
  attachInterrupt(1,dec, FALLING);   //  3번핀의 버튼
}

//  2번 버튼이 눌릴 때 호출되는 함수
void incre()
{
  t = t + 100;
  
  if (2000 < t){t = 2000;}
  
  Serial.println(t);

  delay(300);
}

//  3번 버튼이 눌릴 때 호출되는 함수
void dec()
{
  t = t - 100;
  
  if (t < 0){t = 0;}
  
  Serial.println(t);

  delay(300);
}

void loop() {
  
  lcd.print("$CLEAR\r\n");
  lcd.print("$GO 1 " + String(i)+"\r\n");
  lcd.print("$PRINT "+ tel      +"\r\n");
  i++;
  delay(t);
  if(i==18){i=1;}
}

 

 

인터럽트는 2개만 사용할 수 있다고 하였는데, 하나의 인터럽트를 가지고 여러 제어를 할 수 있는 예제

버튼의 클릭 회수에 따른 제어를 해보자.

소스 코드

더보기
//  하나의 인터럽트로 여러 인터럽트 제어하는 방법
//  인터럽트는 2개만 제어 가능. 그래서 인터럽트를 다룰 다른 방법도 생각해보자.
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  pinMode(2, INPUT_PULLUP);   //  2번핀에 버튼을 연결

  attachInterrupt(0,menu, FALLING);
}

int m = -1;

/*  버튼을 클릭하면 연속적으로 나오는 것을 제어하기 위해 사용한 변수이다.
    아래의 두 변수들이 있는 곳을 제거하고 실행해보면 알 수 있다.
    컴퓨터의 속도가 너무 빨라서 이를 제어하기 위함이다.
*/
int current_time = 0; //  현재 시간
int past_time = 0;    //  이전 시간

void menu()
{
  current_time = millis();  //  현재의 시간을 저장

  //  1초의 간격을 준다.
  if (current_time - past_time > 1000)
  {
    m += 1;
  
    m = m % 4;  //  메뉴가 4개면, 메뉴의 개수를 넘어가지 못하게 한 방법
    
    Serial.println(String("메뉴번호.") + m);
  
    switch(m)
    {
      case 0: {Serial.println("1번째 메뉴 호출");}  break;
      case 1: {Serial.println("2번째 메뉴 호출");}  break;
      case 2: {Serial.println("3번째 메뉴 호출");}  break;
      case 3: {Serial.println("4번째 메뉴 호출");}  break;
      default:  break;
    }
  }
  past_time = current_time;
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("*******");

  delay(1000);
}