Kitchen Timer example program.

Dependencies:   SLCD TSI mbed

Fork of secondtimer_v1 by Stanley Cohen

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?

UserRevisionLine numberNew 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