/* * File....... IRanalyzer.pde * Purpose.... Records up to 128 signal changes * Author..... Walter Anderson * E-mail..... wandrson@walteranderson.us * Started.... 18 May 2007 * Updated.... 18 May 2007 * * */ #define TIMER_RESET TCNT1 = 0 #define SAMPLE_SIZE 128 int IRpin = 3; unsigned long TimerValue[SAMPLE_SIZE]; char direction[SAMPLE_SIZE]; byte change_count; unsigned long t0; long time; int len = 0; int cur = 0; int val; int bytes[8]; void setup() { Serial.begin(19200); Serial.println("Analyze IR Remote"); pinMode(IRpin, INPUT); } void loop() { Serial.println("Waiting..."); restart: change_count = 0; len = SAMPLE_SIZE; for (cur = 0;cur < 8;cur++) bytes[cur] = 0; while(digitalRead(IRpin) == HIGH) {} t0 = micros(); TimerValue[change_count] = t0; direction[change_count++] = '0'; while (change_count < SAMPLE_SIZE) { if (direction[change_count-1] == '0') { while(digitalRead(IRpin) == LOW) {}; TimerValue[change_count] = micros(); direction[change_count++] = '1'; } else { while(digitalRead(IRpin) == HIGH) {}; TimerValue[change_count] = micros(); direction[change_count++] = '0'; } if (change_count == 4) { time = TimerValue[1] - TimerValue[0]; if ((time < 3000) || (time > 6000)) goto restart; /* time = TimerValue[2] - TimerValue[1]; if ((time < 4000) || (time > 5000)) goto restart; */ } if (change_count > 50) { time = TimerValue[change_count -2] - TimerValue[change_count - 3]; if (time > 4000) { len = change_count; break; } } if (micros() - t0 > 1000000) { len = change_count; break; } } Serial.print("Bit stream detected: "); Serial.print(len); Serial.println(" transitions"); change_count = 0; cur = 0; val = 0; while (change_count < len - 1) { time = TimerValue[change_count + 1] - TimerValue[change_count]; /* if (direction[change_count] == '0') { Serial.print("D"); } else { Serial.print("U"); } Serial.println(time); */ if (time > 4000) { if (direction[change_count] == '0') Serial.print("D"); else Serial.print("U"); } else if ((time > 450) && (time < 750)) { if (direction[change_count] == '0') { change_count++; time = TimerValue[change_count + 1] - TimerValue[change_count]; if ((time > 350) && (time < 600)) { Serial.print("0"); val <<= 1; } else if ((time > 1400) && (time < 1750)) { Serial.print("1"); val <<= 1; val += 1; } else if (time > 4000) { Serial.print("dU"); } else { Serial.print("du["); Serial.print(time); Serial.print("]"); } } else { Serial.print("u["); Serial.print(time); Serial.print("]"); } cur++; } else { if (direction[change_count] == '0') { Serial.print("d["); Serial.print(time); Serial.print("]"); } else { Serial.print("u["); Serial.print(time); Serial.print("]"); } cur++; } if (cur % 4 == 0) { Serial.print(" "); if (cur % 8 == 0) { bytes[(cur / 8) - 1] = val; val = 0; } } // Serial.print(time); // Serial.print("\t"); // Serial.println(direction[change_count]); change_count++; } Serial.print(" Bit stream end : "); for (cur = 0;cur < 6;cur++) { Serial.print(bytes[cur], HEX); Serial.print(" "); } Serial.println("!"); if (bytes[0] == 0xB2) { int i; for (i = 0;i< 10;i++) { time = TimerValue[i + 1] - TimerValue[i]; Serial.print(time); Serial.print(" "); } } Serial.println(" !"); delay(2000); }