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.
Fork of secondtimer_v1 by
minutetimerv2.cpp@4:b6d2c5d48ef0, 2015-04-06 (annotated)
- Committer:
- scohennm
- Date:
- Mon Apr 06 14:30:10 2015 +0000
- Revision:
- 4:b6d2c5d48ef0
- Parent:
- 3:db1dad0e5441
Use modulus operator for true time calculations
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
scohennm | 3:db1dad0e5441 | 1 | #include "mbed.h" |
scohennm | 3:db1dad0e5441 | 2 | #include "SLCD.h" |
scohennm | 3:db1dad0e5441 | 3 | #include "TSISensor.h" |
scohennm | 3:db1dad0e5441 | 4 | |
scohennm | 3:db1dad0e5441 | 5 | #define ONESEC 1.009f // tweak for accuracy |
scohennm | 3:db1dad0e5441 | 6 | #define LEDTIME 0.2 |
scohennm | 3:db1dad0e5441 | 7 | #define TOUCHDELAY 0.100 |
scohennm | 3:db1dad0e5441 | 8 | #define DONEMESS "DONE" |
scohennm | 3:db1dad0e5441 | 9 | #define TIMESCALING 1.0 |
scohennm | 3:db1dad0e5441 | 10 | #define LCDLEN 10 |
scohennm | 3:db1dad0e5441 | 11 | #define MAXMIN 55 |
scohennm | 3:db1dad0e5441 | 12 | #define LEDON false |
scohennm | 3:db1dad0e5441 | 13 | #define LEDOFF true |
scohennm | 4:b6d2c5d48ef0 | 14 | #define SECSPERMIN 60 // using modulus |
scohennm | 3:db1dad0e5441 | 15 | // Define states |
scohennm | 3:db1dad0e5441 | 16 | #define NOBLINK 0 // "done" condition |
scohennm | 3:db1dad0e5441 | 17 | #define BLINK 1 |
scohennm | 3:db1dad0e5441 | 18 | #define PERIODSELECT 0 |
scohennm | 3:db1dad0e5441 | 19 | #define TIMING 1 |
scohennm | 3:db1dad0e5441 | 20 | |
scohennm | 3:db1dad0e5441 | 21 | SLCD slcd; //define LCD display |
scohennm | 3:db1dad0e5441 | 22 | TSISensor tsiScaling; // Capacitive sensor/slider |
scohennm | 4:b6d2c5d48ef0 | 23 | DigitalIn RtButton(PTC3); |
scohennm | 4:b6d2c5d48ef0 | 24 | DigitalIn LftButton(PTC12); |
scohennm | 3:db1dad0e5441 | 25 | DigitalOut greenColor(LED_GREEN); |
scohennm | 3:db1dad0e5441 | 26 | DigitalOut redColor(LED_RED); |
scohennm | 3:db1dad0e5441 | 27 | |
scohennm | 3:db1dad0e5441 | 28 | Timer LEDTimer; |
scohennm | 3:db1dad0e5441 | 29 | Timer SecondsTimer; |
scohennm | 3:db1dad0e5441 | 30 | |
scohennm | 3:db1dad0e5441 | 31 | char lcdData[LCDLEN]; //Global character buffer for LCD |
scohennm | 3:db1dad0e5441 | 32 | |
scohennm | 3:db1dad0e5441 | 33 | void LCDMessNoDwell(char *lMess){ |
scohennm | 3:db1dad0e5441 | 34 | slcd.Home(); |
scohennm | 3:db1dad0e5441 | 35 | slcd.clear(); |
scohennm | 3:db1dad0e5441 | 36 | slcd.printf(lMess); |
scohennm | 3:db1dad0e5441 | 37 | } |
scohennm | 3:db1dad0e5441 | 38 | |
scohennm | 3:db1dad0e5441 | 39 | void LEDFlipState(){ |
scohennm | 3:db1dad0e5441 | 40 | static bool LEDState = LEDOFF; |
scohennm | 3:db1dad0e5441 | 41 | |
scohennm | 3:db1dad0e5441 | 42 | redColor.write(LEDState); |
scohennm | 3:db1dad0e5441 | 43 | greenColor.write(!LEDState); |
scohennm | 3:db1dad0e5441 | 44 | LEDState = !LEDState; |
scohennm | 3:db1dad0e5441 | 45 | return; |
scohennm | 3:db1dad0e5441 | 46 | } |
scohennm | 3:db1dad0e5441 | 47 | |
scohennm | 3:db1dad0e5441 | 48 | void LEDSOff(){ |
scohennm | 3:db1dad0e5441 | 49 | redColor.write(LEDOFF); |
scohennm | 3:db1dad0e5441 | 50 | greenColor.write(LEDOFF); |
scohennm | 3:db1dad0e5441 | 51 | return; |
scohennm | 3:db1dad0e5441 | 52 | } |
scohennm | 3:db1dad0e5441 | 53 | |
scohennm | 3:db1dad0e5441 | 54 | |
scohennm | 3:db1dad0e5441 | 55 | |
scohennm | 3:db1dad0e5441 | 56 | |
scohennm | 3:db1dad0e5441 | 57 | |
scohennm | 3:db1dad0e5441 | 58 | int main(){ |
scohennm | 3:db1dad0e5441 | 59 | |
scohennm | 3:db1dad0e5441 | 60 | int RButtonState; |
scohennm | 3:db1dad0e5441 | 61 | int LButtonState; |
scohennm | 3:db1dad0e5441 | 62 | float tempValue; // for touch value |
scohennm | 3:db1dad0e5441 | 63 | int mCount = MAXMIN; |
scohennm | 3:db1dad0e5441 | 64 | int secCount = SECSPERMIN; |
scohennm | 4:b6d2c5d48ef0 | 65 | int totalSecs= 0; |
scohennm | 3:db1dad0e5441 | 66 | // define two state machine variables |
scohennm | 3:db1dad0e5441 | 67 | int IndicatorState = NOBLINK; |
scohennm | 3:db1dad0e5441 | 68 | int TimerState = PERIODSELECT; |
scohennm | 3:db1dad0e5441 | 69 | |
scohennm | 3:db1dad0e5441 | 70 | // default display |
scohennm | 3:db1dad0e5441 | 71 | sprintf (lcdData,"%d",mCount); |
scohennm | 3:db1dad0e5441 | 72 | LCDMessNoDwell(lcdData); |
scohennm | 3:db1dad0e5441 | 73 | LEDTimer.start(); |
scohennm | 3:db1dad0e5441 | 74 | LEDTimer.reset(); |
scohennm | 3:db1dad0e5441 | 75 | SecondsTimer.start(); |
scohennm | 3:db1dad0e5441 | 76 | SecondsTimer.reset(); |
scohennm | 3:db1dad0e5441 | 77 | |
scohennm | 3:db1dad0e5441 | 78 | while (true) { |
scohennm | 3:db1dad0e5441 | 79 | |
scohennm | 3:db1dad0e5441 | 80 | RButtonState = !RtButton.read(); |
scohennm | 3:db1dad0e5441 | 81 | LButtonState = !LftButton.read(); |
scohennm | 3:db1dad0e5441 | 82 | if(LButtonState) { // Stop the timer |
scohennm | 3:db1dad0e5441 | 83 | TimerState = PERIODSELECT; |
scohennm | 3:db1dad0e5441 | 84 | IndicatorState = BLINK; |
scohennm | 3:db1dad0e5441 | 85 | } |
scohennm | 3:db1dad0e5441 | 86 | |
scohennm | 3:db1dad0e5441 | 87 | switch (TimerState){ |
scohennm | 3:db1dad0e5441 | 88 | case PERIODSELECT: { |
scohennm | 3:db1dad0e5441 | 89 | tempValue = tsiScaling.readPercentage(); |
scohennm | 3:db1dad0e5441 | 90 | if(tempValue > 0) { // Standard way of handling slider |
scohennm | 3:db1dad0e5441 | 91 | IndicatorState = NOBLINK; |
scohennm | 3:db1dad0e5441 | 92 | mCount = int((float)MAXMIN *tempValue); // get minutes |
scohennm | 3:db1dad0e5441 | 93 | sprintf (lcdData,"%d",mCount); |
scohennm | 3:db1dad0e5441 | 94 | LCDMessNoDwell(lcdData); |
scohennm | 3:db1dad0e5441 | 95 | wait(TOUCHDELAY); |
scohennm | 3:db1dad0e5441 | 96 | } |
scohennm | 3:db1dad0e5441 | 97 | if(RButtonState) { //start the timer |
scohennm | 3:db1dad0e5441 | 98 | SecondsTimer.reset(); |
scohennm | 4:b6d2c5d48ef0 | 99 | // secCount = SECSPERMIN + 1; // 1st time through |
scohennm | 4:b6d2c5d48ef0 | 100 | totalSecs = mCount * SECSPERMIN; |
scohennm | 3:db1dad0e5441 | 101 | TimerState = TIMING; |
scohennm | 3:db1dad0e5441 | 102 | } |
scohennm | 3:db1dad0e5441 | 103 | break; |
scohennm | 3:db1dad0e5441 | 104 | } |
scohennm | 3:db1dad0e5441 | 105 | |
scohennm | 3:db1dad0e5441 | 106 | case TIMING: { |
scohennm | 3:db1dad0e5441 | 107 | if (SecondsTimer.read() > ONESEC) { |
scohennm | 4:b6d2c5d48ef0 | 108 | totalSecs--; |
scohennm | 4:b6d2c5d48ef0 | 109 | mCount = totalSecs / SECSPERMIN; // Quotient |
scohennm | 4:b6d2c5d48ef0 | 110 | secCount = totalSecs % SECSPERMIN; // Remainder |
scohennm | 4:b6d2c5d48ef0 | 111 | if(totalSecs < 0){ |
scohennm | 4:b6d2c5d48ef0 | 112 | IndicatorState = BLINK; |
scohennm | 4:b6d2c5d48ef0 | 113 | TimerState = PERIODSELECT; |
scohennm | 3:db1dad0e5441 | 114 | } |
scohennm | 3:db1dad0e5441 | 115 | sprintf (lcdData,"%2d%2d",mCount, secCount); // Display countdown |
scohennm | 3:db1dad0e5441 | 116 | LCDMessNoDwell(lcdData); |
scohennm | 3:db1dad0e5441 | 117 | slcd.Colon(true); |
scohennm | 3:db1dad0e5441 | 118 | SecondsTimer.reset(); |
scohennm | 3:db1dad0e5441 | 119 | } |
scohennm | 3:db1dad0e5441 | 120 | break; |
scohennm | 3:db1dad0e5441 | 121 | } |
scohennm | 3:db1dad0e5441 | 122 | }// end TimerState switch |
scohennm | 3:db1dad0e5441 | 123 | |
scohennm | 3:db1dad0e5441 | 124 | |
scohennm | 3:db1dad0e5441 | 125 | |
scohennm | 3:db1dad0e5441 | 126 | |
scohennm | 3:db1dad0e5441 | 127 | |
scohennm | 3:db1dad0e5441 | 128 | // Timer Completion indicator |
scohennm | 3:db1dad0e5441 | 129 | |
scohennm | 3:db1dad0e5441 | 130 | if(LEDTimer.read() > LEDTIME){ |
scohennm | 3:db1dad0e5441 | 131 | LEDTimer.reset(); |
scohennm | 3:db1dad0e5441 | 132 | switch (IndicatorState){ |
scohennm | 3:db1dad0e5441 | 133 | case BLINK: { |
scohennm | 3:db1dad0e5441 | 134 | LEDFlipState(); |
scohennm | 3:db1dad0e5441 | 135 | LCDMessNoDwell(DONEMESS); |
scohennm | 3:db1dad0e5441 | 136 | break; |
scohennm | 3:db1dad0e5441 | 137 | } |
scohennm | 3:db1dad0e5441 | 138 | case NOBLINK: { |
scohennm | 3:db1dad0e5441 | 139 | LEDSOff(); |
scohennm | 3:db1dad0e5441 | 140 | break; |
scohennm | 3:db1dad0e5441 | 141 | } |
scohennm | 3:db1dad0e5441 | 142 | } //end case |
scohennm | 3:db1dad0e5441 | 143 | }// end LEDTimer if |
scohennm | 3:db1dad0e5441 | 144 | } // while forever |
scohennm | 3:db1dad0e5441 | 145 | }// end main |