ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 버튼과 인터럽트
    Arduino/Button 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);
    }

     

    댓글

Designed by Tistory.