Configurable countdown timer

Dependencies:   mbed PinDetect TextLCD

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?

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