// Arduino with Plarail // 2009.5.5. Toshi Nagata // // Servo: D9 // LED1 (red): cathode (short), GND with 220 ohm; anode (long), D12 // LED2 (green): cathode (short), GND with 220 ohm; anode (long), D13 // Switch1 (red): A0 (10kohm pull-up) // Switch2 (green): A1 (10kohm pull-up) // 7SegLED: common anode 1 (pin 14), D11 // common anode 2 (pin 13), D8 // E1 (pin 1) and E2 (pin 5), D0 with 220 ohm // D1 (pin 2) and D2 (pin 6), D1 with 220 ohm // C1 (pin 3) and C2 (pin 8), D2 with 220 ohm // DP1 (pin 4) and DP2 (pin 9), D3 with 220 ohm // F1 (pin 18) and F2 (pin 12), D4 with 220 ohm // G1 (pin 17) and G2 (pin 7), D5 with 220 ohm // A1 (pin 16) and A2 (pin 11), D6 with 220 ohm // B1 (pin 15) and B2 (pin 10), D7 with 220 ohm #include Servo myservo; #include #define DP B00001000 byte patTable[11] = { B11010111, /* 0 */ B10000100, /* 1 */ B11100011, /* 2 */ B11100110, /* 3 */ B10110100, /* 4 */ B01110110, /* 5 */ B01110111, /* 6 */ B11000100, /* 7 */ B11110111, /* 8 */ B11110110, /* 9 */ B00100000 /* - */ }; byte pat[2]; void ledRefresh() { byte p; static byte digit = 0; if (digit == 0) { p = pat[0]; digitalWrite(11, HIGH); digitalWrite(8, LOW); digit = 1; } else { p = pat[1]; digitalWrite(11, LOW); digitalWrite(8, HIGH); digit = 0; } digitalWrite(0, (p & B00000001 ? LOW : HIGH)); digitalWrite(1, (p & B00000010 ? LOW : HIGH)); digitalWrite(2, (p & B00000100 ? LOW : HIGH)); digitalWrite(3, (p & B00001000 ? LOW : HIGH)); digitalWrite(4, (p & B00010000 ? LOW : HIGH)); digitalWrite(5, (p & B00100000 ? LOW : HIGH)); digitalWrite(6, (p & B01000000 ? LOW : HIGH)); digitalWrite(7, (p & B10000000 ? LOW : HIGH)); } void ledSet(int v) { if (v < 0) { pat[0] = patTable[10]; pat[1] = patTable[10]; } else { pat[0] = patTable[(v / 10) % 10]; pat[1] = patTable[v % 10]; } } 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 setup() { pinMode(0, OUTPUT); pinMode(1, OUTPUT); pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(11, OUTPUT); pinMode(12, OUTPUT); pinMode(13, OUTPUT); pinMode(14, INPUT); // analog-in 0 pinMode(15, INPUT); // analog-in 1 ledSet(-1); MsTimer2::set(5, ledRefresh); MsTimer2::start(); myservo.attach(9); green(); } int delayWithCheck(int i) { while (--i >= 0) { delay(100); if (digitalRead(14) == LOW) return 1; else if (digitalRead(15) == LOW) return 2; } return 0; } int countDown() { int count, i; count = 3; do { ledSet(count); redLight(); if (delayWithCheck(1) == 1) return 1; greenLight(); if (delayWithCheck(9) == 1) return 1; count--; } while (count > 0); red(); while (count < 6) { ledSet(count); if (delayWithCheck(10) == 2) break; count++; } green(); ledSet(-1); return 0; } void loop() { if (digitalRead(14) == LOW) { do { ledSet(9); while (digitalRead(14) == LOW) { delay(50); } } while (countDown()); } }