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);
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 |