TestKeypad

Dependencies:   Hotboards_keypad TextLCD mbed

Fork of Chronometer_V2 by VR FabLab - RoboVal

Committer:
Ghiri
Date:
Thu Nov 23 14:20:48 2017 +0000
Revision:
0:1a92e4a37697
Child:
1:26bcd89c18e5
Publication Test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Ghiri 0:1a92e4a37697 1 //##############################################################
Ghiri 0:1a92e4a37697 2 //##
Ghiri 0:1a92e4a37697 3 //## Event: RoboVal - Robot Race
Ghiri 0:1a92e4a37697 4 //##
Ghiri 0:1a92e4a37697 5 //## Chronometer double use
Ghiri 0:1a92e4a37697 6 //##
Ghiri 0:1a92e4a37697 7 //## Version 1.99A
Ghiri 0:1a92e4a37697 8 //##
Ghiri 0:1a92e4a37697 9 //## Hardware platform used: ST NUCLEO-F401RE
Ghiri 0:1a92e4a37697 10 //##
Ghiri 0:1a92e4a37697 11 //## Software IDE used: mbed online version
Ghiri 0:1a92e4a37697 12 //##
Ghiri 0:1a92e4a37697 13 //## Organizzation: Verona FabLab
Ghiri 0:1a92e4a37697 14 //##
Ghiri 0:1a92e4a37697 15 //## Date creation: 2018.01.01
Ghiri 0:1a92e4a37697 16 //##
Ghiri 0:1a92e4a37697 17 //## Software developpers: FdF,GV, AG
Ghiri 0:1a92e4a37697 18 //##
Ghiri 0:1a92e4a37697 19 //## Base on original version of by FdF
Ghiri 0:1a92e4a37697 20 //##
Ghiri 0:1a92e4a37697 21 //##############################################################
Ghiri 0:1a92e4a37697 22
Ghiri 0:1a92e4a37697 23 #include <stdlib.h>
Ghiri 0:1a92e4a37697 24
Ghiri 0:1a92e4a37697 25 #include "mbed.h"
Ghiri 0:1a92e4a37697 26 #include "TextLCD.h"
Ghiri 0:1a92e4a37697 27
Ghiri 0:1a92e4a37697 28
Ghiri 0:1a92e4a37697 29 // Default Number Lap
Ghiri 0:1a92e4a37697 30 #define NUM_LAP 3
Ghiri 0:1a92e4a37697 31
Ghiri 0:1a92e4a37697 32 // Reference for Low/Min Voltage battery
Ghiri 0:1a92e4a37697 33 #define VBAT_MIN 7.2
Ghiri 0:1a92e4a37697 34
Ghiri 0:1a92e4a37697 35
Ghiri 0:1a92e4a37697 36 typedef struct time_screen {
Ghiri 0:1a92e4a37697 37 int cents;
Ghiri 0:1a92e4a37697 38 int seconds;
Ghiri 0:1a92e4a37697 39 int minutes;
Ghiri 0:1a92e4a37697 40 } measured_time;
Ghiri 0:1a92e4a37697 41
Ghiri 0:1a92e4a37697 42
Ghiri 0:1a92e4a37697 43 // read Voltage battery
Ghiri 0:1a92e4a37697 44 DigitalOut heartbeat(LED1);
Ghiri 0:1a92e4a37697 45
Ghiri 0:1a92e4a37697 46 // read Voltage battery, analog pin used PC_3 (Pin 37 of Morpho layout)
Ghiri 0:1a92e4a37697 47 AnalogIn vbat(PC_3);
Ghiri 0:1a92e4a37697 48
Ghiri 0:1a92e4a37697 49 // User button pressure
Ghiri 0:1a92e4a37697 50 InterruptIn user_button(USER_BUTTON);
Ghiri 0:1a92e4a37697 51
Ghiri 0:1a92e4a37697 52 // Sensor connected to digital input D9, alias PC7 on Morpho layout
Ghiri 0:1a92e4a37697 53 InterruptIn proximity(D9);
Ghiri 0:1a92e4a37697 54
Ghiri 0:1a92e4a37697 55 Timer t;
Ghiri 0:1a92e4a37697 56
Ghiri 0:1a92e4a37697 57 // LCD Display (RS, E, D4, D5, D6, D7);
Ghiri 0:1a92e4a37697 58 TextLCD lcd(D2,D3,D4,D5,D6,D7);
Ghiri 0:1a92e4a37697 59
Ghiri 0:1a92e4a37697 60 int lap = 0;
Ghiri 0:1a92e4a37697 61 int last_read = 0;
Ghiri 0:1a92e4a37697 62 int lap_time = 0;
Ghiri 0:1a92e4a37697 63
Ghiri 0:1a92e4a37697 64
Ghiri 0:1a92e4a37697 65 // Conversion from millisecond to mm:ss:cc data format
Ghiri 0:1a92e4a37697 66 measured_time human_read(int ms){
Ghiri 0:1a92e4a37697 67 measured_time read;
Ghiri 0:1a92e4a37697 68 div_t qr = div(ms,1000);
Ghiri 0:1a92e4a37697 69
Ghiri 0:1a92e4a37697 70 read.cents = qr.rem % 100;
Ghiri 0:1a92e4a37697 71
Ghiri 0:1a92e4a37697 72 qr = div(qr.quot,60);
Ghiri 0:1a92e4a37697 73 read.seconds = qr.rem;
Ghiri 0:1a92e4a37697 74
Ghiri 0:1a92e4a37697 75 qr = div(qr.quot,60);
Ghiri 0:1a92e4a37697 76 read.minutes = qr.rem;
Ghiri 0:1a92e4a37697 77
Ghiri 0:1a92e4a37697 78 return read;
Ghiri 0:1a92e4a37697 79 }
Ghiri 0:1a92e4a37697 80
Ghiri 0:1a92e4a37697 81 // Function to measure time elapsed
Ghiri 0:1a92e4a37697 82 void measure_time(){
Ghiri 0:1a92e4a37697 83 int read = t.read_ms();
Ghiri 0:1a92e4a37697 84
Ghiri 0:1a92e4a37697 85 if(lap == 0){
Ghiri 0:1a92e4a37697 86 t.start();
Ghiri 0:1a92e4a37697 87 lap++;
Ghiri 0:1a92e4a37697 88 }else{
Ghiri 0:1a92e4a37697 89 //Dabouncing per evitare problemi
Ghiri 0:1a92e4a37697 90 if(read - last_read > 1000){
Ghiri 0:1a92e4a37697 91
Ghiri 0:1a92e4a37697 92 lap_time = read - last_read;
Ghiri 0:1a92e4a37697 93
Ghiri 0:1a92e4a37697 94 if(lap >= NUM_LAP){
Ghiri 0:1a92e4a37697 95 t.stop();
Ghiri 0:1a92e4a37697 96 lap++;
Ghiri 0:1a92e4a37697 97 }else{
Ghiri 0:1a92e4a37697 98 lap++;
Ghiri 0:1a92e4a37697 99 }
Ghiri 0:1a92e4a37697 100
Ghiri 0:1a92e4a37697 101 last_read = read;
Ghiri 0:1a92e4a37697 102 }
Ghiri 0:1a92e4a37697 103 }
Ghiri 0:1a92e4a37697 104
Ghiri 0:1a92e4a37697 105 }
Ghiri 0:1a92e4a37697 106
Ghiri 0:1a92e4a37697 107 // Function to reset measure done
Ghiri 0:1a92e4a37697 108 void reset_measure(){
Ghiri 0:1a92e4a37697 109 t.stop();
Ghiri 0:1a92e4a37697 110 t.reset();
Ghiri 0:1a92e4a37697 111 lap = 0;
Ghiri 0:1a92e4a37697 112 last_read = 0;
Ghiri 0:1a92e4a37697 113 lcd.cls();
Ghiri 0:1a92e4a37697 114 }
Ghiri 0:1a92e4a37697 115
Ghiri 0:1a92e4a37697 116
Ghiri 0:1a92e4a37697 117
Ghiri 0:1a92e4a37697 118 //------------------------------------------------------------
Ghiri 0:1a92e4a37697 119 //
Ghiri 0:1a92e4a37697 120 // Main body
Ghiri 0:1a92e4a37697 121 //
Ghiri 0:1a92e4a37697 122 //------------------------------------------------------------
Ghiri 0:1a92e4a37697 123
Ghiri 0:1a92e4a37697 124 int main() {
Ghiri 0:1a92e4a37697 125
Ghiri 0:1a92e4a37697 126 proximity.mode(PullDown);
Ghiri 0:1a92e4a37697 127 proximity.rise(&measure_time);
Ghiri 0:1a92e4a37697 128 user_button.fall(&reset_measure);
Ghiri 0:1a92e4a37697 129
Ghiri 0:1a92e4a37697 130
Ghiri 0:1a92e4a37697 131
Ghiri 0:1a92e4a37697 132
Ghiri 0:1a92e4a37697 133 while(true) {
Ghiri 0:1a92e4a37697 134 int read = t.read_ms();
Ghiri 0:1a92e4a37697 135
Ghiri 0:1a92e4a37697 136 measured_time time = human_read(read);
Ghiri 0:1a92e4a37697 137
Ghiri 0:1a92e4a37697 138 lcd.locate(0,0);
Ghiri 0:1a92e4a37697 139 lcd.printf("Totale %02d:%02d:%02d",time.minutes,time.seconds,time.cents);
Ghiri 0:1a92e4a37697 140
Ghiri 0:1a92e4a37697 141 //Gestione dei parziali
Ghiri 0:1a92e4a37697 142 if(lap > 1){
Ghiri 0:1a92e4a37697 143 time = human_read(lap_time);
Ghiri 0:1a92e4a37697 144 lcd.locate(0,1);
Ghiri 0:1a92e4a37697 145 lcd.printf("Giro %d %02d:%02d:%02d",lap - 1,time.minutes,time.seconds,time.cents);
Ghiri 0:1a92e4a37697 146 }
Ghiri 0:1a92e4a37697 147
Ghiri 0:1a92e4a37697 148 heartbeat = !heartbeat;
Ghiri 0:1a92e4a37697 149
Ghiri 0:1a92e4a37697 150
Ghiri 0:1a92e4a37697 151 if(lap > 0 && lap <= NUM_LAP){
Ghiri 0:1a92e4a37697 152 wait(0.1);
Ghiri 0:1a92e4a37697 153 }else{
Ghiri 0:1a92e4a37697 154 if(lap == 0){
Ghiri 0:1a92e4a37697 155 //Controllo batteria con partitore resistivo
Ghiri 0:1a92e4a37697 156 double battery = ((3.3L * vbat) * 57) / 10;
Ghiri 0:1a92e4a37697 157 if(battery < VBAT_MIN){
Ghiri 0:1a92e4a37697 158 lcd.locate(0,1);
Ghiri 0:1a92e4a37697 159 lcd.printf("LOW BAT %2.1f",battery);
Ghiri 0:1a92e4a37697 160 }else{
Ghiri 0:1a92e4a37697 161 lcd.locate(0,1);
Ghiri 0:1a92e4a37697 162 lcd.printf("OK BAT %2.1f",battery);
Ghiri 0:1a92e4a37697 163 }
Ghiri 0:1a92e4a37697 164 }
Ghiri 0:1a92e4a37697 165 wait(1);
Ghiri 0:1a92e4a37697 166 }
Ghiri 0:1a92e4a37697 167 }
Ghiri 0:1a92e4a37697 168 }
Ghiri 0:1a92e4a37697 169