Our clock project

Dependencies:   SPI_TFT_ILI9341 TFT_fonts Adafruit_RTCLib RTC-DS1307 TSI

IoT Clock

We have been given a task to design a clock with internet features, the 'Internet Clock'. First of all, we identified what features we want:

Display: Split into 4 parts:

  • Analogue clock - the good ol' fashioned circle display, complete with minute, hour and second hands.
  • Digital clock - equipped with date for the modern human.
  • Weather display - for those who cannot be bothered to look out of the window.
  • Alarm - just what you need when you have to get up or be somewhere.

Wifi module:

  • For collecting data for weather, alarm times and so it can be an 'Internet Clock'.

Speaker:

  • To make the annoying sound to let you know your alarm is going off.

Range finder:

  • To wave your hand in front of to turn the alarm off, because pressing a button is too last centurary.

The roles:

  • Soroush's first task was to get the LCD screen to work. Meanwhile Adam sorted out the speaker system.
  • When these were done, Adam worked on the screen to display a clock face and date/year. Soroush then connected the wifi module to extract data for weather, location and date. /media/uploads/amilner1/img_0285.jpg Connecting the wifi module.
  • The next part was to get the range-finder hooked up and responding to a hand passing, and switch the alarm off.
  • Finally, it was time for assembly.

Difficulties: There were many issues faced throughout the project. First of all, Adam's coding knowledge was a lot less than Soroush's which slowed down some completion of tasks. Although, this did help us sort out the roles. Next was the wifi connectivity which caused several problems during the project, and we couldn't get the connection or fetch data, which further slowed the process. Another difficulty was finding the range-finder's set-up page for mbed. However, when we got past these set backs we managed to put everything together quickly, /media/uploads/amilner1/img_0294.jpg All the hardware wired in.

Outcome:

  • Our LCD screen has 2 displays:
  1. 1 An analogue clock filling the screen.

/media/uploads/amilner1/img_0304.jpg

  1. 2 An analogue clock, date and year, weather and location, and alarm time.

/media/uploads/amilner1/img_0305.jpg

This is changed by holding (not passing quickly) your hand in front of the range-finder.

  • An RTC to keep track of the time rather than collecting the information from then internet. However, we have had a lot of problems setting this up, and it doesn't seem to respond.
  • Wifi is also not connected, so we have the default date, time, weather and location.
  • You are able to change the alarm time by swiping the touch pad on the back.

Perhaps given more time we'd be able to fix these problems. But a key point is that we have got all the other features working, except the correct time. /media/uploads/amilner1/img_0303.jpg

Committer:
sfaghihi
Date:
Fri May 26 12:01:06 2017 +0000
Revision:
22:68869504b1ee
Parent:
21:fe1769d5a01c
something (not Nothing)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sfaghihi 7:5269fbadd5d7 1 #include "utility.h"
sfaghihi 2:56a27b66d03a 2 #include "Display.h"
sfaghihi 17:7ba6c8e4945b 3 #include "Wifi.h"
sfaghihi 19:450dbcda696e 4 #include "TSISensor.h"
sfaghihi 19:450dbcda696e 5 #include "DS1307.h"
sfaghihi 0:07e2cda84b51 6
sfaghihi 21:fe1769d5a01c 7
sfaghihi 21:fe1769d5a01c 8
sfaghihi 7:5269fbadd5d7 9 // Hardware abstractions
sfaghihi 19:450dbcda696e 10 RawSerial pc_io(USBTX, USBRX, 115200);
sfaghihi 8:e7fce7d9ebdd 11 Display screen;
sfaghihi 17:7ba6c8e4945b 12 Wifi wifi(WIFI_SSID, WIFI_PASS);
sfaghihi 19:450dbcda696e 13 TSISensor tsi;
sfaghihi 21:fe1769d5a01c 14 //InterruptIn set_a(SET_A_PIN);
sfaghihi 21:fe1769d5a01c 15
sfaghihi 17:7ba6c8e4945b 16 bool wifi_con = false;
sfaghihi 17:7ba6c8e4945b 17 bool alarm_dup = false;
sfaghihi 19:450dbcda696e 18 int set_alarm_state = 0;
sfaghihi 19:450dbcda696e 19 int held_hand_time = 0;
sfaghihi 19:450dbcda696e 20 bool dist_dup = false;
sfaghihi 7:5269fbadd5d7 21
sfaghihi 7:5269fbadd5d7 22 // The main program global states
sfaghihi 7:5269fbadd5d7 23 StateClass *programState = NULL;
sfaghihi 7:5269fbadd5d7 24 TimeClass *programTime = NULL;
sfaghihi 11:80a6facfd9f1 25 TimeClass *programPrevTime = NULL;
sfaghihi 7:5269fbadd5d7 26 TimeClass *programAlarm = NULL;
sfaghihi 7:5269fbadd5d7 27 DateClass *programDate = NULL;
sfaghihi 7:5269fbadd5d7 28 WeatherClass *programWeather = NULL;
sfaghihi 21:fe1769d5a01c 29 Thread setAlarmThread;
sfaghihi 21:fe1769d5a01c 30 Thread playAlarmThread;
sfaghihi 7:5269fbadd5d7 31
sfaghihi 7:5269fbadd5d7 32 // Timer Interrupt objects
sfaghihi 7:5269fbadd5d7 33 Ticker clockTimer;
sfaghihi 7:5269fbadd5d7 34 Ticker fetchTimer;
amilner1 15:452425c099ef 35 Ticker alarmTimer;
sfaghihi 7:5269fbadd5d7 36
sfaghihi 7:5269fbadd5d7 37 // Initialize the states and the hardware
sfaghihi 7:5269fbadd5d7 38 void init_state_hw()
sfaghihi 7:5269fbadd5d7 39 {
sfaghihi 9:c10fb4ac8aa7 40 //pc_io.baud(115200);
sfaghihi 21:fe1769d5a01c 41 /*if (wifi.connect()) {
sfaghihi 21:fe1769d5a01c 42 char *data = NULL;
sfaghihi 21:fe1769d5a01c 43 data = wifi.getTimeDate();
sfaghihi 17:7ba6c8e4945b 44 wifi_con = true;
sfaghihi 21:fe1769d5a01c 45 LOG("Data: %s\r\n", data);
sfaghihi 21:fe1769d5a01c 46 } else
sfaghihi 21:fe1769d5a01c 47 LOG("NO");*/
sfaghihi 7:5269fbadd5d7 48 programTime = new TimeClass(11, 0, 0);
sfaghihi 11:80a6facfd9f1 49 programPrevTime = new TimeClass(11, 0, 0);
sfaghihi 21:fe1769d5a01c 50 programDate = new DateClass(26, 5, 2017, 5);
sfaghihi 19:450dbcda696e 51 programAlarm = new TimeClass(9, 0, -1);
sfaghihi 16:a639477091ad 52 programWeather = new WeatherClass(sunny, 18, true, (char *)WEATHER_PLACE);
sfaghihi 8:e7fce7d9ebdd 53 //LOG("MOK");
sfaghihi 11:80a6facfd9f1 54 programState = new StateClass(programTime, programPrevTime, programWeather, programDate, programAlarm);
sfaghihi 11:80a6facfd9f1 55 programState->screenState = 0;
sfaghihi 18:2afeed90c051 56 programState->duringAlarm = true;
sfaghihi 7:5269fbadd5d7 57 }
sfaghihi 7:5269fbadd5d7 58
sfaghihi 19:450dbcda696e 59 #define MIN_CAL 62.0
sfaghihi 19:450dbcda696e 60 #define HOUR_CAL 12.0
sfaghihi 19:450dbcda696e 61
sfaghihi 19:450dbcda696e 62 void setAlarmTime()
sfaghihi 19:450dbcda696e 63 {
sfaghihi 19:450dbcda696e 64 while (set_alarm_state != 0)
sfaghihi 19:450dbcda696e 65 {
sfaghihi 19:450dbcda696e 66 if (tsi.readPercentage()>0)
sfaghihi 19:450dbcda696e 67 {
sfaghihi 19:450dbcda696e 68 float tsp = tsi.readPercentage();
sfaghihi 19:450dbcda696e 69 if (set_alarm_state == 1)
sfaghihi 19:450dbcda696e 70 programAlarm->hour = programAlarm->hour < 12 ? tsp*HOUR_CAL : (12 + tsp*HOUR_CAL);
sfaghihi 19:450dbcda696e 71 else if (set_alarm_state == 2)
sfaghihi 19:450dbcda696e 72 programAlarm->minute = MIN_CAL*tsp;
sfaghihi 19:450dbcda696e 73 else if (set_alarm_state == 3)
sfaghihi 19:450dbcda696e 74 if (tsp > 0.5 && programAlarm->hour < 12)
sfaghihi 19:450dbcda696e 75 programAlarm->hour += 12;
sfaghihi 19:450dbcda696e 76 else if (tsp < 0.5 && programAlarm->hour > 12)
sfaghihi 19:450dbcda696e 77 programAlarm->hour -= 12;
sfaghihi 19:450dbcda696e 78 }
sfaghihi 21:fe1769d5a01c 79 programTime->hour = programAlarm->hour;
sfaghihi 21:fe1769d5a01c 80 programTime->minute = programAlarm->minute;
sfaghihi 21:fe1769d5a01c 81 programTime->second = programAlarm->second;
sfaghihi 19:450dbcda696e 82 screen.flashAlarmSet(programAlarm, set_alarm_state);
sfaghihi 19:450dbcda696e 83 wait(0.2);
sfaghihi 19:450dbcda696e 84 }
sfaghihi 19:450dbcda696e 85 }
sfaghihi 19:450dbcda696e 86
sfaghihi 21:fe1769d5a01c 87 void serial_test()
sfaghihi 21:fe1769d5a01c 88 {
sfaghihi 21:fe1769d5a01c 89 char c = pc_io.getc();
sfaghihi 21:fe1769d5a01c 90 pc_io.putc(c);
sfaghihi 21:fe1769d5a01c 91 if (c == 'x')
sfaghihi 21:fe1769d5a01c 92 {
sfaghihi 21:fe1769d5a01c 93 set_alarm_state = (set_alarm_state + 1)%4;
sfaghihi 21:fe1769d5a01c 94 if (set_alarm_state == 1) {
sfaghihi 21:fe1769d5a01c 95 set_alarm_state = 4;
sfaghihi 21:fe1769d5a01c 96 }
sfaghihi 21:fe1769d5a01c 97 }
sfaghihi 21:fe1769d5a01c 98 }
sfaghihi 21:fe1769d5a01c 99
sfaghihi 21:fe1769d5a01c 100 void set_a_fnc()
sfaghihi 21:fe1769d5a01c 101 {
sfaghihi 21:fe1769d5a01c 102 set_alarm_state = (set_alarm_state + 1)%4;
sfaghihi 21:fe1769d5a01c 103 if (set_alarm_state == 1) {
sfaghihi 21:fe1769d5a01c 104 set_alarm_state = 4;
sfaghihi 21:fe1769d5a01c 105 }
sfaghihi 21:fe1769d5a01c 106 }
sfaghihi 21:fe1769d5a01c 107
sfaghihi 8:e7fce7d9ebdd 108 void refresh_and_inc()
sfaghihi 8:e7fce7d9ebdd 109 {
sfaghihi 10:e5bcd9088d5d 110 //led1 = !led1;
sfaghihi 10:e5bcd9088d5d 111 //LOG("In Inc: %f\r\n", programTime->second);
sfaghihi 8:e7fce7d9ebdd 112 // Increment Time
sfaghihi 11:80a6facfd9f1 113 programTime->inc(programPrevTime, REFRESH_PERIOD);
sfaghihi 10:e5bcd9088d5d 114 if (programState->screenState == 0)
sfaghihi 11:80a6facfd9f1 115 screen.drawClock(programTime, false, programPrevTime);
sfaghihi 10:e5bcd9088d5d 116 else if (programState->screenState == 1)
sfaghihi 11:80a6facfd9f1 117 screen.drawClockBig(programTime, false, programPrevTime);
sfaghihi 17:7ba6c8e4945b 118
sfaghihi 19:450dbcda696e 119 if (programTime->hour == programAlarm->hour && programTime->minute == programAlarm->minute && programAlarm->second >= 0) {
sfaghihi 17:7ba6c8e4945b 120 if (!alarm_dup) {
sfaghihi 17:7ba6c8e4945b 121 alarm_dup = true;
sfaghihi 17:7ba6c8e4945b 122 programState->duringAlarm = true;
sfaghihi 21:fe1769d5a01c 123 playAlarmThread.start(&playAlarmSound);
sfaghihi 17:7ba6c8e4945b 124 }
sfaghihi 17:7ba6c8e4945b 125 } else
sfaghihi 17:7ba6c8e4945b 126 alarm_dup = false;
sfaghihi 18:2afeed90c051 127
sfaghihi 18:2afeed90c051 128 if (getDistance()) {
sfaghihi 18:2afeed90c051 129 if (programState->duringAlarm)
sfaghihi 17:7ba6c8e4945b 130 programState->duringAlarm = false;
sfaghihi 18:2afeed90c051 131 else {
sfaghihi 19:450dbcda696e 132 held_hand_time ++;
sfaghihi 21:fe1769d5a01c 133 /*if (!dist_dup && held_hand_time >= CHANGE_SET_ALARM_TIME) {
sfaghihi 19:450dbcda696e 134 dist_dup = true;
sfaghihi 19:450dbcda696e 135 set_alarm_state = (set_alarm_state + 1)%4;
sfaghihi 19:450dbcda696e 136 if (set_alarm_state == 1)
sfaghihi 21:fe1769d5a01c 137 set_alarm_state = 4;
sfaghihi 21:fe1769d5a01c 138 }*/
sfaghihi 19:450dbcda696e 139 }
sfaghihi 19:450dbcda696e 140 } else {
sfaghihi 19:450dbcda696e 141 dist_dup = false;
sfaghihi 21:fe1769d5a01c 142 if (held_hand_time >= CHANGE_SCREEN_TIME && held_hand_time < CHANGE_SET_ALARM_TIME && set_alarm_state == 0) {
sfaghihi 19:450dbcda696e 143 set_alarm_state = 0;
sfaghihi 18:2afeed90c051 144 programState->screenState = 1 - programState->screenState;
sfaghihi 18:2afeed90c051 145 screen.drawAll(programState, true);
sfaghihi 18:2afeed90c051 146 }
sfaghihi 19:450dbcda696e 147 held_hand_time = 0;
sfaghihi 18:2afeed90c051 148 }
sfaghihi 18:2afeed90c051 149
sfaghihi 8:e7fce7d9ebdd 150 //printf("HAH");
sfaghihi 8:e7fce7d9ebdd 151 //pc_io.printf("After Inc: %d\r\n", programTime->second);
sfaghihi 8:e7fce7d9ebdd 152
sfaghihi 8:e7fce7d9ebdd 153 // Refresh Display
sfaghihi 11:80a6facfd9f1 154 /*if (programState->screenState == 0)
sfaghihi 10:e5bcd9088d5d 155 screen.drawClock(programTime, false);
sfaghihi 10:e5bcd9088d5d 156 else if (programState->screenState == 1)
sfaghihi 11:80a6facfd9f1 157 screen.drawClockBig(programTime, false);*/
sfaghihi 8:e7fce7d9ebdd 158 //screen.drawAll(programState);
sfaghihi 8:e7fce7d9ebdd 159 //LOG ("OUT YEAH!\r\n");
sfaghihi 8:e7fce7d9ebdd 160 }
sfaghihi 8:e7fce7d9ebdd 161
sfaghihi 7:5269fbadd5d7 162 void fetch_data()
sfaghihi 7:5269fbadd5d7 163 {
sfaghihi 19:450dbcda696e 164 LOG("Fetch happening\r\n");
sfaghihi 7:5269fbadd5d7 165 // NB Use the wifi module at some point
sfaghihi 17:7ba6c8e4945b 166 if (!wifi_con)
sfaghihi 17:7ba6c8e4945b 167 return;
sfaghihi 19:450dbcda696e 168 LOG ("GOT DATA!!!\r\n");
sfaghihi 19:450dbcda696e 169 char *data = NULL;
sfaghihi 19:450dbcda696e 170 data = wifi.getTimeDate();
sfaghihi 19:450dbcda696e 171 if (!data)
sfaghihi 19:450dbcda696e 172 return;
sfaghihi 17:7ba6c8e4945b 173 int s, m, h, d, mo, y, dow, t;
sfaghihi 17:7ba6c8e4945b 174 sscanf(data, "%d,%d,%d,%d,%d,%d,%d,%d", &s, &m, &h, &d, &mo, &y, &dow, &t);
sfaghihi 17:7ba6c8e4945b 175 free(data);
sfaghihi 17:7ba6c8e4945b 176 //led1 = 1;
sfaghihi 17:7ba6c8e4945b 177 /*
sfaghihi 13:334c591a982b 178 programWeather->type = cloudy;
sfaghihi 13:334c591a982b 179 programWeather->temp = 10;
sfaghihi 14:85c51b4eff4b 180 programWeather->isCelsius = false;
sfaghihi 16:a639477091ad 181 //programWeather->place = "London";
sfaghihi 13:334c591a982b 182 if (programState->screenState == 0)
sfaghihi 13:334c591a982b 183 screen.drawWeather(programWeather, false);
sfaghihi 17:7ba6c8e4945b 184 */
sfaghihi 17:7ba6c8e4945b 185 if (programWeather->temp != t) {
sfaghihi 17:7ba6c8e4945b 186 programWeather->temp = t;
sfaghihi 17:7ba6c8e4945b 187 screen.drawWeather(programWeather, false);
sfaghihi 17:7ba6c8e4945b 188 }
sfaghihi 17:7ba6c8e4945b 189 //led1 = 0;
sfaghihi 17:7ba6c8e4945b 190
sfaghihi 17:7ba6c8e4945b 191 if (programDate->dow != dow || programDate->day != d || programDate->month != mo || programDate->year != y) {
sfaghihi 17:7ba6c8e4945b 192 programDate->dow = dow;
sfaghihi 17:7ba6c8e4945b 193 programDate->day = d;
sfaghihi 17:7ba6c8e4945b 194 programDate->month = mo;
sfaghihi 17:7ba6c8e4945b 195 programDate->year = y;
sfaghihi 17:7ba6c8e4945b 196 if (programState->screenState == 0)
sfaghihi 17:7ba6c8e4945b 197 screen.drawDate(programDate);
sfaghihi 17:7ba6c8e4945b 198 } else {
sfaghihi 17:7ba6c8e4945b 199 programDate->dow = dow;
sfaghihi 17:7ba6c8e4945b 200 programDate->day = d;
sfaghihi 17:7ba6c8e4945b 201 programDate->month = mo;
sfaghihi 17:7ba6c8e4945b 202 programDate->year = y;
sfaghihi 17:7ba6c8e4945b 203 }
sfaghihi 7:5269fbadd5d7 204 if (abs((programTime->hour)*3600+(programTime->minute)*60+(programTime->second)-h*3600-m*60-s) > 180) {
sfaghihi 12:dd5d8eea2e47 205 programPrevTime->hour = programTime->hour;
sfaghihi 12:dd5d8eea2e47 206 programPrevTime->minute = programTime->minute;
sfaghihi 12:dd5d8eea2e47 207 programPrevTime->second = programTime->second;
sfaghihi 7:5269fbadd5d7 208 programTime->hour = h;
sfaghihi 7:5269fbadd5d7 209 programTime->minute = m;
sfaghihi 7:5269fbadd5d7 210 programTime->second = s;
sfaghihi 11:80a6facfd9f1 211 clockTimer.detach();
sfaghihi 11:80a6facfd9f1 212 clockTimer.attach(&refresh_and_inc, REFRESH_PERIOD);
sfaghihi 12:dd5d8eea2e47 213 if (programState->screenState == 0)
sfaghihi 12:dd5d8eea2e47 214 screen.drawClock(programTime, true, programPrevTime);
sfaghihi 12:dd5d8eea2e47 215 else if (programState->screenState == 1)
sfaghihi 12:dd5d8eea2e47 216 screen.drawClockBig(programTime, true, programPrevTime);
sfaghihi 7:5269fbadd5d7 217 }
sfaghihi 13:334c591a982b 218
sfaghihi 12:dd5d8eea2e47 219 //screen.drawAll(programState, false);
sfaghihi 8:e7fce7d9ebdd 220 //LOG("Fetch happened\r\n");
sfaghihi 7:5269fbadd5d7 221 }
sfaghihi 0:07e2cda84b51 222
amilner1 15:452425c099ef 223 void stopAlarm()
amilner1 15:452425c099ef 224 {
amilner1 15:452425c099ef 225 programState->duringAlarm = false;
sfaghihi 17:7ba6c8e4945b 226 alarmTimer.detach();
amilner1 15:452425c099ef 227 }
amilner1 15:452425c099ef 228
sfaghihi 0:07e2cda84b51 229 // main() runs in its own thread in the OS
sfaghihi 7:5269fbadd5d7 230 int main()
sfaghihi 7:5269fbadd5d7 231 {
sfaghihi 8:e7fce7d9ebdd 232 init_state_hw();
sfaghihi 21:fe1769d5a01c 233 pc_io.attach(&serial_test);
sfaghihi 21:fe1769d5a01c 234 //update_rtc(programState);
sfaghihi 21:fe1769d5a01c 235 //read_rtc(programState);
sfaghihi 19:450dbcda696e 236 fetch_data();
sfaghihi 21:fe1769d5a01c 237 //set_a.rise(&set_a_fnc);
sfaghihi 8:e7fce7d9ebdd 238 //LOG("AFTER\r\n");
sfaghihi 8:e7fce7d9ebdd 239 //printf("OI OI");
sfaghihi 17:7ba6c8e4945b 240
sfaghihi 11:80a6facfd9f1 241 screen.drawAll(programState, true);
sfaghihi 17:7ba6c8e4945b 242
sfaghihi 10:e5bcd9088d5d 243 //screen.drawDate(programDate);
sfaghihi 7:5269fbadd5d7 244 // Timer initializations
sfaghihi 17:7ba6c8e4945b 245
sfaghihi 8:e7fce7d9ebdd 246 clockTimer.attach(&refresh_and_inc, REFRESH_PERIOD);
sfaghihi 21:fe1769d5a01c 247
sfaghihi 17:7ba6c8e4945b 248 fetchTimer.attach(&fetch_data, FETCH_PERIOD);
sfaghihi 19:450dbcda696e 249 //alarmTimer.attach(&stopAlarm, 40);
sfaghihi 17:7ba6c8e4945b 250
sfaghihi 21:fe1769d5a01c 251 playAlarmSound();
sfaghihi 21:fe1769d5a01c 252
sfaghihi 8:e7fce7d9ebdd 253 //LOG("YAY\r\n");
sfaghihi 7:5269fbadd5d7 254 // Infinite loop
sfaghihi 0:07e2cda84b51 255 while (true) {
sfaghihi 21:fe1769d5a01c 256 if (set_alarm_state == 4) {
sfaghihi 21:fe1769d5a01c 257 set_alarm_state = 1;
sfaghihi 21:fe1769d5a01c 258 setAlarmThread.start(&setAlarmTime);
sfaghihi 21:fe1769d5a01c 259 }
sfaghihi 21:fe1769d5a01c 260
sfaghihi 0:07e2cda84b51 261 }
sfaghihi 0:07e2cda84b51 262 }