Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * IRprank: record and play back 10 IR signals 8
- * An IR detector/demodulator must be connected to the input RECV_PIN.
- * An IR LED must be connected to the output PWM pin 3.
- * A button must be connected to the input BUTTON_PIN; this is the
- * send button.
- * A visible LED can be connected to STATUS_PIN to provide status.
- *
- * The logic is:
- * If the button is pressed, send the IR code.
- * If an IR code is received, record it.
- *
- * Version 0.11 September, 2009
- * Copyright 2009 Ken Shirriff
- * http://arcfn.com
- * Modified by James Bruce, http://www.makeuseof.com/tag/author/jbruce
- */
- #include <IRremote.h>
- int RECV_PIN = 11;
- int BUTTON_PIN = 6;
- int STATUS_PIN = 13;
- IRrecv irrecv(RECV_PIN);
- IRsend irsend;
- decode_results results;
- void setup()
- {
- Serial.begin(9600);
- irrecv.enableIRIn(); // Start the receiver
- pinMode(BUTTON_PIN, INPUT);
- pinMode(STATUS_PIN, OUTPUT);
- }
- // Storage for the recorded code
- int codeType = -1; // The type of code
- unsigned long codeValue; // The code value if not raw
- unsigned int rawCodes[RAWBUF]; // The durations if raw
- int codeLen; // The length of the code
- int toggle = 0; // The RC5/6 toggle state
- /* Modifications for IR prank */
- int codeTypes[10];
- unsigned long codeValues[10];
- int codeLens[10];
- int currentSignalIndex = 0;
- int maxStoredSignals = 10;
- boolean canRecordMore = true; // false when maximum signals is received, must reset to change the signal pattern
- boolean playingBack = false; // used to toggle playback mode via button presses
- // Stores the code for later playback
- // Most of this code is just logging
- void storeCode(decode_results *results) {
- codeType = results->decode_type;
- int count = results->rawlen;
- if (codeType == UNKNOWN) {
- Serial.println("Received unknown code, saving as raw");
- codeLen = results->rawlen - 1;
- // To store raw codes:
- // Drop first value (gap)
- // Convert from ticks to microseconds
- // Tweak marks shorter, and spaces longer to cancel out IR receiver distortion
- for (int i = 1; i <= codeLen; i++) {
- if (i % 2) {
- // Mark
- rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK - MARK_EXCESS;
- Serial.print(" m");
- }
- else {
- // Space
- rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK + MARK_EXCESS;
- Serial.print(" s");
- }
- Serial.print(rawCodes[i - 1], DEC);
- }
- Serial.println("");
- }
- else {
- if (codeType == NEC) {
- Serial.print("Received NEC: ");
- if (results->value == REPEAT) {
- // Don't record a NEC repeat value as that's useless.
- Serial.println("repeat; ignoring.");
- return;
- }
- }
- else if (codeType == SONY) {
- Serial.print("Received SONY: ");
- }
- else if (codeType == RC5) {
- Serial.print("Received RC5: ");
- }
- else if (codeType == RC6) {
- Serial.print("Received RC6: ");
- }
- else {
- Serial.print("Unexpected codeType ");
- Serial.print(codeType, DEC);
- Serial.println("");
- }
- Serial.println(results->value, HEX);
- codeValue = results->value;
- codeLen = results->bits;
- }
- /* Store in the array of values */
- codeLens[currentSignalIndex] = codeLen;
- codeValues[currentSignalIndex] = codeValue;
- codeTypes[currentSignalIndex] = codeType;
- currentSignalIndex++;
- }
- void sendCode(int repeat) {
- if (codeType == NEC) {
- if (repeat) {
- irsend.sendNEC(REPEAT, codeLen);
- Serial.println("Sent NEC repeat");
- }
- else {
- irsend.sendNEC(codeValue, codeLen);
- Serial.print("Sent NEC ");
- Serial.println(codeValue, HEX);
- }
- }
- else if (codeType == SONY) {
- irsend.sendSony(codeValue, codeLen);
- Serial.print("Sent Sony ");
- Serial.println(codeValue, HEX);
- }
- else if (codeType == RC5 || codeType == RC6) {
- if (!repeat) {
- // Flip the toggle bit for a new button press
- toggle = 1 - toggle;
- }
- // Put the toggle bit into the code to send
- codeValue = codeValue & ~(1 << (codeLen - 1));
- codeValue = codeValue | (toggle << (codeLen - 1));
- if (codeType == RC5) {
- Serial.print("Sent RC5 ");
- Serial.println(codeValue, HEX);
- irsend.sendRC5(codeValue, codeLen);
- }
- else {
- irsend.sendRC6(codeValue, codeLen);
- Serial.print("Sent RC6 ");
- Serial.println(codeValue, HEX);
- }
- }
- else if (codeType == UNKNOWN /* i.e. raw */) {
- // Assume 38 KHz
- irsend.sendRaw(rawCodes, codeLen, 38);
- Serial.println("Sent raw");
- }
- }
- int lastButtonState;
- void loop() {
- // If button pressed, send the code.
- int buttonState = digitalRead(BUTTON_PIN);
- if (lastButtonState == HIGH && buttonState == LOW) {
- Serial.println("Toggling playback mode");
- //Toggle whichever mode is currently on
- playingBack = !playingBack;
- currentSignalIndex = 0; // reset to first signal reagrd,ess of mode
- }
- if(playingBack){
- if(currentSignalIndex == maxStoredSignals){
- currentSignalIndex = 0; //reset index upon reaching maximum
- }
- codeType = codeTypes[currentSignalIndex];
- codeLen = codeLens[currentSignalIndex];
- codeValue = codeValues[currentSignalIndex];
- Serial.print("Sending single at index ");
- Serial.println(currentSignalIndex);
- sendCode(false);
- digitalWrite(STATUS_PIN, HIGH);
- //sendCode(lastButtonState == buttonState); // repeats are difficult to deal with when you have multiple signals, let's just default to 1 repeat
- digitalWrite(STATUS_PIN, LOW);
- delay(1000); // Wait a bit between retransmissions
- currentSignalIndex++;
- }
- else{
- //switched to inert mode, listen or wait
- if (irrecv.decode(&results) && canRecordMore) {
- digitalWrite(STATUS_PIN, HIGH);
- storeCode(&results);
- if(currentSignalIndex == maxStoredSignals){
- Serial.println("Stored as many as we can, waiting for playback trigger");
- canRecordMore = false; // Reset arduino to allow for more signals to be recorded
- }
- else{
- irrecv.resume(); // resume receiver
- digitalWrite(STATUS_PIN, LOW);
- }
- }
- }
- lastButtonState = buttonState;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement