Clock program with alarm
Dependencies: MaxSonar RTC-DS1307 TextLCD mbed
main.cpp@5:518dd1a21359, 2017-05-26 (annotated)
- 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?
User | Revision | Line number | New 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 | } |