Clock program with alarm

Dependencies:   MaxSonar RTC-DS1307 TextLCD mbed

Committer:
SausageSausage
Date:
Fri May 26 10:49:13 2017 +0000
Revision:
5:518dd1a21359
Parent:
4:f7b32fcc75f8
Working (haha) code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SausageSausage 0:514ef400f75b 1 #include "mbed.h"
SausageSausage 0:514ef400f75b 2 #include "TextLCD.h"
SausageSausage 0:514ef400f75b 3 #include "Rtc_Ds1307.h"
SausageSausage 0:514ef400f75b 4
SausageSausage 0:514ef400f75b 5 Rtc_Ds1307 rtc(PTE0, PTE1);
SausageSausage 2:d3a3a15016f3 6 DigitalOut red(LED1);
SausageSausage 5:518dd1a21359 7 DigitalOut tog(PTE3);
SausageSausage 5:518dd1a21359 8 TextLCD lcd(PTE30, PTE29, PTE23, PTE22, PTE21, PTE20); // rs, e, d4-d7
SausageSausage 5:518dd1a21359 9 DigitalIn pin(PTA1); //button
SausageSausage 0:514ef400f75b 10 Serial pc(USBTX, USBRX);
SausageSausage 1:aa2b8929a968 11 Rtc_Ds1307::Time_rtc tim = {};
SausageSausage 4:f7b32fcc75f8 12 PwmOut boop(PTD4); //alarm buzzer
SausageSausage 2:d3a3a15016f3 13 Timer t;
SausageSausage 1:aa2b8929a968 14
SausageSausage 1:aa2b8929a968 15 void displayTime();
SausageSausage 3:89dae25e597b 16 int setAlrm(bool ho);
SausageSausage 3:89dae25e597b 17 bool hitIt(int hor, int min, Rtc_Ds1307::Time_rtc teim);
SausageSausage 3:89dae25e597b 18
SausageSausage 3:89dae25e597b 19 int Halrm = -1;
SausageSausage 3:89dae25e597b 20 int Malrm = 0;
SausageSausage 3:89dae25e597b 21
SausageSausage 0:514ef400f75b 22
SausageSausage 0:514ef400f75b 23 int main() {
SausageSausage 0:514ef400f75b 24
SausageSausage 5:518dd1a21359 25 tog.write(1);
SausageSausage 4:f7b32fcc75f8 26 boop.write(0); //initialise buzzer
SausageSausage 4:f7b32fcc75f8 27 boop.period(5);
SausageSausage 4:f7b32fcc75f8 28
SausageSausage 2:d3a3a15016f3 29 Ticker cloo; //declare a ticker to update clock every sec
SausageSausage 2:d3a3a15016f3 30 cloo.attach(&displayTime, 1); //the ticker runs the function that wipes the screen and displays the updated time
SausageSausage 2:d3a3a15016f3 31
SausageSausage 2:d3a3a15016f3 32 rtc.startClock();
SausageSausage 1:aa2b8929a968 33
SausageSausage 1:aa2b8929a968 34 while(1){
SausageSausage 2:d3a3a15016f3 35
SausageSausage 2:d3a3a15016f3 36 wait_ms(50); //wait so button states do not overlap
SausageSausage 2:d3a3a15016f3 37
SausageSausage 2:d3a3a15016f3 38 if(pin.read()){ //once it's 1 start the detection loop to decide whether this is a hold or a double click
SausageSausage 2:d3a3a15016f3 39
SausageSausage 2:d3a3a15016f3 40 cloo.detach(); //stop the ticker while performing button operations
SausageSausage 2:d3a3a15016f3 41
SausageSausage 2:d3a3a15016f3 42 t.reset();
SausageSausage 2:d3a3a15016f3 43 t.start(); //start timer
SausageSausage 2:d3a3a15016f3 44
SausageSausage 2:d3a3a15016f3 45 while(t.read() < 1){ //if it's not unpressed in a second - HOLD case
SausageSausage 2:d3a3a15016f3 46
SausageSausage 2:d3a3a15016f3 47 if(!pin.read()){ //if it goes low, check for double click
SausageSausage 2:d3a3a15016f3 48
SausageSausage 2:d3a3a15016f3 49 t.reset();
SausageSausage 2:d3a3a15016f3 50
SausageSausage 2:d3a3a15016f3 51 while(t.read() < 1){ //listen for 1 sec for a second click
SausageSausage 2:d3a3a15016f3 52
SausageSausage 2:d3a3a15016f3 53 if(pin.read()){ //if x = 1 execute DOUBLE CLICK - set alarm
SausageSausage 2:d3a3a15016f3 54 lcd.cls();
SausageSausage 2:d3a3a15016f3 55 lcd.printf("settin' alarm!");
SausageSausage 2:d3a3a15016f3 56 wait(2);
SausageSausage 3:89dae25e597b 57
SausageSausage 3:89dae25e597b 58 Halrm = setAlrm(true);
SausageSausage 3:89dae25e597b 59 if(Halrm >= 0){
SausageSausage 3:89dae25e597b 60 Malrm = setAlrm(false);
SausageSausage 3:89dae25e597b 61 lcd.cls();
SausageSausage 3:89dae25e597b 62 lcd.printf("Alarm: %d:%d", Halrm,Malrm);
SausageSausage 3:89dae25e597b 63 wait(2);
SausageSausage 3:89dae25e597b 64 }
SausageSausage 2:d3a3a15016f3 65 break;
SausageSausage 2:d3a3a15016f3 66 }
SausageSausage 2:d3a3a15016f3 67 }
SausageSausage 2:d3a3a15016f3 68 break;
SausageSausage 2:d3a3a15016f3 69 }
SausageSausage 1:aa2b8929a968 70 }
SausageSausage 2:d3a3a15016f3 71
SausageSausage 2:d3a3a15016f3 72
SausageSausage 2:d3a3a15016f3 73
SausageSausage 2:d3a3a15016f3 74 while(pin.read()){ //still pressed? Execute Button HOLD case, exit hold when no longer held
SausageSausage 2:d3a3a15016f3 75
SausageSausage 2:d3a3a15016f3 76 rtc.getTime(tim);
SausageSausage 2:d3a3a15016f3 77
SausageSausage 2:d3a3a15016f3 78 lcd.cls();
SausageSausage 2:d3a3a15016f3 79 lcd.printf("Today is the :\n%02d/%02d/%02d", tim.date, tim.mon, tim.year); //display date
SausageSausage 2:d3a3a15016f3 80 wait(1);
SausageSausage 2:d3a3a15016f3 81
SausageSausage 2:d3a3a15016f3 82 }
SausageSausage 2:d3a3a15016f3 83
SausageSausage 2:d3a3a15016f3 84 cloo.attach(&displayTime, 1); //re-enable ticker after date release
SausageSausage 2:d3a3a15016f3 85
SausageSausage 2:d3a3a15016f3 86 }
SausageSausage 2:d3a3a15016f3 87
SausageSausage 2:d3a3a15016f3 88 t.stop();
SausageSausage 2:d3a3a15016f3 89
SausageSausage 2:d3a3a15016f3 90 }
SausageSausage 2:d3a3a15016f3 91
SausageSausage 1:aa2b8929a968 92 }
SausageSausage 1:aa2b8929a968 93
SausageSausage 2:d3a3a15016f3 94 void displayTime(){ //get the time from the rtc chip and display it on the LCD
SausageSausage 1:aa2b8929a968 95
SausageSausage 1:aa2b8929a968 96 Rtc_Ds1307::Time_rtc tm = tim;
SausageSausage 1:aa2b8929a968 97
SausageSausage 1:aa2b8929a968 98 if (rtc.getTime(tm) ) {
SausageSausage 1:aa2b8929a968 99 lcd.cls();
SausageSausage 3:89dae25e597b 100 lcd.printf("The time is :\n%02d:%02d:%02d", tm.hour, tm.min, tm.sec); //display time
SausageSausage 3:89dae25e597b 101
SausageSausage 4:f7b32fcc75f8 102 if(hitIt(Halrm, Malrm, tm)){ //check if the time is right for alarmage
SausageSausage 4:f7b32fcc75f8 103 boop.write(0.5);
SausageSausage 4:f7b32fcc75f8 104 while(!pin.read()){
SausageSausage 4:f7b32fcc75f8 105 lcd.cls();
SausageSausage 4:f7b32fcc75f8 106 lcd.printf("You should be alarmed");
SausageSausage 4:f7b32fcc75f8 107 wait(0.2);
SausageSausage 4:f7b32fcc75f8 108 }
SausageSausage 4:f7b32fcc75f8 109 boop.write(0);
SausageSausage 0:514ef400f75b 110 }
SausageSausage 3:89dae25e597b 111
SausageSausage 3:89dae25e597b 112 }
SausageSausage 2:d3a3a15016f3 113 red = !red;
SausageSausage 3:89dae25e597b 114 }
SausageSausage 3:89dae25e597b 115
SausageSausage 3:89dae25e597b 116 int setAlrm(bool ho){
SausageSausage 3:89dae25e597b 117
SausageSausage 3:89dae25e597b 118 int mod;
SausageSausage 3:89dae25e597b 119 float spd;
SausageSausage 3:89dae25e597b 120 if(ho){
SausageSausage 3:89dae25e597b 121 mod = 24;
SausageSausage 3:89dae25e597b 122 spd = 0.5;
SausageSausage 3:89dae25e597b 123 }else{
SausageSausage 3:89dae25e597b 124 mod = 60;
SausageSausage 3:89dae25e597b 125 spd = 0.25;
SausageSausage 3:89dae25e597b 126 }
SausageSausage 3:89dae25e597b 127
SausageSausage 3:89dae25e597b 128 int homin = 0;
SausageSausage 3:89dae25e597b 129 bool sat = false;
SausageSausage 3:89dae25e597b 130 bool DC = false;
SausageSausage 3:89dae25e597b 131
SausageSausage 3:89dae25e597b 132 while(!sat){
SausageSausage 3:89dae25e597b 133
SausageSausage 3:89dae25e597b 134 while(!pin.read() && !sat){
SausageSausage 3:89dae25e597b 135
SausageSausage 3:89dae25e597b 136 lcd.cls();
SausageSausage 3:89dae25e597b 137 if(ho) lcd.printf("Hour: %02d\nDC to confirm", homin);
SausageSausage 3:89dae25e597b 138 else lcd.printf("Minutes: %02d\nDC to confirm", homin);
SausageSausage 3:89dae25e597b 139
SausageSausage 3:89dae25e597b 140 wait(0.2);
SausageSausage 3:89dae25e597b 141 if(pin.read()){ //once it's 1 start the detection loop to decide whether this is a hold or a double click
SausageSausage 3:89dae25e597b 142
SausageSausage 3:89dae25e597b 143 t.reset();
SausageSausage 3:89dae25e597b 144 t.start(); //start timer
SausageSausage 3:89dae25e597b 145
SausageSausage 3:89dae25e597b 146 while(t.read() < 1){ //if it's not unpressed in a second - HOLD case
SausageSausage 3:89dae25e597b 147
SausageSausage 3:89dae25e597b 148 if(!pin.read()){ //if it goes low, check for double click
SausageSausage 3:89dae25e597b 149
SausageSausage 3:89dae25e597b 150 t.reset();
SausageSausage 3:89dae25e597b 151
SausageSausage 3:89dae25e597b 152 while(t.read() < 1){ //listen for 1 sec for a second click
SausageSausage 3:89dae25e597b 153
SausageSausage 3:89dae25e597b 154 if(pin.read()){ //if x = 1 execute DOUBLE CLICK - confirm selection
SausageSausage 3:89dae25e597b 155 lcd.cls();
SausageSausage 3:89dae25e597b 156 if(ho) lcd.printf("Hour: %02d\nSet!", homin);
SausageSausage 3:89dae25e597b 157 else lcd.printf("Minutes: %02d\nSet!", homin);
SausageSausage 3:89dae25e597b 158 sat = true;
SausageSausage 3:89dae25e597b 159 DC = true;
SausageSausage 3:89dae25e597b 160 wait(2);
SausageSausage 3:89dae25e597b 161 break;
SausageSausage 3:89dae25e597b 162 }
SausageSausage 3:89dae25e597b 163 }
SausageSausage 3:89dae25e597b 164 break;
SausageSausage 3:89dae25e597b 165 }
SausageSausage 3:89dae25e597b 166 }
SausageSausage 3:89dae25e597b 167 if(!pin.read() && !DC){ //if unpressed - single click detected - cancel alarm
SausageSausage 3:89dae25e597b 168 lcd.cls();
SausageSausage 3:89dae25e597b 169 lcd.printf("Alarm Canceled!");
SausageSausage 3:89dae25e597b 170 homin = -1;
SausageSausage 3:89dae25e597b 171 return homin;
SausageSausage 3:89dae25e597b 172 }
SausageSausage 3:89dae25e597b 173
SausageSausage 3:89dae25e597b 174 while(pin.read()){ //still pressed? Execute Button HOLD case, exit hold when no longer held
SausageSausage 3:89dae25e597b 175
SausageSausage 4:f7b32fcc75f8 176 homin = (homin + 1)%mod; //increment the value while the button is held
SausageSausage 3:89dae25e597b 177 lcd.cls();
SausageSausage 3:89dae25e597b 178 if(ho) lcd.printf("Hour: %02d", homin);
SausageSausage 4:f7b32fcc75f8 179 else lcd.printf("Minutes: %02d", homin);
SausageSausage 3:89dae25e597b 180 wait(spd);
SausageSausage 3:89dae25e597b 181
SausageSausage 3:89dae25e597b 182 }
SausageSausage 3:89dae25e597b 183 }
SausageSausage 3:89dae25e597b 184 }
SausageSausage 3:89dae25e597b 185
SausageSausage 3:89dae25e597b 186 }
SausageSausage 3:89dae25e597b 187
SausageSausage 3:89dae25e597b 188 return homin;
SausageSausage 3:89dae25e597b 189 }
SausageSausage 3:89dae25e597b 190
SausageSausage 4:f7b32fcc75f8 191 //this function checks whether it's time to sound the alarms
SausageSausage 4:f7b32fcc75f8 192 //if the minute and the hour is the same as that of the alarm, return true
SausageSausage 3:89dae25e597b 193 bool hitIt(int hor, int min, Rtc_Ds1307::Time_rtc teim){
SausageSausage 3:89dae25e597b 194 int x = teim.hour - hor;
SausageSausage 3:89dae25e597b 195 if(x == 0){
SausageSausage 3:89dae25e597b 196 int y = teim.min - min;
SausageSausage 3:89dae25e597b 197 if(y == 0){
SausageSausage 3:89dae25e597b 198 return true;
SausageSausage 3:89dae25e597b 199 }
SausageSausage 3:89dae25e597b 200 }
SausageSausage 3:89dae25e597b 201 return false;
SausageSausage 3:89dae25e597b 202 }