/* Thank you to SparkFun for the majority of this code, which is publicly available from their website Arduino pin 6 -> CLK (Green on the 6-pin cable) 5 -> LAT (Blue) 7 -> SER on the IN side (Yellow) 5V -> 5V (Orange) Power Arduino with 12V and connect to Vin -> 12V (Red) GND -> GND (Black) */ //GPIO declarations //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= byte segmentClock = 6; byte segmentLatch = 5; byte segmentData = 7; const byte interruptPin=2; //toggle switch is on pin D2 int number = 0; unsigned long timeAtPrevLap = 100000; //assume an initial time (will be soon overwritten by millis command, in the ISR unsigned long timeAtThisLap = 120000; //assume an initial time for the second lap (will be soon overwritten by millis command, in the ISR //int timeForTen=100000; //the time taken to do 10 laps unsigned long timeForLast=1000;// millseconds taken for last lap int lapSpeed=8888; int lapCounter=0; //start with no laps int lapDistance = 40; //40m circumference boolean decimalPoint=0; //int aveSpeed = 10; //assume a speed of 10mph initially //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= void setup() { Serial.begin(9600); Serial.println("Large Digit Driver Example"); pinMode(segmentClock, OUTPUT); pinMode(segmentData, OUTPUT); pinMode(segmentLatch, OUTPUT); pinMode(interruptPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(interruptPin), timeSince, RISING); digitalWrite(segmentClock, LOW); digitalWrite(segmentData, LOW); digitalWrite(segmentLatch, LOW); } void timeSince(){ //timeAtThisLap=millis(); if((millis()-timeAtPrevLap)<400){ return; } //this is to make sure only one pulse per lap is counted else{ timeForLast=millis()-timeAtPrevLap; lapCounter=lapCounter+1; timeAtPrevLap=millis(); } } void loop() { showNumber(lapSpeed); //Test pattern lapSpeed=(((lapDistance/1.625*3600)/(timeForLast))*100); if(lapSpeed>9999){ lapSpeed=lapSpeed/10; decimalPoint=1; } else{ decimalPoint=0; } // if(lapSpeed > 1990) // { // lapSpeed=8888; // } // else{} // Serial.print(lapCounter); Serial.print("\t interval"); Serial.print(timeForLast); Serial.print("time at previous "); Serial.print(timeAtPrevLap); Serial.print("lap number "); Serial.print(lapCounter); Serial.print("decimal point showing "); Serial.print(decimalPoint); Serial.print("speed "); Serial.println(lapSpeed); //For debugging delay(500); } //Takes a number and displays 4 numbers. Displays absolute value (no negatives) void showNumber(float lapSpeed) { int number = (lapSpeed); //Remove negative signs and any decimals //Serial.print("number: "); //Serial.println(number); // for (byte x = 0 ; x < 4 ; x++) // { // int remainder = number % 10; // postNumber(remainder, true); //postNumber(remainder, false); // number /= 10; // } if(decimalPoint==0){ //sub 100mph laps int remainder = number % 10; postNumber(remainder, false); number/=10; remainder = number % 10; postNumber(remainder, false); number/=10; remainder = number % 10; postNumber(remainder, true); number/=10; remainder = number % 10; postNumber(remainder, false); number/=10; //Latch the current segment data digitalWrite(segmentLatch, LOW); digitalWrite(segmentLatch, HIGH); //Register moves storage register on the rising edge of RCK } else{ int remainder = number % 10; //more than 100mph, so move decimal point postNumber(remainder, false); number/=10; remainder = number % 10; postNumber(remainder, true); number/=10; remainder = number % 10; postNumber(remainder, false); number/=10; remainder = number % 10; postNumber(remainder, false); number/=10; //Latch the current segment data digitalWrite(segmentLatch, LOW); digitalWrite(segmentLatch, HIGH); //Register moves storage register on the rising edge of RCK } } //Given a number, or '-', shifts it out to the display void postNumber(byte number, boolean decimal) { // - A // / / F/B // - G // / / E/C // -. D/DP #define a 1<<0 #define b 1<<6 #define c 1<<5 #define d 1<<4 #define e 1<<3 #define f 1<<1 #define g 1<<2 #define dp 1<<7 byte segments; switch (number) { case 1: segments = b | c; break; case 2: segments = a | b | d | e | g; break; case 3: segments = a | b | c | d | g; break; case 4: segments = f | g | b | c; break; case 5: segments = a | f | g | c | d; break; case 6: segments = a | f | g | e | c | d; break; case 7: segments = a | b | c; break; case 8: segments = a | b | c | d | e | f | g; break; case 9: segments = a | b | c | d | f | g; break; case 0: segments = a | b | c | d | e | f; break; case ' ': segments = 0; break; case 'c': segments = g | e | d; break; case '-': segments = g; break; } if (decimal) segments |= dp; //Clock these bits out to the drivers for (byte x = 0 ; x < 8 ; x++) { digitalWrite(segmentClock, LOW); digitalWrite(segmentData, segments & 1 << (7 - x)); // digitalWrite(segmentData, 1<<7); digitalWrite(segmentClock, HIGH); //Data transfers to the register on the rising edge of SRCK } }