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:
Tue May 23 18:13:18 2017 +0000
Revision:
7:5269fbadd5d7
Parent:
6:b2f45de1d9ed
Child:
8:e7fce7d9ebdd
First commit for time update

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 3:6795b827060b 14 }
sfaghihi 3:6795b827060b 15
sfaghihi 3:6795b827060b 16 void Display::drawClock(TimeClass *time)
sfaghihi 3:6795b827060b 17 {
amilner1 5:fe6910712822 18
amilner1 5:fe6910712822 19 myTFT.circle(70, 70, 60, 0xFFFFFF); // clock circle
amilner1 4:519ffdf16d25 20 myTFT.line(70, 10, 70, 20, 0xFFFFFF); // 12 oclock
amilner1 4:519ffdf16d25 21 myTFT.line(70, 130, 70, 120, 0xFFFFFF); // 6 oclock
amilner1 4:519ffdf16d25 22 myTFT.line(10, 70, 20 , 70, 0xFFFFFF); // 3 oclock
amilner1 4:519ffdf16d25 23 myTFT.line(120, 70, 130 , 70, 0xFFFFFF); // 9 oclock
amilner1 4:519ffdf16d25 24 myTFT.line(100, 121.9615, 95, 113.301, 0xFFFFFF); // 7 oclock
amilner1 4:519ffdf16d25 25 myTFT.line(40, 18.0385, 45, 26.699, 0xFFFFFF); // 1 oclock
amilner1 4:519ffdf16d25 26 myTFT.line(121.9615, 100, 113.301, 95, 0xFFFFFF); // 8 oclock
amilner1 4:519ffdf16d25 27 myTFT.line(18.0385, 40, 26.699, 45, 0xFFFFFF); // 2 oclock
amilner1 4:519ffdf16d25 28 myTFT.line(121.9615,40,113.301,45, 0xFFFFFF); // 4 oclock
amilner1 4:519ffdf16d25 29 myTFT.line(18.0385,100,26.699,95, 0xFFFFFF); // 10 oclock
amilner1 4:519ffdf16d25 30 myTFT.line(100,18.0385,95,26.699, 0xFFFFFF); // 5 oclock
amilner1 4:519ffdf16d25 31 myTFT.line(40,121.9615,45,113.301, 0xFFFFFF); // 11 olcock
amilner1 5:fe6910712822 32 float h = time->hour;
amilner1 5:fe6910712822 33 float m = time->minute;
amilner1 5:fe6910712822 34 float s = time->second;
amilner1 5:fe6910712822 35 float htheta = (3.14159/6)*(h + (m/60.0)); // hour hand angle
amilner1 5:fe6910712822 36 float mtheta = (3.14159/6)*(m + (s/60.0)); // minute hand angle
amilner1 5:fe6910712822 37 float stheta = (3.14159/6)*s; // second hand angle
amilner1 5:fe6910712822 38 float hx = 70.0 + 15.0*sin(htheta); // hour hand position
amilner1 5:fe6910712822 39 float hy = 70.0 - 15.0*cos(htheta); //
amilner1 5:fe6910712822 40 float mx = 70.0 + 20.0*sin(mtheta); // minute hand position
amilner1 5:fe6910712822 41 float my = 70.0 - 20.0*cos(mtheta); //
amilner1 5:fe6910712822 42 float sx = 70.0 + 30.0*sin(stheta); // second hand position
amilner1 5:fe6910712822 43 float sy = 70.0 - 30.0*cos(stheta); //
amilner1 6:b2f45de1d9ed 44 myTFT.line(70, 70, hx, hy, 0xFFFFFF); // hour hand plot
amilner1 6:b2f45de1d9ed 45 myTFT.line(70, 70, mx, my, 0xFFFFFF); // minute hand plot
amilner1 6:b2f45de1d9ed 46 myTFT.line(70, 70, sx, sy, 0xFFFFFF); // second hand plot
amilner1 6:b2f45de1d9ed 47 myTFT.locate(10,200);
sfaghihi 7:5269fbadd5d7 48 myTFT.set_font((unsigned char*)Arial28x28);
amilner1 5:fe6910712822 49 printf("%f", hx);
amilner1 5:fe6910712822 50
amilner1 5:fe6910712822 51 }
amilner1 5:fe6910712822 52
amilner1 5:fe6910712822 53 void Display::drawDate(DateClass *date)
amilner1 5:fe6910712822 54 {
sfaghihi 7:5269fbadd5d7 55 int d = date->day;
sfaghihi 7:5269fbadd5d7 56 int m = date->month;
sfaghihi 7:5269fbadd5d7 57 int y = date->year;
sfaghihi 7:5269fbadd5d7 58 }
sfaghihi 7:5269fbadd5d7 59
sfaghihi 7:5269fbadd5d7 60 void Display::drawWeather(WeatherClass *data)
sfaghihi 7:5269fbadd5d7 61 {
sfaghihi 7:5269fbadd5d7 62
sfaghihi 7:5269fbadd5d7 63 }
sfaghihi 7:5269fbadd5d7 64
sfaghihi 7:5269fbadd5d7 65 void Display::drawAlarm(TimeClass *alarmTime)
sfaghihi 7:5269fbadd5d7 66 {
sfaghihi 7:5269fbadd5d7 67
sfaghihi 7:5269fbadd5d7 68 }
sfaghihi 7:5269fbadd5d7 69
sfaghihi 7:5269fbadd5d7 70 void Display::drawAll(StateClass *state)
sfaghihi 7:5269fbadd5d7 71 {
sfaghihi 7:5269fbadd5d7 72 myTFT.cls();
sfaghihi 7:5269fbadd5d7 73 if (!state->screenActive)
sfaghihi 7:5269fbadd5d7 74 return;
sfaghihi 7:5269fbadd5d7 75 drawClock(state->time);
sfaghihi 7:5269fbadd5d7 76 drawDate(state->date);
sfaghihi 7:5269fbadd5d7 77 drawWeather(state->weather);
sfaghihi 7:5269fbadd5d7 78 if (state->alarm)
sfaghihi 7:5269fbadd5d7 79 drawAlarm(state->alarm);
sfaghihi 2:56a27b66d03a 80 }