Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed keypadLib TextLCD
Diff: main.cpp
- Revision:
- 0:1a92e4a37697
- Child:
- 1:26bcd89c18e5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Nov 23 14:20:48 2017 +0000 @@ -0,0 +1,169 @@ +//############################################################## +//## +//## Event: RoboVal - Robot Race +//## +//## Chronometer double use +//## +//## Version 1.99A +//## +//## Hardware platform used: ST NUCLEO-F401RE +//## +//## Software IDE used: mbed online version +//## +//## Organizzation: Verona FabLab +//## +//## Date creation: 2018.01.01 +//## +//## Software developpers: FdF,GV, AG +//## +//## Base on original version of by FdF +//## +//############################################################## + +#include <stdlib.h> + +#include "mbed.h" +#include "TextLCD.h" + + +// Default Number Lap +#define NUM_LAP 3 + +// Reference for Low/Min Voltage battery +#define VBAT_MIN 7.2 + + +typedef struct time_screen { + int cents; + int seconds; + int minutes; +} measured_time; + + + // read Voltage battery +DigitalOut heartbeat(LED1); + +// read Voltage battery, analog pin used PC_3 (Pin 37 of Morpho layout) +AnalogIn vbat(PC_3); + +// User button pressure +InterruptIn user_button(USER_BUTTON); + +// Sensor connected to digital input D9, alias PC7 on Morpho layout +InterruptIn proximity(D9); + +Timer t; + +// LCD Display (RS, E, D4, D5, D6, D7); +TextLCD lcd(D2,D3,D4,D5,D6,D7); + +int lap = 0; +int last_read = 0; +int lap_time = 0; + + +// Conversion from millisecond to mm:ss:cc data format +measured_time human_read(int ms){ + measured_time read; + div_t qr = div(ms,1000); + + read.cents = qr.rem % 100; + + qr = div(qr.quot,60); + read.seconds = qr.rem; + + qr = div(qr.quot,60); + read.minutes = qr.rem; + + return read; +} + +// Function to measure time elapsed +void measure_time(){ + int read = t.read_ms(); + + if(lap == 0){ + t.start(); + lap++; + }else{ + //Dabouncing per evitare problemi + if(read - last_read > 1000){ + + lap_time = read - last_read; + + if(lap >= NUM_LAP){ + t.stop(); + lap++; + }else{ + lap++; + } + + last_read = read; + } + } + +} + +// Function to reset measure done +void reset_measure(){ + t.stop(); + t.reset(); + lap = 0; + last_read = 0; + lcd.cls(); +} + + + +//------------------------------------------------------------ +// +// Main body +// +//------------------------------------------------------------ + +int main() { + + proximity.mode(PullDown); + proximity.rise(&measure_time); + user_button.fall(&reset_measure); + + + + + while(true) { + int read = t.read_ms(); + + measured_time time = human_read(read); + + lcd.locate(0,0); + lcd.printf("Totale %02d:%02d:%02d",time.minutes,time.seconds,time.cents); + + //Gestione dei parziali + if(lap > 1){ + time = human_read(lap_time); + lcd.locate(0,1); + lcd.printf("Giro %d %02d:%02d:%02d",lap - 1,time.minutes,time.seconds,time.cents); + } + + heartbeat = !heartbeat; + + + if(lap > 0 && lap <= NUM_LAP){ + wait(0.1); + }else{ + if(lap == 0){ + //Controllo batteria con partitore resistivo + double battery = ((3.3L * vbat) * 57) / 10; + if(battery < VBAT_MIN){ + lcd.locate(0,1); + lcd.printf("LOW BAT %2.1f",battery); + }else{ + lcd.locate(0,1); + lcd.printf("OK BAT %2.1f",battery); + } + } + wait(1); + } + } +} +