Final version, with changing analogue clock colours, Friday 11:20am

Dependencies:   MMA8451Q SPI_TFT_ILI9341 TFT_fonts mbed

Smart clock by Duncan and Kieran

Photo

http://www.imgur.com/SiyOshx.jpg

Equipment

  • PCB: FRDM-KL25Z
  • TFT Color Display: MI0283QT-9A
  • Buzzer
  • 3 x buttons
  • 3 x 2kΩ resistors and 1 x 100Ω resistor
  • Stripboard
  • Wires (stranded is preferable due to their flexibility)
  • USB to Mini-USB cable, and computer

Setup

PCB to TFT (Output)

FRDM-KL25ZMI0283QT-9A
P3V33.3V, IM1, IM2, IM3
GNDRD, IM0, LEDK
PTD5CS
PTD1RS
PTD0RST
PTD2SDI
PTD3SDO
PTA13WR
P5V_USB through 100Ω resistor (approx. 20mA)LEDA

The buzzer should be connected between PTA12 and ground.

Note: The resistance between P5V_USB and LEDA can be reduced to increase the brightness of the screen. However, resistors lower than 30Ω have not been tested, and may result in the current causing damage to the PCB.

PCB to Buttons (Inputs)

FRDM-KL25ZInput
PTA5Minute button
PTC8Hour button
PTC9Time change button - toggles between changing the alarm time and the clock time

Each button should be connected in series with a 2kΩ resistor between 3.3V and 0V, so that pressing the button switches between these two voltages.

Features

  • A digital clock, displayed in 24-hour format
  • An analogue clock, displaying the time in standard 12-hour format
  • Alarm can be changed using the minute and hour buttons
  • Time can be changed by holding the third button
  • Alarm will sound for one minute at the displayed time
  • Putting the alarm on its side will snooze the alarm if the alarm is going off (or just disable it if the alarm is not sounding)
Revision:
4:2013f3158cc6
Parent:
3:6a328c7e9b1c
Child:
5:f5fa116b57a1
--- a/main.cpp	Tue May 23 15:50:45 2017 +0000
+++ b/main.cpp	Wed May 24 13:50:26 2017 +0000
@@ -9,23 +9,53 @@
 #include "font_big.h"
 
 Ticker timer;
-DigitalOut output_high1(PTA4);
-DigitalOut output_high60(PTC8);
 DigitalOut buzzer(PTA12);
-DigitalOut output_time_change(PTA2);
-DigitalIn input1(PTA5);
-DigitalIn input60(PTC9);
-DigitalIn input_time_change(PTC2);
+DigitalIn input1(PTA4);
+DigitalIn input60(PTC8);
+DigitalIn input_time_change(PTC9);
 Serial pc(USBTX,USBRX);
 SPI_TFT_ILI9341 TFT(PTD2, PTD3, PTD1, PTD5, PTD0, PTA13,"TFT"); // mosi, miso, sclk, cs, reset, dc for frdmkl25z
 
 int clock_minutes, clock_hours = 0;
+int clock_seconds = 0;
 int alarm_hours = 7;
 int alarm_minutes = 0;
 
 void timeup(){
-    clock_minutes = (clock_minutes + 1) % 60;
-    if (clock_minutes==0) (clock_hours++) % 24;
+    clock_seconds++;
+    clock_seconds %= 60;
+    
+    if (clock_seconds==0) 
+    {
+        clock_minutes++;
+        clock_minutes %= 60;
+    }
+    if (clock_minutes==0 && clock_seconds==0) 
+    {
+        clock_hours++;
+        clock_hours %= 24;
+    }
+}
+
+// TODO: Add %02d to time ouputs, try font_big.h, comment every line, make sure the drawclock function works, fix the input_time_change and add seconds/precise timing
+void drawclock() // Draws an analogue clock using the clock_minutes and clock_hours variables
+{
+    int hourX, hourY, minuteX, minuteY; // Initialise variables to be used
+    int circleX = 200; // Circle centre X
+    int circleY = 200; // Circle centre Y
+    int circleRadius = 30; // Circle radius
+    
+    double factorH = (2 * 3.141) / 12; // Convert hour to radians
+    double factorM = (2 * 3.141) / 60; // Convert minute to radians
+    
+    hourX = floor(0.9 * circleRadius * sin((double) (clock_hours * factorH))); // Calculate difference in X values of the two ends of the hour hand.
+    hourY = floor(0.9 * circleRadius * cos((double) (clock_hours * factorH))); // Same for Y of hour hand. The 0.9 means the hands are smaller than the circle
+    minuteX = floor(0.9 * circleRadius * sin((double) (clock_minutes * factorM))); // Same for X of minute hand
+    minuteY = floor(0.9 * circleRadius * cos((double) (clock_minutes * factorM))); // Same for Y of minute hand
+    
+    TFT.fillcircle(circleX, circleY, circleRadius, Red); // Draws a red circle
+    TFT.line(circleX, circleY, circleX + hourX, circleY - hourY, White); // Draws the hour hand
+    TFT.line(circleX, circleY, circleX + minuteX, circleY - minuteY, White); // Draws the minute hand
 }
 
 int main()
@@ -34,12 +64,13 @@
     wait(0.2);
      
     TFT.set_orientation(1);   // Make it horizontal
-    TFT.background(Red);    // Set background to black
+    TFT.background(Black);      // Set background to black
     TFT.foreground(White);    // Set text to white
     TFT.cls();                // Clear screen
     TFT.set_font((unsigned char*) Arial12x12); // Set the font
     
     TFT.fillrect(0, 0, 320, 30, Red);
+    TFT.locate(5, 5);
     TFT.printf("Clock by Duncan and Kieran");
     
     wait(0.1);
@@ -47,13 +78,10 @@
     TFT.background(Black);    // Set background to black
     TFT.set_font((unsigned char*) Arial28x28); // Set the font
     
-    output_time_change = 1;
-    output_high1 = 1;
-    output_high60 = 1;
     timer.attach(&timeup, 1);
     
     while(1) {
-        if (input_time_change == 1)
+        if (input_time_change)
         {
             switch(input1){
                 case 1:
@@ -103,13 +131,15 @@
         alarm_hours %= 24;
         
         TFT.locate(50, 50);
-        TFT.printf("Time: %d:%d ", clock_hours, clock_minutes);
+        TFT.printf("Time: %02d:%02d.%02d", clock_hours, clock_minutes, clock_seconds);
         
         TFT.locate(50, 100);
-        TFT.printf("Alarm: %d:%d ", alarm_hours, alarm_minutes);
+        TFT.printf("Alarm: %02d:%02d", alarm_hours, alarm_minutes);
         
         TFT.locate(50, 150);
         TFT.printf("%d ", (int) input_time_change);
+        
+        drawclock();
     }
 
 }