This implements 25hr Clock in LCD1602_I2C mode with alarm setting capabilities

Dependencies:   MBEDI2C_CLOCK_Timers

Committer:
EDISON_NGUNJIRI
Date:
Mon May 23 12:11:00 2022 +0000
Revision:
1:d00e1d87ce42
Parent:
0:cca0f1245b6e
Version1.2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
EDISON_NGUNJIRI 0:cca0f1245b6e 1
EDISON_NGUNJIRI 0:cca0f1245b6e 2 #include "mbed.h"
EDISON_NGUNJIRI 0:cca0f1245b6e 3 #include <stdio.h>
EDISON_NGUNJIRI 0:cca0f1245b6e 4 #include <string.h>
EDISON_NGUNJIRI 0:cca0f1245b6e 5 #include <stdlib.h>
EDISON_NGUNJIRI 0:cca0f1245b6e 6 #include "platform/mbed_thread.h"
EDISON_NGUNJIRI 0:cca0f1245b6e 7 #include "LiquidCrystal_I2C.h"
EDISON_NGUNJIRI 0:cca0f1245b6e 8
EDISON_NGUNJIRI 0:cca0f1245b6e 9 typedef struct Clock_Typedef
EDISON_NGUNJIRI 0:cca0f1245b6e 10
EDISON_NGUNJIRI 0:cca0f1245b6e 11 {
EDISON_NGUNJIRI 0:cca0f1245b6e 12 int hour;
EDISON_NGUNJIRI 0:cca0f1245b6e 13 int Minutes;
EDISON_NGUNJIRI 0:cca0f1245b6e 14 int Second;
EDISON_NGUNJIRI 0:cca0f1245b6e 15 int Param_Select;
EDISON_NGUNJIRI 0:cca0f1245b6e 16 int Alarm_State;
EDISON_NGUNJIRI 0:cca0f1245b6e 17 char Alrm[3];
EDISON_NGUNJIRI 0:cca0f1245b6e 18 } Clock_Typedef;
EDISON_NGUNJIRI 0:cca0f1245b6e 19
EDISON_NGUNJIRI 0:cca0f1245b6e 20
EDISON_NGUNJIRI 0:cca0f1245b6e 21 typedef enum Clock_Set {
EDISON_NGUNJIRI 0:cca0f1245b6e 22 ClockTime=0,
EDISON_NGUNJIRI 0:cca0f1245b6e 23 ClockAlarm
EDISON_NGUNJIRI 0:cca0f1245b6e 24 } Clock_Set;
EDISON_NGUNJIRI 0:cca0f1245b6e 25
EDISON_NGUNJIRI 0:cca0f1245b6e 26
EDISON_NGUNJIRI 0:cca0f1245b6e 27 //structures to hold the Clock and alarm parameters
EDISON_NGUNJIRI 0:cca0f1245b6e 28 Clock_Typedef clock1= {0};
EDISON_NGUNJIRI 0:cca0f1245b6e 29 Clock_Typedef Alarm= {0};
EDISON_NGUNJIRI 0:cca0f1245b6e 30 int set_choice=0;
EDISON_NGUNJIRI 0:cca0f1245b6e 31 char Hold[17];
EDISON_NGUNJIRI 0:cca0f1245b6e 32 LiquidCrystal_I2C lcd(0x4E, 16, 2);
EDISON_NGUNJIRI 0:cca0f1245b6e 33 Ticker TIMER;
EDISON_NGUNJIRI 0:cca0f1245b6e 34 DigitalOut Buzzer(PA_5); //ALARM BUZZER connected to Pin PA_5
EDISON_NGUNJIRI 0:cca0f1245b6e 35 InterruptIn CLOCK_STATE(PC_13); //User-button PC13 is configured as interrupt to switch from time to alarm
EDISON_NGUNJIRI 0:cca0f1245b6e 36 InterruptIn T0_Set_Alarm(PA_6); //User-button PA6 is configured to set alarm by incrementinting alarm hourss,min or seconds according to setchoice in alarm stucture
EDISON_NGUNJIRI 0:cca0f1245b6e 37 InterruptIn Increment_Alarm_par(PA_7); //User-button PA7 is used to select which alarm parameter to setChoice of inrementinted variabale in Alarm, either Minutes or Hours
EDISON_NGUNJIRI 0:cca0f1245b6e 38 InterruptIn ALARM_ON_OFF(PB_12); //User-button PC7 is used to set alarm ON or OFF
EDISON_NGUNJIRI 0:cca0f1245b6e 39 InterruptIn To_SnoozeAlrm(PA_8); //User-button PA_8 is used snooze alarm for 5 minutes
EDISON_NGUNJIRI 0:cca0f1245b6e 40
EDISON_NGUNJIRI 0:cca0f1245b6e 41
EDISON_NGUNJIRI 0:cca0f1245b6e 42 void UPdat_Alarm_Time(Clock_Typedef *Choice)
EDISON_NGUNJIRI 0:cca0f1245b6e 43 {
EDISON_NGUNJIRI 0:cca0f1245b6e 44 if(set_choice==0) {
EDISON_NGUNJIRI 0:cca0f1245b6e 45 Choice->Minutes++;
EDISON_NGUNJIRI 0:cca0f1245b6e 46 if(Choice->Minutes>59) {
EDISON_NGUNJIRI 0:cca0f1245b6e 47 Choice->Minutes=0;
EDISON_NGUNJIRI 0:cca0f1245b6e 48 }
EDISON_NGUNJIRI 0:cca0f1245b6e 49 }
EDISON_NGUNJIRI 0:cca0f1245b6e 50 if(set_choice==1) {
EDISON_NGUNJIRI 0:cca0f1245b6e 51 Choice->hour++;
EDISON_NGUNJIRI 0:cca0f1245b6e 52 if(Choice->hour>23) {
EDISON_NGUNJIRI 0:cca0f1245b6e 53 Choice->hour=0;
EDISON_NGUNJIRI 0:cca0f1245b6e 54 }
EDISON_NGUNJIRI 0:cca0f1245b6e 55 }
EDISON_NGUNJIRI 0:cca0f1245b6e 56 }
EDISON_NGUNJIRI 0:cca0f1245b6e 57 void Time_increment(Clock_Typedef *Clock_Param)
EDISON_NGUNJIRI 0:cca0f1245b6e 58 {
EDISON_NGUNJIRI 0:cca0f1245b6e 59 Clock_Param->Second++;
EDISON_NGUNJIRI 0:cca0f1245b6e 60 if(Clock_Param->Second>59)
EDISON_NGUNJIRI 0:cca0f1245b6e 61 {
EDISON_NGUNJIRI 0:cca0f1245b6e 62 Clock_Param->Second=0;
EDISON_NGUNJIRI 0:cca0f1245b6e 63 Clock_Param->Minutes++;
EDISON_NGUNJIRI 0:cca0f1245b6e 64 }
EDISON_NGUNJIRI 0:cca0f1245b6e 65 if(Clock_Param->Minutes>59) {
EDISON_NGUNJIRI 0:cca0f1245b6e 66 Clock_Param->Minutes=0;
EDISON_NGUNJIRI 0:cca0f1245b6e 67 Clock_Param->hour++;
EDISON_NGUNJIRI 0:cca0f1245b6e 68 }
EDISON_NGUNJIRI 0:cca0f1245b6e 69 if(Clock_Param->hour>23) {
EDISON_NGUNJIRI 0:cca0f1245b6e 70 Clock_Param->hour++;
EDISON_NGUNJIRI 0:cca0f1245b6e 71 }
EDISON_NGUNJIRI 0:cca0f1245b6e 72 }
EDISON_NGUNJIRI 0:cca0f1245b6e 73
EDISON_NGUNJIRI 0:cca0f1245b6e 74 void Set_Alarm_Time()
EDISON_NGUNJIRI 0:cca0f1245b6e 75 {
EDISON_NGUNJIRI 0:cca0f1245b6e 76 if(clock1.Param_Select==0) {
EDISON_NGUNJIRI 0:cca0f1245b6e 77 UPdat_Alarm_Time(&clock1);
EDISON_NGUNJIRI 0:cca0f1245b6e 78 } else {
EDISON_NGUNJIRI 0:cca0f1245b6e 79 UPdat_Alarm_Time(&Alarm);
EDISON_NGUNJIRI 0:cca0f1245b6e 80 }
EDISON_NGUNJIRI 0:cca0f1245b6e 81 }
EDISON_NGUNJIRI 0:cca0f1245b6e 82 void Set_Alarm_ON_OFF()
EDISON_NGUNJIRI 0:cca0f1245b6e 83 {
EDISON_NGUNJIRI 0:cca0f1245b6e 84 Buzzer=0;
EDISON_NGUNJIRI 0:cca0f1245b6e 85 if(++clock1.Alarm_State>1) {
EDISON_NGUNJIRI 0:cca0f1245b6e 86 clock1.Alarm_State=0;
EDISON_NGUNJIRI 0:cca0f1245b6e 87 }
EDISON_NGUNJIRI 0:cca0f1245b6e 88 if( clock1.Alarm_State==0)
EDISON_NGUNJIRI 0:cca0f1245b6e 89 {
EDISON_NGUNJIRI 0:cca0f1245b6e 90 sprintf(clock1.Alrm,"%s","OFF");
EDISON_NGUNJIRI 0:cca0f1245b6e 91 }
EDISON_NGUNJIRI 0:cca0f1245b6e 92 if(clock1.Alarm_State==1)
EDISON_NGUNJIRI 0:cca0f1245b6e 93 {
EDISON_NGUNJIRI 0:cca0f1245b6e 94 sprintf(clock1.Alrm,"%s","ON");
EDISON_NGUNJIRI 0:cca0f1245b6e 95 }
EDISON_NGUNJIRI 0:cca0f1245b6e 96 }
EDISON_NGUNJIRI 0:cca0f1245b6e 97
EDISON_NGUNJIRI 0:cca0f1245b6e 98
EDISON_NGUNJIRI 0:cca0f1245b6e 99 void Time_move()
EDISON_NGUNJIRI 0:cca0f1245b6e 100 {
EDISON_NGUNJIRI 0:cca0f1245b6e 101 Time_increment(&clock1);
EDISON_NGUNJIRI 0:cca0f1245b6e 102 }
EDISON_NGUNJIRI 0:cca0f1245b6e 103 void increment(void)
EDISON_NGUNJIRI 0:cca0f1245b6e 104 {
EDISON_NGUNJIRI 0:cca0f1245b6e 105 if(++set_choice>1) {
EDISON_NGUNJIRI 0:cca0f1245b6e 106 set_choice=0;
EDISON_NGUNJIRI 0:cca0f1245b6e 107 }
EDISON_NGUNJIRI 0:cca0f1245b6e 108 }
EDISON_NGUNJIRI 0:cca0f1245b6e 109 void Set_CLOCK_STATE(void)
EDISON_NGUNJIRI 0:cca0f1245b6e 110 {
EDISON_NGUNJIRI 0:cca0f1245b6e 111 if(clock1.Param_Select==0) {
EDISON_NGUNJIRI 0:cca0f1245b6e 112 clock1.Param_Select=1;
EDISON_NGUNJIRI 0:cca0f1245b6e 113 } else {
EDISON_NGUNJIRI 0:cca0f1245b6e 114 clock1.Param_Select=0;
EDISON_NGUNJIRI 0:cca0f1245b6e 115 }
EDISON_NGUNJIRI 0:cca0f1245b6e 116 }
EDISON_NGUNJIRI 0:cca0f1245b6e 117 void Snooze()
EDISON_NGUNJIRI 0:cca0f1245b6e 118 {
EDISON_NGUNJIRI 0:cca0f1245b6e 119 if(clock1.Alarm_State==1)
EDISON_NGUNJIRI 0:cca0f1245b6e 120 {
EDISON_NGUNJIRI 0:cca0f1245b6e 121 Buzzer=0;
EDISON_NGUNJIRI 0:cca0f1245b6e 122 int compu=Alarm.Minutes+5;
EDISON_NGUNJIRI 0:cca0f1245b6e 123 if(compu>59)
EDISON_NGUNJIRI 0:cca0f1245b6e 124 {
EDISON_NGUNJIRI 0:cca0f1245b6e 125 Alarm.Minutes=compu-60;
EDISON_NGUNJIRI 0:cca0f1245b6e 126 Alarm.hour++;
EDISON_NGUNJIRI 0:cca0f1245b6e 127 if(Alarm.hour>23)
EDISON_NGUNJIRI 0:cca0f1245b6e 128 {
EDISON_NGUNJIRI 0:cca0f1245b6e 129 Alarm.hour=0;
EDISON_NGUNJIRI 0:cca0f1245b6e 130 }
EDISON_NGUNJIRI 0:cca0f1245b6e 131 }
EDISON_NGUNJIRI 0:cca0f1245b6e 132 else
EDISON_NGUNJIRI 0:cca0f1245b6e 133 {
EDISON_NGUNJIRI 0:cca0f1245b6e 134 Alarm.Minutes=compu;
EDISON_NGUNJIRI 0:cca0f1245b6e 135 }
EDISON_NGUNJIRI 0:cca0f1245b6e 136 Alarm.Alarm_State=1;
EDISON_NGUNJIRI 0:cca0f1245b6e 137 }
EDISON_NGUNJIRI 0:cca0f1245b6e 138 }
EDISON_NGUNJIRI 0:cca0f1245b6e 139
EDISON_NGUNJIRI 0:cca0f1245b6e 140 int IsAlarmOn(void)
EDISON_NGUNJIRI 0:cca0f1245b6e 141 {
EDISON_NGUNJIRI 0:cca0f1245b6e 142 if(clock1.Alarm_State==1)
EDISON_NGUNJIRI 0:cca0f1245b6e 143 {
EDISON_NGUNJIRI 0:cca0f1245b6e 144 if(Alarm.Minutes==clock1.Minutes && Alarm.hour==clock1.hour) {
EDISON_NGUNJIRI 0:cca0f1245b6e 145 return 1;
EDISON_NGUNJIRI 0:cca0f1245b6e 146
EDISON_NGUNJIRI 0:cca0f1245b6e 147 }
EDISON_NGUNJIRI 0:cca0f1245b6e 148 }
EDISON_NGUNJIRI 0:cca0f1245b6e 149 return 0;
EDISON_NGUNJIRI 0:cca0f1245b6e 150 }
EDISON_NGUNJIRI 0:cca0f1245b6e 151
EDISON_NGUNJIRI 0:cca0f1245b6e 152 int main()
EDISON_NGUNJIRI 0:cca0f1245b6e 153 {
EDISON_NGUNJIRI 0:cca0f1245b6e 154 TIMER.attach(&Time_move, 1s);
EDISON_NGUNJIRI 0:cca0f1245b6e 155 CLOCK_STATE.mode(PullUp);
EDISON_NGUNJIRI 0:cca0f1245b6e 156 T0_Set_Alarm.mode(PullUp);
EDISON_NGUNJIRI 0:cca0f1245b6e 157 Increment_Alarm_par.mode(PullUp);
EDISON_NGUNJIRI 0:cca0f1245b6e 158 ALARM_ON_OFF.mode(PullUp);
EDISON_NGUNJIRI 0:cca0f1245b6e 159 To_SnoozeAlrm.mode(PullUp);
EDISON_NGUNJIRI 0:cca0f1245b6e 160 CLOCK_STATE.fall(&Set_CLOCK_STATE);
EDISON_NGUNJIRI 0:cca0f1245b6e 161 T0_Set_Alarm.fall(&Set_Alarm_Time);
EDISON_NGUNJIRI 0:cca0f1245b6e 162 Increment_Alarm_par.fall(&increment);
EDISON_NGUNJIRI 0:cca0f1245b6e 163 ALARM_ON_OFF.fall(&Set_Alarm_ON_OFF);
EDISON_NGUNJIRI 0:cca0f1245b6e 164 To_SnoozeAlrm.fall(&Snooze);
EDISON_NGUNJIRI 0:cca0f1245b6e 165 sprintf(clock1.Alrm,"%s","OFF");
EDISON_NGUNJIRI 0:cca0f1245b6e 166 while (1) {
EDISON_NGUNJIRI 0:cca0f1245b6e 167 switch(clock1.Param_Select) {
EDISON_NGUNJIRI 0:cca0f1245b6e 168 case 0:
EDISON_NGUNJIRI 0:cca0f1245b6e 169 lcd.clear();
EDISON_NGUNJIRI 0:cca0f1245b6e 170 lcd.setCursor(0,0);
EDISON_NGUNJIRI 1:d00e1d87ce42 171 sprintf(Hold,"TIME : %d%d:%d%d",clock1.hour/10,clock1.hour%10,clock1.Minutes/10,clock1.Minutes%10);
EDISON_NGUNJIRI 0:cca0f1245b6e 172 lcd.print(Hold);
EDISON_NGUNJIRI 0:cca0f1245b6e 173 if(IsAlarmOn()==1)
EDISON_NGUNJIRI 0:cca0f1245b6e 174 {
EDISON_NGUNJIRI 0:cca0f1245b6e 175 Buzzer=1;
EDISON_NGUNJIRI 0:cca0f1245b6e 176 }
EDISON_NGUNJIRI 0:cca0f1245b6e 177 break;
EDISON_NGUNJIRI 0:cca0f1245b6e 178 case 1:
EDISON_NGUNJIRI 0:cca0f1245b6e 179 lcd.clear();
EDISON_NGUNJIRI 0:cca0f1245b6e 180 lcd.setCursor(0,0);
EDISON_NGUNJIRI 0:cca0f1245b6e 181 sprintf(Hold,"ALARM: %d%d:%d%d",Alarm.hour/10,Alarm.hour%10,Alarm.Minutes/10, Alarm.Minutes%10);
EDISON_NGUNJIRI 0:cca0f1245b6e 182 lcd.print(Hold);
EDISON_NGUNJIRI 0:cca0f1245b6e 183 lcd.setCursor(0,1);
EDISON_NGUNJIRI 0:cca0f1245b6e 184 sprintf(Hold,"ALARM:%s",clock1.Alrm);
EDISON_NGUNJIRI 0:cca0f1245b6e 185 lcd.print(Hold);
EDISON_NGUNJIRI 0:cca0f1245b6e 186 IsAlarmOn();
EDISON_NGUNJIRI 0:cca0f1245b6e 187 break;
EDISON_NGUNJIRI 0:cca0f1245b6e 188 }
EDISON_NGUNJIRI 0:cca0f1245b6e 189 wait_us(100000);
EDISON_NGUNJIRI 0:cca0f1245b6e 190
EDISON_NGUNJIRI 0:cca0f1245b6e 191 }
EDISON_NGUNJIRI 0:cca0f1245b6e 192 }