While I was thinking about logging sensor values, I noticed that I have not got clock for this board. Blowsing the mbed API, I found that the ticker could be used. So this is my first trial of implementing a clock using the ticker. Meantime I added getPoint in my SPI_STMPE610 lib so that the x and y coordinate can be directly read.

Dependencies:   SPI_STMPE610 SPI_TFT_ILI9341 TFT_fonts mbed

Tokei means a clock or a watch in Japanese. To log values of sensor(s) I needed a way to trace the time. At first, knowing that the RTC is not connected in FRDM-KL25Z I thought it must be difficult to implement a clock, but finding the "ticker" in mbed lib, at least I could give a try.

センサの値をログするのに時計機能が欲しいかなと思っていたのですが、FRDM-KL25ZではRTCに32KHzが接続されていないのでちょっと難しいかなと mbed の API を見ていたら ticker というのがありました(笑)

/media/uploads/Rhyme/tokei.jpg

Since it must be painful to set the time each time powering the board, I implemented the minimum functions to set the time (hour, min, sec) using the Adafruit 2.8" TFT and Touch Sensor.

流石に起動毎にシリアルから時間を設定するのは厳しそうだったので とりあえず時、分、秒を設定できる最低限のUIも付けて見ました。

/media/uploads/Rhyme/set_hour.jpg /media/uploads/Rhyme/set_min.jpg /media/uploads/Rhyme/set_sec.jpg

Committer:
Rhyme
Date:
Sat Dec 13 08:48:34 2014 +0000
Revision:
0:94d52137914c
Child:
1:a3749e465942
First commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rhyme 0:94d52137914c 1 /** Tokei
Rhyme 0:94d52137914c 2 * "Tokei" means a clock or watch in Japanese
Rhyme 0:94d52137914c 3 */
Rhyme 0:94d52137914c 4
Rhyme 0:94d52137914c 5 #include "mbed.h"
Rhyme 0:94d52137914c 6 #include "SPI_TFT_ILI9341.h"
Rhyme 0:94d52137914c 7 #include "SPI_STMPE610.h"
Rhyme 0:94d52137914c 8 #include "Arial12x12.h"
Rhyme 0:94d52137914c 9 #include "Arial24x23.h"
Rhyme 0:94d52137914c 10 #include "Arial28x28.h"
Rhyme 0:94d52137914c 11 #include "font_big.h"
Rhyme 0:94d52137914c 12
Rhyme 0:94d52137914c 13 #define PIN_MOSI PTD2
Rhyme 0:94d52137914c 14 #define PIN_MISO PTD3
Rhyme 0:94d52137914c 15 #define PIN_SCLK PTD1
Rhyme 0:94d52137914c 16 #define PIN_CS_TFT PTD0
Rhyme 0:94d52137914c 17 #define PIN_DC_TFT PTD5
Rhyme 0:94d52137914c 18 #define PIN_BL_TFT PTC9
Rhyme 0:94d52137914c 19 #define PIN_CS_SD PTA4
Rhyme 0:94d52137914c 20 #define PIN_CS_TSC PTA13
Rhyme 0:94d52137914c 21 #define PIN_TSC_INTR PTC9
Rhyme 0:94d52137914c 22
Rhyme 0:94d52137914c 23 // return values for the adjust menu
Rhyme 0:94d52137914c 24 #define AM_CANCEL 0x00
Rhyme 0:94d52137914c 25 #define AM_OK 0x01
Rhyme 0:94d52137914c 26 #define AM_UP 0x02
Rhyme 0:94d52137914c 27 #define AM_DOWN 0x04
Rhyme 0:94d52137914c 28 #define AM_NG 0xFF
Rhyme 0:94d52137914c 29
Rhyme 0:94d52137914c 30 SPI_TFT_ILI9341 TFT(PIN_MOSI, PIN_MISO, PIN_SCLK, PIN_CS_TFT, PIN_BL_TFT, PIN_DC_TFT) ;
Rhyme 0:94d52137914c 31 SPI_STMPE610 TSC(PIN_MOSI, PIN_MISO, PIN_SCLK, PIN_CS_TSC) ;
Rhyme 0:94d52137914c 32
Rhyme 0:94d52137914c 33 DigitalOut backlight(PTA12) ;
Rhyme 0:94d52137914c 34
Rhyme 0:94d52137914c 35 Ticker timer ;
Rhyme 0:94d52137914c 36 bool ticked = false ;
Rhyme 0:94d52137914c 37 int year = 2014 ;
Rhyme 0:94d52137914c 38 int month = 12 ;
Rhyme 0:94d52137914c 39 int day = 13 ;
Rhyme 0:94d52137914c 40 int hour = 14 ;
Rhyme 0:94d52137914c 41 int min = 40 ;
Rhyme 0:94d52137914c 42 int sec = 0 ;
Rhyme 0:94d52137914c 43 char time_str[32] ;
Rhyme 0:94d52137914c 44
Rhyme 0:94d52137914c 45 void initTFT(void)
Rhyme 0:94d52137914c 46 {
Rhyme 0:94d52137914c 47 //Configure the display driver
Rhyme 0:94d52137914c 48 TFT.background(Black);
Rhyme 0:94d52137914c 49 TFT.foreground(White);
Rhyme 0:94d52137914c 50 wait(0.01) ;
Rhyme 0:94d52137914c 51 TFT.cls();
Rhyme 0:94d52137914c 52 }
Rhyme 0:94d52137914c 53
Rhyme 0:94d52137914c 54 void drawAdjustMenu(void)
Rhyme 0:94d52137914c 55 {
Rhyme 0:94d52137914c 56 TFT.set_font((unsigned char*) Arial12x12);
Rhyme 0:94d52137914c 57 TFT.locate(180, 100) ;
Rhyme 0:94d52137914c 58 TFT.foreground(Yellow) ;
Rhyme 0:94d52137914c 59 TFT.printf("UP") ;
Rhyme 0:94d52137914c 60 TFT.locate(180, 160) ;
Rhyme 0:94d52137914c 61 TFT.foreground(Yellow) ;
Rhyme 0:94d52137914c 62 TFT.printf("DOWN") ;
Rhyme 0:94d52137914c 63 TFT.locate(20, 280) ;
Rhyme 0:94d52137914c 64 TFT.foreground(Blue) ;
Rhyme 0:94d52137914c 65 TFT.printf("CANCEL") ;
Rhyme 0:94d52137914c 66 TFT.locate(200, 280) ;
Rhyme 0:94d52137914c 67 TFT.foreground(Green) ;
Rhyme 0:94d52137914c 68 TFT.printf("OK") ;
Rhyme 0:94d52137914c 69 }
Rhyme 0:94d52137914c 70
Rhyme 0:94d52137914c 71 int getAdjustMenu(void)
Rhyme 0:94d52137914c 72 {
Rhyme 0:94d52137914c 73 uint16_t x, y, z ;
Rhyme 0:94d52137914c 74 int result = AM_NG ;
Rhyme 0:94d52137914c 75 if ( TSC.getPoint(&x, &y, &z)) {
Rhyme 0:94d52137914c 76 if ((180 <= x)&&(x < 240)&&(80 <= y)&&(y < 120)) { // up
Rhyme 0:94d52137914c 77 result = AM_UP ;
Rhyme 0:94d52137914c 78 } else if ((180 <= x)&&(x < 240)&&(140 <= y)&&(y < 180)) { // down
Rhyme 0:94d52137914c 79 result = AM_DOWN ;
Rhyme 0:94d52137914c 80 } else if ((20 <= x)&&(x < 60)&&(260 <= y)) { // cancel
Rhyme 0:94d52137914c 81 result = AM_CANCEL ;
Rhyme 0:94d52137914c 82 } else if ((200 <= x)&&(x < 240)&&(260 <= y)) { // OK
Rhyme 0:94d52137914c 83 result = AM_OK ;
Rhyme 0:94d52137914c 84 }
Rhyme 0:94d52137914c 85 }
Rhyme 0:94d52137914c 86 return(result) ;
Rhyme 0:94d52137914c 87 }
Rhyme 0:94d52137914c 88
Rhyme 0:94d52137914c 89 void set_hour(void)
Rhyme 0:94d52137914c 90 {
Rhyme 0:94d52137914c 91 bool selected = false ;
Rhyme 0:94d52137914c 92 int16_t tmp_hour, prev_value = -1 ;
Rhyme 0:94d52137914c 93 char str[4] ;
Rhyme 0:94d52137914c 94 tmp_hour = hour ;
Rhyme 0:94d52137914c 95 TFT.cls() ;
Rhyme 0:94d52137914c 96 TFT.foreground(White) ;
Rhyme 0:94d52137914c 97 TFT.set_font((unsigned char*) Arial28x28);
Rhyme 0:94d52137914c 98 TFT.locate(60, 50) ;
Rhyme 0:94d52137914c 99 TFT.printf("Set Hour") ;
Rhyme 0:94d52137914c 100
Rhyme 0:94d52137914c 101 while(!selected) {
Rhyme 0:94d52137914c 102 if (tmp_hour != prev_value) {
Rhyme 0:94d52137914c 103 TFT.foreground(White) ;
Rhyme 0:94d52137914c 104 TFT.set_font((unsigned char*) Arial28x28);
Rhyme 0:94d52137914c 105 sprintf(str, " %02d ", tmp_hour) ;
Rhyme 0:94d52137914c 106 TFT.locate(80, 120) ;
Rhyme 0:94d52137914c 107 TFT.printf(str) ;
Rhyme 0:94d52137914c 108
Rhyme 0:94d52137914c 109 drawAdjustMenu() ;
Rhyme 0:94d52137914c 110 prev_value = tmp_hour ;
Rhyme 0:94d52137914c 111 }
Rhyme 0:94d52137914c 112
Rhyme 0:94d52137914c 113 switch(getAdjustMenu()) {
Rhyme 0:94d52137914c 114 case AM_CANCEL:
Rhyme 0:94d52137914c 115 selected = true ;
Rhyme 0:94d52137914c 116 break ;
Rhyme 0:94d52137914c 117 case AM_OK:
Rhyme 0:94d52137914c 118 hour = tmp_hour ;
Rhyme 0:94d52137914c 119 selected = true ;
Rhyme 0:94d52137914c 120 break ;
Rhyme 0:94d52137914c 121 case AM_UP:
Rhyme 0:94d52137914c 122 tmp_hour++ ;
Rhyme 0:94d52137914c 123 if (tmp_hour > 23) {
Rhyme 0:94d52137914c 124 tmp_hour = 0 ;
Rhyme 0:94d52137914c 125 }
Rhyme 0:94d52137914c 126 break ;
Rhyme 0:94d52137914c 127 case AM_DOWN:
Rhyme 0:94d52137914c 128 tmp_hour-- ;
Rhyme 0:94d52137914c 129 if (tmp_hour < 0) {
Rhyme 0:94d52137914c 130 tmp_hour = 0 ;
Rhyme 0:94d52137914c 131 }
Rhyme 0:94d52137914c 132 default:
Rhyme 0:94d52137914c 133 break ;
Rhyme 0:94d52137914c 134 }
Rhyme 0:94d52137914c 135 wait(0.1) ;
Rhyme 0:94d52137914c 136 }
Rhyme 0:94d52137914c 137 TFT.cls() ;
Rhyme 0:94d52137914c 138 }
Rhyme 0:94d52137914c 139
Rhyme 0:94d52137914c 140 void set_min(void)
Rhyme 0:94d52137914c 141 {
Rhyme 0:94d52137914c 142 bool selected = false ;
Rhyme 0:94d52137914c 143 int16_t tmp_min, prev_value = -1 ;
Rhyme 0:94d52137914c 144 char str[4] ;
Rhyme 0:94d52137914c 145 tmp_min = min ;
Rhyme 0:94d52137914c 146 TFT.cls() ;
Rhyme 0:94d52137914c 147 TFT.set_font((unsigned char*) Arial28x28);
Rhyme 0:94d52137914c 148 TFT.foreground(White) ;
Rhyme 0:94d52137914c 149 TFT.locate(60, 50) ;
Rhyme 0:94d52137914c 150 TFT.printf("Set Min") ;
Rhyme 0:94d52137914c 151
Rhyme 0:94d52137914c 152 while(!selected) {
Rhyme 0:94d52137914c 153 if (tmp_min != prev_value) {
Rhyme 0:94d52137914c 154 TFT.set_font((unsigned char*) Arial28x28);
Rhyme 0:94d52137914c 155 TFT.foreground(White) ;
Rhyme 0:94d52137914c 156 sprintf(str, " %02d ", tmp_min) ;
Rhyme 0:94d52137914c 157 TFT.locate(80, 120) ;
Rhyme 0:94d52137914c 158 TFT.printf(str) ;
Rhyme 0:94d52137914c 159
Rhyme 0:94d52137914c 160 drawAdjustMenu() ;
Rhyme 0:94d52137914c 161 prev_value = tmp_min ;
Rhyme 0:94d52137914c 162 }
Rhyme 0:94d52137914c 163
Rhyme 0:94d52137914c 164 switch(getAdjustMenu()) {
Rhyme 0:94d52137914c 165 case AM_CANCEL:
Rhyme 0:94d52137914c 166 selected = true ;
Rhyme 0:94d52137914c 167 break ;
Rhyme 0:94d52137914c 168 case AM_OK:
Rhyme 0:94d52137914c 169 min = tmp_min ;
Rhyme 0:94d52137914c 170 selected = true ;
Rhyme 0:94d52137914c 171 break ;
Rhyme 0:94d52137914c 172 case AM_UP:
Rhyme 0:94d52137914c 173 tmp_min++ ;
Rhyme 0:94d52137914c 174 if (tmp_min > 59) {
Rhyme 0:94d52137914c 175 tmp_min = 0 ;
Rhyme 0:94d52137914c 176 }
Rhyme 0:94d52137914c 177 break ;
Rhyme 0:94d52137914c 178 case AM_DOWN:
Rhyme 0:94d52137914c 179 tmp_min-- ;
Rhyme 0:94d52137914c 180 if (tmp_min < 0) {
Rhyme 0:94d52137914c 181 tmp_min = 0 ;
Rhyme 0:94d52137914c 182 }
Rhyme 0:94d52137914c 183 default:
Rhyme 0:94d52137914c 184 break ;
Rhyme 0:94d52137914c 185 }
Rhyme 0:94d52137914c 186 wait(0.1) ;
Rhyme 0:94d52137914c 187 }
Rhyme 0:94d52137914c 188 TFT.cls() ;
Rhyme 0:94d52137914c 189 }
Rhyme 0:94d52137914c 190
Rhyme 0:94d52137914c 191 void set_sec(void)
Rhyme 0:94d52137914c 192 {
Rhyme 0:94d52137914c 193 bool selected = false ;
Rhyme 0:94d52137914c 194 int16_t tmp_sec, prev_value = -1 ;
Rhyme 0:94d52137914c 195 char str[4] ;
Rhyme 0:94d52137914c 196 tmp_sec = sec ;
Rhyme 0:94d52137914c 197 TFT.cls() ;
Rhyme 0:94d52137914c 198 TFT.foreground(White) ;
Rhyme 0:94d52137914c 199 TFT.set_font((unsigned char*) Arial28x28);
Rhyme 0:94d52137914c 200 TFT.locate(60, 50) ;
Rhyme 0:94d52137914c 201 TFT.printf("Set Sec") ;
Rhyme 0:94d52137914c 202
Rhyme 0:94d52137914c 203 while(!selected) {
Rhyme 0:94d52137914c 204 if (tmp_sec != prev_value) {
Rhyme 0:94d52137914c 205 TFT.set_font((unsigned char*) Arial28x28);
Rhyme 0:94d52137914c 206 TFT.foreground(White) ;
Rhyme 0:94d52137914c 207 sprintf(str, " %02d ", tmp_sec) ;
Rhyme 0:94d52137914c 208 TFT.locate(80, 120) ;
Rhyme 0:94d52137914c 209 TFT.printf(str) ;
Rhyme 0:94d52137914c 210
Rhyme 0:94d52137914c 211 drawAdjustMenu() ;
Rhyme 0:94d52137914c 212 prev_value = tmp_sec ;
Rhyme 0:94d52137914c 213 }
Rhyme 0:94d52137914c 214
Rhyme 0:94d52137914c 215 switch(getAdjustMenu()) {
Rhyme 0:94d52137914c 216 case AM_CANCEL:
Rhyme 0:94d52137914c 217 selected = true ;
Rhyme 0:94d52137914c 218 break ;
Rhyme 0:94d52137914c 219 case AM_OK:
Rhyme 0:94d52137914c 220 sec = tmp_sec ;
Rhyme 0:94d52137914c 221 selected = true ;
Rhyme 0:94d52137914c 222 break ;
Rhyme 0:94d52137914c 223 case AM_UP:
Rhyme 0:94d52137914c 224 tmp_sec++ ;
Rhyme 0:94d52137914c 225 if (tmp_sec > 59) {
Rhyme 0:94d52137914c 226 tmp_sec = 0 ;
Rhyme 0:94d52137914c 227 }
Rhyme 0:94d52137914c 228 break ;
Rhyme 0:94d52137914c 229 case AM_DOWN:
Rhyme 0:94d52137914c 230 tmp_sec-- ;
Rhyme 0:94d52137914c 231 if (tmp_sec < 0) {
Rhyme 0:94d52137914c 232 tmp_sec = 0 ;
Rhyme 0:94d52137914c 233 }
Rhyme 0:94d52137914c 234 default:
Rhyme 0:94d52137914c 235 break ;
Rhyme 0:94d52137914c 236 }
Rhyme 0:94d52137914c 237 wait(0.2) ;
Rhyme 0:94d52137914c 238 }
Rhyme 0:94d52137914c 239 TFT.cls() ;
Rhyme 0:94d52137914c 240 }
Rhyme 0:94d52137914c 241
Rhyme 0:94d52137914c 242 void set_time(void)
Rhyme 0:94d52137914c 243 {
Rhyme 0:94d52137914c 244 set_hour() ;
Rhyme 0:94d52137914c 245 set_min() ;
Rhyme 0:94d52137914c 246 set_sec() ;
Rhyme 0:94d52137914c 247 }
Rhyme 0:94d52137914c 248
Rhyme 0:94d52137914c 249 void display_time(void)
Rhyme 0:94d52137914c 250 {
Rhyme 0:94d52137914c 251 TFT.set_font((unsigned char*) Arial28x28);
Rhyme 0:94d52137914c 252 TFT.foreground(White) ;
Rhyme 0:94d52137914c 253 sprintf(time_str, " %02d:%02d:%02d ",hour,min,sec) ;
Rhyme 0:94d52137914c 254 TFT.locate(50, 100) ;
Rhyme 0:94d52137914c 255 wait(0.01) ;
Rhyme 0:94d52137914c 256 TFT.printf(time_str) ;
Rhyme 0:94d52137914c 257 wait(0.01) ;
Rhyme 0:94d52137914c 258 }
Rhyme 0:94d52137914c 259
Rhyme 0:94d52137914c 260 void tick_time(void)
Rhyme 0:94d52137914c 261 {
Rhyme 0:94d52137914c 262 sec++ ;
Rhyme 0:94d52137914c 263 if (sec > 59) {
Rhyme 0:94d52137914c 264 min++ ;
Rhyme 0:94d52137914c 265 sec = sec % 60 ;
Rhyme 0:94d52137914c 266 }
Rhyme 0:94d52137914c 267 if (min > 59) {
Rhyme 0:94d52137914c 268 hour++ ;
Rhyme 0:94d52137914c 269 min = min % 60 ;
Rhyme 0:94d52137914c 270 }
Rhyme 0:94d52137914c 271 if (hour > 23) {
Rhyme 0:94d52137914c 272 day++ ;
Rhyme 0:94d52137914c 273 hour = hour % 24 ;
Rhyme 0:94d52137914c 274 }
Rhyme 0:94d52137914c 275 ticked = true ;
Rhyme 0:94d52137914c 276 }
Rhyme 0:94d52137914c 277
Rhyme 0:94d52137914c 278 void draw_adjust_str(void)
Rhyme 0:94d52137914c 279 {
Rhyme 0:94d52137914c 280 TFT.set_font((unsigned char*) Arial12x12) ;
Rhyme 0:94d52137914c 281 TFT.foreground(Blue) ;
Rhyme 0:94d52137914c 282 TFT.locate(180, 280) ;
Rhyme 0:94d52137914c 283 TFT.printf("adjust") ;
Rhyme 0:94d52137914c 284 }
Rhyme 0:94d52137914c 285
Rhyme 0:94d52137914c 286 int main()
Rhyme 0:94d52137914c 287 {
Rhyme 0:94d52137914c 288 uint16_t x, y ;
Rhyme 0:94d52137914c 289
Rhyme 0:94d52137914c 290 initTFT() ;
Rhyme 0:94d52137914c 291 timer.attach(&tick_time, 1) ;
Rhyme 0:94d52137914c 292 draw_adjust_str() ;
Rhyme 0:94d52137914c 293 backlight = 1 ;
Rhyme 0:94d52137914c 294
Rhyme 0:94d52137914c 295 for(;;) {
Rhyme 0:94d52137914c 296 if (ticked) {
Rhyme 0:94d52137914c 297 display_time() ;
Rhyme 0:94d52137914c 298 ticked = false ;
Rhyme 0:94d52137914c 299 }
Rhyme 0:94d52137914c 300
Rhyme 0:94d52137914c 301 if ( TSC.getPoint(&x, &y)) {
Rhyme 0:94d52137914c 302 if ((180 < x)&&(260 < y)) {
Rhyme 0:94d52137914c 303 set_time() ;
Rhyme 0:94d52137914c 304 draw_adjust_str() ;
Rhyme 0:94d52137914c 305 }
Rhyme 0:94d52137914c 306 }
Rhyme 0:94d52137914c 307 }
Rhyme 0:94d52137914c 308 }