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 09:07:54 2014 +0000
Revision:
1:a3749e465942
Parent:
0:94d52137914c
some clean up is done

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 hour = 14 ;
Rhyme 0:94d52137914c 38 int min = 40 ;
Rhyme 0:94d52137914c 39 int sec = 0 ;
Rhyme 0:94d52137914c 40 char time_str[32] ;
Rhyme 0:94d52137914c 41
Rhyme 0:94d52137914c 42 void initTFT(void)
Rhyme 0:94d52137914c 43 {
Rhyme 0:94d52137914c 44 //Configure the display driver
Rhyme 0:94d52137914c 45 TFT.background(Black);
Rhyme 0:94d52137914c 46 TFT.foreground(White);
Rhyme 0:94d52137914c 47 wait(0.01) ;
Rhyme 0:94d52137914c 48 TFT.cls();
Rhyme 0:94d52137914c 49 }
Rhyme 0:94d52137914c 50
Rhyme 0:94d52137914c 51 void drawAdjustMenu(void)
Rhyme 0:94d52137914c 52 {
Rhyme 0:94d52137914c 53 TFT.set_font((unsigned char*) Arial12x12);
Rhyme 0:94d52137914c 54 TFT.locate(180, 100) ;
Rhyme 0:94d52137914c 55 TFT.foreground(Yellow) ;
Rhyme 0:94d52137914c 56 TFT.printf("UP") ;
Rhyme 0:94d52137914c 57 TFT.locate(180, 160) ;
Rhyme 0:94d52137914c 58 TFT.foreground(Yellow) ;
Rhyme 0:94d52137914c 59 TFT.printf("DOWN") ;
Rhyme 0:94d52137914c 60 TFT.locate(20, 280) ;
Rhyme 0:94d52137914c 61 TFT.foreground(Blue) ;
Rhyme 0:94d52137914c 62 TFT.printf("CANCEL") ;
Rhyme 0:94d52137914c 63 TFT.locate(200, 280) ;
Rhyme 0:94d52137914c 64 TFT.foreground(Green) ;
Rhyme 0:94d52137914c 65 TFT.printf("OK") ;
Rhyme 0:94d52137914c 66 }
Rhyme 0:94d52137914c 67
Rhyme 1:a3749e465942 68 void draw_tmp_value(uint16_t value)
Rhyme 1:a3749e465942 69 {
Rhyme 1:a3749e465942 70 char str[8] ;
Rhyme 1:a3749e465942 71 TFT.foreground(White) ;
Rhyme 1:a3749e465942 72 TFT.set_font((unsigned char*) Arial28x28);
Rhyme 1:a3749e465942 73 sprintf(str, " %02d ", value) ;
Rhyme 1:a3749e465942 74 TFT.locate(80, 120) ;
Rhyme 1:a3749e465942 75 TFT.printf(str) ;
Rhyme 1:a3749e465942 76 }
Rhyme 1:a3749e465942 77
Rhyme 0:94d52137914c 78 int getAdjustMenu(void)
Rhyme 0:94d52137914c 79 {
Rhyme 0:94d52137914c 80 uint16_t x, y, z ;
Rhyme 0:94d52137914c 81 int result = AM_NG ;
Rhyme 0:94d52137914c 82 if ( TSC.getPoint(&x, &y, &z)) {
Rhyme 0:94d52137914c 83 if ((180 <= x)&&(x < 240)&&(80 <= y)&&(y < 120)) { // up
Rhyme 0:94d52137914c 84 result = AM_UP ;
Rhyme 0:94d52137914c 85 } else if ((180 <= x)&&(x < 240)&&(140 <= y)&&(y < 180)) { // down
Rhyme 0:94d52137914c 86 result = AM_DOWN ;
Rhyme 0:94d52137914c 87 } else if ((20 <= x)&&(x < 60)&&(260 <= y)) { // cancel
Rhyme 0:94d52137914c 88 result = AM_CANCEL ;
Rhyme 0:94d52137914c 89 } else if ((200 <= x)&&(x < 240)&&(260 <= y)) { // OK
Rhyme 0:94d52137914c 90 result = AM_OK ;
Rhyme 0:94d52137914c 91 }
Rhyme 0:94d52137914c 92 }
Rhyme 0:94d52137914c 93 return(result) ;
Rhyme 0:94d52137914c 94 }
Rhyme 0:94d52137914c 95
Rhyme 0:94d52137914c 96 void set_hour(void)
Rhyme 0:94d52137914c 97 {
Rhyme 0:94d52137914c 98 bool selected = false ;
Rhyme 0:94d52137914c 99 int16_t tmp_hour, prev_value = -1 ;
Rhyme 0:94d52137914c 100 tmp_hour = hour ;
Rhyme 0:94d52137914c 101 TFT.cls() ;
Rhyme 0:94d52137914c 102 TFT.foreground(White) ;
Rhyme 0:94d52137914c 103 TFT.set_font((unsigned char*) Arial28x28);
Rhyme 0:94d52137914c 104 TFT.locate(60, 50) ;
Rhyme 0:94d52137914c 105 TFT.printf("Set Hour") ;
Rhyme 0:94d52137914c 106
Rhyme 0:94d52137914c 107 while(!selected) {
Rhyme 0:94d52137914c 108 if (tmp_hour != prev_value) {
Rhyme 1:a3749e465942 109 draw_tmp_value(tmp_hour) ;
Rhyme 0:94d52137914c 110 drawAdjustMenu() ;
Rhyme 0:94d52137914c 111 prev_value = tmp_hour ;
Rhyme 0:94d52137914c 112 }
Rhyme 0:94d52137914c 113
Rhyme 0:94d52137914c 114 switch(getAdjustMenu()) {
Rhyme 0:94d52137914c 115 case AM_CANCEL:
Rhyme 0:94d52137914c 116 selected = true ;
Rhyme 0:94d52137914c 117 break ;
Rhyme 0:94d52137914c 118 case AM_OK:
Rhyme 0:94d52137914c 119 hour = tmp_hour ;
Rhyme 0:94d52137914c 120 selected = true ;
Rhyme 0:94d52137914c 121 break ;
Rhyme 0:94d52137914c 122 case AM_UP:
Rhyme 0:94d52137914c 123 tmp_hour++ ;
Rhyme 0:94d52137914c 124 if (tmp_hour > 23) {
Rhyme 0:94d52137914c 125 tmp_hour = 0 ;
Rhyme 0:94d52137914c 126 }
Rhyme 0:94d52137914c 127 break ;
Rhyme 0:94d52137914c 128 case AM_DOWN:
Rhyme 0:94d52137914c 129 tmp_hour-- ;
Rhyme 0:94d52137914c 130 if (tmp_hour < 0) {
Rhyme 0:94d52137914c 131 tmp_hour = 0 ;
Rhyme 0:94d52137914c 132 }
Rhyme 0:94d52137914c 133 default:
Rhyme 0:94d52137914c 134 break ;
Rhyme 0:94d52137914c 135 }
Rhyme 0:94d52137914c 136 wait(0.1) ;
Rhyme 0:94d52137914c 137 }
Rhyme 0:94d52137914c 138 TFT.cls() ;
Rhyme 0:94d52137914c 139 }
Rhyme 0:94d52137914c 140
Rhyme 0:94d52137914c 141 void set_min(void)
Rhyme 0:94d52137914c 142 {
Rhyme 0:94d52137914c 143 bool selected = false ;
Rhyme 0:94d52137914c 144 int16_t tmp_min, prev_value = -1 ;
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 1:a3749e465942 154 draw_tmp_value(tmp_min) ;
Rhyme 0:94d52137914c 155 drawAdjustMenu() ;
Rhyme 0:94d52137914c 156 prev_value = tmp_min ;
Rhyme 0:94d52137914c 157 }
Rhyme 0:94d52137914c 158
Rhyme 0:94d52137914c 159 switch(getAdjustMenu()) {
Rhyme 0:94d52137914c 160 case AM_CANCEL:
Rhyme 0:94d52137914c 161 selected = true ;
Rhyme 0:94d52137914c 162 break ;
Rhyme 0:94d52137914c 163 case AM_OK:
Rhyme 0:94d52137914c 164 min = tmp_min ;
Rhyme 0:94d52137914c 165 selected = true ;
Rhyme 0:94d52137914c 166 break ;
Rhyme 0:94d52137914c 167 case AM_UP:
Rhyme 0:94d52137914c 168 tmp_min++ ;
Rhyme 0:94d52137914c 169 if (tmp_min > 59) {
Rhyme 0:94d52137914c 170 tmp_min = 0 ;
Rhyme 0:94d52137914c 171 }
Rhyme 0:94d52137914c 172 break ;
Rhyme 0:94d52137914c 173 case AM_DOWN:
Rhyme 0:94d52137914c 174 tmp_min-- ;
Rhyme 0:94d52137914c 175 if (tmp_min < 0) {
Rhyme 0:94d52137914c 176 tmp_min = 0 ;
Rhyme 0:94d52137914c 177 }
Rhyme 0:94d52137914c 178 default:
Rhyme 0:94d52137914c 179 break ;
Rhyme 0:94d52137914c 180 }
Rhyme 0:94d52137914c 181 wait(0.1) ;
Rhyme 0:94d52137914c 182 }
Rhyme 0:94d52137914c 183 TFT.cls() ;
Rhyme 0:94d52137914c 184 }
Rhyme 0:94d52137914c 185
Rhyme 0:94d52137914c 186 void set_sec(void)
Rhyme 0:94d52137914c 187 {
Rhyme 0:94d52137914c 188 bool selected = false ;
Rhyme 0:94d52137914c 189 int16_t tmp_sec, prev_value = -1 ;
Rhyme 0:94d52137914c 190 tmp_sec = sec ;
Rhyme 0:94d52137914c 191 TFT.cls() ;
Rhyme 0:94d52137914c 192 TFT.foreground(White) ;
Rhyme 0:94d52137914c 193 TFT.set_font((unsigned char*) Arial28x28);
Rhyme 0:94d52137914c 194 TFT.locate(60, 50) ;
Rhyme 0:94d52137914c 195 TFT.printf("Set Sec") ;
Rhyme 0:94d52137914c 196
Rhyme 0:94d52137914c 197 while(!selected) {
Rhyme 0:94d52137914c 198 if (tmp_sec != prev_value) {
Rhyme 1:a3749e465942 199 draw_tmp_value(tmp_sec) ;
Rhyme 0:94d52137914c 200 drawAdjustMenu() ;
Rhyme 0:94d52137914c 201 prev_value = tmp_sec ;
Rhyme 0:94d52137914c 202 }
Rhyme 0:94d52137914c 203
Rhyme 0:94d52137914c 204 switch(getAdjustMenu()) {
Rhyme 0:94d52137914c 205 case AM_CANCEL:
Rhyme 0:94d52137914c 206 selected = true ;
Rhyme 0:94d52137914c 207 break ;
Rhyme 0:94d52137914c 208 case AM_OK:
Rhyme 0:94d52137914c 209 sec = tmp_sec ;
Rhyme 0:94d52137914c 210 selected = true ;
Rhyme 0:94d52137914c 211 break ;
Rhyme 0:94d52137914c 212 case AM_UP:
Rhyme 0:94d52137914c 213 tmp_sec++ ;
Rhyme 0:94d52137914c 214 if (tmp_sec > 59) {
Rhyme 0:94d52137914c 215 tmp_sec = 0 ;
Rhyme 0:94d52137914c 216 }
Rhyme 0:94d52137914c 217 break ;
Rhyme 0:94d52137914c 218 case AM_DOWN:
Rhyme 0:94d52137914c 219 tmp_sec-- ;
Rhyme 0:94d52137914c 220 if (tmp_sec < 0) {
Rhyme 0:94d52137914c 221 tmp_sec = 0 ;
Rhyme 0:94d52137914c 222 }
Rhyme 0:94d52137914c 223 default:
Rhyme 0:94d52137914c 224 break ;
Rhyme 0:94d52137914c 225 }
Rhyme 0:94d52137914c 226 wait(0.2) ;
Rhyme 0:94d52137914c 227 }
Rhyme 0:94d52137914c 228 TFT.cls() ;
Rhyme 0:94d52137914c 229 }
Rhyme 0:94d52137914c 230
Rhyme 0:94d52137914c 231 void set_time(void)
Rhyme 0:94d52137914c 232 {
Rhyme 0:94d52137914c 233 set_hour() ;
Rhyme 0:94d52137914c 234 set_min() ;
Rhyme 0:94d52137914c 235 set_sec() ;
Rhyme 0:94d52137914c 236 }
Rhyme 0:94d52137914c 237
Rhyme 0:94d52137914c 238 void display_time(void)
Rhyme 0:94d52137914c 239 {
Rhyme 0:94d52137914c 240 TFT.set_font((unsigned char*) Arial28x28);
Rhyme 0:94d52137914c 241 TFT.foreground(White) ;
Rhyme 0:94d52137914c 242 sprintf(time_str, " %02d:%02d:%02d ",hour,min,sec) ;
Rhyme 0:94d52137914c 243 TFT.locate(50, 100) ;
Rhyme 0:94d52137914c 244 wait(0.01) ;
Rhyme 0:94d52137914c 245 TFT.printf(time_str) ;
Rhyme 0:94d52137914c 246 wait(0.01) ;
Rhyme 0:94d52137914c 247 }
Rhyme 0:94d52137914c 248
Rhyme 0:94d52137914c 249 void tick_time(void)
Rhyme 0:94d52137914c 250 {
Rhyme 0:94d52137914c 251 sec++ ;
Rhyme 0:94d52137914c 252 if (sec > 59) {
Rhyme 0:94d52137914c 253 min++ ;
Rhyme 0:94d52137914c 254 sec = sec % 60 ;
Rhyme 0:94d52137914c 255 }
Rhyme 0:94d52137914c 256 if (min > 59) {
Rhyme 0:94d52137914c 257 hour++ ;
Rhyme 0:94d52137914c 258 min = min % 60 ;
Rhyme 0:94d52137914c 259 }
Rhyme 0:94d52137914c 260 if (hour > 23) {
Rhyme 0:94d52137914c 261 hour = hour % 24 ;
Rhyme 0:94d52137914c 262 }
Rhyme 0:94d52137914c 263 ticked = true ;
Rhyme 0:94d52137914c 264 }
Rhyme 0:94d52137914c 265
Rhyme 0:94d52137914c 266 void draw_adjust_str(void)
Rhyme 0:94d52137914c 267 {
Rhyme 0:94d52137914c 268 TFT.set_font((unsigned char*) Arial12x12) ;
Rhyme 0:94d52137914c 269 TFT.foreground(Blue) ;
Rhyme 0:94d52137914c 270 TFT.locate(180, 280) ;
Rhyme 0:94d52137914c 271 TFT.printf("adjust") ;
Rhyme 0:94d52137914c 272 }
Rhyme 0:94d52137914c 273
Rhyme 0:94d52137914c 274 int main()
Rhyme 0:94d52137914c 275 {
Rhyme 0:94d52137914c 276 uint16_t x, y ;
Rhyme 0:94d52137914c 277
Rhyme 0:94d52137914c 278 initTFT() ;
Rhyme 0:94d52137914c 279 timer.attach(&tick_time, 1) ;
Rhyme 1:a3749e465942 280 backlight = 1 ;
Rhyme 1:a3749e465942 281 set_time() ;
Rhyme 0:94d52137914c 282 draw_adjust_str() ;
Rhyme 1:a3749e465942 283
Rhyme 0:94d52137914c 284 for(;;) {
Rhyme 0:94d52137914c 285 if (ticked) {
Rhyme 0:94d52137914c 286 display_time() ;
Rhyme 0:94d52137914c 287 ticked = false ;
Rhyme 0:94d52137914c 288 }
Rhyme 0:94d52137914c 289
Rhyme 0:94d52137914c 290 if ( TSC.getPoint(&x, &y)) {
Rhyme 0:94d52137914c 291 if ((180 < x)&&(260 < y)) {
Rhyme 0:94d52137914c 292 set_time() ;
Rhyme 0:94d52137914c 293 draw_adjust_str() ;
Rhyme 0:94d52137914c 294 }
Rhyme 0:94d52137914c 295 }
Rhyme 0:94d52137914c 296 }
Rhyme 0:94d52137914c 297 }