99 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
| // Example for drawSmoothCircle function. Which draws anti-aliased circles
 | |
| // The circle periphery has a "thickness" of ~3 pixles to minimise the
 | |
| // "braiding" effect present in narrow anti-aliased lines.
 | |
| 
 | |
| // For thicker or thinner circle outlines use the drawArc function.
 | |
| 
 | |
| #include <TFT_eSPI.h>       // Include the graphics library
 | |
| TFT_eSPI tft = TFT_eSPI();  // Create object "tft"
 | |
| 
 | |
| // -------------------------------------------------------------------------
 | |
| // Setup
 | |
| // -------------------------------------------------------------------------
 | |
| void setup(void) {
 | |
|   Serial.begin(115200);
 | |
|   tft.init();
 | |
|   tft.fillScreen(TFT_BLACK);
 | |
| }
 | |
| 
 | |
| // -------------------------------------------------------------------------
 | |
| // Main loop
 | |
| // -------------------------------------------------------------------------
 | |
| void loop()
 | |
| {
 | |
|   static uint32_t radius = 2;
 | |
|   static uint32_t index = 0;
 | |
| 
 | |
|   uint16_t fg_color = rainbow(index);
 | |
|   uint16_t bg_color = TFT_BLACK;       // This is the background colour used for smoothing (anti-aliasing)
 | |
| 
 | |
|   uint16_t x = tft.width() / 2; // Position of centre of arc
 | |
|   uint16_t y = tft.height() / 2;
 | |
| 
 | |
|   tft.drawSmoothCircle(x, y, radius, fg_color, bg_color);
 | |
| 
 | |
|   radius += 11;
 | |
|   index += 5;
 | |
|   index = index%192;
 | |
| 
 | |
|   if (radius > tft.height()/2) {
 | |
|     delay (1000);
 | |
|     radius = 2;
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| // -------------------------------------------------------------------------
 | |
| // Return a 16 bit rainbow colour
 | |
| // -------------------------------------------------------------------------
 | |
| unsigned int rainbow(byte value)
 | |
| {
 | |
|   // If 'value' is in the range 0-159 it is converted to a spectrum colour
 | |
|   // from 0 = red through to 127 = blue to 159 = violet
 | |
|   // Extending the range to 0-191 adds a further violet to red band
 | |
|  
 | |
|   value = value%192;
 | |
|   
 | |
|   byte red   = 0; // Red is the top 5 bits of a 16 bit colour value
 | |
|   byte green = 0; // Green is the middle 6 bits, but only top 5 bits used here
 | |
|   byte blue  = 0; // Blue is the bottom 5 bits
 | |
| 
 | |
|   byte sector = value >> 5;
 | |
|   byte amplit = value & 0x1F;
 | |
| 
 | |
|   switch (sector)
 | |
|   {
 | |
|     case 0:
 | |
|       red   = 0x1F;
 | |
|       green = amplit; // Green ramps up
 | |
|       blue  = 0;
 | |
|       break;
 | |
|     case 1:
 | |
|       red   = 0x1F - amplit; // Red ramps down
 | |
|       green = 0x1F;
 | |
|       blue  = 0;
 | |
|       break;
 | |
|     case 2:
 | |
|       red   = 0;
 | |
|       green = 0x1F;
 | |
|       blue  = amplit; // Blue ramps up
 | |
|       break;
 | |
|     case 3:
 | |
|       red   = 0;
 | |
|       green = 0x1F - amplit; // Green ramps down
 | |
|       blue  = 0x1F;
 | |
|       break;
 | |
|     case 4:
 | |
|       red   = amplit; // Red ramps up
 | |
|       green = 0;
 | |
|       blue  = 0x1F;
 | |
|       break;
 | |
|     case 5:
 | |
|       red   = 0x1F;
 | |
|       green = 0;
 | |
|       blue  = 0x1F - amplit; // Blue ramps down
 | |
|       break;
 | |
|   }
 | |
|   return red << 11 | green << 6 | blue;
 | |
| }
 |