Go Down

Topic: Arduino Infrared Problems (Read 432 times) previous topic - next topic



I just got an Arduino board a few days ago and bought the parallax IR receiver part # 350-00014 and connected it exactly how it says on this other forum (http://arduino.cc/forum/index.php/topic,17965.0.html).  Now when I get the serial monitor open I keep getting 2047, then different values for each button I push on the sony TV remote control.  The code I am using is listed below.  I need the value for each button press to be consistent so that I can be able to control other stuff connected on the Arduino using if statements and such.  I understand that the Sony TV remote protocol sends 13 pulses (verified with oscilliscope).

Any help would be appreciated

Code: [Select]

int ir_pin = 8;                        //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 recieve
  pinMode(ir_pin, INPUT);
  digitalWrite(led_pin, LOW);          //not ready yet

void loop() {
  int key = getIRKey();                //Fetch the key
  Serial.print("Key Recieved: ");     

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) {
  for(int i=0;i<11;i++) {              //Parse them
    if (debug == 1) {
    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=0;i<11;i++) {              //Convert bits to integer
    if(data[i] == 1) {
      result += seed;
    seed = seed * 2;
  return result;                       //Return key number


Ken Shirriff wrote a really nice library for using IR devices. Why are you not using it?


Go Up

Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

via Egeo 16
Torino, 10131