Configurable countdown timer
Dependencies: mbed PinDetect TextLCD
main.cpp@3:3facd92a3f37, 2020-06-07 (annotated)
- Committer:
- MarceloSalazar
- Date:
- Sun Jun 07 23:37:02 2020 +0000
- Revision:
- 3:3facd92a3f37
- Parent:
- 2:ecbc6a14824c
Push buttons and buzzer working
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MarceloSalazar | 0:95d8c08cb5d4 | 1 | #include "mbed.h" |
MarceloSalazar | 1:0ed57c2fd528 | 2 | #include "TextLCD.h" |
MarceloSalazar | 3:3facd92a3f37 | 3 | #include "PinDetect.h" |
MarceloSalazar | 1:0ed57c2fd528 | 4 | |
MarceloSalazar | 0:95d8c08cb5d4 | 5 | DigitalOut myled(LED1); |
MarceloSalazar | 1:0ed57c2fd528 | 6 | |
MarceloSalazar | 3:3facd92a3f37 | 7 | DigitalOut buzzer(p24); |
MarceloSalazar | 3:3facd92a3f37 | 8 | PinDetect pb1(p23); // Increase minutes |
MarceloSalazar | 3:3facd92a3f37 | 9 | PinDetect pb2(p22); // Decrease minutes |
MarceloSalazar | 3:3facd92a3f37 | 10 | PinDetect pb3(p21); // Start / pause |
MarceloSalazar | 3:3facd92a3f37 | 11 | |
MarceloSalazar | 3:3facd92a3f37 | 12 | |
MarceloSalazar | 1:0ed57c2fd528 | 13 | //TextLCD(PinName rs, PinName e, PinName d4, PinName d5, PinName d6, PinName d7, LCDType type = LCD16x2); |
MarceloSalazar | 1:0ed57c2fd528 | 14 | // Note: VCC=5V, V0=0V, via 330 resistor) |
MarceloSalazar | 1:0ed57c2fd528 | 15 | TextLCD lcd(p15, p16, p17, p18, p19, p20); |
MarceloSalazar | 1:0ed57c2fd528 | 16 | |
MarceloSalazar | 2:ecbc6a14824c | 17 | Ticker flipper; |
MarceloSalazar | 3:3facd92a3f37 | 18 | Timeout wait_time; |
MarceloSalazar | 2:ecbc6a14824c | 19 | |
MarceloSalazar | 3:3facd92a3f37 | 20 | volatile int start = 0; |
MarceloSalazar | 2:ecbc6a14824c | 21 | volatile int t1s = 0; |
MarceloSalazar | 1:0ed57c2fd528 | 22 | |
MarceloSalazar | 3:3facd92a3f37 | 23 | volatile unsigned char a = 0; |
MarceloSalazar | 3:3facd92a3f37 | 24 | volatile unsigned char b = 0; |
MarceloSalazar | 3:3facd92a3f37 | 25 | volatile unsigned char c = 0; |
MarceloSalazar | 3:3facd92a3f37 | 26 | |
MarceloSalazar | 2:ecbc6a14824c | 27 | volatile char seconds = 0; |
MarceloSalazar | 2:ecbc6a14824c | 28 | volatile char minutes = 25; |
MarceloSalazar | 2:ecbc6a14824c | 29 | volatile char hours = 0; |
MarceloSalazar | 2:ecbc6a14824c | 30 | volatile char alarm = 1; // alarm set on/off ==> enables buzzer |
MarceloSalazar | 0:95d8c08cb5d4 | 31 | |
MarceloSalazar | 2:ecbc6a14824c | 32 | void update_lcd() { |
MarceloSalazar | 1:0ed57c2fd528 | 33 | lcd.locate (0,1); |
MarceloSalazar | 3:3facd92a3f37 | 34 | lcd.printf("%02d:%02d:%02d %2x%2x%2x",hours, minutes, seconds,a,b,c); |
MarceloSalazar | 2:ecbc6a14824c | 35 | } |
MarceloSalazar | 2:ecbc6a14824c | 36 | |
MarceloSalazar | 2:ecbc6a14824c | 37 | void flip() { |
MarceloSalazar | 2:ecbc6a14824c | 38 | t1s = 1; |
MarceloSalazar | 2:ecbc6a14824c | 39 | } |
MarceloSalazar | 2:ecbc6a14824c | 40 | |
MarceloSalazar | 2:ecbc6a14824c | 41 | void count_down(){ |
MarceloSalazar | 2:ecbc6a14824c | 42 | |
MarceloSalazar | 2:ecbc6a14824c | 43 | if(seconds == 0 && minutes == 0 && hours == 0) |
MarceloSalazar | 2:ecbc6a14824c | 44 | return; |
MarceloSalazar | 2:ecbc6a14824c | 45 | |
MarceloSalazar | 2:ecbc6a14824c | 46 | if(seconds != 0) { |
MarceloSalazar | 2:ecbc6a14824c | 47 | seconds -= 1; |
MarceloSalazar | 2:ecbc6a14824c | 48 | return; |
MarceloSalazar | 2:ecbc6a14824c | 49 | } |
MarceloSalazar | 2:ecbc6a14824c | 50 | |
MarceloSalazar | 2:ecbc6a14824c | 51 | if(minutes != 0){ |
MarceloSalazar | 2:ecbc6a14824c | 52 | minutes -= 1; |
MarceloSalazar | 2:ecbc6a14824c | 53 | seconds = 59; |
MarceloSalazar | 2:ecbc6a14824c | 54 | return; |
MarceloSalazar | 2:ecbc6a14824c | 55 | } |
MarceloSalazar | 2:ecbc6a14824c | 56 | |
MarceloSalazar | 2:ecbc6a14824c | 57 | if(hours != 0){ |
MarceloSalazar | 2:ecbc6a14824c | 58 | hours -= 1; |
MarceloSalazar | 2:ecbc6a14824c | 59 | minutes = 59; |
MarceloSalazar | 2:ecbc6a14824c | 60 | seconds = 59; |
MarceloSalazar | 2:ecbc6a14824c | 61 | return; |
MarceloSalazar | 2:ecbc6a14824c | 62 | } |
MarceloSalazar | 1:0ed57c2fd528 | 63 | } |
MarceloSalazar | 3:3facd92a3f37 | 64 | |
MarceloSalazar | 3:3facd92a3f37 | 65 | |
MarceloSalazar | 3:3facd92a3f37 | 66 | // Buzzer beep for t seconds |
MarceloSalazar | 3:3facd92a3f37 | 67 | void beep(float t) { |
MarceloSalazar | 3:3facd92a3f37 | 68 | buzzer = 1; |
MarceloSalazar | 3:3facd92a3f37 | 69 | wait(t); |
MarceloSalazar | 3:3facd92a3f37 | 70 | buzzer = 0; |
MarceloSalazar | 3:3facd92a3f37 | 71 | } |
MarceloSalazar | 3:3facd92a3f37 | 72 | |
MarceloSalazar | 3:3facd92a3f37 | 73 | void beepn(int i, float t) { |
MarceloSalazar | 3:3facd92a3f37 | 74 | while(i --){ |
MarceloSalazar | 3:3facd92a3f37 | 75 | buzzer = 1; |
MarceloSalazar | 3:3facd92a3f37 | 76 | wait(t); |
MarceloSalazar | 3:3facd92a3f37 | 77 | buzzer = 0; |
MarceloSalazar | 3:3facd92a3f37 | 78 | wait(t); |
MarceloSalazar | 3:3facd92a3f37 | 79 | } |
MarceloSalazar | 3:3facd92a3f37 | 80 | } |
MarceloSalazar | 3:3facd92a3f37 | 81 | |
MarceloSalazar | 3:3facd92a3f37 | 82 | // Callback routine is interrupt activated by a debounced pb2 hit |
MarceloSalazar | 3:3facd92a3f37 | 83 | void pb1_hit_callback (void) { |
MarceloSalazar | 3:3facd92a3f37 | 84 | minutes++; |
MarceloSalazar | 3:3facd92a3f37 | 85 | } |
MarceloSalazar | 3:3facd92a3f37 | 86 | // Callback routine is interrupt activated by a debounced pb2 hit |
MarceloSalazar | 3:3facd92a3f37 | 87 | void pb2_hit_callback (void) { |
MarceloSalazar | 3:3facd92a3f37 | 88 | minutes--; |
MarceloSalazar | 3:3facd92a3f37 | 89 | } |
MarceloSalazar | 3:3facd92a3f37 | 90 | // Callback routine is interrupt activated by a debounced pb3 hit |
MarceloSalazar | 3:3facd92a3f37 | 91 | void pb3_hit_callback (void) { |
MarceloSalazar | 3:3facd92a3f37 | 92 | start = (start + 1) & 0x01; |
MarceloSalazar | 3:3facd92a3f37 | 93 | } |
MarceloSalazar | 3:3facd92a3f37 | 94 | |
MarceloSalazar | 3:3facd92a3f37 | 95 | |
MarceloSalazar | 3:3facd92a3f37 | 96 | int main () { |
MarceloSalazar | 3:3facd92a3f37 | 97 | |
MarceloSalazar | 1:0ed57c2fd528 | 98 | // Clean screen |
MarceloSalazar | 1:0ed57c2fd528 | 99 | lcd.cls(); |
MarceloSalazar | 2:ecbc6a14824c | 100 | lcd.printf("Countdown"); |
MarceloSalazar | 1:0ed57c2fd528 | 101 | |
MarceloSalazar | 3:3facd92a3f37 | 102 | beep(0.1); // init buzzer |
MarceloSalazar | 3:3facd92a3f37 | 103 | |
MarceloSalazar | 2:ecbc6a14824c | 104 | update_lcd(); |
MarceloSalazar | 3:3facd92a3f37 | 105 | |
MarceloSalazar | 2:ecbc6a14824c | 106 | flipper.attach(&flip, 1.0); // interval 1 second |
MarceloSalazar | 2:ecbc6a14824c | 107 | |
MarceloSalazar | 3:3facd92a3f37 | 108 | pb1.attach_deasserted(&pb1_hit_callback); |
MarceloSalazar | 3:3facd92a3f37 | 109 | pb2.attach_deasserted(&pb2_hit_callback); |
MarceloSalazar | 3:3facd92a3f37 | 110 | pb3.attach_deasserted(&pb3_hit_callback); |
MarceloSalazar | 3:3facd92a3f37 | 111 | |
MarceloSalazar | 3:3facd92a3f37 | 112 | pb1.setSampleFrequency(); |
MarceloSalazar | 3:3facd92a3f37 | 113 | pb2.setSampleFrequency(); |
MarceloSalazar | 3:3facd92a3f37 | 114 | pb3.setSampleFrequency(); |
MarceloSalazar | 3:3facd92a3f37 | 115 | |
MarceloSalazar | 0:95d8c08cb5d4 | 116 | while(1) { |
MarceloSalazar | 2:ecbc6a14824c | 117 | if (t1s){ |
MarceloSalazar | 2:ecbc6a14824c | 118 | t1s = 0; |
MarceloSalazar | 2:ecbc6a14824c | 119 | myled = !myled; |
MarceloSalazar | 3:3facd92a3f37 | 120 | |
MarceloSalazar | 3:3facd92a3f37 | 121 | if(start) |
MarceloSalazar | 3:3facd92a3f37 | 122 | count_down(); |
MarceloSalazar | 3:3facd92a3f37 | 123 | |
MarceloSalazar | 3:3facd92a3f37 | 124 | update_lcd(); |
MarceloSalazar | 3:3facd92a3f37 | 125 | |
MarceloSalazar | 3:3facd92a3f37 | 126 | // Last 5 seconds |
MarceloSalazar | 3:3facd92a3f37 | 127 | if(seconds > 0 && seconds <= 5 && minutes == 0 && hours == 0) { |
MarceloSalazar | 3:3facd92a3f37 | 128 | beep(0.2); |
MarceloSalazar | 3:3facd92a3f37 | 129 | } |
MarceloSalazar | 3:3facd92a3f37 | 130 | // Countdown finished |
MarceloSalazar | 3:3facd92a3f37 | 131 | else if(seconds == 0 && minutes == 0 && hours == 0) { |
MarceloSalazar | 3:3facd92a3f37 | 132 | flipper.detach(); |
MarceloSalazar | 3:3facd92a3f37 | 133 | beepn(5, 0.2); |
MarceloSalazar | 3:3facd92a3f37 | 134 | } |
MarceloSalazar | 3:3facd92a3f37 | 135 | } |
MarceloSalazar | 1:0ed57c2fd528 | 136 | } |
MarceloSalazar | 0:95d8c08cb5d4 | 137 | } |