Configurable countdown timer
Dependencies: mbed PinDetect TextLCD
main.cpp
- Committer:
- MarceloSalazar
- Date:
- 2020-06-07
- Revision:
- 3:3facd92a3f37
- Parent:
- 2:ecbc6a14824c
File content as of revision 3:3facd92a3f37:
#include "mbed.h"
#include "TextLCD.h"
#include "PinDetect.h"
DigitalOut myled(LED1);
DigitalOut buzzer(p24);
PinDetect pb1(p23); // Increase minutes
PinDetect pb2(p22); // Decrease minutes
PinDetect pb3(p21); // Start / pause
//TextLCD(PinName rs, PinName e, PinName d4, PinName d5, PinName d6, PinName d7, LCDType type = LCD16x2);
// Note: VCC=5V, V0=0V, via 330 resistor)
TextLCD lcd(p15, p16, p17, p18, p19, p20);
Ticker flipper;
Timeout wait_time;
volatile int start = 0;
volatile int t1s = 0;
volatile unsigned char a = 0;
volatile unsigned char b = 0;
volatile unsigned char c = 0;
volatile char seconds = 0;
volatile char minutes = 25;
volatile char hours = 0;
volatile char alarm = 1; // alarm set on/off ==> enables buzzer
void update_lcd() {
lcd.locate (0,1);
lcd.printf("%02d:%02d:%02d %2x%2x%2x",hours, minutes, seconds,a,b,c);
}
void flip() {
t1s = 1;
}
void count_down(){
if(seconds == 0 && minutes == 0 && hours == 0)
return;
if(seconds != 0) {
seconds -= 1;
return;
}
if(minutes != 0){
minutes -= 1;
seconds = 59;
return;
}
if(hours != 0){
hours -= 1;
minutes = 59;
seconds = 59;
return;
}
}
// Buzzer beep for t seconds
void beep(float t) {
buzzer = 1;
wait(t);
buzzer = 0;
}
void beepn(int i, float t) {
while(i --){
buzzer = 1;
wait(t);
buzzer = 0;
wait(t);
}
}
// Callback routine is interrupt activated by a debounced pb2 hit
void pb1_hit_callback (void) {
minutes++;
}
// Callback routine is interrupt activated by a debounced pb2 hit
void pb2_hit_callback (void) {
minutes--;
}
// Callback routine is interrupt activated by a debounced pb3 hit
void pb3_hit_callback (void) {
start = (start + 1) & 0x01;
}
int main () {
// Clean screen
lcd.cls();
lcd.printf("Countdown");
beep(0.1); // init buzzer
update_lcd();
flipper.attach(&flip, 1.0); // interval 1 second
pb1.attach_deasserted(&pb1_hit_callback);
pb2.attach_deasserted(&pb2_hit_callback);
pb3.attach_deasserted(&pb3_hit_callback);
pb1.setSampleFrequency();
pb2.setSampleFrequency();
pb3.setSampleFrequency();
while(1) {
if (t1s){
t1s = 0;
myled = !myled;
if(start)
count_down();
update_lcd();
// Last 5 seconds
if(seconds > 0 && seconds <= 5 && minutes == 0 && hours == 0) {
beep(0.2);
}
// Countdown finished
else if(seconds == 0 && minutes == 0 && hours == 0) {
flipper.detach();
beepn(5, 0.2);
}
}
}
}