Copy and paste the code below into the Arduino Editor, then compile and upload it to your board.
/* CIRC17 - IR Replay
* Requires: IRLib 2.x Library
*
* record.ino by Chris Young
* modified by Brent Rubell for Adafruit Industries for the for the Metro (and Metro Express) Experimenters Guide. Support Open Source, buy Adafruit!
*/
/* IRLib */
#include <IRLibDecodeBase.h> //We need both the coding and
#include <IRLibSendBase.h> // sending base classes
#include <IRLib_P01_NEC.h> //Lowest numbered protocol 1st
#include <IRLib_P02_Sony.h> // Include only protocols you want
#include <IRLib_P03_RC5.h>
#include <IRLib_P04_RC6.h>
#include <IRLib_P05_Panasonic_Old.h>
#include <IRLib_P07_NECx.h>
#include <IRLib_HashRaw.h> //We need this for IRsendRaw
#include <IRLibCombo.h> // After all protocols, include this
// All of the above automatically creates a universal decoder
// class called "IRdecode" and a universal sender class "IRsend"
// containing only the protocols you want.
// Now declare instances of the decoder and the sender.
IRdecode myDecoder;
IRsend mySender;
// Include a receiver either this or IRLibRecvPCI or IRLibRecvLoop
#include <IRLibRecv.h>
IRrecv myReceiver(2); //pin number for the receiver
// Storage for the recorded code
uint8_t codeProtocol; // The type of code
uint32_t codeValue; // The data bits if type is not raw
uint8_t codeBits; // The length of the code in bits
//These flags keep track of whether we received the first code
//and if we have have received a new different code from a previous one.
bool gotOne, gotNew;
/* Buttons */
// button -> pin number
const int playBtn = 8;
const int recBtn = 9;
// hold the button states
int playBtnState = 0;
int recBtnState = 0;
// status LED
const int ledPin = 13;
void setup() {
gotOne=false; gotNew=false;
codeProtocol=UNKNOWN;
codeValue=0;
/* BTNS AND LED */
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
pinMode(playBtn, INPUT);
pinMode(recBtn, INPUT);
Serial.begin(9600);
Serial.println(F("Send a code from your remote and we will record it."));
Serial.println(F("Type any character and press enter. We will send the recorded code."));
Serial.println(F("Type 'r' special repeat sequence."));
myReceiver.enableIRIn(); // Start the receiver
}
// Stores the code for later playback
void storeCode(void) {
gotNew=true; gotOne=true;
codeProtocol = myDecoder.protocolNum;
Serial.print(F("Received "));
Serial.print(Pnames(codeProtocol));
if (codeProtocol==UNKNOWN) {
Serial.println(F(" saving raw data."));
myDecoder.dumpResults();
codeValue = myDecoder.value;
}
else {
if (myDecoder.value == REPEAT_CODE) {
// Don't record a NEC repeat value as that's useless.
Serial.println(F("repeat; ignoring."));
} else {
codeValue = myDecoder.value;
codeBits = myDecoder.bits;
}
Serial.print(F(" Value:0x"));
Serial.println(codeValue, HEX);
}
}
void sendCode(void) {
if( !gotNew ) {//We've already sent this so handle toggle bits
if (codeProtocol == RC5) {
codeValue ^= 0x0800;
}
else if (codeProtocol == RC6) {
switch(codeBits) {
case 20: codeValue ^= 0x10000; break;
case 24: codeValue ^= 0x100000; break;
case 28: codeValue ^= 0x1000000; break;
case 32: codeValue ^= 0x8000; break;
}
}
}
gotNew=false;
if(codeProtocol== UNKNOWN) {
//The raw time values start in decodeBuffer[1] because
//the [0] entry is the gap between frames. The address
//is passed to the raw send routine.
codeValue=(uint32_t)&(recvGlobal.decodeBuffer[1]);
//This isn't really number of bits. It's the number of entries
//in the buffer.
codeBits=recvGlobal.decodeLength-1;
Serial.println(F("Sent raw"));
}
mySender.send(codeProtocol,codeValue,codeBits);
if(codeProtocol==UNKNOWN) return;
Serial.print(F("Sent "));
Serial.print(Pnames(codeProtocol));
Serial.print(F(" Value:0x"));
Serial.println(codeValue, HEX);
}
void loop() {
recBtnState = digitalRead(recBtn);
playBtnState = digitalRead(playBtn);
if(recBtnState == HIGH ) {
digitalWrite(ledPin, LOW);
myDecoder.decode();
// Re-enable receiver
myReceiver.enableIRIn();
digitalWrite(ledPin, HIGH);
}
if(playBtnState == HIGH) {
// check for stored signal
if(gotOne) {
// send the IR Code
sendCode();
// re-enable receiver
myReceiver.enableIRIn();
digitalWrite(ledPin, LOW);
}
}
}
I don't see the LED lighting up
Try opening the Arduino Serial Monitor. There are Serial.print() statements in this code to help you debug.
I can receive but not send IR signals
Make sure your NPN Transistor is hooked up correctly, it is required for this circuit.
I'm really frustrated with this circuit, I don't see any output after debugging
Page last edited July 17, 2017
Text editor powered by tinymce.