Hej,
this is my code for sender and receiver, note that the receiver is having a nasty hack to get the data out, but it sends and receives numbers from 1 to 8 with no problem
RECEIVER
-----------------
int ir_pin = 7; Â Â Â Â Â Â Â Â Â Â Â Â //Sensor pin 1 wired through a 220 ohm resistor
int led_pin = 13; Â Â Â Â Â Â Â Â Â Â Â Â Â //"Ready to Receive" flag, not needed but nice
int debug = 0; Â Â Â Â Â Â Â Â Â Â Â Â Â //Serial connection must be started to debug
int start_bit = 2000; Â Â Â Â Â Â Â Â Â //Start bit threshold (Microseconds)
int bin_1 = 1000; Â Â Â Â Â Â Â Â Â Â Â Â Â //Binary 1 threshold (Microseconds)
int bin_0 = 400; Â Â Â Â Â Â Â Â Â Â Â Â Â Â //Binary 0 threshold (Microseconds)
void setup() {
pinMode(led_pin, OUTPUT); Â Â Â Â Â Â //This shows when we're ready to receive
pinMode(ir_pin, INPUT);
digitalWrite(led_pin, LOW); Â Â Â //not ready yet
Serial.begin(9600);
}
void loop() {
int key = getIRKey(); Â Â Â Â Â Â //Fetch the key
if (key != -1) {
 Serial.print("Key Recieved: ");
 Serial.println(key);
}
}
int getIRKey() {
int data[12];
digitalWrite(led_pin, HIGH); Â Â //Ok, i'm ready to recieve
while(pulseIn(ir_pin, LOW) < 2200) { //Wait for a start bit
}
data[0] = pulseIn(ir_pin, LOW); Â Â Â //Start measuring bits, I only want low pulses
data[1] = pulseIn(ir_pin, LOW);
data[2] = pulseIn(ir_pin, LOW);
data[3] = pulseIn(ir_pin, LOW);
data[4] = pulseIn(ir_pin, LOW);
data[5] = pulseIn(ir_pin, LOW);
data[6] = pulseIn(ir_pin, LOW);
data[7] = pulseIn(ir_pin, LOW);
data[8] = pulseIn(ir_pin, LOW);
data[9] = pulseIn(ir_pin, LOW);
data[10] = pulseIn(ir_pin, LOW);
data[11] = pulseIn(ir_pin, LOW);
digitalWrite(led_pin, LOW);
if(debug == 1) {
 Serial.println("-----");
}
for(int i=0;i<11;i++) { Â Â Â Â Â Â Â Â //Parse them
 if (debug == 1) {
    Serial.println(data[i]);
 }
 if(data[i] > bin_1) {         //is it a 1?
   data[i] = 1;
 }  else {
   if(data[i] > bin_0) {      //is it a 0?
    data[i] = 0;
   } else {
    data[i] = 2;           //Flag the data as invalid; I don't know what it is!
   }
 }
}
for(int i=0;i<11;i++) { Â Â Â Â Â Â Â Â //Pre-check data for errors
 if(data[i] > 1) {
   return -1;              //Return -1 on invalid data
 }
}
int result = 0;
int seed = 1;
for(int i=11;i>=0;i--) { Â Â Â Â Â Â Â Â //Convert bits to integer
 if(data[i] == 1) {
   result |= seed;
 }
 seed = seed * 2;
}
//patch for the weird data result
//I wish I knew wtf is wrong
for (int j = 0; j <= 11; j++) {
int aux = result;
 aux -= pow(2, j);
 if (aux < 0) {
  result = j;
  break;
 }
}
if (result > 8) result = -1;
return result; Â Â Â Â Â Â Â Â Â Â Â Â Â Â //Return key number
}
SENDER
--------------
int ir_pin = 6; Â Â Â Â Â Â Â Â Â Â Â Â //Sensor pin 1 wired through a 220 ohm resistor
int led_pin = 13; Â Â Â Â Â Â Â Â Â Â Â Â Â //"Ready to Receive" flag, not needed but nice
int debug = 1; Â Â Â Â Â Â Â Â Â Â Â Â Â //Serial connection must be started to debug
int start_bit = 2400; Â Â Â Â Â Â Â Â Â //Start bit threshold (Microseconds)
int bin_1 = 1200; Â Â Â Â Â Â Â Â Â Â Â Â Â //Binary 1 threshold (Microseconds)
int bin_0 = 600; Â Â Â Â Â Â Â Â Â Â Â Â Â Â //Binary 0 threshold (Microseconds)
int dataOut = 0;
int guardTime = 300;
void setup() {
pinMode(led_pin, OUTPUT); Â Â Â Â Â Â //This shows when we're ready to recieve
pinMode(ir_pin, OUTPUT);
digitalWrite(led_pin, LOW); Â Â Â //not ready yet
digitalWrite(ir_pin, LOW); Â Â Â Â //not ready yet
Serial.begin(9600);
}
void loop() {
if (Serial.available()) {
 int val = Serial.read();
 switch (val) {
 case '0':
  dataOut = val - 48;
  break;
 case '1':
  dataOut = val - 48;
  break;
 case '2':
  dataOut = val - 48;
  break;
 case '3':
  dataOut = val - 48;
  break;
 case '4':
  dataOut = val - 48;
  break;
 case '5':
  dataOut = val - 48;
  break;
 case '6':
  dataOut = val - 48;
  break;
 case '7':
  dataOut = val - 48;
  break;
 case '8':
  dataOut = val - 48;
  break;
 default:
  dataOut = 255;
  break;
 }
}
int key = sendIRKey(dataOut); Â Â Â Â Â Â //Fetch the key
Serial.print("Key Sent: ");
Serial.println(key);
}
int sendIRKey(int dataOut) {
int data[12];
digitalWrite(led_pin, HIGH); Â Â //Ok, i'm ready to send
for (int i=0; i<12; i++)
 data[i] = dataOut>i & B1;  //encode data as '1' or '0'
// send startbit
oscillationWrite(ir_pin, start_bit);
// send separation bit
digitalWrite(ir_pin, HIGH);
delayMicroseconds(guardTime);
// send the whole string of data
for (int i=11; i>=0; i--) {
 //digitalWrite(ir_pin, LOW);
 //if (data[i] == 0) delayMicroseconds(bin_0);
 //else delayMicroseconds(bin_1);
 if (data[i] == 0) oscillationWrite(ir_pin, bin_0);
 else oscillationWrite(ir_pin, bin_1);
 // send separation bit
 digitalWrite(ir_pin, HIGH);
 delayMicroseconds(guardTime);
}
delay(20);
return dataOut; Â Â Â Â Â Â Â Â Â Â Â Â Â Â //Return key number
}
// this will write an oscillation at 38KHz for a certain time in useconds
void oscillationWrite(int pin, int time) {
for(int i = 0; i <= time/26; i++) {
 digitalWrite(pin, HIGH);
 delayMicroseconds(13);
 digitalWrite(pin, LOW);
 delayMicroseconds(13);
}
}
/d