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:
Wed May 24 08:18:02 2017 +0000
Revision:
9:c10fb4ac8aa7
Parent:
8:e7fce7d9ebdd
Child:
10:e5bcd9088d5d
Nope

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sfaghihi 2:56a27b66d03a 1 #include "Display.h"
sfaghihi 2:56a27b66d03a 2
sfaghihi 2:56a27b66d03a 3 Display::Display ()
sfaghihi 2:56a27b66d03a 4 : myTFT(DISPLAY_MOSI_PIN, DISPLAY_MISO_PIN, DISPLAY_SCLK_PIN, DISPLAY_CS_PIN, DISPLAY_RST_PIN, DISPLAY_DC_PIN, "TFT")
sfaghihi 2:56a27b66d03a 5 {
sfaghihi 2:56a27b66d03a 6 //myTFT = new SPI_TFT_ILI9341(DISPLAY_MOSI_PIN, DISPLAY_MISO_PIN, DISPLAY_SCLK_PIN, DISPLAY_CS_PIN, DISPLAY_RST_PIN, DISPLAY_DC_PIN,"TFT");
sfaghihi 2:56a27b66d03a 7 myTFT.claim(stdout); // send stdout to the TFT display
sfaghihi 2:56a27b66d03a 8 myTFT.set_orientation(1);
sfaghihi 2:56a27b66d03a 9 myTFT.background(Black); // set background to black
sfaghihi 2:56a27b66d03a 10 myTFT.foreground(White); // set chars to white
sfaghihi 2:56a27b66d03a 11 myTFT.cls(); // clear the screen
sfaghihi 2:56a27b66d03a 12 myTFT.set_font((unsigned char*) Arial12x12);
sfaghihi 2:56a27b66d03a 13 myTFT.locate(0,0);
sfaghihi 9:c10fb4ac8aa7 14 printf("O HOH O ");
sfaghihi 3:6795b827060b 15 }
sfaghihi 3:6795b827060b 16
sfaghihi 8:e7fce7d9ebdd 17 void Display::drawClock(TimeClass *time, bool cls)
sfaghihi 3:6795b827060b 18 {
sfaghihi 8:e7fce7d9ebdd 19 //LOG("Small\r\n");
amilner1 5:fe6910712822 20 myTFT.circle(70, 70, 60, 0xFFFFFF); // clock circle
amilner1 4:519ffdf16d25 21 myTFT.line(70, 10, 70, 20, 0xFFFFFF); // 12 oclock
amilner1 4:519ffdf16d25 22 myTFT.line(70, 130, 70, 120, 0xFFFFFF); // 6 oclock
amilner1 4:519ffdf16d25 23 myTFT.line(10, 70, 20 , 70, 0xFFFFFF); // 3 oclock
amilner1 4:519ffdf16d25 24 myTFT.line(120, 70, 130 , 70, 0xFFFFFF); // 9 oclock
amilner1 4:519ffdf16d25 25 myTFT.line(100, 121.9615, 95, 113.301, 0xFFFFFF); // 7 oclock
amilner1 4:519ffdf16d25 26 myTFT.line(40, 18.0385, 45, 26.699, 0xFFFFFF); // 1 oclock
amilner1 4:519ffdf16d25 27 myTFT.line(121.9615, 100, 113.301, 95, 0xFFFFFF); // 8 oclock
amilner1 4:519ffdf16d25 28 myTFT.line(18.0385, 40, 26.699, 45, 0xFFFFFF); // 2 oclock
amilner1 4:519ffdf16d25 29 myTFT.line(121.9615,40,113.301,45, 0xFFFFFF); // 4 oclock
amilner1 4:519ffdf16d25 30 myTFT.line(18.0385,100,26.699,95, 0xFFFFFF); // 10 oclock
amilner1 4:519ffdf16d25 31 myTFT.line(100,18.0385,95,26.699, 0xFFFFFF); // 5 oclock
amilner1 4:519ffdf16d25 32 myTFT.line(40,121.9615,45,113.301, 0xFFFFFF); // 11 olcock
sfaghihi 8:e7fce7d9ebdd 33 //LOG("SO Near: %x\r\n", (void *)time);
sfaghihi 8:e7fce7d9ebdd 34 float h = time->hour % 12;
amilner1 5:fe6910712822 35 float m = time->minute;
amilner1 5:fe6910712822 36 float s = time->second;
sfaghihi 8:e7fce7d9ebdd 37 float htheta = (M_PI/6.0)*(h + (m/60.0) + (s/3600.0)); // hour hand angle
sfaghihi 8:e7fce7d9ebdd 38 float mtheta = (M_PI/6.0)*(m + (s/60.0))/5.0; // minute hand angle
sfaghihi 8:e7fce7d9ebdd 39 float stheta = (M_PI/6.0)*s/5.0; // second hand angle
amilner1 5:fe6910712822 40 float hx = 70.0 + 15.0*sin(htheta); // hour hand position
amilner1 5:fe6910712822 41 float hy = 70.0 - 15.0*cos(htheta); //
sfaghihi 8:e7fce7d9ebdd 42 float mx = 70.0 + 30.0*sin(mtheta); // minute hand position
sfaghihi 8:e7fce7d9ebdd 43 float my = 70.0 - 30.0*cos(mtheta); //
sfaghihi 8:e7fce7d9ebdd 44 float sx = 70.0 + 50.0*sin(stheta); // second hand position
sfaghihi 8:e7fce7d9ebdd 45 float sy = 70.0 - 50.0*cos(stheta); //
sfaghihi 8:e7fce7d9ebdd 46 LOG("SO Far: %f, %f\r\n", sx, sy);
sfaghihi 8:e7fce7d9ebdd 47 if (cls) {
sfaghihi 8:e7fce7d9ebdd 48 myTFT.line(70, 70, hx, hy, Black); // hour hand plot
sfaghihi 8:e7fce7d9ebdd 49 myTFT.line(70, 70, mx, my, Black); // minute hand plot
sfaghihi 8:e7fce7d9ebdd 50 myTFT.line(70, 70, sx, sy, Black); // second hand plot
sfaghihi 8:e7fce7d9ebdd 51 } else {
sfaghihi 8:e7fce7d9ebdd 52 myTFT.line(70, 70, hx, hy, Yellow); // hour hand plot
sfaghihi 8:e7fce7d9ebdd 53 myTFT.line(70, 70, mx, my, White); // minute hand plot
sfaghihi 8:e7fce7d9ebdd 54 myTFT.line(70, 70, sx, sy, DarkCyan); // second hand plot
sfaghihi 8:e7fce7d9ebdd 55 }
sfaghihi 8:e7fce7d9ebdd 56 /*
sfaghihi 8:e7fce7d9ebdd 57 int xc = myTFT.width()/2;
sfaghihi 8:e7fce7d9ebdd 58 int yc = myTFT.height()/2;
sfaghihi 8:e7fce7d9ebdd 59 int r = (myTFT.height()*3)/4;
sfaghihi 8:e7fce7d9ebdd 60 myTFT.circle(xc, yc, r, White); // clock circle
sfaghihi 8:e7fce7d9ebdd 61 for (int i = 0; i < 12; i++)
sfaghihi 8:e7fce7d9ebdd 62 myTFT.line(xc+6*r/7*sin((float)i*M_PI/6.0), yc-6*r/7*cos((float)i*M_PI/6.0),
sfaghihi 8:e7fce7d9ebdd 63 xc + r*sin((float)i*M_PI/6.0), yc-r*cos((float)i*M_PI/6.0), 0xFFFFFF);
sfaghihi 8:e7fce7d9ebdd 64
sfaghihi 8:e7fce7d9ebdd 65 //LOG("SO Near: %x\r\n", (void *)time);
sfaghihi 8:e7fce7d9ebdd 66 float h = time->hour % 12;
sfaghihi 8:e7fce7d9ebdd 67 float m = time->minute;
sfaghihi 8:e7fce7d9ebdd 68 float s = time->second;
sfaghihi 8:e7fce7d9ebdd 69 float htheta = (M_PI/6.0)*(h + (m/60.0) + (s/3600.0)); // hour hand angle
sfaghihi 8:e7fce7d9ebdd 70 float mtheta = (M_PI/6.0)*(m + (s/60.0))/5.0; // minute hand angle
sfaghihi 8:e7fce7d9ebdd 71 float stheta = (M_PI/6.0)*s/5.0; // second hand angle
sfaghihi 8:e7fce7d9ebdd 72 int hx = xc + r*sin(htheta)/4.5; // hour hand position
sfaghihi 8:e7fce7d9ebdd 73 int hy = yc - r*cos(htheta)/4.5; //
sfaghihi 8:e7fce7d9ebdd 74 int mx = xc + r*sin(mtheta)/1.9; // minute hand position
sfaghihi 8:e7fce7d9ebdd 75 int my = yc - r*cos(mtheta)/1.9; //
sfaghihi 8:e7fce7d9ebdd 76 int sx = xc + r*sin(stheta)/1.5; // second hand position
sfaghihi 8:e7fce7d9ebdd 77 int sy = yc - r*cos(stheta)/1.5; //
sfaghihi 8:e7fce7d9ebdd 78 //LOG("SO Far: %f, %f\r\n", sx, sy);
sfaghihi 8:e7fce7d9ebdd 79 if (cls) {
sfaghihi 8:e7fce7d9ebdd 80 myTFT.line(xc, yc, hx, hy, Black); // hour hand plot
sfaghihi 8:e7fce7d9ebdd 81 myTFT.line(xc, yc, mx, my, Black); // minute hand plot
sfaghihi 8:e7fce7d9ebdd 82 myTFT.line(xc, yc, sx, sy, Black); // second hand plot
sfaghihi 8:e7fce7d9ebdd 83 } else {
sfaghihi 8:e7fce7d9ebdd 84 myTFT.line(xc, yc, hx, hy, Yellow); // hour hand plot
sfaghihi 8:e7fce7d9ebdd 85 myTFT.line(xc, yc, mx, my, White); // minute hand plot
sfaghihi 8:e7fce7d9ebdd 86 myTFT.line(xc, yc, sx, sy, DarkCyan); // second hand plot
sfaghihi 8:e7fce7d9ebdd 87 }*/
sfaghihi 8:e7fce7d9ebdd 88 //LOG("SO OK\r\n");
sfaghihi 8:e7fce7d9ebdd 89 //myTFT.locate(10,200);
sfaghihi 8:e7fce7d9ebdd 90 //myTFT.set_font((unsigned char*)Arial28x28);
sfaghihi 8:e7fce7d9ebdd 91 //printf("%f", hx);
amilner1 5:fe6910712822 92
amilner1 5:fe6910712822 93 }
amilner1 5:fe6910712822 94
sfaghihi 8:e7fce7d9ebdd 95 /*void Display::drawClockBig(TimeClass *time, bool cls)
sfaghihi 8:e7fce7d9ebdd 96 {
sfaghihi 8:e7fce7d9ebdd 97 LOG("BIG\r\n");
sfaghihi 8:e7fce7d9ebdd 98 int xc = myTFT.width()/2;
sfaghihi 8:e7fce7d9ebdd 99 int yc = myTFT.height()/2;
sfaghihi 8:e7fce7d9ebdd 100 int r = (myTFT.height()*3)/4;
sfaghihi 8:e7fce7d9ebdd 101 myTFT.circle(xc, yc, r, White); // clock circle
sfaghihi 8:e7fce7d9ebdd 102 for (int i = 0; i < 12; i++)
sfaghihi 8:e7fce7d9ebdd 103 myTFT.line(xc+6*r/7*sin((float)i*M_PI/6.0), yc-6*r/7*cos((float)i*M_PI/6.0),
sfaghihi 8:e7fce7d9ebdd 104 xc + r*sin((float)i*M_PI/6.0), yc-r*cos((float)i*M_PI/6.0), 0xFFFFFF);
sfaghihi 8:e7fce7d9ebdd 105
sfaghihi 8:e7fce7d9ebdd 106 //LOG("SO Near: %x\r\n", (void *)time);
sfaghihi 8:e7fce7d9ebdd 107 float h = time->hour % 12;
sfaghihi 8:e7fce7d9ebdd 108 float m = time->minute;
sfaghihi 8:e7fce7d9ebdd 109 float s = time->second;
sfaghihi 8:e7fce7d9ebdd 110 float htheta = (M_PI/6.0)*(h + (m/60.0) + (s/3600.0)); // hour hand angle
sfaghihi 8:e7fce7d9ebdd 111 float mtheta = (M_PI/6.0)*(m + (s/60.0))/5.0; // minute hand angle
sfaghihi 8:e7fce7d9ebdd 112 float stheta = (M_PI/6.0)*s/5.0; // second hand angle
sfaghihi 8:e7fce7d9ebdd 113 int hx = xc + r*sin(htheta)/4.5; // hour hand position
sfaghihi 8:e7fce7d9ebdd 114 int hy = yc - r*cos(htheta)/4.5; //
sfaghihi 8:e7fce7d9ebdd 115 int mx = xc + r*sin(mtheta)/1.9; // minute hand position
sfaghihi 8:e7fce7d9ebdd 116 int my = yc - r*cos(mtheta)/1.9; //
sfaghihi 8:e7fce7d9ebdd 117 int sx = xc + r*sin(stheta)/1.5; // second hand position
sfaghihi 8:e7fce7d9ebdd 118 int sy = yc - r*cos(stheta)/1.5; //
sfaghihi 8:e7fce7d9ebdd 119 //LOG("SO Far: %f, %f\r\n", sx, sy);
sfaghihi 8:e7fce7d9ebdd 120 if (cls) {
sfaghihi 8:e7fce7d9ebdd 121 myTFT.line(xc, yc, hx, hy, Black); // hour hand plot
sfaghihi 8:e7fce7d9ebdd 122 myTFT.line(xc, yc, mx, my, Black); // minute hand plot
sfaghihi 8:e7fce7d9ebdd 123 myTFT.line(xc, yc, sx, sy, Black); // second hand plot
sfaghihi 8:e7fce7d9ebdd 124 } else {
sfaghihi 8:e7fce7d9ebdd 125 myTFT.line(xc, yc, hx, hy, Yellow); // hour hand plot
sfaghihi 8:e7fce7d9ebdd 126 myTFT.line(xc, yc, mx, my, White); // minute hand plot
sfaghihi 8:e7fce7d9ebdd 127 myTFT.line(xc, yc, sx, sy, DarkCyan); // second hand plot
sfaghihi 8:e7fce7d9ebdd 128 }
sfaghihi 8:e7fce7d9ebdd 129
sfaghihi 8:e7fce7d9ebdd 130 }*/
sfaghihi 8:e7fce7d9ebdd 131
sfaghihi 9:c10fb4ac8aa7 132 char *month_names[] =
sfaghihi 9:c10fb4ac8aa7 133 {
sfaghihi 9:c10fb4ac8aa7 134 "Jan.", "Feb.", "Mar.", "Apr.", "May", "Jun.",
sfaghihi 9:c10fb4ac8aa7 135 "Jul.", "Aug.", "Sep.", "Oct.", "Nov.", "Dec."
sfaghihi 9:c10fb4ac8aa7 136 };
sfaghihi 9:c10fb4ac8aa7 137 char *dow_names[] =
sfaghihi 9:c10fb4ac8aa7 138 {
sfaghihi 9:c10fb4ac8aa7 139 "Sunday", "Monday", "Tuesday", "Wednesday",
sfaghihi 9:c10fb4ac8aa7 140 "Thursday", "Friday", "Saturday"
sfaghihi 9:c10fb4ac8aa7 141 };
sfaghihi 9:c10fb4ac8aa7 142
sfaghihi 9:c10fb4ac8aa7 143
amilner1 5:fe6910712822 144 void Display::drawDate(DateClass *date)
amilner1 5:fe6910712822 145 {
sfaghihi 8:e7fce7d9ebdd 146 /*int d = date->day;
sfaghihi 7:5269fbadd5d7 147 int m = date->month;
sfaghihi 8:e7fce7d9ebdd 148 int y = date->year;*/
sfaghihi 9:c10fb4ac8aa7 149 LOG("IN Date\r\n");
sfaghihi 9:c10fb4ac8aa7 150 //myTFT.set_font((unsigned char*)Arial28x28);
sfaghihi 9:c10fb4ac8aa7 151 myTFT.locate(40,160);
sfaghihi 9:c10fb4ac8aa7 152 printf("%s", dow_names[date->dow]);
sfaghihi 9:c10fb4ac8aa7 153 LOG("OUTDATE\r\n");
sfaghihi 9:c10fb4ac8aa7 154 myTFT.locate(20,180);
sfaghihi 9:c10fb4ac8aa7 155 printf("%d %s %d", date->day, month_names[date->month-1], date->year);
sfaghihi 7:5269fbadd5d7 156 }
sfaghihi 7:5269fbadd5d7 157
sfaghihi 7:5269fbadd5d7 158 void Display::drawWeather(WeatherClass *data)
sfaghihi 7:5269fbadd5d7 159 {
sfaghihi 7:5269fbadd5d7 160
sfaghihi 7:5269fbadd5d7 161 }
sfaghihi 7:5269fbadd5d7 162
sfaghihi 7:5269fbadd5d7 163 void Display::drawAlarm(TimeClass *alarmTime)
sfaghihi 7:5269fbadd5d7 164 {
sfaghihi 7:5269fbadd5d7 165
sfaghihi 7:5269fbadd5d7 166 }
sfaghihi 7:5269fbadd5d7 167
sfaghihi 7:5269fbadd5d7 168 void Display::drawAll(StateClass *state)
sfaghihi 7:5269fbadd5d7 169 {
sfaghihi 8:e7fce7d9ebdd 170 //LOG("In ALARM\r\n");
sfaghihi 7:5269fbadd5d7 171 myTFT.cls();
sfaghihi 8:e7fce7d9ebdd 172 //LOG("State 0\r\n");
sfaghihi 8:e7fce7d9ebdd 173 if (!(state->screenActive))
sfaghihi 7:5269fbadd5d7 174 return;
sfaghihi 8:e7fce7d9ebdd 175 //LOG("State: %d\r\n", state->screenState);
sfaghihi 8:e7fce7d9ebdd 176 //if (state->screenState == 0) {
sfaghihi 8:e7fce7d9ebdd 177 //LOG("Yo\r\n");
sfaghihi 8:e7fce7d9ebdd 178 drawClock(state->time, false);
sfaghihi 8:e7fce7d9ebdd 179 //LOG("State 1\r\n");
sfaghihi 7:5269fbadd5d7 180 drawDate(state->date);
sfaghihi 8:e7fce7d9ebdd 181 //LOG("State 2\r\n");
sfaghihi 7:5269fbadd5d7 182 drawWeather(state->weather);
sfaghihi 8:e7fce7d9ebdd 183 //LOG("BEFORE ALARM\r\n");
sfaghihi 8:e7fce7d9ebdd 184 if (state->alarm) {
sfaghihi 8:e7fce7d9ebdd 185 //LOG("SHOULDN't HAPPEN\r\n");
sfaghihi 7:5269fbadd5d7 186 drawAlarm(state->alarm);
sfaghihi 8:e7fce7d9ebdd 187 }
sfaghihi 8:e7fce7d9ebdd 188 //} else if (state->screenState == 1) {
sfaghihi 8:e7fce7d9ebdd 189 //drawClockBig(state->time, false);
sfaghihi 8:e7fce7d9ebdd 190 //}
sfaghihi 2:56a27b66d03a 191 }