#include #include #include // Color definitions #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF /* Teensy3.x and Arduino's You are using 4 wire SPI here, so: MOSI: 11//Teensy3.x/Arduino UNO (for MEGA/DUE refere to arduino site) MISO: 12//Teensy3.x/Arduino UNO (for MEGA/DUE refere to arduino site) SCK: 13//Teensy3.x/Arduino UNO (for MEGA/DUE refere to arduino site) the rest of pin below: */ #define __CS 10 #define __DC 9 /* Teensy 3.x can use: 2,6,9,10,15,20,21,22,23 Arduino's 8 bit: any DUE: check arduino site If you do not use reset, tie it to +3V3 */ TFT_ILI9163C tft = TFT_ILI9163C(__CS, __DC); uint16_t ccenterx,ccentery;//center x,y of the clock const uint16_t cradius = 63;//radius of the clock const float scosConst = 0.0174532925; float sx = 0, sy = 1, mx = 1, my = 0, hx = -1, hy = 0; float sdeg=0, mdeg=0, hdeg=0; uint16_t osx,osy,omx,omy,ohx,ohy; uint16_t x0 = 0, x1 = 0, yy0 = 0, yy1 = 0; uint32_t targetTime = 0;// for next 1 second timeout uint8_t hh,mm,ss; //containers for current time void drawClockFace(){ tft.fillCircle(ccenterx, ccentery, cradius, BLUE); tft.fillCircle(ccenterx, ccentery, cradius-4, BLACK); // Draw 12 lines for(int i = 0; i<360; i+= 30) { sx = cos((i-90)*scosConst); sy = sin((i-90)*scosConst); x0 = sx*(cradius-4)+ccenterx; yy0 = sy*(cradius-4)+ccentery; x1 = sx*(cradius-11)+ccenterx; yy1 = sy*(cradius-11)+ccentery; tft.drawLine(x0, yy0, x1, yy1, BLUE); } } static uint8_t conv2d(const char* p) { uint8_t v = 0; if ('0' <= *p && *p <= '9') v = *p - '0'; return 10 * v + *++p - '0'; } void setup(void) { tft.begin(); tft.setTextColor(WHITE, BLACK); ccenterx = tft.width()/2; ccentery = tft.height()/2; osx = ccenterx; osy = ccentery; omx = ccenterx; omy = ccentery; ohx = ccenterx; ohy = ccentery; drawClockFace();// Draw clock face //get current time from compiler hh = conv2d(__TIME__); mm = conv2d(__TIME__+3); ss = conv2d(__TIME__+6); targetTime = millis() + 1000; } void drawClockHands(uint8_t h,uint8_t m,uint8_t s){ // Pre-compute hand degrees, x & y coords for a fast screen update sdeg = s * 6; // 0-59 -> 0-354 mdeg = m * 6 + sdeg * 0.01666667; // 0-59 -> 0-360 - includes seconds hdeg = h * 30 + mdeg * 0.0833333; // 0-11 -> 0-360 - includes minutes and seconds hx = cos((hdeg-90)*scosConst); hy = sin((hdeg-90)*scosConst); mx = cos((mdeg-90)*scosConst); my = sin((mdeg-90)*scosConst); sx = cos((sdeg-90)*scosConst); sy = sin((sdeg-90)*scosConst); // Erase just old hand positions tft.drawLine(ohx, ohy, ccenterx+1, ccentery+1, BLACK); tft.drawLine(omx, omy, ccenterx+1, ccentery+1, BLACK); tft.drawLine(osx, osy, ccenterx+1, ccentery+1, BLACK); // Draw new hand positions tft.drawLine(hx*(cradius-28)+ccenterx+1, hy*(cradius-28)+ccentery+1, ccenterx+1, ccentery+1, WHITE); tft.drawLine(mx*(cradius-17)+ccenterx+1, my*(cradius-17)+ccentery+1, ccenterx+1, ccentery+1, WHITE); tft.drawLine(sx*(cradius-14)+ccenterx+1, sy*(cradius-14)+ccentery+1, ccenterx+1, ccentery+1, RED); tft.fillCircle(ccenterx+1, ccentery+1, 3, RED); // Update old x&y coords osx = sx*(cradius-14)+ccenterx+1; osy = sy*(cradius-14)+ccentery+1; omx = mx*(cradius-17)+ccenterx+1; omy = my*(cradius-17)+ccentery+1; ohx = hx*(cradius-28)+ccenterx+1; ohy = hy*(cradius-28)+ccentery+1; } void loop() { if (targetTime < millis()) { targetTime = millis()+1000; ss++; if (ss == 60) { ss = 0; mm++; if(mm > 59) { mm = 0; hh++; if (hh > 23) hh = 0; } } drawClockHands(hh,mm,ss); } }