Projekt-Alarmclock
Dependencies: LCD RTC8563 Wecker mbed
main.cpp@2:d3708e92660f, 2015-06-25 (annotated)
- Committer:
- wolpra98
- Date:
- Thu Jun 25 07:39:17 2015 +0000
- Revision:
- 2:d3708e92660f
- Parent:
- 1:b71a6c225c2b
Finished Alarm Clock
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
wolpra98 | 0:bb9c3f242f5a | 1 | #include "mbed.h" |
wolpra98 | 0:bb9c3f242f5a | 2 | #include "LCD.h" |
wolpra98 | 0:bb9c3f242f5a | 3 | #include "const.h" |
wolpra98 | 0:bb9c3f242f5a | 4 | #include "RTC8563.h" |
wolpra98 | 0:bb9c3f242f5a | 5 | #include "Wecker.h" |
wolpra98 | 0:bb9c3f242f5a | 6 | |
wolpra98 | 1:b71a6c225c2b | 7 | Wecker wecker; |
wolpra98 | 0:bb9c3f242f5a | 8 | |
wolpra98 | 2:d3708e92660f | 9 | void btnStdf(); |
wolpra98 | 2:d3708e92660f | 10 | void btnMinf(); |
wolpra98 | 1:b71a6c225c2b | 11 | void btnSlpr(); |
wolpra98 | 1:b71a6c225c2b | 12 | void btnSlpf(); |
wolpra98 | 1:b71a6c225c2b | 13 | void tickControll(); |
wolpra98 | 2:d3708e92660f | 14 | void blink(); |
wolpra98 | 1:b71a6c225c2b | 15 | |
wolpra98 | 1:b71a6c225c2b | 16 | typedef enum {Normal, setAlarm, AlarmOn, Alarm, Sleep} state; |
wolpra98 | 1:b71a6c225c2b | 17 | state Mode=Normal; |
wolpra98 | 1:b71a6c225c2b | 18 | char sMode[2]; |
wolpra98 | 1:b71a6c225c2b | 19 | |
wolpra98 | 1:b71a6c225c2b | 20 | Ticker tick1; |
wolpra98 | 1:b71a6c225c2b | 21 | Timer tim1,tim2,tim3; |
wolpra98 | 1:b71a6c225c2b | 22 | |
wolpra98 | 2:d3708e92660f | 23 | InterruptIn swStd(p22); |
wolpra98 | 2:d3708e92660f | 24 | InterruptIn swMin(p23); |
wolpra98 | 2:d3708e92660f | 25 | InterruptIn swSlp(p21); |
wolpra98 | 2:d3708e92660f | 26 | DigitalOut alarmOut(p24,0); |
wolpra98 | 1:b71a6c225c2b | 27 | DigitalIn alarm(P1_28); |
wolpra98 | 1:b71a6c225c2b | 28 | DigitalOut myled(LED1); |
wolpra98 | 1:b71a6c225c2b | 29 | |
wolpra98 | 2:d3708e92660f | 30 | |
wolpra98 | 2:d3708e92660f | 31 | const int SlpAlTime = (60)*5; |
wolpra98 | 2:d3708e92660f | 32 | |
wolpra98 | 0:bb9c3f242f5a | 33 | int main() |
wolpra98 | 0:bb9c3f242f5a | 34 | { |
wolpra98 | 2:d3708e92660f | 35 | swMin.mode(PullUp); |
wolpra98 | 2:d3708e92660f | 36 | swStd.mode(PullUp); |
wolpra98 | 2:d3708e92660f | 37 | swSlp.mode(PullUp); |
wolpra98 | 2:d3708e92660f | 38 | alarmOut=0; |
wolpra98 | 2:d3708e92660f | 39 | while(swSlp==1); |
wolpra98 | 2:d3708e92660f | 40 | alarmOut=0; |
wolpra98 | 2:d3708e92660f | 41 | wait(1); |
wolpra98 | 0:bb9c3f242f5a | 42 | wecker.rtc_init(); |
wolpra98 | 2:d3708e92660f | 43 | swMin.mode(PullUp); |
wolpra98 | 2:d3708e92660f | 44 | swStd.mode(PullUp); |
wolpra98 | 2:d3708e92660f | 45 | swSlp.mode(PullUp); |
wolpra98 | 2:d3708e92660f | 46 | swStd.fall(&btnStdf); |
wolpra98 | 2:d3708e92660f | 47 | swMin.fall(&btnMinf); |
wolpra98 | 1:b71a6c225c2b | 48 | swSlp.rise(&btnSlpr); |
wolpra98 | 1:b71a6c225c2b | 49 | swSlp.fall(&btnSlpf); |
wolpra98 | 1:b71a6c225c2b | 50 | tick1.attach(&tickControll,0.01); |
wolpra98 | 0:bb9c3f242f5a | 51 | while(1) { |
wolpra98 | 0:bb9c3f242f5a | 52 | wecker.printTime(); |
wolpra98 | 1:b71a6c225c2b | 53 | wecker.printState(sMode); |
wolpra98 | 0:bb9c3f242f5a | 54 | wecker.printAlarmTime(); |
wolpra98 | 0:bb9c3f242f5a | 55 | wait(0.1); |
wolpra98 | 0:bb9c3f242f5a | 56 | } |
wolpra98 | 1:b71a6c225c2b | 57 | } |
wolpra98 | 1:b71a6c225c2b | 58 | |
wolpra98 | 1:b71a6c225c2b | 59 | |
wolpra98 | 2:d3708e92660f | 60 | void btnSlpf() |
wolpra98 | 1:b71a6c225c2b | 61 | { |
wolpra98 | 1:b71a6c225c2b | 62 | wait_ms(20); |
wolpra98 | 1:b71a6c225c2b | 63 | switch (Mode) { |
wolpra98 | 1:b71a6c225c2b | 64 | case Normal: |
wolpra98 | 1:b71a6c225c2b | 65 | if(tim1.read()==0) |
wolpra98 | 1:b71a6c225c2b | 66 | tim1.start(); |
wolpra98 | 2:d3708e92660f | 67 | if (swStd==0 || swMin==0) |
wolpra98 | 1:b71a6c225c2b | 68 | Mode = setAlarm; |
wolpra98 | 1:b71a6c225c2b | 69 | break; |
wolpra98 | 1:b71a6c225c2b | 70 | case AlarmOn: |
wolpra98 | 1:b71a6c225c2b | 71 | if (tim1.read()==0) |
wolpra98 | 1:b71a6c225c2b | 72 | tim1.start(); |
wolpra98 | 1:b71a6c225c2b | 73 | break; |
wolpra98 | 1:b71a6c225c2b | 74 | case Sleep: |
wolpra98 | 1:b71a6c225c2b | 75 | if (tim1.read()==0) |
wolpra98 | 1:b71a6c225c2b | 76 | tim1.start(); |
wolpra98 | 1:b71a6c225c2b | 77 | break; |
wolpra98 | 1:b71a6c225c2b | 78 | case Alarm: |
wolpra98 | 1:b71a6c225c2b | 79 | Mode=Sleep; |
wolpra98 | 2:d3708e92660f | 80 | tim3.stop(); |
wolpra98 | 2:d3708e92660f | 81 | tim3.reset(); |
wolpra98 | 1:b71a6c225c2b | 82 | break; |
wolpra98 | 1:b71a6c225c2b | 83 | } |
wolpra98 | 1:b71a6c225c2b | 84 | } |
wolpra98 | 1:b71a6c225c2b | 85 | |
wolpra98 | 2:d3708e92660f | 86 | void btnStdf() |
wolpra98 | 1:b71a6c225c2b | 87 | { |
wolpra98 | 1:b71a6c225c2b | 88 | wait_ms(20); |
wolpra98 | 1:b71a6c225c2b | 89 | switch(Mode) { |
wolpra98 | 1:b71a6c225c2b | 90 | case Normal: |
wolpra98 | 1:b71a6c225c2b | 91 | int nextStd = wecker.unbcd(wecker.rtc_read(HOURS)); |
wolpra98 | 2:d3708e92660f | 92 | if (swSlp != 0) { |
wolpra98 | 1:b71a6c225c2b | 93 | if (nextStd>=23) |
wolpra98 | 1:b71a6c225c2b | 94 | nextStd=0; |
wolpra98 | 1:b71a6c225c2b | 95 | else |
wolpra98 | 1:b71a6c225c2b | 96 | nextStd++; |
wolpra98 | 1:b71a6c225c2b | 97 | wecker.rtc_write(HOURS, wecker.bcd(nextStd)); |
wolpra98 | 1:b71a6c225c2b | 98 | } |
wolpra98 | 1:b71a6c225c2b | 99 | break; |
wolpra98 | 1:b71a6c225c2b | 100 | case setAlarm: |
wolpra98 | 1:b71a6c225c2b | 101 | tim2.stop(); |
wolpra98 | 1:b71a6c225c2b | 102 | tim2.reset(); |
wolpra98 | 1:b71a6c225c2b | 103 | nextStd = wecker.unbcd(wecker.rtc_read(HOUR_ALARM)); |
wolpra98 | 1:b71a6c225c2b | 104 | if (nextStd>=23) |
wolpra98 | 1:b71a6c225c2b | 105 | nextStd=0; |
wolpra98 | 1:b71a6c225c2b | 106 | else |
wolpra98 | 1:b71a6c225c2b | 107 | nextStd++; |
wolpra98 | 1:b71a6c225c2b | 108 | wecker.rtc_write(HOUR_ALARM, wecker.bcd(nextStd)); |
wolpra98 | 1:b71a6c225c2b | 109 | break; |
wolpra98 | 1:b71a6c225c2b | 110 | case Alarm: |
wolpra98 | 1:b71a6c225c2b | 111 | Mode=Sleep; |
wolpra98 | 1:b71a6c225c2b | 112 | tim3.stop(); |
wolpra98 | 1:b71a6c225c2b | 113 | tim3.reset(); |
wolpra98 | 1:b71a6c225c2b | 114 | break; |
wolpra98 | 1:b71a6c225c2b | 115 | } |
wolpra98 | 1:b71a6c225c2b | 116 | } |
wolpra98 | 1:b71a6c225c2b | 117 | |
wolpra98 | 2:d3708e92660f | 118 | void btnMinf() |
wolpra98 | 1:b71a6c225c2b | 119 | { |
wolpra98 | 1:b71a6c225c2b | 120 | wait_ms(20); |
wolpra98 | 1:b71a6c225c2b | 121 | switch(Mode) { |
wolpra98 | 1:b71a6c225c2b | 122 | case Normal: |
wolpra98 | 1:b71a6c225c2b | 123 | int nextMin = wecker.unbcd(wecker.rtc_read(MINUTES)); |
wolpra98 | 2:d3708e92660f | 124 | if (swSlp != 0) { |
wolpra98 | 1:b71a6c225c2b | 125 | if (nextMin>=59) |
wolpra98 | 1:b71a6c225c2b | 126 | nextMin=0; |
wolpra98 | 1:b71a6c225c2b | 127 | else |
wolpra98 | 1:b71a6c225c2b | 128 | nextMin++; |
wolpra98 | 1:b71a6c225c2b | 129 | wecker.rtc_write(MINUTES, wecker.bcd(nextMin)); |
wolpra98 | 1:b71a6c225c2b | 130 | } |
wolpra98 | 1:b71a6c225c2b | 131 | break; |
wolpra98 | 1:b71a6c225c2b | 132 | case setAlarm: |
wolpra98 | 1:b71a6c225c2b | 133 | tim2.stop(); |
wolpra98 | 1:b71a6c225c2b | 134 | tim2.reset(); |
wolpra98 | 1:b71a6c225c2b | 135 | nextMin = wecker.unbcd(wecker.rtc_read(MINUTE_ALARM)); |
wolpra98 | 1:b71a6c225c2b | 136 | if (nextMin>=59) |
wolpra98 | 1:b71a6c225c2b | 137 | nextMin=0; |
wolpra98 | 1:b71a6c225c2b | 138 | else |
wolpra98 | 1:b71a6c225c2b | 139 | nextMin++; |
wolpra98 | 1:b71a6c225c2b | 140 | wecker.rtc_write(MINUTE_ALARM, wecker.bcd(nextMin)); |
wolpra98 | 1:b71a6c225c2b | 141 | break; |
wolpra98 | 1:b71a6c225c2b | 142 | case Alarm: |
wolpra98 | 1:b71a6c225c2b | 143 | tim3.stop(); |
wolpra98 | 1:b71a6c225c2b | 144 | tim3.reset(); |
wolpra98 | 1:b71a6c225c2b | 145 | Mode=Sleep; |
wolpra98 | 1:b71a6c225c2b | 146 | break; |
wolpra98 | 1:b71a6c225c2b | 147 | } |
wolpra98 | 1:b71a6c225c2b | 148 | } |
wolpra98 | 1:b71a6c225c2b | 149 | |
wolpra98 | 1:b71a6c225c2b | 150 | void tickControll() |
wolpra98 | 1:b71a6c225c2b | 151 | { |
wolpra98 | 1:b71a6c225c2b | 152 | switch(Mode) { |
wolpra98 | 1:b71a6c225c2b | 153 | case Normal: |
wolpra98 | 1:b71a6c225c2b | 154 | strcpy(sMode,"No"); |
wolpra98 | 2:d3708e92660f | 155 | |
wolpra98 | 1:b71a6c225c2b | 156 | break; |
wolpra98 | 1:b71a6c225c2b | 157 | case setAlarm: |
wolpra98 | 1:b71a6c225c2b | 158 | strcpy(sMode,"sA"); |
wolpra98 | 2:d3708e92660f | 159 | if(swStd==1 && swMin==1) |
wolpra98 | 1:b71a6c225c2b | 160 | tim2.start(); |
wolpra98 | 1:b71a6c225c2b | 161 | if(tim2.read()>=5.0) { |
wolpra98 | 1:b71a6c225c2b | 162 | Mode=Normal; |
wolpra98 | 1:b71a6c225c2b | 163 | tim2.stop(); |
wolpra98 | 1:b71a6c225c2b | 164 | tim2.reset(); |
wolpra98 | 1:b71a6c225c2b | 165 | } |
wolpra98 | 1:b71a6c225c2b | 166 | break; |
wolpra98 | 1:b71a6c225c2b | 167 | case AlarmOn: |
wolpra98 | 1:b71a6c225c2b | 168 | strcpy(sMode,"AO"); |
wolpra98 | 1:b71a6c225c2b | 169 | if(alarm==0) |
wolpra98 | 1:b71a6c225c2b | 170 | Mode=Alarm; |
wolpra98 | 2:d3708e92660f | 171 | //else if((wecker.rtc_read(MINUTE_ALARM) == wecker.rtc_read(MINUTES)) && (wecker.rtc_read(HOUR_ALARM)==wecker.rtc_read(HOURS))) |
wolpra98 | 2:d3708e92660f | 172 | // Mode=Alarm; |
wolpra98 | 2:d3708e92660f | 173 | |
wolpra98 | 2:d3708e92660f | 174 | break; |
wolpra98 | 2:d3708e92660f | 175 | case Sleep: |
wolpra98 | 2:d3708e92660f | 176 | if(tim3.read()==0) |
wolpra98 | 2:d3708e92660f | 177 | tim3.start(); |
wolpra98 | 2:d3708e92660f | 178 | if(tim3.read()>=SlpAlTime) { |
wolpra98 | 2:d3708e92660f | 179 | Mode=Alarm; |
wolpra98 | 2:d3708e92660f | 180 | tim3.stop(); |
wolpra98 | 2:d3708e92660f | 181 | tim3.reset(); |
wolpra98 | 2:d3708e92660f | 182 | } |
wolpra98 | 1:b71a6c225c2b | 183 | strcpy(sMode,"Sl"); |
wolpra98 | 2:d3708e92660f | 184 | alarmOut=0; |
wolpra98 | 1:b71a6c225c2b | 185 | break; |
wolpra98 | 1:b71a6c225c2b | 186 | case Alarm: |
wolpra98 | 2:d3708e92660f | 187 | if(tim3.read()==0) |
wolpra98 | 1:b71a6c225c2b | 188 | tim3.start(); |
wolpra98 | 2:d3708e92660f | 189 | if(tim3.read()>=SlpAlTime) { |
wolpra98 | 2:d3708e92660f | 190 | Mode=Sleep; |
wolpra98 | 2:d3708e92660f | 191 | tim3.stop(); |
wolpra98 | 2:d3708e92660f | 192 | tim3.reset(); |
wolpra98 | 2:d3708e92660f | 193 | } |
wolpra98 | 1:b71a6c225c2b | 194 | strcpy(sMode,"Al"); |
wolpra98 | 2:d3708e92660f | 195 | alarmOut=1; |
wolpra98 | 1:b71a6c225c2b | 196 | break; |
wolpra98 | 1:b71a6c225c2b | 197 | } |
wolpra98 | 1:b71a6c225c2b | 198 | } |
wolpra98 | 1:b71a6c225c2b | 199 | |
wolpra98 | 2:d3708e92660f | 200 | void btnSlpr() |
wolpra98 | 1:b71a6c225c2b | 201 | { |
wolpra98 | 1:b71a6c225c2b | 202 | switch(Mode) { |
wolpra98 | 1:b71a6c225c2b | 203 | case Normal: |
wolpra98 | 2:d3708e92660f | 204 | if (swStd==0 || swMin==0) |
wolpra98 | 1:b71a6c225c2b | 205 | Mode = setAlarm; |
wolpra98 | 1:b71a6c225c2b | 206 | if(tim1.read()!=0) { |
wolpra98 | 1:b71a6c225c2b | 207 | tim1.stop(); |
wolpra98 | 2:d3708e92660f | 208 | if (tim1.read()>=3.0) { |
wolpra98 | 1:b71a6c225c2b | 209 | Mode = AlarmOn; |
wolpra98 | 2:d3708e92660f | 210 | wecker.rtc_write(CONTROL2, 0x02); |
wolpra98 | 2:d3708e92660f | 211 | } |
wolpra98 | 1:b71a6c225c2b | 212 | tim1.reset(); |
wolpra98 | 2:d3708e92660f | 213 | } |
wolpra98 | 2:d3708e92660f | 214 | break; |
wolpra98 | 2:d3708e92660f | 215 | case AlarmOn: |
wolpra98 | 2:d3708e92660f | 216 | tim1.stop(); |
wolpra98 | 2:d3708e92660f | 217 | if (tim1.read()>=3.0) { |
wolpra98 | 2:d3708e92660f | 218 | Mode = Normal; |
wolpra98 | 1:b71a6c225c2b | 219 | wecker.rtc_write(CONTROL2, 0); |
wolpra98 | 1:b71a6c225c2b | 220 | } |
wolpra98 | 2:d3708e92660f | 221 | tim1.reset(); |
wolpra98 | 2:d3708e92660f | 222 | break; |
wolpra98 | 2:d3708e92660f | 223 | case Sleep: |
wolpra98 | 2:d3708e92660f | 224 | tim1.stop(); |
wolpra98 | 2:d3708e92660f | 225 | if (tim1.read()>=3.0) { |
wolpra98 | 2:d3708e92660f | 226 | Mode = Normal; |
wolpra98 | 2:d3708e92660f | 227 | tim3.stop(); |
wolpra98 | 2:d3708e92660f | 228 | tim3.reset(); |
wolpra98 | 2:d3708e92660f | 229 | } |
wolpra98 | 2:d3708e92660f | 230 | wecker.rtc_write(CONTROL2, 0); |
wolpra98 | 2:d3708e92660f | 231 | tim1.reset(); |
wolpra98 | 2:d3708e92660f | 232 | break; |
wolpra98 | 1:b71a6c225c2b | 233 | } |
wolpra98 | 0:bb9c3f242f5a | 234 | } |