Gestione Timer per roboval

Dependencies:   TextLCD mbed

Timer di misura per roboval. Il programma è stato scritto per la scheda Nucleo STM32F401RE, prevede la misura del tempo totale e dei parziali sui tre giri

Committer:
fdalforno
Date:
Mon Mar 07 08:51:08 2016 +0000
Revision:
0:c7170b5cd312
Child:
1:289167b04f0d
Prima versione da provare sul circuito

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fdalforno 0:c7170b5cd312 1 #include <stdlib.h>
fdalforno 0:c7170b5cd312 2
fdalforno 0:c7170b5cd312 3 #include "mbed.h"
fdalforno 0:c7170b5cd312 4 #include "TextLCD.h"
fdalforno 0:c7170b5cd312 5
fdalforno 0:c7170b5cd312 6 #define NUM_LAP 3
fdalforno 0:c7170b5cd312 7
fdalforno 0:c7170b5cd312 8
fdalforno 0:c7170b5cd312 9 typedef struct time_screen {
fdalforno 0:c7170b5cd312 10 int cents;
fdalforno 0:c7170b5cd312 11 int seconds;
fdalforno 0:c7170b5cd312 12 int minutes;
fdalforno 0:c7170b5cd312 13 } measured_time;
fdalforno 0:c7170b5cd312 14
fdalforno 0:c7170b5cd312 15
fdalforno 0:c7170b5cd312 16 DigitalOut heartbeat(LED1);
fdalforno 0:c7170b5cd312 17
fdalforno 0:c7170b5cd312 18 InterruptIn user_button(USER_BUTTON);
fdalforno 0:c7170b5cd312 19 InterruptIn proximity(D9);
fdalforno 0:c7170b5cd312 20
fdalforno 0:c7170b5cd312 21 Timer t;
fdalforno 0:c7170b5cd312 22 TextLCD lcd(D3,D4,D5,D6,D7,D8);
fdalforno 0:c7170b5cd312 23
fdalforno 0:c7170b5cd312 24 int lap = 0;
fdalforno 0:c7170b5cd312 25 int last_read = 0;
fdalforno 0:c7170b5cd312 26 int lap_time = 0;
fdalforno 0:c7170b5cd312 27
fdalforno 0:c7170b5cd312 28
fdalforno 0:c7170b5cd312 29 //Conversione da millisecondi a mm:ss:cc
fdalforno 0:c7170b5cd312 30 measured_time human_read(int ms){
fdalforno 0:c7170b5cd312 31 measured_time read;
fdalforno 0:c7170b5cd312 32 div_t qr = div(ms,1000);
fdalforno 0:c7170b5cd312 33
fdalforno 0:c7170b5cd312 34 read.cents = qr.rem % 100;
fdalforno 0:c7170b5cd312 35
fdalforno 0:c7170b5cd312 36 qr = div(qr.quot,60);
fdalforno 0:c7170b5cd312 37 read.seconds = qr.rem;
fdalforno 0:c7170b5cd312 38
fdalforno 0:c7170b5cd312 39 qr = div(qr.quot,60);
fdalforno 0:c7170b5cd312 40 read.minutes = qr.rem;
fdalforno 0:c7170b5cd312 41
fdalforno 0:c7170b5cd312 42 return read;
fdalforno 0:c7170b5cd312 43 }
fdalforno 0:c7170b5cd312 44
fdalforno 0:c7170b5cd312 45 void measure_time(){
fdalforno 0:c7170b5cd312 46 int read = t.read_ms();
fdalforno 0:c7170b5cd312 47
fdalforno 0:c7170b5cd312 48 if(lap == 0){
fdalforno 0:c7170b5cd312 49 t.start();
fdalforno 0:c7170b5cd312 50 lap++;
fdalforno 0:c7170b5cd312 51 }else{
fdalforno 0:c7170b5cd312 52 //Dabouncing per evitare problemi
fdalforno 0:c7170b5cd312 53 if(read - last_read > 100){
fdalforno 0:c7170b5cd312 54
fdalforno 0:c7170b5cd312 55 lap_time = read - last_read;
fdalforno 0:c7170b5cd312 56
fdalforno 0:c7170b5cd312 57 if(lap > NUM_LAP){
fdalforno 0:c7170b5cd312 58 t.stop();
fdalforno 0:c7170b5cd312 59 }else{
fdalforno 0:c7170b5cd312 60 lap++;
fdalforno 0:c7170b5cd312 61 }
fdalforno 0:c7170b5cd312 62
fdalforno 0:c7170b5cd312 63 last_read = read;
fdalforno 0:c7170b5cd312 64 }
fdalforno 0:c7170b5cd312 65 }
fdalforno 0:c7170b5cd312 66
fdalforno 0:c7170b5cd312 67 }
fdalforno 0:c7170b5cd312 68
fdalforno 0:c7170b5cd312 69 void reset_measure(){
fdalforno 0:c7170b5cd312 70 t.reset();
fdalforno 0:c7170b5cd312 71 lap = 0;
fdalforno 0:c7170b5cd312 72 last_read = 0;
fdalforno 0:c7170b5cd312 73 }
fdalforno 0:c7170b5cd312 74
fdalforno 0:c7170b5cd312 75
fdalforno 0:c7170b5cd312 76
fdalforno 0:c7170b5cd312 77
fdalforno 0:c7170b5cd312 78
fdalforno 0:c7170b5cd312 79 int main() {
fdalforno 0:c7170b5cd312 80
fdalforno 0:c7170b5cd312 81 proximity.mode(PullDown);
fdalforno 0:c7170b5cd312 82 proximity.rise(&measure_time);
fdalforno 0:c7170b5cd312 83 user_button.fall(&reset_measure);
fdalforno 0:c7170b5cd312 84
fdalforno 0:c7170b5cd312 85 while(true) {
fdalforno 0:c7170b5cd312 86 int read = t.read_ms();
fdalforno 0:c7170b5cd312 87
fdalforno 0:c7170b5cd312 88 measured_time time = human_read(read);
fdalforno 0:c7170b5cd312 89
fdalforno 0:c7170b5cd312 90 lcd.locate(0,0);
fdalforno 0:c7170b5cd312 91 lcd.printf("Totale %02d:%02d:%02d",time.minutes,time.seconds,time.cents);
fdalforno 0:c7170b5cd312 92
fdalforno 0:c7170b5cd312 93 //Gestione dei parziali
fdalforno 0:c7170b5cd312 94 if(lap > 1){
fdalforno 0:c7170b5cd312 95 time = human_read(lap_time);
fdalforno 0:c7170b5cd312 96 lcd.locate(0,1);
fdalforno 0:c7170b5cd312 97 lcd.printf("Giro %d %02d:%02d:%02d",lap - 1,time.minutes,time.seconds,time.cents);
fdalforno 0:c7170b5cd312 98 }
fdalforno 0:c7170b5cd312 99
fdalforno 0:c7170b5cd312 100 heartbeat = !heartbeat;
fdalforno 0:c7170b5cd312 101
fdalforno 0:c7170b5cd312 102
fdalforno 0:c7170b5cd312 103 if(lap > 0){
fdalforno 0:c7170b5cd312 104 wait(0.2);
fdalforno 0:c7170b5cd312 105 }else{
fdalforno 0:c7170b5cd312 106 wait(1);
fdalforno 0:c7170b5cd312 107 }
fdalforno 0:c7170b5cd312 108 }
fdalforno 0:c7170b5cd312 109 }