![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
This implements 25hr Clock in LCD1602_I2C mode with alarm setting capabilities
Dependencies: MBEDI2C_CLOCK_Timers
main.cpp@1:d00e1d87ce42, 2022-05-23 (annotated)
- 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?
User | Revision | Line number | New 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 | } |