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: Hotboards_keypad TextLCD mbed
Fork of Chronometer_V2 by
main.cpp
- Committer:
- Ghiri
- Date:
- 2017-11-23
- Revision:
- 0:1a92e4a37697
- Child:
- 1:26bcd89c18e5
File content as of revision 0:1a92e4a37697:
//##############################################################
//##
//## 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);
}
}
}
