Projekt-Alarmclock

Dependencies:   LCD RTC8563 Wecker mbed

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?

UserRevisionLine numberNew 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 }