This is a port of the Adafruit Trinket (Arduino) universal Infrared receiver. The should produce a unique code for every key on virtually any Infrared Remote control

Dependencies:   mbed

Revision:
0:0124991faa9d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue May 19 09:43:35 2015 +0000
@@ -0,0 +1,94 @@
+
+/* Trinket/Gemma compatible Raw IR decoder sketch
+This sketch/program uses an Adafruit Trinket or Gemma
+ATTiny85 based mini microcontroller and a PNA4602 to
+decode IR received. This can be used to make a IR receiver
+(by looking for a particular code) or transmitter
+(by pulsing an IR LED at ~38KHz for the durations detected
+
+Based on Adafruit tutorial http://learn.adafruit.com/ir-sensor/using-an-ir-sensor
+
+and ATTiny program by TinyPCRemote Nathan Chantrell http://nathan.chantrell.net
+under Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) license
+
+Modified to work on MBed by David Bottrill May 2015
+This has been tested on a KL25z using a Grove IR sensor with a number of different
+Infrared Remote controls.
+
+*/
+#include "mbed.h"
+
+#define MAXPULSE    10000                               // the maximum pulse we'll listen for - 10 milliseconds 
+#define NUMPULSES    200                                // max IR pulse pairs to sample
+#define RESOLUTION     1                                // time between IR measurements ~1uS
+
+// we will store up to 200 pulse pairs (this is -a lot-)
+uint16_t pulses[200][2];                                // pair is high and low pulse
+uint16_t currentpulse = 0;                              // index for pulses we're storing
+uint32_t irCode = 0;
+Serial pc(USBTX, USBRX);                                // tx, rx
+DigitalIn IRpin (D2);                                   // Listen to IR receiver on Trinket/Gemma pin D2
+
+int listenForIR(void);                                  // IR receive code
+void printcode(void);                                   // Print IR code in HEX
+
+int main(void)
+{
+    pc.printf("Ready to decode IR!\n");
+
+    while (1) {
+
+        int numpulse=listenForIR();                     // Wait for an IR Code
+
+        // Process the pulses to get a single number representing code
+        for (int i = 0; i < 32; i++) {
+            irCode=irCode<<1;
+            if((pulses[i][0] * RESOLUTION)>0&&(pulses[i][0] * RESOLUTION)<500) {
+                irCode|=0;
+            } else {
+                irCode|=1;
+            }
+        }
+
+        printcode();                                    // Print IR code 
+        wait_ms(100);
+
+    }  //end of main loop
+}
+
+
+int listenForIR(void){                                  // IR receive code
+    currentpulse = 0;
+    while (1) {
+        unsigned int highpulse, lowpulse;               // temporary storage timing
+        highpulse = lowpulse = 0;                       // start out with no pulse length
+
+        while (IRpin==1) {                              // got a high pulse
+            highpulse++;
+            wait_us(RESOLUTION);
+            if (((highpulse >= MAXPULSE) && (currentpulse != 0))|| currentpulse == NUMPULSES) {
+                return currentpulse;
+            }
+        }
+        pulses[currentpulse][0] = highpulse;
+
+        while (IRpin==0) {                              // got a low pulse
+            lowpulse++;
+            wait_us(RESOLUTION);
+            if (((lowpulse >= MAXPULSE) && (currentpulse != 0))|| currentpulse == NUMPULSES) {
+                return currentpulse;
+            }
+        }
+        pulses[currentpulse][1] = lowpulse;
+        currentpulse++;
+    }
+}
+
+void printcode(void)
+{
+    uint16_t half;
+    half=irCode>>16;                                    // Get first 16 bits of code
+    pc.printf("0x%x",half);                             // Print upper 16 bits in hex
+    pc.printf("%x\n",(irCode & 0xFFFF));                // print lower 16 bits in hex
+}
+