reloj de tiempo real con alarma aplazable
Dependencies: Debounced RTC-DS1307 TextLCD mbed
Fork of Rtc_Ds1307_Sample by
Diff: main.cpp
- Revision:
- 3:cc43cc1af11a
- Parent:
- 2:3be003301107
- Child:
- 4:242b6afb651e
--- a/main.cpp Wed Jun 26 21:07:13 2013 +0000 +++ b/main.cpp Fri May 02 18:19:57 2014 +0000 @@ -1,87 +1,616 @@ #include "mbed.h" #include "Rtc_Ds1307.h" +#include "TextLCD.h" +#include "DebouncedIn.h" -//RtcCls rtc(p28, p27, p29, true); -Rtc_Ds1307 rtc(p28, p27); - +Rtc_Ds1307 rtc(PTE0, PTE1); +TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); Serial pc(USBTX, USBRX, "pc"); +DebouncedIn button1(PTC12); //Incremental +DebouncedIn button2(PTC13); //Decremental +DebouncedIn button3(PTC16); //Cambiador de variable +DebouncedIn button4(PTC17); //Configurador de modo +PwmOut pw(PTA12); //se define la salida del pwm para hacer sonar la bocina -char buffer[128]; -int readptr = 0; - -int main() { - char c; +//esta parte es para definir la frecuencia a la que suenan los botones +float Tdo=1/2093.005; +float Pdo=Tdo/2; +float Tre=1/2637.02; +float Pre=Tre/2; +float Tmi=1/3135.963; +float Pmi=Tmi/2; +float Tfa=1/4186.009; +float Pfa=Tfa/2; +//********************************** +int C1=0x0F; // comando para el lcd +//************************************* +int modo=0; //modo es para el boton 4. Indica: 0-mostrar datos, 1-configurar datos, 2-config alarma +int p=0; //p es el valor del boton 3 para la ubicación del modificador de variables 0-no aparece, 1-h, 2-m, 3-s, 4-D, 5-M, 6-Y. +//*************************************** +//Definicion de variables para la configuración de alarma +int houral=0,minal=0,secal=0,dateal=1,monal=1,yearal=2014; +Timer t; // se define la variable t, contabilizadora del tiempo desde el inicio de la alarma +//************************************* +int main(){ + //Definiciones del ds1307 Rtc_Ds1307::Time_rtc tm = {}; - - while(1) { - pc.printf("*************************************\n"); - pc.printf("* Menu for RTC Test : *\n"); - pc.printf("* read - reads the clock *\n"); - pc.printf("* start - start the clock *\n"); - pc.printf("* stop - stop the clock *\n"); - pc.printf("* write - write the clock *\n"); - pc.printf("* ena - enable Square wave output *\n"); - pc.printf("* dis - disable square wave outp. *\n"); - pc.printf("*************************************\n"); - - while( (c = pc.getc()) != '\n') { - buffer[readptr++] = c; - } - buffer[readptr++] = 0; - if (strncmp(buffer, "read", 4) == 0) { - // perform read - pc.printf("Performing read operation\n"); - if (rtc.getTime(tm) ) { - pc.printf("The current time is : %02d:%02d:%02d\n", tm.hour, tm.min, tm.sec); - pc.printf("The current date is : %s, %02d/%02d/%04d\n", rtc.weekdayToString(tm.wday), tm.mon, tm.date, tm.year); + rtc.startClock(); + //Comandos para la LCD + lcd.cls(); //borrar pantalla + lcd.writeCommand(C1); +//************************************** + while(1) { //Comienza el ciclo principal + //PARTE PARA EL MODO 0: MUESTRA DE HORA Y FECHA + if (modo==0) { + while(modo==0) { + rtc.getTime(tm); + lcd.locate(0,0); //las coordenadas van del 0 al 15 en la primera entrada, y de 0 a 1 en la segunda casilla + lcd.printf("Hora:%02d:%02d:%02d",tm.hour, tm.min, tm.sec); //%02d indica que la variable tiene maximo dos (2) digitos y si en algun caso solo tiene 1 digito, + lcd.locate(0,1); // el otro espacio que queda vacio debe llenarse con un cero (0) + lcd.printf("Fech:%02d/%02d/%04d", tm.date, tm.mon, tm.year); + //Verificación de hora alarma + if (tm.hour==houral && tm.min==minal && tm.sec==secal && tm.date==dateal && tm.mon==monal && tm.year==yearal) { + while(button1.falling() != 1) { + pw.period(Tdo); // aqui se indica la frecuencia para el sonido al pulsar el boton 1 + pw.pulsewidth(Pdo); + wait(0.5); + pw=0; + pw.period(Tre); // aqui se indica la frecuencia para el sonido al pulsar el boton 1 + pw.pulsewidth(Pre); + wait(0.5); + pw=0; + pw.period(Tmi); // aqui se indica la frecuencia para el sonido al pulsar el boton 1 + pw.pulsewidth(Pmi); + wait(0.5); + pw=0; + pw.period(Tfa); // aqui se indica la frecuencia para el sonido al pulsar el boton 1 + pw.pulsewidth(Pfa); + wait(0.5); + pw=0; + } + t.start();//comienza a contar el tiempo despues de apagar la alarma, para reiniciarla a los 30 seg + if(t>=30){ + t.stop(); + while(button1.falling() != 1) { + pw.period(Tdo); // aqui se indica la frecuencia para el sonido al pulsar el boton 1 + pw.pulsewidth(Pdo); + wait(0.5); + pw=0; + pw.period(Tre); // aqui se indica la frecuencia para el sonido al pulsar el boton 1 + pw.pulsewidth(Pre); + wait(0.5); + pw=0; + pw.period(Tmi); // aqui se indica la frecuencia para el sonido al pulsar el boton 1 + pw.pulsewidth(Pmi); + wait(0.5); + pw=0; + pw.period(Tfa); // aqui se indica la frecuencia para el sonido al pulsar el boton 1 + pw.pulsewidth(Pfa); + wait(0.5); + pw=0; + } + } + } + + if (button4.falling()) { + pw.period(Tfa); // aqui se indica la frecuencia para el sonido al pulsar el boton 1 + pw.pulsewidth(Pfa); + wait(0.1); + pw=0; + ++modo; + lcd.locate(0,0); + lcd.printf("Conf"); + } } - - } - else if (strncmp(buffer, "write", 5) == 0) { - // perform write - pc.printf("Enter the date (date 0..31)"); - pc.scanf("%d", &tm.date); - pc.printf("Enter the date (month 1..12)"); - pc.scanf("%d", &tm.mon); - pc.printf("Enter the date (year)"); - pc.scanf("%d", &tm.year); - pc.printf("Enter the time (hours 0..23)"); - pc.scanf("%d", &tm.hour); - pc.printf("Enter the time (minutes 0..59)"); - pc.scanf("%d", &tm.min); - pc.printf("Enter the time (seconds 0..59)"); - pc.scanf("%d", &tm.sec); - pc.printf("Performing write operation\n"); - - while(pc.readable()) - pc.getc(); - rtc.setTime(tm, false, false); - } - else if (strncmp(buffer, "start", 5) == 0) { - // start - pc.printf("Performing start operation\n"); - rtc.startClock(); - } - else if (strncmp(buffer, "stop", 4) == 0) { - // stop - pc.printf("Performing stop operation\n"); - rtc.stopClock(); - } - else if (strncmp(buffer, "ena", 3) == 0) { - int rs; - pc.printf("Please specify the frequency : [0 = 1Hz, 1 = 4.096kHz, 2 = 8.192kHz, 3 = 32.768kHz] "); - scanf("%d", &rs); - pc.printf("Enabling the output with %d option\n", rs); - rtc.setSquareWaveOutput(true, (Rtc_Ds1307::SqwRateSelect_t)rs); - } - else if (strncmp(buffer, "dis", 3) == 0) { - pc.printf("Disableing square wave output\n"); - rtc.setSquareWaveOutput(false, Rtc_Ds1307::RS1Hz); - } - else { - pc.printf("syntax error\n"); - } - readptr = 0; - pc.printf("\n\n\n"); - } + }//fIN DEL MODO CERO + if (modo==1) { + rtc.getTime(tm); + while(modo==1){ + if (button4.falling()) { //CAMBIADOR DE MODO + pw.period(Tfa); // aqui se indica la frecuencia para el sonido al pulsar el boton 1 + pw.pulsewidth(Pfa); + wait(0.1); + pw=0; + ++modo; + lcd.locate(0,0); //las coordenadas van del 0 al 15 en la primera entrada, y de 0 a 1 en la segunda casilla + lcd.printf("Alrm:%02d:%02d:%02d",houral, minal, secal); //%02d indica que la variable tiene maximo dos (2) digitos y si en algun caso solo tiene 1 digito, + lcd.locate(0,1); // el otro espacio que queda vacio debe llenarse con un cero (0) + lcd.printf("Fech:%02d/%02d/%04d", dateal, monal, yearal); + } + if (button1.falling()) { //INCREMENTAL + if (p==0) {pw=0;} //Condicion: incremental no suena si no estoy ubicado en una variable + else{ + pw.period(Tdo); // aqui se indica la frecuencia para el sonido al pulsar el boton 1 + pw.pulsewidth(Pdo); + wait(0.1); + pw=0; + } + if (p==1) { //posicion de variable hora + if (tm.hour==23) { + tm.hour=0; + lcd.locate(5,0); + lcd.printf(" "); + lcd.locate(5,0); + lcd.printf("%02d", tm.hour); + } else { + ++tm.hour; + lcd.locate(5,0); + lcd.printf(" "); + lcd.locate(5,0); + lcd.printf("%02d", tm.hour); + } + } + else if (p==2) { //p=2: posicion de variable minutos + if (tm.min==59) { + tm.min=0; + lcd.locate(8,0); + lcd.printf(" "); + lcd.locate(8,0); + lcd.printf("%02d", tm.min); + } + else { + ++tm.min; + lcd.locate(8,0); + lcd.printf(" "); + lcd.locate(8,0); + lcd.printf("%02d", tm.min); + } + } + else if (p==3) {//p=3: posicion de variable segundos + if (tm.sec==59) { + tm.sec=0; + lcd.locate(11,0); + lcd.printf(" "); + lcd.locate(11,0); + lcd.printf("%02d", tm.sec); + } + else { + ++tm.sec; + lcd.locate(11,0); + lcd.printf(" "); + lcd.locate(11,0); + lcd.printf("%02d", tm.sec); + } + } + else if (p==4) {//p=4: posicion de variable dia del mes + if (tm.date==31) { + tm.date=1; + lcd.locate(5,1); + lcd.printf(" "); + lcd.locate(5,1); + lcd.printf("%02d", tm.date); + } + else { + ++tm.date; + lcd.locate(5,1); + lcd.printf(" "); + lcd.locate(5,1); + lcd.printf("%02d", tm.date); + } + } + else if (p==5) {//p=5: posicion de variable mes + if (tm.mon==12) { + tm.mon=1; + lcd.locate(8,1); + lcd.printf(" "); + lcd.locate(8,1); + lcd.printf("%02d", tm.mon); + } + else { + ++tm.mon; + lcd.locate(8,1); + lcd.printf(" "); + lcd.locate(8,1); + lcd.printf("%02d", tm.mon); + } + } + else if (p==6) { //p=6: posicion de variable años + ++tm.year; + lcd.locate(11,1); + lcd.printf(" "); + lcd.locate(11,1); + lcd.printf("%04d", tm.year); + } + } + if (button2.falling()) { //boton decremental + if (p==0) {pw=0;} + else{ + pw.period(Tre); + pw.pulsewidth(Pre); + wait(0.1); + pw=0; + } + if (p==1) { + if (tm.hour==0) { + tm.hour=24; + lcd.locate(5,0); + lcd.printf(" "); + lcd.locate(5,0); + lcd.printf("%02d", tm.hour); + } + else { + --tm.hour; + lcd.locate(5,0); + lcd.printf(" "); + lcd.locate(5,0); + lcd.printf("%02d", tm.hour); + } + } + else if (p==2) { + if (tm.min==0) { // no mostrar nada + tm.min=59; + lcd.locate(8,0); + lcd.printf(" "); + lcd.locate(8,0); + lcd.printf("%02d", tm.min); + } + else { + --tm.min; + lcd.locate(8,0); + lcd.printf(" "); + lcd.locate(8,0); + lcd.printf("%02d", tm.min); + } + } + else if (p==3) { + if (tm.sec==0) { // no mostrar nada + tm.sec=59; + lcd.locate(11,0); + lcd.printf(" "); + lcd.locate(11,0); + lcd.printf("%02d", tm.sec); + } + else { + --tm.sec; + lcd.locate(11,0); + lcd.printf(" "); + lcd.locate(11,0); + lcd.printf("%02d", tm.sec); + } + } + else if (p==4) { + if (tm.date==1) { // no mostrar nada + tm.date=31; + lcd.locate(5,1); + lcd.printf(" "); + lcd.locate(5,1); + lcd.printf("%02d", tm.date); + } + else { + --tm.date; + lcd.locate(5,1); + lcd.printf(" "); + lcd.locate(5,1); + lcd.printf("%02d", tm.date); + } + } + else if (p==5) { + if (tm.mon==1) { + tm.mon=12; + lcd.locate(8,1); + lcd.printf(" "); + lcd.locate(8,1); + lcd.printf("%02d", tm.mon); + } + else { + --tm.mon; + lcd.locate(8,1); + lcd.printf(" "); + lcd.locate(8,1); + lcd.printf("%02d", tm.mon); + } + } + else if (p==6) { + if (tm.year==2000) { + lcd.locate(11,1); + lcd.printf(" "); + lcd.locate(11,1); + lcd.printf("%04d", tm.year); + } + else { + --tm.year; + lcd.locate(11,1); + lcd.printf(" "); + lcd.locate(11,1); + lcd.printf("%04d", tm.year); + } + } + } + if (button3.falling()) { //boton 3: cambiador de variable + pw.period(Tmi); + pw.pulsewidth(Pmi); + wait(0.1); + pw=0; + + if (p==0) { //p=0: no esta parado en ninguna variable + ++p; + lcd.locate(5,0); + lcd.printf(" "); + lcd.locate(5,0); + lcd.printf("%02d", tm.hour); + } else if (p==1) { //p=1: ubicacion de variable hora + ++p; + lcd.locate(8,0); + lcd.printf(" "); + lcd.locate(8,0); + lcd.printf("%02d", tm.min); + } else if (p==2) { + ++p; + lcd.locate(11,0); + lcd.printf(" "); + lcd.locate(11,0); + lcd.printf("%02d", tm.sec); + } else if (p==3) { + ++p; + lcd.locate(5,1); + lcd.printf(" "); + lcd.locate(5,1); + lcd.printf("%02d", tm.date); + } else if (p==4) { + ++p; + lcd.locate(8,1); + lcd.printf(" "); + lcd.locate(8,1); + lcd.printf("%02d", tm.mon); + } else if (p==5) { + ++p; + lcd.locate(11,1); + lcd.printf(" "); + lcd.locate(11,1); + lcd.printf("%04d", tm.year); + } else if (p==6) { + p=0; + rtc.setTime(tm, true, false);//SOLO SI CONFIGURO TODAS LAS VARIOABLES Y RETORNO A P=0, LA HORA SE CONFIGURA + } + } + } + } + //MODO 2: PROGRAMACION DE LA ALARMA + if (modo==2) { + rtc.getTime(tm); + while(modo==2){ + if (button1.falling()) { + if (p==0) {pw=0;} + else{ + pw.period(Tdo); // aqui se indica la frecuencia para el sonido al pulsar el boton 1 + pw.pulsewidth(Pdo); + wait(0.1); + pw=0; + } + if (p==0) { + } else if (p==1) { + if (houral==23) { + houral=0; + lcd.locate(5,0); + lcd.printf(" "); + lcd.locate(5,0); + lcd.printf("%02d", houral); + } else { + ++houral; + lcd.locate(5,0); + lcd.printf(" "); + lcd.locate(5,0); + lcd.printf("%02d", houral); + } + } else if (p==2) { + if (minal==59) { + minal=0; + lcd.locate(8,0); + lcd.printf(" "); + lcd.locate(8,0); + lcd.printf("%02d", minal); + } else { + ++minal; + lcd.locate(8,0); + lcd.printf(" "); + lcd.locate(8,0); + lcd.printf("%02d", minal); + } + } else if (p==3) { + if (secal==59) { + secal=0; + lcd.locate(11,0); + lcd.printf(" "); + lcd.locate(11,0); + lcd.printf("%02d", secal); + } else { + ++secal; + lcd.locate(11,0); + lcd.printf(" "); + lcd.locate(11,0); + lcd.printf("%02d", secal); + } + } else if (p==4) { + if (dateal==31) { + dateal=1; + lcd.locate(5,1); + lcd.printf(" "); + lcd.locate(5,1); + lcd.printf("%02d", dateal); + } else { + ++dateal; + lcd.locate(5,1); + lcd.printf(" "); + lcd.locate(5,1); + lcd.printf("%02d", dateal); + } + } else if (p==5) { + if (monal==12) { + monal=1; + lcd.locate(8,1); + lcd.printf(" "); + lcd.locate(8,1); + lcd.printf("%02d", monal); + } else { + ++monal; + lcd.locate(8,1); + lcd.printf(" "); + lcd.locate(8,1); + lcd.printf("%02d", monal); + } + } else if (p==6) { + ++yearal; + lcd.locate(11,1); + lcd.printf(" "); + lcd.locate(11,1); + lcd.printf("%04d", yearal); + } + } + if (button2.falling()) { + if (p==0) {pw=0;} + else{ + pw.period(Tre); + pw.pulsewidth(Pre); + wait(0.1); + pw=0; + } + if (p==1) { + if (houral==0) { // no mostrar nada + houral=24; + lcd.locate(5,0); + lcd.printf(" "); + lcd.locate(5,0); + lcd.printf("%02d", houral); + } else { + --houral; + lcd.locate(5,0); + lcd.printf(" "); + lcd.locate(5,0); + lcd.printf("%02d", houral); + } + } + if (p==2) { + if (minal==0) { // no mostrar nada + minal=59; + lcd.locate(8,0); + lcd.printf(" "); + lcd.locate(8,0); + lcd.printf("%02d", minal); + } else { + --minal; + lcd.locate(8,0); + lcd.printf(" "); + lcd.locate(8,0); + lcd.printf("%02d", minal); + } + } + if (p==3) { + if (secal==0) { // no mostrar nada + secal=59; + lcd.locate(11,0); + lcd.printf(" "); + lcd.locate(11,0); + lcd.printf("%02d", secal); + } else { + --secal; + lcd.locate(11,0); + lcd.printf(" "); + lcd.locate(11,0); + lcd.printf("%02d", secal); + } + } + if (p==4) { + if (dateal==1) { // no mostrar nada + dateal=31; + lcd.locate(5,1); + lcd.printf(" "); + lcd.locate(5,1); + lcd.printf("%02d", dateal); + } else { + --dateal; + lcd.locate(5,1); + lcd.printf(" "); + lcd.locate(5,1); + lcd.printf("%02d", dateal); + } + } + if (p==5) { + if (monal==1) { + monal=12; + lcd.locate(8,1); + lcd.printf(" "); + lcd.locate(8,1); + lcd.printf("%02d", monal); + } else { + --monal; + lcd.locate(8,1); + lcd.printf(" "); + lcd.locate(8,1); + lcd.printf("%02d", monal); + } + } + if (p==6) { + if (yearal==2000) { + lcd.locate(11,1); + lcd.printf(" "); + lcd.locate(11,1); + lcd.printf("%04d", yearal); + } else { + --yearal; + lcd.locate(11,1); + lcd.printf(" "); + lcd.locate(11,1); + lcd.printf("%04d", yearal); + } + } + } + if (button3.falling()) {//BOTON 3: CAMBIADOR DE VARIABLE (POSICION EN LA LCD) + pw.period(Tmi); + pw.pulsewidth(Pmi); + wait(0.1); + pw=0; + + if (p==0) { + ++p; + lcd.locate(5,0); + lcd.printf(" "); + lcd.locate(5,0); + lcd.printf("%02d", houral); + } else if (p==1) { + ++p; + lcd.locate(8,0); + lcd.printf(" "); + lcd.locate(8,0); + lcd.printf("%02d", minal); + } else if (p==2) { + ++p; + lcd.locate(11,0); + lcd.printf(" "); + lcd.locate(11,0); + lcd.printf("%02d", secal); + } else if (p==3) { + ++p; + lcd.locate(5,1); + lcd.printf(" "); + lcd.locate(5,1); + lcd.printf("%02d", dateal); + } else if (p==4) { + ++p; + lcd.locate(8,1); + lcd.printf(" "); + lcd.locate(8,1); + lcd.printf("%02d", monal); + } else if (p==5) { + ++p; + lcd.locate(11,1); + lcd.printf(" "); + lcd.locate(11,1); + lcd.printf("%04d", yearal); + } else if (p==6) { + p=0; + } + } + if (button4.falling()) { //BOTON 4: CAMBIADOR DE MODO + pw.period(Tfa); // aqui se indica la frecuencia para el sonido al pulsar el boton 1 + pw.pulsewidth(Pfa); + wait(0.1); + pw=0; + modo=0; + lcd.locate(0,0); + lcd.printf("Hora"); + } + } + } + } + }