433mhz keyfob remote
-
hi there,
i'm here to share my project, it's just a simple keyfob programming/receiver to be connected to our mysensors net. I use this to control my surveillance sistem (activation/deactivation).
i wrote this sketch for mysensors 1.5, so maybe it need to be translated for latest version.
my coding it's so rude, so i hope someone can also improve it.
later i will post schematic and the used component list.
cheers#include <MySensor.h> #include <SPI.h> #include <RCSwitch.h> #include <EEPROMEx.h> #define STATIC_ID 4 #define CHILD_ID 1 RCSwitch RFKey = RCSwitch(); const byte progSwitch = 4; // Prgram button const byte ledGreen = 6; // green led const byte ledRed = 7; // red led unsigned long lastAvailable = 0; unsigned long previousMillis = 0; int timeout = 3000; // set unlock timeout here MySensor gw; MyMessage msg(CHILD_ID,V_TRIPPED); int oldValue=-1; unsigned long code1, code2, code3; void setup() { gw.begin(NULL, STATIC_ID, false); pinMode(progSwitch, INPUT_PULLUP); // Prog button pinMode(ledGreen, OUTPUT); // unlock/learning pinMode(ledRed, OUTPUT); // invalid code/stop learnig RFKey.enableTransmit(3); // Transmitter is connected to Arduino Pin #3 RFKey.enableReceive(0); // Receiver on inerrupt 0 => that is pin #2 gw.sendSketchInfo("Ricevitore 433 MHZ", "1.0"); gw.present(CHILD_ID, S_DOOR); code1 = EEPROM.readLong( 50 ); code2 = EEPROM.readLong( 100 ); code3 = EEPROM.readLong( 150 ); } void loop() { if ( !digitalRead(progSwitch) ) { // check button unsigned long lastMillis = 0; previousMillis = millis(); while ( !digitalRead(progSwitch) ) { lastMillis = millis(); } if ( (lastMillis - previousMillis) > 10000 ){ // press button 10sec updateCode(); // change remote codes } else if ( (lastMillis - previousMillis) > 200 ){ // debounce progRemote(); // send radio code to remotes learn } } //////////////////////////////////////////////////////// if ( RFKey.available() ) { // multicode control blinkLed(ledRed, 1, 50); unsigned long receivedCode = RFKey.getReceivedValue(); RFKey.resetAvailable(); Serial.println (receivedCode); if ( receivedCode == code1 ){ // check first code unsigned long checkTime = millis(); receivedCode = 0; boolean flag = false; while ( millis() < (checkTime + timeout) ) { if ( RFKey.available() ) { blinkLed(ledRed, 1, 50); receivedCode = RFKey.getReceivedValue(); RFKey.resetAvailable(); if ( receivedCode == code2 ){ //check second code Serial.println ("*** UNLOCKED ***"); digitalWrite( ledGreen, HIGH); digitalWrite( ledRed, LOW); gw.send(msg.set(0==HIGH ? 1 : 0)); // send unlock code flag = true; break; } } } if (flag == false){ gw.send(msg.set(1==HIGH ? 1 : 0)); blinkLed(ledGreen, 1, 100); Serial.println ("*** LOCKED ***"); digitalWrite( ledGreen, LOW); digitalWrite( ledRed, HIGH); RFKey.resetAvailable(); unsigned long checkTime = millis(); receivedCode = 0; } } else if ( receivedCode == code3 ) { // CODICE AUX gw.send(msg.set(2)); blinkLed(ledGreen, 1, 100); Serial.println ("*** AUX ***"); delay(3000); RFKey.resetAvailable(); receivedCode = 0; } else{ RFKey.resetAvailable(); delay (1000); Serial.println("*** invalid code ***"); Serial.print("received code: "); Serial.println(receivedCode); receivedCode = 0; } } } void progRemote(){ // keyfob programming unsigned long code1 = EEPROM.readLong( 50 ); unsigned long code2 = EEPROM.readLong( 100 ); unsigned long code3 = EEPROM.readLong( 150 ); Serial.println("--- CODE 1 ---"); sendCode(code1); Serial.println("terminated"); blinkLed(ledRed, 1, 1000); Serial.println("--- CODE 2 ---"); sendCode(code2); Serial.println("terminated"); blinkLed(ledRed, 1, 1000); Serial.println("--- CODE 3 ---"); sendCode(code3); Serial.println("terminated"); blinkLed(ledRed, 1, 1000); } void sendCode ( unsigned long sendCode) { Serial.print("Sending code (20sec): "); Serial.println( sendCode ); previousMillis = millis(); unsigned long lastLedBlink = millis(); boolean ledStatus = false; while ( millis() < ( previousMillis + 20000 ) ) { RFKey.send( sendCode, 24 ); blinkLed(ledGreen, 1, 50); } } //////////////////////////////////////////////////////////////////////////// void updateCode() { // chandge radio code Serial.println("change radio code"); //unsigned long randomCode1 = random (1000000,9999999); unsigned long randomCode1 = random (1000,4094); // 12 bit // randomCode1 = 3618; Serial.print ("Codice random1 : "); Serial.println(randomCode1); //unsigned long randomCode2 = random (1000000,9999999); unsigned long randomCode2 = random (1000,4094); // 12 bit // randomCode2 = 2769; Serial.print ("Codice random2 : "); Serial.println(randomCode2); //unsigned long randomCode3 = random (1000000,9999999); unsigned long randomCode3 = random (1000,4094); // 12 bit // randomCode3 = 1720; Serial.print ("Codice random3 : "); Serial.println(randomCode3); EEPROM.writeLong( 50 , randomCode1 ); EEPROM.writeLong( 100 , randomCode2 ); EEPROM.writeLong( 150 , randomCode3 ); blinkLed(ledGreen, 1, 3000); } //////////////////////////////////////////////////////////////////////////// void checkCode() { // check received code unsigned long receivedCode = RFKey.getReceivedValue(); unsigned long code1 = EEPROM.readLong( 50 ); unsigned long code2 = EEPROM.readLong( 100 ); if ( receivedCode == code1 ){ // check first code blinkLed(ledGreen, 1, 100); Serial.println ("first code unlocked"); RFKey.resetAvailable(); unsigned long checkTime = millis(); receivedCode = 0; while ( millis() < (checkTime + 3000) ) { // Serial.println ("while"); if ( RFKey.available() ) { receivedCode = RFKey.getReceivedValue(); if ( receivedCode == code2 ){ //check second code // Serial.println ("second code unlocked"); RFKey.resetAvailable(); Serial.println("*** valid code received ***"); // ALstatus = !ALstatus; // return true; } } } } else{ RFKey.resetAvailable(); delay (1000); Serial.println("*** invalid code ***"); Serial.print("received code: "); Serial.println(receivedCode); // return false; } } //////////////////////////////////////////////////////////////////////////// void blinkLed(byte ledPin, byte times, int Delay){ for ( int i = 0; i < times; i++){ digitalWrite (ledPin, HIGH); delay (Delay); digitalWrite (ledPin, LOW); delay (Delay); } } //////////////////////////////////////////////////////////////////////////// /* Instruction press PROG button to send code for keyfob programming hold PROG about 10 sec. to reset and generate new code for keyfob programming */