// IRRemote_Servo // 2009.5.16. Toshi Nagata // // IRC receiver module: D2 (interrupt 0) // Servo: D9 // LED1 (red): cathode (short), GND with 220 ohm; anode (long), D12 // LED2 (green): cathode (short), GND with 220 ohm; anode (long), D13 #include Servo myservo; volatile unsigned long start; volatile int data[100]; volatile int index; void redLight() { digitalWrite(12, HIGH); digitalWrite(13, LOW); } void greenLight() { digitalWrite(12, LOW); digitalWrite(13, HIGH); } void noLight() { digitalWrite(12, LOW); digitalWrite(13, LOW); } void red() { redLight(); myservo.write(135); } void green() { greenLight(); myservo.write(30); } void doInterrupt() { static unsigned long last; unsigned long now; long d; now = micros(); if (start == 0) { start = now; index = 0; last = now; } else { d = (now - last) / 10; if (index < 100) { data[index++] = d; } last = now; } } void setup() { start = 0; index = 0; Serial.begin(9600); pinMode(2, INPUT); pinMode(12, OUTPUT); pinMode(13, OUTPUT); myservo.attach(9); red(); attachInterrupt(0, doInterrupt, CHANGE); } void loop() { int i, d1, d2; long n; if (start == 0) delay(1); else { delay(20); n = 0; for (i = 0; i < index; i += 2) { d1 = data[i]; d2 = data[i + 1]; if (d1 > 400 || d2 > 400) break; if (d2 / d1 >= 3) n |= (1 << (i / 2)); } Serial.println(n, BIN); if (n == 0b100001001000) { green(); delay(1000); } else if (n == 0b100001101000) { red(); delay(1000); } start = 0; } }