Arduino, 스위치 다루기

이도현·2023년 8월 9일
0

아두이노 학습

목록 보기
7/34

1. 택트 스위치

2. 스위치 연결 방법

1) 풀 업 방식

2) 풀다운 방식

3. 회로도

4. 스위치 상태

5. 채터링 방지(디바운싱)

  • chattering: 전자 회로 내의 스위치나 계전기의 접점이 붙거나 떨어질 때, 기계적인 진도에 의해 매우 짧은 시간 안에 접점이 붙었다가 떨어지는 것을 반복하는 형상
  • Debouncing: 연이어 발생한 이벤트를 하나의 그룹으로 묶어서 처리하는 방식

6. switch 눌려질 때마다 4개의 LED 순차 점멸

// Button.h
#pragma once

#include <Arduino.h>
// 매개변수가 없는 void 함수에 대한 포인터를 button_callback_t로 정의
typedef void(*button_callback_t)();

class Button{
protected:
	int pin;
	button_callback_t callback; // callback 함수에 대한 포인터

public:
	Button(int pin);
	void setCallback(button_callback_t callback);
	int read();
	void check();
};
#include "Button.cpp"

Button::Button(int pin): pin(pin){ //버튼 입력핀
	pinMode(pin. INPUT_PULLUP);
	callback = NULL;
}

void Button::setCallback(button_callback_t callback){ // 함수 주소
	this -> callback = calback;
}

// 누른 경우에 H, 뗀 경우에 L을 리턴
int Button::read(){ 
	return !digitalRead(pin);
}

void Button::check(){ // read에 변화가 생기면, 함수 호출
	bool o_sw, n_sw;
	
	o_sw = read();
	delay(10); // 디바운스를 위한 지연시간
	n_sw = read();

	if(o_sw == 0 && n_sw ==1){ // 버튼을 누른 시점
		if(callback != NULL){
			callback();
		}
	}
}
//Button.cpp 

#include <Led.h>
#include "Button.h"

Button btn(2);
Led leds[4] = {
	Led(8), Led(9), Led(10), Led(11)
};

int out_no = -1; // 출력 패턴 번호(0 - 3)

void move_led(){ // 순차점등 하는 함수
	out_no = (++out_no)%4; //다음 출력 패턴 번호 설정
	Serial.println(out_no);
	for(int n = 0; n < 4; n++){
		leds[n].setValue(n == out_no);
}

void setup(){
	btn.setCallback(move_led); // 왜 리턴을 안하고 이렇게 하는가.. 싯팔
}

void loop(){
	btn.check();
}

7. led순차점등, 스위치 클릭스 7번 led on/off

#include <Led.h>
#include <Button.h>

Button btn

Button btn(2);
Led leds[4] = {
	Led(8), Led(9), Led(10), Led(11)
};

int out_no = -1

unsigned long old_time = 0; // 프로그램 ms 경과시간

void move_led(){
  out_no = (out_no + 1) % 4;
  for(int n = 0; n < 4; n++)
  {
    leds[n].setValue(n==out_no);
  }
}

void toggle(){
  led.toggle();
}

void setup(){
	btn.setCallback(toggle);
	old_time = millis();
}

void loop(){
	btn.check()
	
	unsigned long current_time = millis(); // 현재 ms 시간
	if(current_time - old_time >= 1000){ // 더 제대로된 디바운싱
		move_led();
		old_time = current_time;
}
profile
좋은 지식 나누어요

0개의 댓글