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 |
Sprite_scroll_16bit.ino (6117B)
1 /* 2 Display "flicker free" scrolling text and updating number 3 4 Example for library: 5 https://github.com/Bodmer/TFT_eSPI 6 7 The sketch has been tested on a 320x240 ILI9341 based TFT, it 8 could be adapted for other screen sizes. 9 10 A Sprite is notionally an invisible graphics screen that is 11 kept in the processors RAM. Graphics can be drawn into the 12 Sprite just as it can be drawn directly to the screen. Once 13 the Sprite is completed it can be plotted onto the screen in 14 any position. If there is sufficient RAM then the Sprite can 15 be the same size as the screen and used as a frame buffer. 16 17 The Sprite occupies (2 * width * height) bytes. 18 19 On a ESP8266 Sprite sizes up to 128 x 160 can be accommodated, 20 this size requires 128*160*2 bytes (40kBytes) of RAM, this must be 21 available or the processor will crash. You need to make the sprite 22 small enough to fit, with RAM spare for any "local variables" that 23 may be needed by your sketch and libraries. 24 25 Created by Bodmer 15/11/17 26 27 ######################################################################### 28 ###### DON'T FORGET TO UPDATE THE User_Setup.h FILE IN THE LIBRARY ###### 29 ######################################################################### 30 */ 31 32 // Size of sprite image for the scrolling text, this requires ~14 Kbytes of RAM 33 #define IWIDTH 240 34 #define IHEIGHT 30 35 36 // Pause in milliseconds to set scroll speed 37 #define WAIT 0 38 39 #include <TFT_eSPI.h> // Include the graphics library (this includes the sprite functions) 40 41 TFT_eSPI tft = TFT_eSPI(); // Create object "tft" 42 43 TFT_eSprite img = TFT_eSprite(&tft); // Create Sprite object "img" with pointer to "tft" object 44 // // the pointer is used by pushSprite() to push it onto the TFT 45 46 // ------------------------------------------------------------------------- 47 // Setup 48 // ------------------------------------------------------------------------- 49 void setup(void) { 50 tft.init(); 51 tft.setRotation(0); 52 53 tft.fillScreen(TFT_BLUE); 54 } 55 56 // ------------------------------------------------------------------------- 57 // Main loop 58 // ------------------------------------------------------------------------- 59 void loop() { 60 61 while (1) 62 { 63 // Create the sprite and clear background to black 64 img.createSprite(IWIDTH, IHEIGHT); 65 //img.fillSprite(TFT_BLACK); // Optional here as we fill the sprite later anyway 66 67 for (int pos = IWIDTH; pos > 0; pos--) 68 { 69 build_banner("Hello World", pos); 70 img.pushSprite(0, 0); 71 72 build_banner("TFT_eSPI sprite" , pos); 73 img.pushSprite(0, 50); 74 75 delay(WAIT); 76 } 77 78 // Delete sprite to free up the memory 79 img.deleteSprite(); 80 81 // Create a sprite of a different size 82 numberBox(random(100), 60, 100); 83 84 } 85 } 86 87 // ######################################################################### 88 // Build the scrolling sprite image from scratch, draw text at x = xpos 89 // ######################################################################### 90 91 void build_banner(String msg, int xpos) 92 { 93 int h = IHEIGHT; 94 95 // We could just use fillSprite(color) but lets be a bit more creative... 96 97 // Fill with rainbow stripes 98 while (h--) img.drawFastHLine(0, h, IWIDTH, rainbow(h * 4)); 99 100 // Draw some graphics, the text will apear to scroll over these 101 img.fillRect (IWIDTH / 2 - 20, IHEIGHT / 2 - 10, 40, 20, TFT_YELLOW); 102 img.fillCircle(IWIDTH / 2, IHEIGHT / 2, 10, TFT_ORANGE); 103 104 // Now print text on top of the graphics 105 img.setTextSize(1); // Font size scaling is x1 106 img.setTextFont(4); // Font 4 selected 107 img.setTextColor(TFT_BLACK); // Black text, no background colour 108 img.setTextWrap(false); // Turn of wrap so we can print past end of sprite 109 110 // Need to print twice so text appears to wrap around at left and right edges 111 img.setCursor(xpos, 2); // Print text at xpos 112 img.print(msg); 113 114 img.setCursor(xpos - IWIDTH, 2); // Print text at xpos - sprite width 115 img.print(msg); 116 } 117 118 // ######################################################################### 119 // Create sprite, plot graphics in it, plot to screen, then delete sprite 120 // ######################################################################### 121 void numberBox(int num, int x, int y) 122 { 123 // Create a sprite 80 pixels wide, 50 high (8kbytes of RAM needed) 124 img.createSprite(80, 50); 125 126 // Fill it with black 127 img.fillSprite(TFT_BLACK); 128 129 // Draw a backgorund of 2 filled triangles 130 img.fillTriangle( 0, 0, 0, 49, 40, 25, TFT_RED); 131 img.fillTriangle( 79, 0, 79, 49, 40, 25, TFT_DARKGREEN); 132 133 // Set the font parameters 134 img.setTextSize(1); // Font size scaling is x1 135 img.setFreeFont(&FreeSerifBoldItalic24pt7b); // Select free font 136 img.setTextColor(TFT_WHITE); // White text, no background colour 137 138 // Set text coordinate datum to middle centre 139 img.setTextDatum(MC_DATUM); 140 141 // Draw the number in middle of 80 x 50 sprite 142 img.drawNumber(num, 40, 25); 143 144 // Push sprite to TFT screen CGRAM at coordinate x,y (top left corner) 145 img.pushSprite(x, y); 146 147 // Delete sprite to free up the RAM 148 img.deleteSprite(); 149 } 150 151 152 // ######################################################################### 153 // Return a 16 bit rainbow colour 154 // ######################################################################### 155 unsigned int rainbow(byte value) 156 { 157 // Value is expected to be in range 0-127 158 // The value is converted to a spectrum colour from 0 = red through to 127 = blue 159 160 byte red = 0; // Red is the top 5 bits of a 16 bit colour value 161 byte green = 0;// Green is the middle 6 bits 162 byte blue = 0; // Blue is the bottom 5 bits 163 164 byte sector = value >> 5; 165 byte amplit = value & 0x1F; 166 167 switch (sector) 168 { 169 case 0: 170 red = 0x1F; 171 green = amplit; 172 blue = 0; 173 break; 174 case 1: 175 red = 0x1F - amplit; 176 green = 0x1F; 177 blue = 0; 178 break; 179 case 2: 180 red = 0; 181 green = 0x1F; 182 blue = amplit; 183 break; 184 case 3: 185 red = 0; 186 green = 0x1F - amplit; 187 blue = 0x1F; 188 break; 189 } 190 191 return red << 11 | green << 6 | blue; 192 } 193 194