Speedometer for CS 335 final project.

Dependencies:   mbed mbed-rtos

Committer:
bky
Date:
Tue Dec 01 12:27:22 2020 +0000
Revision:
18:ef0569bea7e9
Parent:
16:def6abcb4294
Dobby is a free elf

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bky 10:8d86e59fb408 1 # include "mbed.h"
bky 16:def6abcb4294 2 # include "rtos.h"
bky 10:8d86e59fb408 3 # include "Timer.h"
bky 16:def6abcb4294 4 # include "displayDriver.h"
bky 9:b7e8d0372f53 5
bky 10:8d86e59fb408 6 # include <time.h>
bky 10:8d86e59fb408 7 # define NUM_HOLES 32
bky 10:8d86e59fb408 8 # define CIRCUMFRENCE_CM 48.6946861
bky 9:b7e8d0372f53 9
bky 18:ef0569bea7e9 10 # define LIGHT_SENSOR_PIN p18
bky 14:8ceaa97cc85c 11 # define FLASH_THRESHOLD 0.02
bky 14:8ceaa97cc85c 12 # define PERIOD_MS 500
bky 16:def6abcb4294 13 # define RUNTIME 120000 // 2 mins
bky 9:b7e8d0372f53 14
bky 9:b7e8d0372f53 15
bky 9:b7e8d0372f53 16 AnalogIn lightSensorVoltage(LIGHT_SENSOR_PIN);
bky 9:b7e8d0372f53 17 Serial pc(USBTX, USBRX);
bky 0:d724bf9c4031 18
bky 16:def6abcb4294 19 float velocity = 0.0; // used by display thread
bky 16:def6abcb4294 20
bky 9:b7e8d0372f53 21 void sendFloat(float value) {
bky 9:b7e8d0372f53 22 for (int i=0; i<4; i++)
bky 9:b7e8d0372f53 23 pc.putc(*(((char*) &value)+i));
bky 9:b7e8d0372f53 24 }
bky 9:b7e8d0372f53 25
bky 16:def6abcb4294 26 void displayThread_cb() {
bky 16:def6abcb4294 27 while(velocity >= 0) {
bky 18:ef0569bea7e9 28 display_num(velocity);
bky 16:def6abcb4294 29 }
bky 16:def6abcb4294 30 return;
bky 14:8ceaa97cc85c 31 }
bky 14:8ceaa97cc85c 32
bky 14:8ceaa97cc85c 33 int main() {
bky 16:def6abcb4294 34 Thread displayThread;
bky 16:def6abcb4294 35 displayThread.start(displayThread_cb);
bky 16:def6abcb4294 36
bky 16:def6abcb4294 37 Timer t0;
bky 16:def6abcb4294 38 t0.start();
bky 16:def6abcb4294 39
bky 16:def6abcb4294 40 while(t0.read_ms() < RUNTIME) {
bky 14:8ceaa97cc85c 41 float minVoltage = 1.1; // voltage will never go above 1.0
bky 14:8ceaa97cc85c 42 int voltagePeaks = 0;
bky 13:a1a9f2282f15 43
bky 16:def6abcb4294 44 Timer t1;
bky 16:def6abcb4294 45 t1.start();
bky 13:a1a9f2282f15 46
bky 16:def6abcb4294 47 while(t1.read_ms() < PERIOD_MS) {
bky 14:8ceaa97cc85c 48 float currVoltage = lightSensorVoltage.read();
bky 14:8ceaa97cc85c 49 if(currVoltage < minVoltage) {
bky 14:8ceaa97cc85c 50 minVoltage = currVoltage;
bky 14:8ceaa97cc85c 51 } else if (currVoltage - minVoltage > FLASH_THRESHOLD) {
bky 14:8ceaa97cc85c 52 voltagePeaks++;
bky 14:8ceaa97cc85c 53 minVoltage = 1.1;
bky 14:8ceaa97cc85c 54 }
bky 14:8ceaa97cc85c 55 wait(0.01);
bky 10:8d86e59fb408 56 }
bky 13:a1a9f2282f15 57
bky 16:def6abcb4294 58 t1.stop();
bky 13:a1a9f2282f15 59
bky 14:8ceaa97cc85c 60 // calculate velocity
bky 16:def6abcb4294 61 velocity = (voltagePeaks * CIRCUMFRENCE_CM * 1000) / (NUM_HOLES * PERIOD_MS);
bky 13:a1a9f2282f15 62
bky 14:8ceaa97cc85c 63 //send
bky 14:8ceaa97cc85c 64 sendFloat(velocity);
bky 7:12eed49f95fc 65 }
bky 16:def6abcb4294 66
bky 16:def6abcb4294 67 t0.stop();
bky 16:def6abcb4294 68 velocity = -1; // tells the display thread to stop
bky 16:def6abcb4294 69 displayThread.join();
bky 16:def6abcb4294 70
bky 14:8ceaa97cc85c 71 return 0;
bky 10:8d86e59fb408 72 }