acid-drop- Hacking the planet from a LilyGo T-Deck using custom firmware |
git clone git://git.acid.vegas/acid-drop.git |
Log | Files | Refs | Archive | README | LICENSE |
TFT_FillArcSpiral.ino (4286B)
1 // This sketch tests a fillArc function that has been adapted to permit the drawing of spirals 2 3 // Sketch also includes (but does not use) a function to change the brightness of a colour 4 5 #include <TFT_eSPI.h> // Hardware-specific library 6 #include <SPI.h> 7 8 TFT_eSPI tft = TFT_eSPI(); // Invoke custom library 9 10 #define DEG2RAD 0.0174532925 11 12 int segment = 0; 13 unsigned int col = 0; 14 int delta = -1; 15 16 byte red = 31; // Red is the top 5 bits of a 16 bit colour value 17 byte green = 0;// Green is the middle 6 bits 18 byte blue = 0; // Blue is the bottom 5 bits 19 byte state = 0; 20 21 void setup(void) { 22 tft.begin(); 23 24 tft.setRotation(1); 25 26 tft.fillScreen(TFT_BLACK); 27 } 28 29 30 void loop() { 31 fillArc(160, 120, segment*6, 1, 120-segment/4, 120-segment/4, 3, rainbow(col)); 32 33 segment+=delta; 34 col+=1; 35 if (col>191) col = 0; 36 if (segment <0) delta = 1; 37 if (segment >298) delta = -1; // ~5 turns in the spiral (300*6 degrees) 38 //delay(5); // Slow drawing down 39 } 40 41 // ######################################################################### 42 // Draw an arc with a defined thickness (modified to aid drawing spirals) 43 // ######################################################################### 44 45 // x,y == coords of centre of arc 46 // start_angle = 0 - 359 47 // seg_count = number of 3 degree segments to draw (120 => 360 degree arc) 48 // rx = x axis radius 49 // yx = y axis radius 50 // w = width (thickness) of arc in pixels 51 // colour = 16 bit colour value 52 // Note if rx and ry are the same an arc of a circle is drawn 53 54 void fillArc(int x, int y, int start_angle, int seg_count, int rx, int ry, int w, unsigned int colour) 55 { 56 57 // Make the segment size 7 degrees to prevent gaps when drawing spirals 58 byte seg = 7; // Angle a single segment subtends (made more than 6 deg. for spiral drawing) 59 byte inc = 6; // Draw segments every 6 degrees 60 61 // Draw colour blocks every inc degrees 62 for (int i = start_angle; i < start_angle + seg * seg_count; i += inc) { 63 // Calculate pair of coordinates for segment start 64 float sx = cos((i - 90) * DEG2RAD); 65 float sy = sin((i - 90) * DEG2RAD); 66 uint16_t x0 = sx * (rx - w) + x; 67 uint16_t y0 = sy * (ry - w) + y; 68 uint16_t x1 = sx * rx + x; 69 uint16_t y1 = sy * ry + y; 70 71 // Calculate pair of coordinates for segment end 72 float sx2 = cos((i + seg - 90) * DEG2RAD); 73 float sy2 = sin((i + seg - 90) * DEG2RAD); 74 int x2 = sx2 * (rx - w) + x; 75 int y2 = sy2 * (ry - w) + y; 76 int x3 = sx2 * rx + x; 77 int y3 = sy2 * ry + y; 78 79 tft.fillTriangle(x0, y0, x1, y1, x2, y2, colour); 80 tft.fillTriangle(x1, y1, x2, y2, x3, y3, colour); 81 } 82 } 83 84 // ######################################################################### 85 // Return a 16 bit colour with brightness 0 - 100% 86 // ######################################################################### 87 unsigned int brightness(unsigned int colour, int brightness) 88 { 89 byte red = colour >> 11; 90 byte green = (colour & 0x7E0) >> 5; 91 byte blue = colour & 0x1F; 92 93 blue = (blue * brightness)/100; 94 green = (green * brightness)/100; 95 red = (red * brightness)/100; 96 97 return (red << 11) + (green << 5) + blue; 98 } 99 100 // ######################################################################### 101 // Return a 16 bit rainbow colour 102 // ######################################################################### 103 unsigned int rainbow(byte value) 104 { 105 // Value is expected to be in range 0-127 106 // The value is converted to a spectrum colour from 0 = blue through to 127 = red 107 108 switch (state) { 109 case 0: 110 green ++; 111 if (green == 64) { 112 green = 63; 113 state = 1; 114 } 115 break; 116 case 1: 117 red--; 118 if (red == 255) { 119 red = 0; 120 state = 2; 121 } 122 break; 123 case 2: 124 blue ++; 125 if (blue == 32) { 126 blue = 31; 127 state = 3; 128 } 129 break; 130 case 3: 131 green --; 132 if (green == 255) { 133 green = 0; 134 state = 4; 135 } 136 break; 137 case 4: 138 red ++; 139 if (red == 32) { 140 red = 31; 141 state = 5; 142 } 143 break; 144 case 5: 145 blue --; 146 if (blue == 255) { 147 blue = 0; 148 state = 0; 149 } 150 break; 151 } 152 return red << 11 | green << 5 | blue; 153 } 154