136 lines
3.9 KiB
C++
136 lines
3.9 KiB
C++
/*
|
|
An example digital clock using a TFT LCD screen to show the time.
|
|
Demonstrates use of the font printing routines. (Time updates but date does not.)
|
|
|
|
For a more accurate clock, it would be better to use the RTClib library.
|
|
But this is just a demo.
|
|
|
|
This examples uses the hardware SPI only. Non-hardware SPI
|
|
is just too slow (~8 times slower!)
|
|
|
|
Based on clock sketch by Gilchrist 6/2/2014 1.0
|
|
Updated by Bodmer
|
|
A few colour codes:
|
|
|
|
code color
|
|
0x0000 Black
|
|
0xFFFF White
|
|
0xBDF7 Light Gray
|
|
0x7BEF Dark Gray
|
|
0xF800 Red
|
|
0xFFE0 Yellow
|
|
0xFBE0 Orange
|
|
0x79E0 Brown
|
|
0x7E0 Green
|
|
0x7FF Cyan
|
|
0x1F Blue
|
|
0xF81F Pink
|
|
|
|
*/
|
|
|
|
#include <TFT_eSPI.h> // Graphics and font library for ST7735 driver chip
|
|
#include <SPI.h>
|
|
|
|
TFT_eSPI tft = TFT_eSPI(); // Invoke library, pins defined in User_Setup.h
|
|
|
|
uint32_t targetTime = 0; // for next 1 second timeout
|
|
|
|
byte omm = 99;
|
|
boolean initial = 1;
|
|
byte xcolon = 0;
|
|
unsigned int colour = 0;
|
|
|
|
static uint8_t conv2d(const char* p) {
|
|
uint8_t v = 0;
|
|
if ('0' <= *p && *p <= '9')
|
|
v = *p - '0';
|
|
return 10 * v + *++p - '0';
|
|
}
|
|
|
|
uint8_t hh=conv2d(__TIME__), mm=conv2d(__TIME__+3), ss=conv2d(__TIME__+6); // Get H, M, S from compile time
|
|
|
|
void setup(void) {
|
|
tft.init();
|
|
tft.setRotation(1);
|
|
tft.fillScreen(TFT_BLACK);
|
|
|
|
tft.setTextColor(TFT_YELLOW, TFT_BLACK); // Note: the new fonts do not draw the background colour
|
|
|
|
targetTime = millis() + 1000;
|
|
}
|
|
|
|
void loop() {
|
|
if (targetTime < millis()) {
|
|
targetTime = millis()+1000;
|
|
ss++; // Advance second
|
|
if (ss==60) {
|
|
ss=0;
|
|
omm = mm;
|
|
mm++; // Advance minute
|
|
if(mm>59) {
|
|
mm=0;
|
|
hh++; // Advance hour
|
|
if (hh>23) {
|
|
hh=0;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (ss==0 || initial) {
|
|
initial = 0;
|
|
tft.setTextColor(TFT_GREEN, TFT_BLACK);
|
|
tft.setCursor (8, 52);
|
|
tft.print(__DATE__); // This uses the standard ADAFruit small font
|
|
|
|
tft.setTextColor(TFT_BLUE, TFT_BLACK);
|
|
tft.drawCentreString("It is windy",120,48,2); // Next size up font 2
|
|
|
|
//tft.setTextColor(0xF81F, TFT_BLACK); // Pink
|
|
//tft.drawCentreString("12.34",80,100,6); // Large font 6 only contains characters [space] 0 1 2 3 4 5 6 7 8 9 . : a p m
|
|
}
|
|
|
|
// Update digital time
|
|
byte xpos = 6;
|
|
byte ypos = 0;
|
|
if (omm != mm) { // Only redraw every minute to minimise flicker
|
|
// Uncomment ONE of the next 2 lines, using the ghost image demonstrates text overlay as time is drawn over it
|
|
tft.setTextColor(0x39C4, TFT_BLACK); // Leave a 7 segment ghost image, comment out next line!
|
|
//tft.setTextColor(TFT_BLACK, TFT_BLACK); // Set font colour to black to wipe image
|
|
// Font 7 is to show a pseudo 7 segment display.
|
|
// Font 7 only contains characters [space] 0 1 2 3 4 5 6 7 8 9 0 : .
|
|
tft.drawString("88:88",xpos,ypos,7); // Overwrite the text to clear it
|
|
tft.setTextColor(0xFBE0, TFT_BLACK); // Orange
|
|
omm = mm;
|
|
|
|
if (hh<10) xpos+= tft.drawChar('0',xpos,ypos,7);
|
|
xpos+= tft.drawNumber(hh,xpos,ypos,7);
|
|
xcolon=xpos;
|
|
xpos+= tft.drawChar(':',xpos,ypos,7);
|
|
if (mm<10) xpos+= tft.drawChar('0',xpos,ypos,7);
|
|
tft.drawNumber(mm,xpos,ypos,7);
|
|
}
|
|
|
|
if (ss%2) { // Flash the colon
|
|
tft.setTextColor(0x39C4, TFT_BLACK);
|
|
xpos+= tft.drawChar(':',xcolon,ypos,7);
|
|
tft.setTextColor(0xFBE0, TFT_BLACK);
|
|
}
|
|
else {
|
|
tft.drawChar(':',xcolon,ypos,7);
|
|
colour = random(0xFFFF);
|
|
// Erase the old text with a rectangle, the disadvantage of this method is increased display flicker
|
|
tft.fillRect (0, 64, 160, 20, TFT_BLACK);
|
|
tft.setTextColor(colour);
|
|
tft.drawRightString("Colour",75,64,4); // Right justified string drawing to x position 75
|
|
String scolour = String(colour,HEX);
|
|
scolour.toUpperCase();
|
|
char buffer[20];
|
|
scolour.toCharArray(buffer,20);
|
|
tft.drawString(buffer,82,64,4);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|