void irSensor() { static unsigned long last_interrupt_time = 0; unsigned long interrupt_time = millis(); // If interrupts come faster than 200ms, assume it's a bounce and ignore if (interrupt_time - last_interrupt_time > 200) { tripSensor(); } last_interrupt_time = interrupt_time; } void tripSensor() { unsigned long time = millis(); if (mode == MODE_RESTING) { if (time < restExpires) return; // Ignore signals while resting mode = MODE_SPINUP; lastTime = 0; } if (mode == MODE_COUNTING && recordedTimes < maxTimes) { times[recordedTimes++] = time; if (recordedTimes == maxTimes) { mode = MODE_RESTING; restExpires = time + 30000; } } if (mode == MODE_SPINUP && lastTime == 0) { lastTime = time; showShape(4); return; } if (mode == MODE_SPINUP && lastTime != 0) { double duration = time - lastTime; double mph = durationToMph(duration); lastTime = time; showNumber(mph); return; } if (mode == MODE_COUNTING && recordedTimes == 1) { showShape(4); showNumberLAP(0); return; } if (mode == MODE_COUNTING && recordedTimes > 1) { double duration = times[recordedTimes - 1] - times[recordedTimes - 2]; double mph = durationToMph(duration); showNumber(mph); showNumberLAP(recordedTimes - 1); return; } if (mode == MODE_RESTING) { double duration = averageTime(); double mph = durationToMph(duration); showNumber(mph); showNumberLAP(recordedTimes - 1); return; } } double averageTime() { if (recordedTimes > 0) { double sum = 0; for (int i = 1; i < recordedTimes; i++) { sum = sum + (double)(times[i] - times[i - 1]); } double average = sum / (double)recordedTimes; return average; } else { return 0; } } double durationToMph(double duration) { seconds = (duration/1000); hours = (duration/3600000); mph = (distance/hours); return mph; }