Alarm v1.0
Dependencies: Debounced RTC-DS1307 mbed
Fork of Rtc_Ds1307_Sample by
main.cpp@3:fb2b42e00333, 2015-11-02 (annotated)
- Committer:
- PabloViana
- Date:
- Mon Nov 02 04:18:25 2015 +0000
- Revision:
- 3:fb2b42e00333
- Parent:
- 2:3be003301107
Alarm v1.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
PabloViana | 3:fb2b42e00333 | 1 | /*Programa tomado y adaptado de Henry Leinen*/ |
PabloViana | 3:fb2b42e00333 | 2 | /*Algunas modificaciones se realizan con propósitos educativos*/ |
leihen | 0:431183c5b136 | 3 | #include "mbed.h" |
leihen | 0:431183c5b136 | 4 | #include "Rtc_Ds1307.h" |
PabloViana | 3:fb2b42e00333 | 5 | #include "DebouncedIn.h" |
leihen | 0:431183c5b136 | 6 | |
leihen | 2:3be003301107 | 7 | //RtcCls rtc(p28, p27, p29, true); |
PabloViana | 3:fb2b42e00333 | 8 | Rtc_Ds1307 rtc(PTE0, PTE1); |
PabloViana | 3:fb2b42e00333 | 9 | |
PabloViana | 3:fb2b42e00333 | 10 | /****************Configurar Salidas********************/ |
PabloViana | 3:fb2b42e00333 | 11 | Serial pc(USBTX, USBRX, "pc"); |
PabloViana | 3:fb2b42e00333 | 12 | PwmOut led1(LED1); |
PabloViana | 3:fb2b42e00333 | 13 | PwmOut led2(LED2); |
leihen | 0:431183c5b136 | 14 | |
PabloViana | 3:fb2b42e00333 | 15 | DebouncedIn Stop(PTE2); |
PabloViana | 3:fb2b42e00333 | 16 | DebouncedIn CLK(PTE3); |
PabloViana | 3:fb2b42e00333 | 17 | DebouncedIn DT(PTE4); |
PabloViana | 3:fb2b42e00333 | 18 | DebouncedIn SW1(PTE5); |
PabloViana | 3:fb2b42e00333 | 19 | DebouncedIn Snooze(PTB11); |
PabloViana | 3:fb2b42e00333 | 20 | /*****************Definir variables********************/ |
leihen | 0:431183c5b136 | 21 | char buffer[128]; |
leihen | 0:431183c5b136 | 22 | int readptr = 0; |
PabloViana | 3:fb2b42e00333 | 23 | int started=0; |
PabloViana | 3:fb2b42e00333 | 24 | int wakeup=0; |
PabloViana | 3:fb2b42e00333 | 25 | //int snooze=0; |
PabloViana | 3:fb2b42e00333 | 26 | int howmanytimes = 0; |
PabloViana | 3:fb2b42e00333 | 27 | //Alarm variables; |
PabloViana | 3:fb2b42e00333 | 28 | int hour1; |
PabloViana | 3:fb2b42e00333 | 29 | int min1; |
PabloViana | 3:fb2b42e00333 | 30 | int sec1; |
leihen | 1:6dbe51fe0737 | 31 | |
PabloViana | 3:fb2b42e00333 | 32 | /*******************Rutinas********************/ |
PabloViana | 3:fb2b42e00333 | 33 | |
PabloViana | 3:fb2b42e00333 | 34 | void Encoder() |
PabloViana | 3:fb2b42e00333 | 35 | { |
PabloViana | 3:fb2b42e00333 | 36 | int NewClk; |
PabloViana | 3:fb2b42e00333 | 37 | int OldClk; |
PabloViana | 3:fb2b42e00333 | 38 | int NewDt; |
PabloViana | 3:fb2b42e00333 | 39 | int OldDt; |
PabloViana | 3:fb2b42e00333 | 40 | int NewPos; |
PabloViana | 3:fb2b42e00333 | 41 | int OldPos; |
PabloViana | 3:fb2b42e00333 | 42 | int counter2=0; |
PabloViana | 3:fb2b42e00333 | 43 | pc.printf("Setting Alarm...\n\r") ; |
PabloViana | 3:fb2b42e00333 | 44 | pc.printf("The current alarm settings : %02d:%02d\n", hour1,min1); |
PabloViana | 3:fb2b42e00333 | 45 | pc.printf("Hour:\n\r") ; |
PabloViana | 3:fb2b42e00333 | 46 | |
PabloViana | 3:fb2b42e00333 | 47 | while(howmanytimes != 0) |
PabloViana | 3:fb2b42e00333 | 48 | { |
PabloViana | 3:fb2b42e00333 | 49 | NewClk = CLK.read(); |
PabloViana | 3:fb2b42e00333 | 50 | NewDt=DT.read(); |
PabloViana | 3:fb2b42e00333 | 51 | NewPos = 2*NewClk + NewDt; |
PabloViana | 3:fb2b42e00333 | 52 | if (NewClk != OldClk || NewDt != OldDt) |
PabloViana | 3:fb2b42e00333 | 53 | { |
PabloViana | 3:fb2b42e00333 | 54 | counter2++; |
PabloViana | 3:fb2b42e00333 | 55 | if ((OldPos == 0 && NewPos == 2) ||(OldPos == 2 && NewPos == 3) || (OldPos == 3 && NewPos == 1) || (OldPos == 1 && NewPos == 0)) //Incremento; |
PabloViana | 3:fb2b42e00333 | 56 | { |
PabloViana | 3:fb2b42e00333 | 57 | |
PabloViana | 3:fb2b42e00333 | 58 | if (howmanytimes ==1 && counter2 ==2){hour1++; if(hour1>23){hour1=0;}}; |
PabloViana | 3:fb2b42e00333 | 59 | if (howmanytimes ==2 && counter2 ==2){min1++; if(min1>59){min1=0;}}; |
PabloViana | 3:fb2b42e00333 | 60 | |
PabloViana | 3:fb2b42e00333 | 61 | printf("%d : %d\n", hour1, min1); |
leihen | 0:431183c5b136 | 62 | } |
PabloViana | 3:fb2b42e00333 | 63 | else if ((OldPos == 0 && NewPos == 1) ||(OldPos == 1 && NewPos == 3) || (OldPos == 3 && NewPos == 2) || (OldPos == 2 && NewPos == 0)) |
PabloViana | 3:fb2b42e00333 | 64 | { |
PabloViana | 3:fb2b42e00333 | 65 | if (howmanytimes ==1 && counter2 ==2 ){hour1--; if(hour1<0){hour1=23;}}; |
PabloViana | 3:fb2b42e00333 | 66 | if (howmanytimes ==2 && counter2 ==2){min1--; if(min1<0){min1=59;}}; |
PabloViana | 3:fb2b42e00333 | 67 | printf("%d : %d\n", hour1, min1); |
PabloViana | 3:fb2b42e00333 | 68 | } |
PabloViana | 3:fb2b42e00333 | 69 | |
PabloViana | 3:fb2b42e00333 | 70 | if (counter2==2){counter2=0;} |
leihen | 0:431183c5b136 | 71 | } |
PabloViana | 3:fb2b42e00333 | 72 | OldClk=NewClk; |
PabloViana | 3:fb2b42e00333 | 73 | OldDt=NewDt; |
PabloViana | 3:fb2b42e00333 | 74 | OldPos = NewPos; |
PabloViana | 3:fb2b42e00333 | 75 | |
PabloViana | 3:fb2b42e00333 | 76 | if(SW1.falling()) |
PabloViana | 3:fb2b42e00333 | 77 | { |
PabloViana | 3:fb2b42e00333 | 78 | howmanytimes++; |
PabloViana | 3:fb2b42e00333 | 79 | if(howmanytimes==2){pc.printf("Minutes...\n");} |
PabloViana | 3:fb2b42e00333 | 80 | if(howmanytimes > 2) {howmanytimes=0;} |
leihen | 0:431183c5b136 | 81 | } |
leihen | 0:431183c5b136 | 82 | } |
leihen | 0:431183c5b136 | 83 | } |
PabloViana | 3:fb2b42e00333 | 84 | |
PabloViana | 3:fb2b42e00333 | 85 | |
PabloViana | 3:fb2b42e00333 | 86 | //Main |
PabloViana | 3:fb2b42e00333 | 87 | int main() { |
PabloViana | 3:fb2b42e00333 | 88 | int c; |
PabloViana | 3:fb2b42e00333 | 89 | int counter1=0; |
PabloViana | 3:fb2b42e00333 | 90 | |
PabloViana | 3:fb2b42e00333 | 91 | led1.period(2.0); |
PabloViana | 3:fb2b42e00333 | 92 | led1.write(1.0); |
PabloViana | 3:fb2b42e00333 | 93 | led2.period(2.0); |
PabloViana | 3:fb2b42e00333 | 94 | led2.write(1.0); |
PabloViana | 3:fb2b42e00333 | 95 | |
PabloViana | 3:fb2b42e00333 | 96 | Rtc_Ds1307::Time_rtc tm = {}; //Se da un nombre a la estructura usada para almacenar la información del reloj |
PabloViana | 3:fb2b42e00333 | 97 | |
PabloViana | 3:fb2b42e00333 | 98 | |
PabloViana | 3:fb2b42e00333 | 99 | /*Inicializar el reloj*/ |
PabloViana | 3:fb2b42e00333 | 100 | pc.printf("************************\n Be Welcome! \n ************************\n"); |
PabloViana | 3:fb2b42e00333 | 101 | if (rtc.getTime(tm) ) { |
PabloViana | 3:fb2b42e00333 | 102 | pc.printf("The current time is : %02d:%02d:%02d\n", tm.hour, tm.min, tm.sec); |
PabloViana | 3:fb2b42e00333 | 103 | pc.printf("The current date is : %02d/%02d/%04d\n", tm.mon, tm.date, tm.year); |
PabloViana | 3:fb2b42e00333 | 104 | |
PabloViana | 3:fb2b42e00333 | 105 | } |
PabloViana | 3:fb2b42e00333 | 106 | |
PabloViana | 3:fb2b42e00333 | 107 | while(started==0) |
PabloViana | 3:fb2b42e00333 | 108 | |
PabloViana | 3:fb2b42e00333 | 109 | { pc.printf("Is it right? yes or not?\n"); |
PabloViana | 3:fb2b42e00333 | 110 | while( (c = pc.getc()) != '\n') |
PabloViana | 3:fb2b42e00333 | 111 | { |
PabloViana | 3:fb2b42e00333 | 112 | buffer[readptr++] = c; |
PabloViana | 3:fb2b42e00333 | 113 | } |
PabloViana | 3:fb2b42e00333 | 114 | |
PabloViana | 3:fb2b42e00333 | 115 | buffer[readptr++] = 0; //Almaceno un cero en la posición después del cambio de línea; |
PabloViana | 3:fb2b42e00333 | 116 | |
PabloViana | 3:fb2b42e00333 | 117 | if (strncmp(buffer, "yes", 3) == 0) //Date and time are ok, lets start! |
PabloViana | 3:fb2b42e00333 | 118 | { |
PabloViana | 3:fb2b42e00333 | 119 | pc.printf("Lets start...\n"); |
PabloViana | 3:fb2b42e00333 | 120 | rtc.startClock(); |
PabloViana | 3:fb2b42e00333 | 121 | started=1; |
PabloViana | 3:fb2b42e00333 | 122 | } |
PabloViana | 3:fb2b42e00333 | 123 | |
PabloViana | 3:fb2b42e00333 | 124 | else if (strncmp(buffer, "not", 3) == 0) |
PabloViana | 3:fb2b42e00333 | 125 | { |
PabloViana | 3:fb2b42e00333 | 126 | // perform write |
PabloViana | 3:fb2b42e00333 | 127 | pc.printf("Enter the date (date 0..31)"); |
PabloViana | 3:fb2b42e00333 | 128 | pc.scanf("%d", &tm.date); |
PabloViana | 3:fb2b42e00333 | 129 | pc.printf("Enter the date (month 1..12)"); |
PabloViana | 3:fb2b42e00333 | 130 | pc.scanf("%d", &tm.mon); |
PabloViana | 3:fb2b42e00333 | 131 | pc.printf("Enter the date (year)"); |
PabloViana | 3:fb2b42e00333 | 132 | pc.scanf("%d", &tm.year); |
PabloViana | 3:fb2b42e00333 | 133 | pc.printf("Enter the time (hours 0..23)"); |
PabloViana | 3:fb2b42e00333 | 134 | pc.scanf("%d", &tm.hour); |
PabloViana | 3:fb2b42e00333 | 135 | pc.printf("Enter the time (minutes 0..59)"); |
PabloViana | 3:fb2b42e00333 | 136 | pc.scanf("%d", &tm.min); |
PabloViana | 3:fb2b42e00333 | 137 | pc.printf("Enter the time (seconds 0..59)"); |
PabloViana | 3:fb2b42e00333 | 138 | pc.scanf("%d", &tm.sec); |
PabloViana | 3:fb2b42e00333 | 139 | pc.printf("Performing write operation\n"); |
PabloViana | 3:fb2b42e00333 | 140 | |
PabloViana | 3:fb2b42e00333 | 141 | while(pc.readable()) |
PabloViana | 3:fb2b42e00333 | 142 | pc.getc(); |
PabloViana | 3:fb2b42e00333 | 143 | rtc.setTime(tm, false, false); |
PabloViana | 3:fb2b42e00333 | 144 | rtc.startClock(); |
PabloViana | 3:fb2b42e00333 | 145 | started=1; |
PabloViana | 3:fb2b42e00333 | 146 | } |
PabloViana | 3:fb2b42e00333 | 147 | |
PabloViana | 3:fb2b42e00333 | 148 | else |
PabloViana | 3:fb2b42e00333 | 149 | { |
PabloViana | 3:fb2b42e00333 | 150 | pc.printf("Try again \n"); |
PabloViana | 3:fb2b42e00333 | 151 | readptr=0; |
PabloViana | 3:fb2b42e00333 | 152 | } |
PabloViana | 3:fb2b42e00333 | 153 | pc.printf("\n"); |
PabloViana | 3:fb2b42e00333 | 154 | }//while start |
PabloViana | 3:fb2b42e00333 | 155 | |
PabloViana | 3:fb2b42e00333 | 156 | //Esto es temporal |
PabloViana | 3:fb2b42e00333 | 157 | if (tm.min==59){ hour1 = tm.hour+1; min1=0;} |
PabloViana | 3:fb2b42e00333 | 158 | else {hour1 = tm.hour; min1=tm.min+1;} |
PabloViana | 3:fb2b42e00333 | 159 | |
PabloViana | 3:fb2b42e00333 | 160 | |
PabloViana | 3:fb2b42e00333 | 161 | /*Ciclo infinito para correr el programa*/ |
PabloViana | 3:fb2b42e00333 | 162 | while(1) |
PabloViana | 3:fb2b42e00333 | 163 | { |
PabloViana | 3:fb2b42e00333 | 164 | wait(0.01); |
PabloViana | 3:fb2b42e00333 | 165 | counter1++; //Aumento el contador |
PabloViana | 3:fb2b42e00333 | 166 | |
PabloViana | 3:fb2b42e00333 | 167 | /*******Get the time*********/ |
PabloViana | 3:fb2b42e00333 | 168 | if (counter1==90) //Cuento 900ms para mostrar algo en pantalla; |
PabloViana | 3:fb2b42e00333 | 169 | { |
PabloViana | 3:fb2b42e00333 | 170 | counter1=0; |
PabloViana | 3:fb2b42e00333 | 171 | if (rtc.getTime(tm) ) |
PabloViana | 3:fb2b42e00333 | 172 | { |
PabloViana | 3:fb2b42e00333 | 173 | pc.printf("The current time is : %02d:%02d:%02d\n", tm.hour, tm.min, tm.sec); |
PabloViana | 3:fb2b42e00333 | 174 | pc.printf("The current date is : %02d/%02d/%04d\n", tm.mon, tm.date, tm.year); |
PabloViana | 3:fb2b42e00333 | 175 | if (hour1==tm.hour && min1==tm.min && sec1 == tm.sec) |
PabloViana | 3:fb2b42e00333 | 176 | { |
PabloViana | 3:fb2b42e00333 | 177 | wakeup=1; |
PabloViana | 3:fb2b42e00333 | 178 | pc.printf("Wakeup bitch!..\n"); |
PabloViana | 3:fb2b42e00333 | 179 | led1.write(0.5); |
PabloViana | 3:fb2b42e00333 | 180 | led2.write(1.0); |
PabloViana | 3:fb2b42e00333 | 181 | } |
PabloViana | 3:fb2b42e00333 | 182 | } //if rtc |
PabloViana | 3:fb2b42e00333 | 183 | } //if counter |
PabloViana | 3:fb2b42e00333 | 184 | |
PabloViana | 3:fb2b42e00333 | 185 | |
PabloViana | 3:fb2b42e00333 | 186 | if (SW1.falling() && wakeup != 1) |
PabloViana | 3:fb2b42e00333 | 187 | { |
PabloViana | 3:fb2b42e00333 | 188 | led2.write(0.5); |
PabloViana | 3:fb2b42e00333 | 189 | howmanytimes++; |
PabloViana | 3:fb2b42e00333 | 190 | Encoder(); |
PabloViana | 3:fb2b42e00333 | 191 | led2.write(1.0); |
PabloViana | 3:fb2b42e00333 | 192 | } |
PabloViana | 3:fb2b42e00333 | 193 | |
PabloViana | 3:fb2b42e00333 | 194 | if (Stop.rising()&& wakeup==1) |
PabloViana | 3:fb2b42e00333 | 195 | { |
PabloViana | 3:fb2b42e00333 | 196 | pc.printf("Alarm Stopped ... \n"); |
PabloViana | 3:fb2b42e00333 | 197 | led1.write(1.0); |
PabloViana | 3:fb2b42e00333 | 198 | wakeup=0; |
PabloViana | 3:fb2b42e00333 | 199 | } |
PabloViana | 3:fb2b42e00333 | 200 | if (Snooze.rising() && wakeup==1)//In case of pushing snooze; |
PabloViana | 3:fb2b42e00333 | 201 | { |
PabloViana | 3:fb2b42e00333 | 202 | pc.printf("Two more minutes please!!!!\n"); |
PabloViana | 3:fb2b42e00333 | 203 | led1.write(1.0); |
PabloViana | 3:fb2b42e00333 | 204 | wakeup=0; |
PabloViana | 3:fb2b42e00333 | 205 | |
PabloViana | 3:fb2b42e00333 | 206 | if (tm.min==58){min1=0;hour1=hour1+1;} |
PabloViana | 3:fb2b42e00333 | 207 | else if (tm.min==59){min1=1;hour1=hour1+1;} |
PabloViana | 3:fb2b42e00333 | 208 | else { min1=tm.min+1;} //two more minutes please} |
PabloViana | 3:fb2b42e00333 | 209 | pc.printf("Alarm will sound again at: %02d:%02d:%02d\n", hour1, min1,sec1); |
PabloViana | 3:fb2b42e00333 | 210 | |
PabloViana | 3:fb2b42e00333 | 211 | } |
PabloViana | 3:fb2b42e00333 | 212 | }//while |
PabloViana | 3:fb2b42e00333 | 213 | |
PabloViana | 3:fb2b42e00333 | 214 | }//main |
PabloViana | 3:fb2b42e00333 | 215 | |
PabloViana | 3:fb2b42e00333 | 216 | |
PabloViana | 3:fb2b42e00333 | 217 | |
PabloViana | 3:fb2b42e00333 | 218 |