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);
}