make more robust
[speedo_scaler.git] / speedo_scaler.ino
1 /*
2     Copyright 2015 Tom Parker
3
4     This program is free software: you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation, either version 3 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 */
17
18 // Divide incoming pulses by 2.75. We accept some jitter by outputing 3 pulses in 9 incoming pulses, and 1 pulse in 2.
19
20 int inPin = 2;
21 int outPin = 3;
22 int ledPin = 13;
23
24 int lastState = 0;
25 int count = 0;
26 int outputState = HIGH;
27
28 void setup() {
29   pinMode(inPin, INPUT_PULLUP);
30   pinMode(outPin, OUTPUT);
31   pinMode(ledPin, OUTPUT);
32   next();
33 }
34
35 void loop() {
36   int current = digitalRead(inPin);
37   if (current != lastState) {
38     lastState = current;
39     digitalWrite(ledPin, current);
40     count++;
41     switch (count) {
42       case 0 :
43       case 3 :
44       case 6 :
45       case 9 :
46         next();
47         break;
48     }
49     if (count >= 10) {
50       count = 0;
51     }
52   }
53 }
54
55 void next() {
56   if (outputState == LOW) {
57     outputState = HIGH;
58   } else {
59     outputState = LOW;
60   }
61   digitalWrite(outPin, outputState);
62 }