이전에 gnd와 vcc를 반대로 연결해 태워먹은 IR 수신센서를 다시 구매해서 테스트 해본다.
#include <IRremote.h>
int RECV_PIN = 8; // IR 수신 핀
IRrecv irrecv(RECV_PIN); // IR 수신 객체 생성
void setup() {
// Serial 모니터 초기화
Serial.begin(9600);
// IR 수신 시작
irrecv.enableIRIn();
}
void loop() {
// IR 신호가 수신되었을 때
if (irrecv.decode()) {
// 수신된 IR 명령을 Serial 모니터에 출력
long int decCode = irrecv.decodedIRData.decodedRawData;
Serial.println(decCode, HEX);
// 다음 신호를 받을 수 있도록 준비
delay(100);
irrecv.resume();
}
}


일단 리모컨 신호를 읽는거 까지는 했는데, ...이걸 이용해서 final boss 문제를 수행해 보겠다.
- 리모컨의 1번부터 9번까지 눌렀을 때 버저에서 각각 [도, 미, 솔#, 라, 시, 높은도, 높은 레, 높은레#, 높은미]의음이 0.1초간 출력
- LC에 현재 출력되고 있은 음을 [Do, Mi, Sol#, La, Si, High Do, High Re, High Re#, High Mi]의 문자열로 출력함
- 989895764, 1245, 2356, 989895764, 1245, 2654 순서대로 리모컨을 눌러 연주함
버저 + IR 리모컨 + LCD 사용
#include <IRremote.h>
int RECV_PIN = 8; // IR 수신 핀
IRrecv irrecv(RECV_PIN); // IR 수신 객체 생성
void setup() {
// Serial 모니터 초기화
Serial.begin(9600);
// IR 수신 시작
irrecv.enableIRIn();
}
void loop() {
// IR 신호가 수신되었을 때
if (irrecv.decode()) {
long int deCode = irrecv.decodedIRData.decodedRawData;
Serial.print(deCode, HEX);
if(deCode == 0xF30CFF00){//1누름
Serial.println(" / 1");
}
if(deCode == 0xE718FF00){//2누름
Serial.println(" / 2");
}
if(deCode == 0xA15EFF00){//3누름
Serial.println(" / 3");
}
if(deCode == 0xF708FF00){//4누름
Serial.println(" / 4");
}
if(deCode == 0xE31CFF00){//5누름
Serial.println(" / 5");
}
if(deCode == 0xA55AFF00){//6누름
Serial.println(" / 6");
}
if(deCode == 0xBD42FF00){//7누름
Serial.println(" / 7");
}
if(deCode == 0xAD52FF00){//8누름
Serial.println(" / 8");
}
if(deCode == 0xB54AFF00){//9누름
Serial.println(" / 9");
}
// 다음 신호를 받을 수 있도록 준비
delay(100);
irrecv.resume();
}
}

#include <IRremote.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
int RECV_PIN = 8; // IR 수신 핀
IRrecv irrecv(RECV_PIN); // IR 수신 객체 생성
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
void setup() {
// Serial 모니터 초기화
Serial.begin(9600);
// IR 수신 시작
irrecv.enableIRIn();
//lcd 초기
lcd.init(); // initialize the lcd
lcd.backlight();
}
void loop() {
// IR 신호가 수신되었을 때
if (irrecv.decode()) {
lcd.clear();//lcd창 초기
// 수신된 IR 명령을 Serial 모니터에 출력
long int deCode = irrecv.decodedIRData.decodedRawData;
Serial.print(deCode, HEX);
if(deCode == 0xF30CFF00){//1누름
Serial.println(" / 1");
lcd.print("Do");
}
if(deCode == 0xE718FF00){//2누름
Serial.println(" / 2");
lcd.print("Mi");
}
if(deCode == 0xA15EFF00){//3누름
Serial.println(" / 3");
lcd.print("Sol#");
}
if(deCode == 0xF708FF00){//4누름
Serial.println(" / 4");
lcd.print("La");
}
if(deCode == 0xE31CFF00){//5누름
Serial.println(" / 5");
lcd.print("Si");
}
if(deCode == 0xA55AFF00){//6누름
Serial.println(" / 6");
lcd.print("High Do");
}
if(deCode == 0xBD42FF00){//7누름
Serial.println(" / 7");
lcd.print("High Re");
}
if(deCode == 0xAD52FF00){//8누름
Serial.println(" / 8");
lcd.print("High Re#");
}
if(deCode == 0xB54AFF00){//9누름
Serial.println(" / 9");
lcd.print("High Mi");
}
// 다음 신호를 받을 수 있도록 준비
delay(100);
irrecv.resume();
}
}

#include <IRremote.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
int RECV_PIN = 8; // IR 수신 핀
IRrecv irrecv(RECV_PIN); // IR 수신 객체 생성
int buzzer = 9; // 부저 핀
int melody[] = { 262, 330, 415, 440, 494, 523, 587, 622, 659 };
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
void setup() {
// Serial 모니터 초기화
Serial.begin(9600);
// IR 수신 시작
irrecv.enableIRIn();
//lcd 초기
lcd.init(); // initialize the lcd
lcd.backlight();
//부저 초기화
pinMode(buzzer, OUTPUT);
}
void loop() {
// IR 신호가 수신되었을 때
if (irrecv.decode()) {
lcd.clear();//lcd창 초기
// 수신된 IR 명령을 Serial 모니터에 출력
long int deCode = irrecv.decodedIRData.decodedRawData;
Serial.print(deCode, HEX);
if(deCode == 0xF30CFF00){//1누름
Serial.println(" / 1");
lcd.print("Do");
tone(buzzer, melody[0], 100);//0.1초 동안 출력
}
if(deCode == 0xE718FF00){//2누름
Serial.println(" / 2");
lcd.print("Mi");
tone(buzzer, melody[1], 100);//0.1초 동안 출력
}
if(deCode == 0xA15EFF00){//3누름
Serial.println(" / 3");
lcd.print("Sol#");
tone(buzzer, melody[2], 100);//0.1초 동안 출력
}
if(deCode == 0xF708FF00){//4누름
Serial.println(" / 4");
lcd.print("La");
tone(buzzer, melody[3], 100);//0.1초 동안 출력
}
if(deCode == 0xE31CFF00){//5누름
Serial.println(" / 5");
lcd.print("Si");
tone(buzzer, melody[4], 100);//0.1초 동안 출력
}
if(deCode == 0xA55AFF00){//6누름
Serial.println(" / 6");
lcd.print("High Do");
tone(buzzer, melody[5], 100);//0.1초 동안 출력
}
if(deCode == 0xBD42FF00){//7누름
Serial.println(" / 7");
lcd.print("High Re");
tone(buzzer, melody[6], 100);//0.1초 동안 출력
}
if(deCode == 0xAD52FF00){//8누름
Serial.println(" / 8");
lcd.print("High Re#");
tone(buzzer, melody[7], 100);//0.1초 동안 출력
}
if(deCode == 0xB54AFF00){//9누름
Serial.println(" / 9");
lcd.print("High Mi");
tone(buzzer, melody[8], 100);//0.1초 동안 출력
}
// 다음 신호를 받을 수 있도록 준비
delay(100);
noTone(buzzer);
irrecv.resume();
}
}


다른거까지는 잘 해결되는데 부저만 연결해서 출력을 하고 나면 문제가 발생했다.
부저와 IR 리모컨이 모두 타이머2 인터럽트라는 것을 사용한다고 한다.
그래서 부저를 출력하고 나면 IR리모컨 신호를 왜곡해서 받는 문제가 발생한다. IR리모컨을 타이머1 인터럽트로 수정해 해결했다.라이브러리의 IRTimer.hpp를 수정한다.
-->
LCD 복습
LCD의 SDA, SCL을 따로 지정을 안해줬는데 A4, A5에 지정되는 이유?
-> Arduino Uno와 Nano에서는 I2C 통신이 기본적으로 아날로그 핀 A4, A5에 할당되어 있어서, Wire.h 라이브러리를 사용하면 자동으로 해당 핀을 I2C 통신에 사용함
- SDA (데이터) = A4
- SCL (클럭) = A5