Arduino, 리모컨

이도현·2023년 8월 10일
0

아두이노 학습

목록 보기
21/34

  • IR Reciver: (IR 수신기): 송신기로부터 적외선 신호를 수신하고 요청을 해석하는 구성요소
  • NFC: 10cm 거리에서 13.56MHz의 주파수로 두 전자 기기가 통신할 수 있는 무선통신 기술


1. 리모컨 눌려진 키 시리얼 모니터 표시하기

#include <IRremote.h>

const int REC_PIN = 2;
IRrecv myIR(REC_PIN); // 리모컨 객체 myIR생성
decode_results rlt; // 리모컨 수신 데이터 구조체 선언

void setup() 
{
	Serial.begin(9600); // 시리얼 통신속도 9600bps
	myIR.enableIRIn(); // 리모컨 입력 시작
}
void loop() 
{
	byte key;

	if(!myIR.decode(&rlt)) return; // 수신된 데이터가 없으면 리턴

	if(rlt.decode_type == NEC){ // NEC 방식인 경우에만 처리
	key = (unsigned char)rlt.value; // 반전 데이터 코드만 추출(하위 8비트)
	if(key == 0x5D) Serial.println("Press CH-"); // CH- key
	else if(key == 0x9D) Serial.println("Press CH"); // CH key
	else if(key == 0x1D) Serial.println("Press CH+"); // CH+ key
	else if(key == 0xDD) Serial.println("Press :<<"); // :<< key
	else if(key == 0xFD) Serial.println("Press >>:"); // >>: key
	else if(key == 0x3D) Serial.println("Press >::"); // >:: key
	else if(key == 0x1F) Serial.println("Press -"); // - key
	else if(key == 0x57) Serial.println("Press +"); // + key
	else if(key == 0x6F) Serial.println("Press EQ"); // EQ key
	else if(key == 0x97) Serial.println("Press 0"); // 0 key
	else if(key == 0x67) Serial.println("Press 200-"); // 200- key
	else if(key == 0x4F) Serial.println("Press 200+"); // 200+ key
	else if(key == 0xCF) Serial.println("Press 1"); // 1 key
	else if(key == 0xE7) Serial.println("Press 2"); // 2 key
	else if(key == 0x85) Serial.println("Press 3"); // 3 key
	else if(key == 0xEF) Serial.println("Press 4"); // 4 key
	else if(key == 0xC7) Serial.println("Press 5"); // 5 key
	else if(key == 0xA5) Serial.println("Press 6"); // 6 key
	else if(key == 0xBD) Serial.println("Press 7"); // 7 key
	else if(key == 0xB5) Serial.println("Press 8"); // 8 key
	else if(key == 0xAD) Serial.println("Press 9"); // 9 key
	}

	myIR.resume(); // 새로운 데이터 수신
}

2. 리모컨 키에 따라 7 - 세그먼트 표시 값 설정


#include <IRremote.h>

const int REC_PIN = 2;
const int segment_pin[8] ={9, 8, 7, 6, 5, 4, 3}; // A,B,C,D,E,F,G 연결 핀

// 7세그먼트 0~F 표시 패턴 {a, b, c, d, e, f, g}
const byte segment_pat[10][7] = {
	{1, 1, 1, 1, 1, 1, 0}, // 0
	{0, 1, 1, 0, 0, 0, 0}, // 1
	{1, 1, 0, 1, 1, 0, 1}, // 2
	{1, 1, 1, 1, 0, 0, 1}, // 3
	{0, 1, 1, 0, 0, 1, 1}, // 4
	{1, 0, 1, 1, 0, 1, 1}, // 5
	{1, 0, 1, 1, 1, 1, 1}, // 6
	{1, 1, 1, 0, 0, 0, 0}, // 7
	{1, 1, 1, 1, 1, 1, 1}, // 8
	{1, 1, 1, 0, 0, 1, 1}}; // 9 

byte disp_val = 0; // 7-세그먼트 표시값
void segment_dsp(void); // 7-세그먼트 표시
IRrecv myIR(REC_PIN); // 리모컨 객체 myIR생성
decode_results rlt; // 리모컨 수신 데이터 구조체 선언

void setup() 
{
	byte n;
	myIR.enableIRIn(); // 리모컨 입력 시작

	for(n = 0;n < 7;n++) 
		pinMode(segment_pin[n], OUTPUT); // Segment 연결 핀 출력 설정
	
	segment_dsp(); // 초기상태 '0’ 표시
}

void loop() 
{
	byte key, disp;

	if(!myIR.decode(&rlt)) return; // 수신된 데이터가 없으면 리턴

	if(rlt.decode_type == NEC){ // NEC 방식인 경우에만 처리
		key = (unsigned char)rlt.value; // 반전 데이터 코드만 추출(하위 8비트)
		
		if(key == 0x5D) disp_val = (disp_val + 6) % 10; // CH- key(-4)
		else if(key == 0x9D) disp_val = 0; // CH key(0)
		else if(key == 0x1D) disp_val = (disp_val + 4) % 10; // CH+ key(+4)
		else if(key == 0xDD) disp_val = (disp_val + 7) % 10; // :<< key(-3)
		else if(key == 0xFD) disp_val = (disp_val + 3) % 10; // >>: key(+3)
		else if(key == 0x3D) disp_val = 9; // >:: key(9)
		else if(key == 0x1F) disp_val = (disp_val + 9) % 10; // - key(-1)
		else if(key == 0x57) disp_val = (disp_val + 1) % 10; // + key(+1)
		else if(key == 0x6F) disp_val = 5; // EQ key(5)
		else if(key == 0x67) disp_val = (disp_val + 8) % 10; // 100+ key(-2)
		else if(key == 0x4F) disp_val = (disp_val + 2) % 10; // 200+ key(+2)
		else if(key == 0x97) disp_val = 0; // 0 key
		else if(key == 0xCF) disp_val = 1; // 1 key
		else if(key == 0xE7) disp_val = 2; // 2 key
		else if(key == 0x85) disp_val = 3; // 3 key
		else if(key == 0xEF) disp_val = 4; // 4 key
		else if(key == 0xC7) disp_val = 5; // 5 key
		else if(key == 0xA5) disp_val = 6; // 6 key
		else if(key == 0xBD) disp_val = 7; // 7 key
		else if(key == 0xB5) disp_val = 8; // 8 key
		else if(key == 0xAD) disp_val = 9; // 9 key 
		segment_dsp();
	}
	myIR.resume(); // 새로운 데이터 수신
	}
	// 눌려진 키 16진 7-세그먼트 표시

void segment_dsp() {
	byte n;

	for(n = 0;n < 7;n++) // disp_val 패턴 출력
		digitalWrite(segment_pin[n], segment_pat[disp_val][n]);
}
profile
좋은 지식 나누어요

0개의 댓글