Projekt-Alarmclock

Dependencies:   LCD RTC8563 Wecker mbed

Committer:
wolpra98
Date:
Fri May 29 12:01:00 2015 +0000
Revision:
1:b71a6c225c2b
Parent:
0:bb9c3f242f5a
Child:
2:d3708e92660f
Completed Version of the Alarm Clock with LCD Output

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 1:b71a6c225c2b 9 void btnStdr();
wolpra98 1:b71a6c225c2b 10 void btnMinr();
wolpra98 1:b71a6c225c2b 11 void btnSlpr();
wolpra98 1:b71a6c225c2b 12 void btnSlpf();
wolpra98 1:b71a6c225c2b 13 void tickControll();
wolpra98 1:b71a6c225c2b 14
wolpra98 1:b71a6c225c2b 15 typedef enum {Normal, setAlarm, AlarmOn, Alarm, Sleep} state;
wolpra98 1:b71a6c225c2b 16 state Mode=Normal;
wolpra98 1:b71a6c225c2b 17 char sMode[2];
wolpra98 1:b71a6c225c2b 18
wolpra98 1:b71a6c225c2b 19 Ticker tick1;
wolpra98 1:b71a6c225c2b 20 Timer tim1,tim2,tim3;
wolpra98 1:b71a6c225c2b 21
wolpra98 1:b71a6c225c2b 22 InterruptIn swStd(P0_15);
wolpra98 1:b71a6c225c2b 23 InterruptIn swMin(P0_23);
wolpra98 1:b71a6c225c2b 24 InterruptIn swSlp(P0_10);
wolpra98 1:b71a6c225c2b 25 DigitalIn alarm(P1_28);
wolpra98 1:b71a6c225c2b 26 DigitalOut myled(LED1);
wolpra98 1:b71a6c225c2b 27
wolpra98 0:bb9c3f242f5a 28 int main()
wolpra98 0:bb9c3f242f5a 29 {
wolpra98 0:bb9c3f242f5a 30 wecker.rtc_init();
wolpra98 1:b71a6c225c2b 31 swStd.rise(&btnStdr);
wolpra98 1:b71a6c225c2b 32 swMin.rise(&btnMinr);
wolpra98 1:b71a6c225c2b 33 swSlp.rise(&btnSlpr);
wolpra98 1:b71a6c225c2b 34 swSlp.fall(&btnSlpf);
wolpra98 1:b71a6c225c2b 35 tick1.attach(&tickControll,0.01);
wolpra98 0:bb9c3f242f5a 36 while(1) {
wolpra98 0:bb9c3f242f5a 37 wecker.printTime();
wolpra98 1:b71a6c225c2b 38 wecker.printState(sMode);
wolpra98 0:bb9c3f242f5a 39 wecker.printAlarmTime();
wolpra98 0:bb9c3f242f5a 40 wait(0.1);
wolpra98 0:bb9c3f242f5a 41 }
wolpra98 1:b71a6c225c2b 42 }
wolpra98 1:b71a6c225c2b 43
wolpra98 1:b71a6c225c2b 44
wolpra98 1:b71a6c225c2b 45
wolpra98 1:b71a6c225c2b 46 void btnSlpr()
wolpra98 1:b71a6c225c2b 47 {
wolpra98 1:b71a6c225c2b 48 wait_ms(20);
wolpra98 1:b71a6c225c2b 49 switch (Mode) {
wolpra98 1:b71a6c225c2b 50 case Normal:
wolpra98 1:b71a6c225c2b 51 if(tim1.read()==0)
wolpra98 1:b71a6c225c2b 52 tim1.start();
wolpra98 1:b71a6c225c2b 53 if (swStd==1 || swMin==1)
wolpra98 1:b71a6c225c2b 54 Mode = setAlarm;
wolpra98 1:b71a6c225c2b 55 break;
wolpra98 1:b71a6c225c2b 56 case AlarmOn:
wolpra98 1:b71a6c225c2b 57 if (tim1.read()==0)
wolpra98 1:b71a6c225c2b 58 tim1.start();
wolpra98 1:b71a6c225c2b 59 break;
wolpra98 1:b71a6c225c2b 60 case Sleep:
wolpra98 1:b71a6c225c2b 61 if (tim1.read()==0)
wolpra98 1:b71a6c225c2b 62 tim1.start();
wolpra98 1:b71a6c225c2b 63 break;
wolpra98 1:b71a6c225c2b 64 case Alarm:
wolpra98 1:b71a6c225c2b 65 Mode=Sleep;
wolpra98 1:b71a6c225c2b 66 break;
wolpra98 1:b71a6c225c2b 67 }
wolpra98 1:b71a6c225c2b 68 }
wolpra98 1:b71a6c225c2b 69
wolpra98 1:b71a6c225c2b 70 void btnStdr()
wolpra98 1:b71a6c225c2b 71 {
wolpra98 1:b71a6c225c2b 72 wait_ms(20);
wolpra98 1:b71a6c225c2b 73 switch(Mode) {
wolpra98 1:b71a6c225c2b 74 case Normal:
wolpra98 1:b71a6c225c2b 75 int nextStd = wecker.unbcd(wecker.rtc_read(HOURS));
wolpra98 1:b71a6c225c2b 76 if (swSlp != 1) {
wolpra98 1:b71a6c225c2b 77 if (nextStd>=23)
wolpra98 1:b71a6c225c2b 78 nextStd=0;
wolpra98 1:b71a6c225c2b 79 else
wolpra98 1:b71a6c225c2b 80 nextStd++;
wolpra98 1:b71a6c225c2b 81 wecker.rtc_write(HOURS, wecker.bcd(nextStd));
wolpra98 1:b71a6c225c2b 82 }
wolpra98 1:b71a6c225c2b 83 break;
wolpra98 1:b71a6c225c2b 84 case setAlarm:
wolpra98 1:b71a6c225c2b 85 tim2.stop();
wolpra98 1:b71a6c225c2b 86 tim2.reset();
wolpra98 1:b71a6c225c2b 87 nextStd = wecker.unbcd(wecker.rtc_read(HOUR_ALARM));
wolpra98 1:b71a6c225c2b 88 if (nextStd>=23)
wolpra98 1:b71a6c225c2b 89 nextStd=0;
wolpra98 1:b71a6c225c2b 90 else
wolpra98 1:b71a6c225c2b 91 nextStd++;
wolpra98 1:b71a6c225c2b 92 wecker.rtc_write(HOUR_ALARM, wecker.bcd(nextStd));
wolpra98 1:b71a6c225c2b 93 break;
wolpra98 1:b71a6c225c2b 94 case Alarm:
wolpra98 1:b71a6c225c2b 95 Mode=Sleep;
wolpra98 1:b71a6c225c2b 96 tim3.stop();
wolpra98 1:b71a6c225c2b 97 tim3.reset();
wolpra98 1:b71a6c225c2b 98 break;
wolpra98 1:b71a6c225c2b 99 }
wolpra98 1:b71a6c225c2b 100 }
wolpra98 1:b71a6c225c2b 101
wolpra98 1:b71a6c225c2b 102 void btnMinr()
wolpra98 1:b71a6c225c2b 103 {
wolpra98 1:b71a6c225c2b 104 wait_ms(20);
wolpra98 1:b71a6c225c2b 105 switch(Mode) {
wolpra98 1:b71a6c225c2b 106 case Normal:
wolpra98 1:b71a6c225c2b 107 int nextMin = wecker.unbcd(wecker.rtc_read(MINUTES));
wolpra98 1:b71a6c225c2b 108 if (swSlp != 1) {
wolpra98 1:b71a6c225c2b 109 if (nextMin>=59)
wolpra98 1:b71a6c225c2b 110 nextMin=0;
wolpra98 1:b71a6c225c2b 111 else
wolpra98 1:b71a6c225c2b 112 nextMin++;
wolpra98 1:b71a6c225c2b 113 wecker.rtc_write(MINUTES, wecker.bcd(nextMin));
wolpra98 1:b71a6c225c2b 114 }
wolpra98 1:b71a6c225c2b 115 break;
wolpra98 1:b71a6c225c2b 116 case setAlarm:
wolpra98 1:b71a6c225c2b 117 tim2.stop();
wolpra98 1:b71a6c225c2b 118 tim2.reset();
wolpra98 1:b71a6c225c2b 119 nextMin = wecker.unbcd(wecker.rtc_read(MINUTE_ALARM));
wolpra98 1:b71a6c225c2b 120 if (nextMin>=59)
wolpra98 1:b71a6c225c2b 121 nextMin=0;
wolpra98 1:b71a6c225c2b 122 else
wolpra98 1:b71a6c225c2b 123 nextMin++;
wolpra98 1:b71a6c225c2b 124 wecker.rtc_write(MINUTE_ALARM, wecker.bcd(nextMin));
wolpra98 1:b71a6c225c2b 125 break;
wolpra98 1:b71a6c225c2b 126 case Alarm:
wolpra98 1:b71a6c225c2b 127 tim3.stop();
wolpra98 1:b71a6c225c2b 128 tim3.reset();
wolpra98 1:b71a6c225c2b 129 Mode=Sleep;
wolpra98 1:b71a6c225c2b 130 break;
wolpra98 1:b71a6c225c2b 131 }
wolpra98 1:b71a6c225c2b 132 }
wolpra98 1:b71a6c225c2b 133
wolpra98 1:b71a6c225c2b 134 void tickControll()
wolpra98 1:b71a6c225c2b 135 {
wolpra98 1:b71a6c225c2b 136 switch(Mode) {
wolpra98 1:b71a6c225c2b 137 case Normal:
wolpra98 1:b71a6c225c2b 138 strcpy(sMode,"No");
wolpra98 1:b71a6c225c2b 139 break;
wolpra98 1:b71a6c225c2b 140 case setAlarm:
wolpra98 1:b71a6c225c2b 141 strcpy(sMode,"sA");
wolpra98 1:b71a6c225c2b 142 if(swStd==0 && swMin==0)
wolpra98 1:b71a6c225c2b 143 tim2.start();
wolpra98 1:b71a6c225c2b 144 if(tim2.read()>=5.0) {
wolpra98 1:b71a6c225c2b 145 Mode=Normal;
wolpra98 1:b71a6c225c2b 146 tim2.stop();
wolpra98 1:b71a6c225c2b 147 tim2.reset();
wolpra98 1:b71a6c225c2b 148 }
wolpra98 1:b71a6c225c2b 149 break;
wolpra98 1:b71a6c225c2b 150 case AlarmOn:
wolpra98 1:b71a6c225c2b 151 strcpy(sMode,"AO");
wolpra98 1:b71a6c225c2b 152 if(alarm==0)
wolpra98 1:b71a6c225c2b 153 Mode=Alarm;
wolpra98 1:b71a6c225c2b 154 break;
wolpra98 1:b71a6c225c2b 155 case Sleep:
wolpra98 1:b71a6c225c2b 156 if(tim3.read()==0)
wolpra98 1:b71a6c225c2b 157 tim3.start();
wolpra98 1:b71a6c225c2b 158 if(tim3.read()>=300) {
wolpra98 1:b71a6c225c2b 159 Mode=Alarm;
wolpra98 1:b71a6c225c2b 160 tim3.stop();
wolpra98 1:b71a6c225c2b 161 tim3.reset();
wolpra98 1:b71a6c225c2b 162 }
wolpra98 1:b71a6c225c2b 163 strcpy(sMode,"Sl");
wolpra98 1:b71a6c225c2b 164 myled=0;
wolpra98 1:b71a6c225c2b 165 break;
wolpra98 1:b71a6c225c2b 166 case Alarm:
wolpra98 1:b71a6c225c2b 167 if(tim3.read()==0)
wolpra98 1:b71a6c225c2b 168 tim3.start();
wolpra98 1:b71a6c225c2b 169 if(tim3.read()>=300) {
wolpra98 1:b71a6c225c2b 170 Mode=Sleep;
wolpra98 1:b71a6c225c2b 171 tim3.stop();
wolpra98 1:b71a6c225c2b 172 tim3.reset();
wolpra98 1:b71a6c225c2b 173 }
wolpra98 1:b71a6c225c2b 174 strcpy(sMode,"Al");
wolpra98 1:b71a6c225c2b 175 myled=1;
wolpra98 1:b71a6c225c2b 176 break;
wolpra98 1:b71a6c225c2b 177 }
wolpra98 1:b71a6c225c2b 178 }
wolpra98 1:b71a6c225c2b 179
wolpra98 1:b71a6c225c2b 180 void btnSlpf()
wolpra98 1:b71a6c225c2b 181 {
wolpra98 1:b71a6c225c2b 182 switch(Mode) {
wolpra98 1:b71a6c225c2b 183 case Normal:
wolpra98 1:b71a6c225c2b 184 if (swStd==1 || swMin==1)
wolpra98 1:b71a6c225c2b 185 Mode = setAlarm;
wolpra98 1:b71a6c225c2b 186 if(tim1.read()!=0) {
wolpra98 1:b71a6c225c2b 187 tim1.stop();
wolpra98 1:b71a6c225c2b 188 if (tim1.read()>=3.0)
wolpra98 1:b71a6c225c2b 189 Mode = AlarmOn;
wolpra98 1:b71a6c225c2b 190 wecker.rtc_write(CONTROL2, 0x02);
wolpra98 1:b71a6c225c2b 191 tim1.reset();
wolpra98 1:b71a6c225c2b 192 break;
wolpra98 1:b71a6c225c2b 193 case AlarmOn:
wolpra98 1:b71a6c225c2b 194 tim1.stop();
wolpra98 1:b71a6c225c2b 195 if (tim1.read()>=3.0)
wolpra98 1:b71a6c225c2b 196 Mode = Normal;
wolpra98 1:b71a6c225c2b 197 wecker.rtc_write(CONTROL2, 0);
wolpra98 1:b71a6c225c2b 198 tim1.reset();
wolpra98 1:b71a6c225c2b 199 break;
wolpra98 1:b71a6c225c2b 200 case Sleep:
wolpra98 1:b71a6c225c2b 201 tim1.stop();
wolpra98 1:b71a6c225c2b 202 if (tim1.read()>=3.0) {
wolpra98 1:b71a6c225c2b 203 Mode = Normal;
wolpra98 1:b71a6c225c2b 204 tim3.stop();
wolpra98 1:b71a6c225c2b 205 tim3.reset();
wolpra98 1:b71a6c225c2b 206 }
wolpra98 1:b71a6c225c2b 207 wecker.rtc_write(CONTROL2, 0);
wolpra98 1:b71a6c225c2b 208 tim1.reset();
wolpra98 1:b71a6c225c2b 209 break;
wolpra98 1:b71a6c225c2b 210 }
wolpra98 1:b71a6c225c2b 211 }
wolpra98 0:bb9c3f242f5a 212 }