2019년 4월 22일 월요일

주차장 문 개폐 리모콘키 복사하기



처가집에 가면 빌라인데 리모콘 키가 있습니다.




이렇게 생겼는데... 리모콘이 1개라서 와이프가 갈땐 저 키를 쓰고..

제 차를 타고 갈땐 그 키를 꺼내서 가지고 가야 하는데 불편해서..키를 추가로 살까 하다가...

그냥 만들어 봤습니다.

우선 주파수를 몇을 쓰는지 몰라서... 433MHz 와 315MHz 둘다 테스트 해봤는데.. 315MHz를 사용 하네요...

315mHz 방식 송/수신 모듈을 사서... 수신기로 분석한 값을 메모 해 놨다가...

송신기 만들어서 그 값을 보내주게 프로그램 했습니다...







Arduino Pro에 스위치 버튼 하나 달고.... 송신 모듈을 달아 줫습니다.

사진에 케이블을 프로그램 전송 때문에 여러 가닥인데..다 떼어 버리고...전원 5 볼트만 연결 하면 됩니다.#include <RCSwitch.h> bool bFirstRun = false; RCSwitch mySwitch = RCSwitch(); void setup() { pinMode(6, INPUT); pinMode(13, OUTPUT); Serial.begin(9600); // Transmitter is connected to Arduino Pin #10 mySwitch.enableTransmit(10); // Optional set pulse length. mySwitch.setPulseLength(447); // Optional set protocol (default is 1, will work for most outlets) //mySwitch.setProtocol(2); // Optional set number of transmission repetitions. // mySwitch.setRepeatTransmit(15); } void loop() { if (bFirstRun == false) { digitalWrite(13,HIGH); mySwitch.send(1380428, 24); //mySwitch.send(1380464, 24); //mySwitch.send(1380419, 24); bFirstRun = true; } if ( digitalRead(6) ) { digitalWrite(13,HIGH); mySwitch.send(1380428, 24); while (digitalRead(6)) { delay(1); } } delay(10); digitalWrite(13,LOW); return; /* See Example: TypeA_WithDIPSwitches */ mySwitch.switchOn("11111", "00010"); delay(1000); mySwitch.switchOff("11111", "00010"); delay(1000); /* Same switch as above, but using decimal code */ mySwitch.send(5393, 24); delay(1000); mySwitch.send(5396, 24); delay(1000); /* Same switch as above, but using binary code */ mySwitch.send("000000000001010100010001"); delay(1000); mySwitch.send("000000000001010100010100"); delay(1000); /* Same switch as above, but tri-state code */ mySwitch.sendTriState("00000FFF0F0F"); delay(1000); mySwitch.sendTriState("00000FFF0FF0"); delay(1000); delay(5000); }





원래 리모콘 수신해서 값을 분석하기 위한 수신 리시버에 코드는 다음과 같습니다.

그냥 수신만 잠시 하기 위해서 만든거니 코드 정리는 안했습니다.#include <EEPROM.h> #include <RCSwitch.h> RCSwitch mySwitch = RCSwitch(); unsigned long nEEPROMValue; void setup() { pinMode(12, OUTPUT); pinMode(13, OUTPUT); pinMode(A3, INPUT); Serial.begin(9600); Serial.println("Run"); mySwitch.enableReceive(0); // Receiver on interrupt 0 => that is pin #2 nEEPROMValue = EEPROMReadlong(1); } void loop() { if (mySwitch.available()) { output(mySwitch.getReceivedValue(), mySwitch.getReceivedBitlength(), mySwitch.getReceivedDelay(), mySwitch.getReceivedRawdata(),mySwitch.getReceivedProtocol()); Serial.println( mySwitch.getReceivedValue() ); //output(1); if (mySwitch.getReceivedValue() == nEEPROMValue) { if (digitalRead(12) == LOW) { Serial.println("on"); digitalWrite(12,HIGH); digitalWrite(13,HIGH); } else { Serial.println("off"); digitalWrite(12,LOW); digitalWrite(13,LOW); } delay(1000); } mySwitch.resetAvailable(); } if ( digitalRead(A3) == HIGH) { delay(1000); if ( digitalRead(A3) == HIGH) { digitalWrite(13,HIGH); Serial.println("TeachMode Start"); bool bLoop = true; while ( digitalRead(A3) == HIGH ) {} while (bLoop) { if ( digitalRead(A3) == HIGH) { bLoop = false; Serial.println("TeachMode End"); } if (mySwitch.available()) { nEEPROMValue = mySwitch.getReceivedValue(); EEPROMWritelong(1,nEEPROMValue); Serial.print("EEPROM Save : "); //Serial.println(EEPROMWritelong); bLoop = false; } } digitalWrite(13,LOW); } } } void EEPROMWritelong(int address, unsigned long value) { //Decomposition from a long to 4 bytes by using bitshift. //One = Most significant -> Four = Least significant byte byte four = (value & 0xFF); byte three = ((value >> 8) & 0xFF); byte two = ((value >> 16) & 0xFF); byte one = ((value >> 24) & 0xFF); //Write the 4 bytes into the eeprom memory. EEPROM.write(address, four); EEPROM.write(address + 1, three); EEPROM.write(address + 2, two); EEPROM.write(address + 3, one); } unsigned long EEPROMReadlong(long address) { //Read the 4 bytes from the eeprom memory. long four = EEPROM.read(address); long three = EEPROM.read(address + 1); long two = EEPROM.read(address + 2); long one = EEPROM.read(address + 3); //Return the recomposed long by using bitshift. return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF); }

댓글 없음:

댓글 쓰기