138 lines
3.8 KiB
C++
138 lines
3.8 KiB
C++
#include <SPI.h>
|
|
#include <Adafruit_GFX.h>
|
|
#include <TFT_ILI9163C.h>
|
|
|
|
// 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);
|
|
|
|
}
|
|
}
|
|
|
|
|