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.
Dependencies: MaxSonar RTC-DS1307 TextLCD mbed
main.cpp
- Committer:
- SausageSausage
- Date:
- 2017-05-26
- Revision:
- 4:f7b32fcc75f8
- Parent:
- 3:89dae25e597b
- Child:
- 5:518dd1a21359
File content as of revision 4:f7b32fcc75f8:
#include "mbed.h"
#include "TextLCD.h"
#include "Rtc_Ds1307.h"
Rtc_Ds1307 rtc(PTE0, PTE1);
DigitalOut red(LED1);
TextLCD lcd(PTE5, PTE4, PTE3, PTE2, PTB11, PTB10); // rs, e, d4-d7
DigitalIn pin(PTE29); //button
Serial pc(USBTX, USBRX);
Rtc_Ds1307::Time_rtc tim = {};
PwmOut boop(PTD4); //alarm buzzer
Timer t;
void displayTime();
int setAlrm(bool ho);
bool hitIt(int hor, int min, Rtc_Ds1307::Time_rtc teim);
int Halrm = -1;
int Malrm = 0;
int main() {
boop.write(0); //initialise buzzer
boop.period(5);
Ticker cloo; //declare a ticker to update clock every sec
cloo.attach(&displayTime, 1); //the ticker runs the function that wipes the screen and displays the updated time
rtc.startClock();
while(1){
wait_ms(50); //wait so button states do not overlap
if(pin.read()){ //once it's 1 start the detection loop to decide whether this is a hold or a double click
cloo.detach(); //stop the ticker while performing button operations
t.reset();
t.start(); //start timer
while(t.read() < 1){ //if it's not unpressed in a second - HOLD case
if(!pin.read()){ //if it goes low, check for double click
t.reset();
while(t.read() < 1){ //listen for 1 sec for a second click
if(pin.read()){ //if x = 1 execute DOUBLE CLICK - set alarm
lcd.cls();
lcd.printf("settin' alarm!");
wait(2);
Halrm = setAlrm(true);
if(Halrm >= 0){
Malrm = setAlrm(false);
lcd.cls();
lcd.printf("Alarm: %d:%d", Halrm,Malrm);
wait(2);
}
break;
}
}
break;
}
}
while(pin.read()){ //still pressed? Execute Button HOLD case, exit hold when no longer held
rtc.getTime(tim);
lcd.cls();
lcd.printf("Today is the :\n%02d/%02d/%02d", tim.date, tim.mon, tim.year); //display date
wait(1);
}
cloo.attach(&displayTime, 1); //re-enable ticker after date release
}
t.stop();
}
}
void displayTime(){ //get the time from the rtc chip and display it on the LCD
Rtc_Ds1307::Time_rtc tm = tim;
if (rtc.getTime(tm) ) {
lcd.cls();
lcd.printf("The time is :\n%02d:%02d:%02d", tm.hour, tm.min, tm.sec); //display time
if(hitIt(Halrm, Malrm, tm)){ //check if the time is right for alarmage
boop.write(0.5);
while(!pin.read()){
lcd.cls();
lcd.printf("You should be alarmed");
wait(0.2);
}
boop.write(0);
}
}
red = !red;
}
int setAlrm(bool ho){
int mod;
float spd;
if(ho){
mod = 24;
spd = 0.5;
}else{
mod = 60;
spd = 0.25;
}
int homin = 0;
bool sat = false;
bool DC = false;
while(!sat){
while(!pin.read() && !sat){
lcd.cls();
if(ho) lcd.printf("Hour: %02d\nDC to confirm", homin);
else lcd.printf("Minutes: %02d\nDC to confirm", homin);
wait(0.2);
if(pin.read()){ //once it's 1 start the detection loop to decide whether this is a hold or a double click
t.reset();
t.start(); //start timer
while(t.read() < 1){ //if it's not unpressed in a second - HOLD case
if(!pin.read()){ //if it goes low, check for double click
t.reset();
while(t.read() < 1){ //listen for 1 sec for a second click
if(pin.read()){ //if x = 1 execute DOUBLE CLICK - confirm selection
lcd.cls();
if(ho) lcd.printf("Hour: %02d\nSet!", homin);
else lcd.printf("Minutes: %02d\nSet!", homin);
sat = true;
DC = true;
wait(2);
break;
}
}
break;
}
}
if(!pin.read() && !DC){ //if unpressed - single click detected - cancel alarm
lcd.cls();
lcd.printf("Alarm Canceled!");
homin = -1;
return homin;
}
while(pin.read()){ //still pressed? Execute Button HOLD case, exit hold when no longer held
homin = (homin + 1)%mod; //increment the value while the button is held
lcd.cls();
if(ho) lcd.printf("Hour: %02d", homin);
else lcd.printf("Minutes: %02d", homin);
wait(spd);
}
}
}
}
return homin;
}
//this function checks whether it's time to sound the alarms
//if the minute and the hour is the same as that of the alarm, return true
bool hitIt(int hor, int min, Rtc_Ds1307::Time_rtc teim){
int x = teim.hour - hor;
if(x == 0){
int y = teim.min - min;
if(y == 0){
return true;
}
}
return false;
}