Skip to content

Instantly share code, notes, and snippets.

@kcal2845
Created January 23, 2019 09:55
Show Gist options
  • Save kcal2845/95ad505369d1e13f5dd54caaaa977130 to your computer and use it in GitHub Desktop.
Save kcal2845/95ad505369d1e13f5dd54caaaa977130 to your computer and use it in GitHub Desktop.
/*
kcal2845@naver.com
만능 리모컨입니다. 아두이노 우노, 아두이노 나노, 아두이노 프로 미니 등에서 사용 가능합니다. IRremote 라이브러리가 있어야 합니다.
LED(사용 중인지 확인하는 용도) - 2번핀
VS1838b( 수신기) - 10번핀
적외선 송신 LED - 11번 핀
버튼 갯수를 늘리고 싶다면 btn_number의 숫자를 늘리고, btn_id에 핀 정보를 추가해 주세요.
EEPROM에 기록되기 때문에 전원이 꺼져도 정보는 계속 보존됩니다.
궁금한 사항이 있다면 위 이메일로 질문을 보내거나 블로그에 댓글을 올려주세요.
*/
#include <IRremote.h>
#include <EEPROM.h>
#define LED 2
#define RECV_PIN 10
#define btn_record 11
#define btn_number 8
const int btn_id[btn_number] = {4, 5, 6, 7, 8, 9, 12, 13};
unsigned long IRdata[btn_number] = {0};
byte DataType[5] = {0};
IRsend irsend;
IRrecv irrecv(RECV_PIN);
decode_results DetectedIRdata;
void setup()
{
pinMode(LED, OUTPUT);
pinMode(btn_record, INPUT_PULLUP);
unsigned long buf = 0;
for (int i = 0; i < btn_number; i++) {
pinMode(btn_id[i], INPUT_PULLUP);
for(int j = 0;j<4;j++){
buf = EEPROM.read(i*4 + j);
IRdata[i] |= (buf<<(8*j));
}
}
digitalWrite(LED,HIGH);
delay(500);
digitalWrite(LED,LOW);
}
void receive() {
irrecv.enableIRIn();
digitalWrite(LED, HIGH);
int selected_btn = -1;
while (selected_btn == -1) {
for (int i = 0; i < btn_number; i++) {
if (!digitalRead(btn_id[i])) {
selected_btn = i;
break;
}
}
if(!digitalRead(btn_record)){
digitalWrite(LED, LOW);
return;
}
}
digitalWrite(LED, LOW);
delay(100);
digitalWrite(LED, HIGH);
while (1) {
if (irrecv.decode(&DetectedIRdata)) {
IRdata[selected_btn] = DetectedIRdata.value;
for(int i=0;i<4;i++){
EEPROM.write(selected_btn*4 + i,(byte)(IRdata[selected_btn]>>(i*8)));
}
irrecv.resume();
break;
} else if (!digitalRead(btn_record)) {
digitalWrite(LED, LOW);
return;
}
}
for (int i = 0; i < 3; i++) {
digitalWrite(LED, LOW);
delay(100);
digitalWrite(LED, HIGH);
delay(100);
}
digitalWrite(LED, LOW);
delay(100);
}
void loop() {
if (!digitalRead(btn_record)) {
delay(500);
receive();
delay(500);
} else {
for (int i = 0; i < btn_number; i++) {
if (!digitalRead(btn_id[i])) {
digitalWrite(LED, HIGH);
irsend.sendNEC(IRdata[i], 32);
digitalWrite(LED, LOW);
delay(100);
break;
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment