
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 というのがありました(笑)
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も付けて見ました。
main.cpp@1:a3749e465942, 2014-12-13 (annotated)
- 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?
User | Revision | Line number | New 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 | } |