Kevin Wells hace 6 años
padre
commit
89e23ab0fa
Se han modificado 7 ficheros con 140 adiciones y 78 borrados
  1. 6 1
      _main.ino
  2. 79 0
      irSensor.ino
  3. 7 58
      loop.ino
  4. 5 6
      pushButton.ino
  5. 2 8
      setup.ino
  6. 4 0
      showShape.ino
  7. 37 5
      showShapeLap.ino

+ 6 - 1
_main.ino

@@ -51,7 +51,8 @@ Arduino pin for LAP DISPLAY
 // Sabatatini test track circumference equals 100.531 feet or 0.01903996212 miles per lap USED 0.01903   
 // Iowa track = 0.02083333333 miles per lap
 #define distance 0.02083333333
-#define maxLaps 12
+#define maxTimes 13
+#define restPeriod 30000
 
 
 #define MODE_SPINUP 0
@@ -79,3 +80,7 @@ int avglaps= 0; // AVERAGE LAP COUNTER
 int recordedLaps = 0;     //number of samples averaged 
 double speeds[maxLaps] = {0};    // need a 0 for every sample to average
 
+unsigned long times[maxTimes] = {0};
+int recordedTimes = 0;
+unsigned long lastTime = 0;
+unsigned long restExpires = 0;

+ 79 - 0
irSensor.ino

@@ -0,0 +1,79 @@
+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;
+}

+ 7 - 58
loop.ino

@@ -1,62 +1,11 @@
 void loop() {
-  // int v = digitalRead(8);
-  // Serial.print(v);
-  // Serial.print('\n');
-  if (timerRunning == 0 && digitalRead(SENSOR) == HIGH) { // stop counting
-    startTime = millis();
-    timerRunning = 1;
+  if (mode == MODE_RESTING && millis() > restExpires) {
+    mode = MODE_SPINUP;
+    lastTime = 0;
+    showShape(2);
+    showShapeLAP(2);
   }
-  if (timerRunning == 1 && digitalRead(SENSOR) == LOW) { // start counting
-    endTime = millis();
-    timerRunning = 0;
-    laps++;
-    avglaps++;
-    duration = endTime - startTime;
-    seconds = (duration/1000);
-    hours= (duration/3600000);
-    mph= (distance/hours);
-    Serial.print ("Lap:   ");
-    Serial.print (laps);
-    Serial.print (" \t");
-    Serial.print ("mph:   ");
-    Serial.print (mph,3);
-    Serial.print (" \t");
-    Serial.print ("sec: ");
-    Serial.println (seconds,3);
-    Serial.print ("avgLap:   ");
-    Serial.println (avglaps);
-    delay(5); // added this delay to stop reading rear wheels error before was up to .003 seconds
-    if (mode == MODE_SPINUP) {
-      showNumber(mph);
-      showShapeLAP(2);
-    }
-    if (mode == MODE_COUNTING) {
-      showNumber(mph);
-      showNumberLAP(recordedLaps);
-      recordLap(mph);
-      if (recordedLaps == maxLaps) {
-        Serial.println('Switching mode to MODE_RESTING\n');
-        mode = MODE_RESTING;
-      }
-    }
-    if (mode == MODE_RESTING) {
-      showNumber(averageSpeed());
-      showNumberLAP(maxLaps);
-      delay(3000);
-      showNumber(0);
-      showShapeLAP(2);
-      Serial.println("Setting mode to MODE_SPINUP\n");
-      mode = MODE_SPINUP;
-      recordedLaps = 0;
-    } 
-    // Otherwise leave it
-
-    /// LAP AVERAGE COUNTER LOOP CODE /////////////////////
-    Serial.print("avgSpeed: ");
-    Serial.println (averageSpeed(),4);
+  if (mode == MODE_SPINUP) {
+    showShapeLAP(20 + (millis() / 62) % 8);
   }
-
 }
-
-
-

+ 5 - 6
pushButton.ino

@@ -5,12 +5,11 @@ void pushButton()
   // If interrupts come faster than 200ms, assume it's a bounce and ignore
   if (interrupt_time - last_interrupt_time > 200) 
   {
-    Serial.print("Button\n");
-    if (mode == MODE_SPINUP) {
-      Serial.print("Switching mode to MODE_COUNTING\n");
-      mode = MODE_COUNTING;
-      recordedLaps = 0;
-    }
+    Serial.print("Switching mode to MODE_COUNTING\n");
+    mode = MODE_COUNTING;
+    recordedTimes = 0;
+    showShape(2);
+    showShapeLAP(2);
   }
   last_interrupt_time = interrupt_time;
 }

+ 2 - 8
setup.ino

@@ -21,9 +21,7 @@ void setup() {
 
   pinMode(button, INPUT_PULLUP);
   attachInterrupt(digitalPinToInterrupt(button), pushButton, RISING);
-
-  
-  
+  attachInterrupt(digitalPinToInterrupt(SENSOR), irSensor, FALLING);
 
   Serial.println("Iowa Lap Timer");
   Serial.print(distance, 4);
@@ -42,10 +40,6 @@ void setup() {
   showShape(0);
   showShapeLAP(0);
   delay(500);
-  showShape(4);
-  showShapeLAP(4);
-  delay(500);
+  showShape(2);
   showShapeLAP(2);
-   
-
 }

+ 4 - 0
showShape.ino

@@ -47,6 +47,10 @@ void showShape(int shape)
     case 2:
       segments1 = d;
       segments2 = d;
+      segments3 = d;
+      segments4 = d;
+      segments5 = d;
+      segments6 = d;
       
       break;
     // Double 88

+ 37 - 5
showShapeLap.ino

@@ -1,10 +1,10 @@
 void showShapeLAP(int shape)
 {
-  //    -  A
+  //    -   A
   //   / / F/B
-  //    -  G
+  //    -   G
   //   / / E/C
-  //    -. D/DP
+  //    -.  D/DP
 
 #define a  1<<0
 #define b  1<<6
@@ -51,6 +51,38 @@ void showShapeLAP(int shape)
       segmentsLAP1 = 0;
       segmentsLAP2 = 0;
       break;  
+    case 20:
+      segmentsLAP1 = a;
+      segmentsLAP2 = a;
+      break;
+    case 21:
+      segmentsLAP1 = a | b;
+      segmentsLAP2 = 0;
+      break;
+    case 22:
+      segmentsLAP1 = b | c;
+      segmentsLAP2 = 0;
+      break;
+    case 23:
+      segmentsLAP1 = c | d;
+      segmentsLAP2 = 0;
+      break;
+    case 24:
+      segmentsLAP1 = d;
+      segmentsLAP2 = d;
+      break;
+    case 25:
+      segmentsLAP1 = 0;
+      segmentsLAP2 = d | e;
+      break;
+    case 26:
+      segmentsLAP1 = 0;
+      segmentsLAP2 = e | f;
+      break;
+    case 27:
+      segmentsLAP1 = 0;
+      segmentsLAP2 = f | a;
+      break;
   }
   //Clock these bits out to the drivers
   // SegmentLAP1
@@ -61,8 +93,8 @@ void showShapeLAP(int shape)
     digitalWrite(segmentClockLAP, HIGH); //Data transfers to the register on the rising edge of SRCK
   }
 
-  digitalWrite(segmentLatchLAP, LOW);
-  digitalWrite(segmentLatchLAP, HIGH); //Register moves storage register on the rising edge of RCK
+  // digitalWrite(segmentLatchLAP, LOW);
+  // digitalWrite(segmentLatchLAP, HIGH); //Register moves storage register on the rising edge of RCK
 
   // SegmentLAP2
   for (byte x = 0 ; x < 8 ; x++)