├── LED-Matrix-Banana-Dance-Display └── LED-Matrix-Banana-Dance-Display.ino ├── LED-Matrix-Hackster-Display └── LED-Matrix-Hackster-Display.ino ├── LED-Matrix-Instructables-Display └── LED-Matrix-Instructables-Display.ino ├── LED-Matrix-Kickstarter-Stats-Display └── LED-Matrix-Kickstarter-Stats-Display.ino ├── LED-Matrix-Mario-Display └── LED-Matrix-Mario-Display.ino ├── RGBMatrixWithGraphs └── RGBMatrixWithGraphs.ino └── Wiring.png /LED-Matrix-Hackster-Display/LED-Matrix-Hackster-Display.ino: -------------------------------------------------------------------------------- 1 | /******************************************************************* 2 | Using a 64 * 32 RGB Matrix to displays the Hackster.io 3 | Icon! 4 | * * 5 | Written by Brian Lough 6 | https://www.youtube.com/channel/UCezJOfu7OtqGzd5xrP3q6WA 7 | *******************************************************************/ 8 | 9 | // ---------------------------- 10 | // Standard Libraries - Already Installed if you have ESP8266 set up 11 | // ---------------------------- 12 | 13 | #include 14 | 15 | // ---------------------------- 16 | // Additional Libraries - each one of these will need to be installed. 17 | // ---------------------------- 18 | 19 | 20 | #include 21 | // The library for controlling the LED Matrix 22 | // Needs to be manually downloaded and installed 23 | // https://github.com/2dom/PxMatrix 24 | 25 | 26 | Ticker display_ticker; 27 | 28 | // Pins for LED MATRIX 29 | #define P_LAT 16 30 | #define P_A 5 31 | #define P_B 4 32 | #define P_C 15 33 | #define P_OE 2 34 | #define P_D 12 35 | #define P_E 0 36 | 37 | // PxMATRIX display(32,16,P_LAT, P_OE,P_A,P_B,P_C); 38 | // PxMATRIX display(64,32,P_LAT, P_OE,P_A,P_B,P_C,P_D); 39 | PxMATRIX display(64, 32, P_LAT, P_OE, P_A, P_B, P_C, P_D, P_E); 40 | 41 | // Some standard colors 42 | uint16_t myRED = display.color565(255, 0, 0); 43 | uint16_t myGREEN = display.color565(0, 255, 0); 44 | uint16_t myBLUE = display.color565(0, 0, 255); 45 | uint16_t myWHITE = display.color565(255, 255, 255); 46 | uint16_t myYELLOW = display.color565(255, 255, 0); 47 | uint16_t myCYAN = display.color565(0, 255, 255); 48 | uint16_t myMAGENTA = display.color565(255, 0, 255); 49 | uint16_t myBLACK = display.color565(0, 0, 0); 50 | 51 | uint16 myCOLORS[8] = {myRED, myGREEN, myBLUE, myWHITE, myYELLOW, myCYAN, myMAGENTA, myBLACK}; 52 | 53 | // Converted using the following site: http://www.rinkydinkelectronics.com/t_imageconverter565.php 54 | uint16_t static image[] = { 55 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0021, 0x096B, 0x1292, 0x1358, 0x1BDC, 0x1C3E, // 0x0010 (16) pixels 56 | 0x1C3E, 0x1BDC, 0x1358, 0x1292, 0x096B, 0x0021, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0020 (32) pixels 57 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0084, 0x1292, 0x1BFD, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, // 0x0030 (48) pixels 58 | 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1BFD, 0x1292, 0x0084, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0040 (64) pixels 59 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0A30, 0x1BFD, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, // 0x0050 (80) pixels 60 | 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1BFD, 0x0A30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0060 (96) pixels 61 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0083, 0x1379, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, // 0x0070 (112) pixels 62 | 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1379, 0x0083, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0080 (128) pixels 63 | 0x0000, 0x0000, 0x0000, 0x0000, 0x00A5, 0x1BBB, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, // 0x0090 (144) pixels 64 | 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1BBB, 0x00A5, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00A0 (160) pixels 65 | 0x0000, 0x0000, 0x0000, 0x0083, 0x1BBB, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, // 0x00B0 (176) pixels 66 | 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0xFFFF, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1BBB, 0x0084, 0x0000, 0x0000, 0x0000, // 0x00C0 (192) pixels 67 | 0x0000, 0x0000, 0x0000, 0x1379, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, // 0x00D0 (208) pixels 68 | 0x1C3E, 0x1C3E, 0x1C3E, 0xFFFF, 0xFFFF, 0xFFFF, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1379, 0x0020, 0x0000, 0x0000, // 0x00E0 (224) pixels 69 | 0x0000, 0x0000, 0x0A30, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0xFFFF, 0x1C3E, 0x1C3E, // 0x00F0 (240) pixels 70 | 0x1C3E, 0x1C3E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x0A30, 0x0000, 0x0000, // 0x0100 (256) pixels 71 | 0x0000, 0x0084, 0x1BFD, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0xFFFF, 0xFFFF, 0xFFFF, 0x1C3E, 0x1C3E, // 0x0110 (272) pixels 72 | 0x1C3E, 0x1C3E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C1E, 0x0084, 0x0000, // 0x0120 (288) pixels 73 | 0x0000, 0x1292, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x1C3E, 0x1C3E, // 0x0130 (304) pixels 74 | 0x1C3E, 0x1C3E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1293, 0x0000, // 0x0140 (320) pixels 75 | 0x0021, 0x1BFD, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x243E, 0x1C3E, 0x1C3E, // 0x0150 (336) pixels 76 | 0x1C3E, 0x1C3E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1BFD, 0x0042, // 0x0160 (352) pixels 77 | 0x096B, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0xFFFF, 0x1C3E, 0x1C3E, // 0x0170 (368) pixels 78 | 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x096B, // 0x0180 (384) pixels 79 | 0x1292, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0xFFFF, 0xFFFF, 0xFFFF, 0x1C3E, 0x1C3E, // 0x0190 (400) pixels 80 | 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1292, // 0x01A0 (416) pixels 81 | 0x1358, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01B0 (432) pixels 82 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1358, // 0x01C0 (448) pixels 83 | 0x1BDC, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01D0 (464) pixels 84 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1BDC, // 0x01E0 (480) pixels 85 | 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01F0 (496) pixels 86 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, // 0x0200 (512) pixels 87 | 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x1C3E, // 0x0210 (528) pixels 88 | 0x1C3E, 0x1C3E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, // 0x0220 (544) pixels 89 | 0x1BDC, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, // 0x0230 (560) pixels 90 | 0x1C3E, 0x1C3E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1BDC, // 0x0240 (576) pixels 91 | 0x1359, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x243E, 0x243E, 0x243E, 0x2C5E, 0x1C3E, 0x1C3E, // 0x0250 (592) pixels 92 | 0x1C3E, 0x1C3E, 0xFFFF, 0xFFFF, 0xFFFF, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1359, // 0x0260 (608) pixels 93 | 0x1293, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x1C3E, 0x1C3E, // 0x0270 (624) pixels 94 | 0x1C3E, 0x1C3E, 0xFFFF, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1293, // 0x0280 (640) pixels 95 | 0x096B, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x1C3E, 0x1C3E, // 0x0290 (656) pixels 96 | 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x096B, // 0x02A0 (672) pixels 97 | 0x0042, 0x1BFD, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x1C3E, 0x1C3E, // 0x02B0 (688) pixels 98 | 0x1C3E, 0x1C3E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1BFD, 0x0041, // 0x02C0 (704) pixels 99 | 0x0000, 0x1293, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x1C3E, 0x1C3E, // 0x02D0 (720) pixels 100 | 0x1C3E, 0x1C3E, 0xFFFF, 0xFFFF, 0xFFFF, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1293, 0x0000, // 0x02E0 (736) pixels 101 | 0x0000, 0x00A4, 0x1C1E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x1C3E, 0x1C3E, // 0x02F0 (752) pixels 102 | 0x1C3E, 0x1C3E, 0xFFFF, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C1E, 0x00C5, 0x0000, // 0x0300 (768) pixels 103 | 0x0000, 0x0000, 0x0A30, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x1C3E, 0x1C3E, // 0x0310 (784) pixels 104 | 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1271, 0x0000, 0x0000, // 0x0320 (800) pixels 105 | 0x0000, 0x0000, 0x0021, 0x137A, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0xFFFF, 0xFFFF, 0xFFFF, 0x1C3E, 0x1C3E, 0x1C3E, // 0x0330 (816) pixels 106 | 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x137A, 0x0021, 0x0000, 0x0000, // 0x0340 (832) pixels 107 | 0x0000, 0x0000, 0x0000, 0x00A4, 0x1BDC, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0xFFFF, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, // 0x0350 (848) pixels 108 | 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1BDC, 0x00A4, 0x0000, 0x0000, 0x0000, // 0x0360 (864) pixels 109 | 0x0000, 0x0000, 0x0000, 0x0000, 0x00E7, 0x1BDC, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, // 0x0370 (880) pixels 110 | 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1BDC, 0x00E7, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0380 (896) pixels 111 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00A4, 0x137A, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, // 0x0390 (912) pixels 112 | 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x137A, 0x00A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03A0 (928) pixels 113 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0021, 0x1271, 0x1C1E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, // 0x03B0 (944) pixels 114 | 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C1E, 0x1271, 0x0021, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03C0 (960) pixels 115 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00C5, 0x1293, 0x1BFD, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, // 0x03D0 (976) pixels 116 | 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1C3E, 0x1BFD, 0x1293, 0x00C5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03E0 (992) pixels 117 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0041, 0x096B, 0x1293, 0x1359, 0x1BDC, 0x1C3E, // 0x03F0 (1008) pixels 118 | 0x1C3E, 0x1BDC, 0x1359, 0x1293, 0x096B, 0x0042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0400 (1024) pixels 119 | }; 120 | 121 | 122 | 123 | 124 | 125 | // ISR for display refresh 126 | void display_updater() 127 | { 128 | 129 | display.display(70); 130 | 131 | } 132 | void setup() { 133 | Serial.begin(9600); 134 | display.begin(16); 135 | display.clearDisplay(); 136 | Serial.print("Pixel draw latency in us: "); 137 | unsigned long start_timer = micros(); 138 | display.drawPixel(1, 1, 0); 139 | unsigned long delta_timer = micros() - start_timer; 140 | Serial.println(delta_timer); 141 | 142 | Serial.print("Display update latency in us: "); 143 | start_timer = micros(); 144 | display.display(0); 145 | delta_timer = micros() - start_timer; 146 | Serial.println(delta_timer); 147 | 148 | display_ticker.attach(0.002, display_updater); 149 | yield(); 150 | display.clearDisplay(); 151 | drawImage(16, 0); 152 | delay(500); 153 | } 154 | 155 | void drawImage(int x, int y) 156 | { 157 | int imageHeight = 32; 158 | int imageWidth = 32; 159 | int counter = 0; 160 | for (int yy = 0; yy < imageHeight; yy++) 161 | { 162 | for (int xx = 0; xx < imageWidth; xx++) 163 | { 164 | display.drawPixel(xx + x , yy + y, image[counter]); 165 | counter++; 166 | } 167 | } 168 | } 169 | 170 | 171 | void loop() { 172 | } 173 | -------------------------------------------------------------------------------- /LED-Matrix-Instructables-Display/LED-Matrix-Instructables-Display.ino: -------------------------------------------------------------------------------- 1 | /******************************************************************* 2 | Using a 64 * 32 RGB Matrix to displays the Instructables 3 | Mascot! 4 | * * 5 | Written by Brian Lough 6 | https://www.youtube.com/channel/UCezJOfu7OtqGzd5xrP3q6WA 7 | *******************************************************************/ 8 | 9 | // ---------------------------- 10 | // Standard Libraries - Already Installed if you have ESP8266 set up 11 | // ---------------------------- 12 | 13 | #include 14 | 15 | // ---------------------------- 16 | // Additional Libraries - each one of these will need to be installed. 17 | // ---------------------------- 18 | 19 | 20 | #include 21 | // The library for controlling the LED Matrix 22 | // Needs to be manually downloaded and installed 23 | // https://github.com/2dom/PxMatrix 24 | 25 | 26 | Ticker display_ticker; 27 | 28 | // Pins for LED MATRIX 29 | #define P_LAT 16 30 | #define P_A 5 31 | #define P_B 4 32 | #define P_C 15 33 | #define P_OE 2 34 | #define P_D 12 35 | #define P_E 0 36 | 37 | // PxMATRIX display(32,16,P_LAT, P_OE,P_A,P_B,P_C); 38 | // PxMATRIX display(64,32,P_LAT, P_OE,P_A,P_B,P_C,P_D); 39 | PxMATRIX display(64, 32, P_LAT, P_OE, P_A, P_B, P_C, P_D, P_E); 40 | 41 | // Some standard colors 42 | uint16_t myRED = display.color565(255, 0, 0); 43 | uint16_t myGREEN = display.color565(0, 255, 0); 44 | uint16_t myBLUE = display.color565(0, 0, 255); 45 | uint16_t myWHITE = display.color565(255, 255, 255); 46 | uint16_t myYELLOW = display.color565(255, 255, 0); 47 | uint16_t myCYAN = display.color565(0, 255, 255); 48 | uint16_t myMAGENTA = display.color565(255, 0, 255); 49 | uint16_t myBLACK = display.color565(0, 0, 0); 50 | 51 | uint16 myCOLORS[8] = {myRED, myGREEN, myBLUE, myWHITE, myYELLOW, myCYAN, myMAGENTA, myBLACK}; 52 | 53 | // Converted using the following site: http://www.rinkydinkelectronics.com/t_imageconverter565.php 54 | uint16_t static image[] = { 55 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0010 (16) pixels 56 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0020 (32) pixels 57 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0030 (48) pixels 58 | 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0040 (64) pixels 59 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0050 (80) pixels 60 | 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0060 (96) pixels 61 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFEC0, 0xFEC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0070 (112) pixels 62 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFEC0, 0xFEC0, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0080 (128) pixels 63 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0090 (144) pixels 64 | 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x00A0 (160) pixels 65 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x0000, 0x0000, 0x0000, 0xFEC0, // 0x00B0 (176) pixels 66 | 0xFEC0, 0x0000, 0x0000, 0x0000, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x00C0 (192) pixels 67 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0xF800, 0xF800, 0x0000, 0xFEC0, // 0x00D0 (208) pixels 68 | 0xFEC0, 0x0000, 0xF800, 0xF800, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x00E0 (224) pixels 69 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xF800, 0xF800, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0xF800, 0xF800, 0x0000, 0xFEC0, // 0x00F0 (240) pixels 70 | 0xFEC0, 0x0000, 0xF800, 0xF800, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0xF800, 0xF800, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0100 (256) pixels 71 | 0x07FF, 0x07FF, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x0000, 0x0000, 0x0000, 0xFEC0, // 0x0110 (272) pixels 72 | 0xFEC0, 0x0000, 0x0000, 0x0000, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x07FF, 0x07FF, // 0x0120 (288) pixels 73 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xF800, 0xF800, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0130 (304) pixels 74 | 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0xF800, 0xF800, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0140 (320) pixels 75 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0150 (336) pixels 76 | 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0160 (352) pixels 77 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0170 (368) pixels 78 | 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0180 (384) pixels 79 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFEC0, 0xFEC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0190 (400) pixels 80 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFEC0, 0xFEC0, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x01A0 (416) pixels 81 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x01B0 (432) pixels 82 | 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x01C0 (448) pixels 83 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x01D0 (464) pixels 84 | 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x01E0 (480) pixels 85 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x01F0 (496) pixels 86 | 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0200 (512) pixels 87 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0210 (528) pixels 88 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0220 (544) pixels 89 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0230 (560) pixels 90 | 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0240 (576) pixels 91 | 0x07FF, 0x07FF, 0x0000, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0250 (592) pixels 92 | 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x0000, 0x07FF, 0x07FF, // 0x0260 (608) pixels 93 | 0x0000, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0270 (624) pixels 94 | 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x0000, // 0x0280 (640) pixels 95 | 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0290 (656) pixels 96 | 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, // 0x02A0 (672) pixels 97 | 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x02B0 (688) pixels 98 | 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, // 0x02C0 (704) pixels 99 | 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x0000, 0x0000, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x0000, // 0x02D0 (720) pixels 100 | 0x0000, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x0000, 0x0000, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, // 0x02E0 (736) pixels 101 | 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x7800, 0x7800, 0x7800, 0x7800, 0x0000, 0xFEC0, 0xFEC0, 0x0000, 0x7800, 0x7800, // 0x02F0 (752) pixels 102 | 0x7800, 0x7800, 0x0000, 0xFEC0, 0xFEC0, 0x0000, 0x7800, 0x7800, 0x7800, 0x7800, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, // 0x0300 (768) pixels 103 | 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x7800, 0x7800, 0x7800, 0x7800, 0x0000, 0xFEC0, 0xFEC0, 0x0000, 0x7800, 0x7800, // 0x0310 (784) pixels 104 | 0x7800, 0x7800, 0x0000, 0xFEC0, 0xFEC0, 0x0000, 0x7800, 0x7800, 0x7800, 0x7800, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, // 0x0320 (800) pixels 105 | 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x7800, 0x7800, 0x7800, 0x7800, 0x0000, 0xFEC0, 0xFEC0, 0x0000, 0x7800, 0x7800, // 0x0330 (816) pixels 106 | 0x7800, 0x7800, 0x0000, 0xFEC0, 0xFEC0, 0x0000, 0x7800, 0x7800, 0x7800, 0x7800, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, // 0x0340 (832) pixels 107 | 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x7800, 0x7800, 0x7800, 0x7800, 0x0000, 0xFEC0, 0xFEC0, 0x0000, 0x7800, 0x7800, // 0x0350 (848) pixels 108 | 0x7800, 0x7800, 0x0000, 0xFEC0, 0xFEC0, 0x0000, 0x7800, 0x7800, 0x7800, 0x7800, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, // 0x0360 (864) pixels 109 | 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x0000, 0x0000, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x0000, // 0x0370 (880) pixels 110 | 0x0000, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x0000, 0x0000, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, // 0x0380 (896) pixels 111 | 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x0390 (912) pixels 112 | 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, // 0x03A0 (928) pixels 113 | 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x03B0 (944) pixels 114 | 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, // 0x03C0 (960) pixels 115 | 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03D0 (976) pixels 116 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, // 0x03E0 (992) pixels 117 | 0x0000, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, // 0x03F0 (1008) pixels 118 | 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0xFEC0, 0x0000, // 0x0400 (1024) pixels 119 | }; 120 | 121 | 122 | 123 | // ISR for display refresh 124 | void display_updater() 125 | { 126 | 127 | display.display(70); 128 | 129 | } 130 | void setup() { 131 | Serial.begin(9600); 132 | display.begin(16); 133 | display.clearDisplay(); 134 | Serial.print("Pixel draw latency in us: "); 135 | unsigned long start_timer = micros(); 136 | display.drawPixel(1, 1, 0); 137 | unsigned long delta_timer = micros() - start_timer; 138 | Serial.println(delta_timer); 139 | 140 | Serial.print("Display update latency in us: "); 141 | start_timer = micros(); 142 | display.display(0); 143 | delta_timer = micros() - start_timer; 144 | Serial.println(delta_timer); 145 | 146 | display_ticker.attach(0.002, display_updater); 147 | yield(); 148 | display.clearDisplay(); 149 | drawImage(16, 0); 150 | delay(500); 151 | } 152 | 153 | void drawImage(int x, int y) 154 | { 155 | int imageHeight = 32; 156 | int imageWidth = 32; 157 | int counter = 0; 158 | for (int yy = 0; yy < imageHeight; yy++) 159 | { 160 | for (int xx = 0; xx < imageWidth; xx++) 161 | { 162 | display.drawPixel(xx + x , yy + y, image[counter]); 163 | counter++; 164 | } 165 | } 166 | } 167 | 168 | 169 | void loop() { 170 | } 171 | -------------------------------------------------------------------------------- /LED-Matrix-Kickstarter-Stats-Display/LED-Matrix-Kickstarter-Stats-Display.ino: -------------------------------------------------------------------------------- 1 | /******************************************************************* 2 | Kickstarter Project statistics using an ESP8266 and LED Matrix 3 | 4 | Fetches live kickstarter project data and displays on 5 | a LED Matrix 6 | 7 | By Brian Lough 8 | YouTube: https://www.youtube.com/brianlough 9 | Twitch: https://www.twitch.tv/brianlough 10 | Twitter: https://twitter.com/witnessmenow 11 | 12 | ********************************************************************/ 13 | 14 | // ---------------------------- 15 | // Standard Libraries - Already Installed if you have ESP8266 set up 16 | // ---------------------------- 17 | 18 | #include 19 | #include 20 | #include 21 | #include 22 | 23 | 24 | // ---------------------------- 25 | // Additional Libraries - each one of these will need to be installed. 26 | // ---------------------------- 27 | 28 | 29 | #include 30 | // The library for controlling the LED Matrix 31 | // Search for "PxMatrix" in the Arduino Library manager 32 | // https://github.com/2dom/PxMatrix 33 | // 34 | // NOTE: Has a dependancy on "Adafruit GFX" library (install this too) 35 | 36 | #include 37 | // For fetching the stats from Kickstarter 38 | // Search for "kickstarter" in the Arduino Library manager 39 | // https://github.com/witnessmenow/arduino-kickstarter-stats 40 | 41 | #include 42 | // This Sketch doesn't technically need this, but the KS library does so it must be installed. 43 | // Search for "ArduinoJson" in the library manger 44 | // NOTE: You must install version 5.X as 6.X has breaking changes 45 | // https://github.com/bblanchon/ArduinoJson 46 | 47 | #include 48 | // For handling time 49 | // Needs to be installed manually 50 | // https://github.com/PaulStoffregen/Time 51 | 52 | #include 53 | // For getting the time off the NTP server 54 | // Search for "NTPClient" and install the one by Fabrice Weinberg 55 | // https://github.com/arduino-libraries/NTPClient 56 | 57 | 58 | //------- Replace the following! ------ 59 | char ssid[] = "SSID"; // your network SSID (name) 60 | char password[] = "password"; // your network key 61 | 62 | #define KS_USER "idlehandsdev" // User name on kickstarter: https://www.kickstarter.com/projects/idlehandsdev 63 | 64 | #define KS_PROJECT "hcc-mod-ready-to-solder-arduino-module" // Project name on kickstarter: 65 | // https://www.kickstarter.com/projects/idlehandsdev/hcc-mod-ready-to-solder-arduino-module 66 | 67 | // This does not come back from the API, but it is a constant per project 68 | const long target = 10000; 69 | 70 | const tmElements_t finishTime = {0, 0, 33, 13, 23, 8, CalendarYrToTm(2018)}; 71 | 72 | const String projectName = "HCC MOD"; 73 | 74 | //------------------------------ 75 | 76 | WiFiUDP ntpUDP; 77 | NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 3600, 60000); 78 | 79 | Ticker display_ticker; 80 | 81 | WiFiClientSecure client; 82 | KickstarterStats kss(client); 83 | 84 | unsigned long delayBetweenRequests = 60000; // Time between requests (1 minute) 85 | unsigned long requestDueTime; //time when request due 86 | 87 | unsigned long delayBetweenNTPUpdates = 10000; // Time between requests (10 seconds) 88 | unsigned long ntpUpdateDueTime; //time when request due 89 | 90 | // Pins for LED MATRIX 91 | #define P_LAT 16 92 | #define P_A 5 93 | #define P_B 4 94 | #define P_C 15 95 | #define P_OE 2 96 | #define P_D 12 97 | #define P_E 0 98 | 99 | // PxMATRIX display(32,16,P_LAT, P_OE,P_A,P_B,P_C); 100 | // PxMATRIX display(64,32,P_LAT, P_OE,P_A,P_B,P_C,P_D); 101 | PxMATRIX display(64, 32, P_LAT, P_OE, P_A, P_B, P_C, P_D, P_E); 102 | 103 | // Some standard colors 104 | uint16_t myRED = display.color565(255, 0, 0); 105 | uint16_t myGREEN = display.color565(0, 255, 0); 106 | uint16_t myBLUE = display.color565(0, 0, 255); 107 | uint16_t myWHITE = display.color565(255, 255, 255); 108 | uint16_t myYELLOW = display.color565(255, 255, 0); 109 | uint16_t myCYAN = display.color565(0, 255, 255); 110 | uint16_t myMAGENTA = display.color565(255, 0, 255); 111 | uint16_t myBLACK = display.color565(0, 0, 0); 112 | 113 | uint16 myCOLORS[8] = {myRED, myGREEN, myBLUE, myWHITE, myYELLOW, myCYAN, myMAGENTA, myBLACK}; 114 | 115 | long pledged = 0; 116 | long backerCount = 0; 117 | 118 | // ISR for display refresh 119 | void display_updater() 120 | { 121 | 122 | display.display(70); 123 | 124 | } 125 | void setup() { 126 | 127 | // Define your display layout here, e.g. 1/8 step 128 | display.begin(16); 129 | display.clearDisplay(); 130 | display.setTextColor(myCYAN); 131 | display.setCursor(2, 0); 132 | display.print("Connecting"); 133 | display.setTextColor(myMAGENTA); 134 | display.setCursor(2, 8); 135 | display.print("to the"); 136 | display.setTextColor(myGREEN); 137 | display.setCursor(2, 16); 138 | display.print("WiFi!"); 139 | 140 | // Set WiFi to station mode and disconnect from an AP if it was Previously 141 | // connected 142 | WiFi.mode(WIFI_STA); 143 | WiFi.disconnect(); 144 | delay(100); 145 | 146 | // Attempt to connect to Wifi network: 147 | Serial.print("Connecting Wifi: "); 148 | Serial.println(ssid); 149 | WiFi.begin(ssid, password); 150 | while (WiFi.status() != WL_CONNECTED) { 151 | Serial.print("."); 152 | delay(500); 153 | } 154 | Serial.println(""); 155 | Serial.println("WiFi connected"); 156 | Serial.println("IP address: "); 157 | IPAddress ip = WiFi.localIP(); 158 | Serial.println(ip); 159 | 160 | 161 | Serial.begin(9600); 162 | 163 | Serial.print("Pixel draw latency in us: "); 164 | unsigned long start_timer = micros(); 165 | display.drawPixel(1, 1, 0); 166 | unsigned long delta_timer = micros() - start_timer; 167 | Serial.println(delta_timer); 168 | 169 | Serial.print("Display update latency in us: "); 170 | start_timer = micros(); 171 | display.display(0); 172 | delta_timer = micros() - start_timer; 173 | Serial.println(delta_timer); 174 | 175 | display_ticker.attach(0.002, display_updater); 176 | yield(); 177 | delay(1000); 178 | display.clearDisplay(); 179 | displayName("BRIAN", "LOUGH"); 180 | timeClient.begin(); 181 | delay(1000); 182 | timeClient.forceUpdate(); 183 | Serial.println(timeClient.getEpochTime()); 184 | delay(3000); 185 | } 186 | 187 | void displayText(String text, int yPos) { 188 | int16_t x1, y1; 189 | uint16_t w, h; 190 | display.setTextSize(2); 191 | char charBuf[text.length() + 1]; 192 | text.toCharArray(charBuf, text.length() + 1); 193 | display.getTextBounds(charBuf, 0, yPos, &x1, &y1, &w, &h); 194 | int startingX = 33 - (w / 2); 195 | if (startingX < 0) { 196 | display.setTextSize(1); 197 | display.getTextBounds(charBuf, 0, yPos, &x1, &y1, &w, &h); 198 | startingX = 33 - (w / 2); 199 | } 200 | display.setCursor(startingX, yPos); 201 | Serial.println(startingX); 202 | Serial.println(yPos); 203 | display.print(text); 204 | } 205 | 206 | struct timeLeft_t { 207 | uint8_t Seconds, Minutes, Hours; 208 | uint16_t Days; 209 | } timeLeft; 210 | 211 | 212 | // From this example 213 | // https://pastebin.com/sfEjA94n 214 | void calculateTimeLeft(){ 215 | 216 | //Serial.println((uint32_t)(makeTime(finishTime))); 217 | //Serial.println(timeClient.getEpochTime()); 218 | uint32_t difference = (uint32_t)(makeTime(finishTime) - timeClient.getEpochTime()); 219 | 220 | timeLeft.Seconds = difference % 60; 221 | difference /= 60; // now it is minutes 222 | 223 | timeLeft.Minutes = difference % 60; 224 | difference /= 60; // now it is hours 225 | 226 | timeLeft.Hours = difference % 24; 227 | difference /= 24; // now it is days 228 | 229 | timeLeft.Days = difference; 230 | } 231 | 232 | void updateScreen(long amountPledged, long numBackers) { 233 | calculateTimeLeft(); 234 | display.clearDisplay(); 235 | display.setTextSize(1); 236 | display.setTextColor(myGREEN); 237 | display.setCursor(1, 1); 238 | display.print(projectName); 239 | display.setTextColor(myCYAN); 240 | display.setCursor(1, 9); 241 | String pledged = "$" + String(amountPledged) + " of"; 242 | String goal = String(target/1000) + "K goal"; 243 | display.print(pledged); 244 | display.setTextColor(myMAGENTA); 245 | display.setCursor(1, 17); 246 | display.print(goal); 247 | display.setTextColor(myBLUE); 248 | display.setCursor(1, 25); 249 | String daysLeft = String(timeLeft.Days) + "d left"; 250 | display.print(daysLeft); 251 | } 252 | 253 | void displayName(String first, String last) 254 | { 255 | display.setTextColor(myCYAN); 256 | displayText(first, 1); 257 | display.setTextColor(myMAGENTA); 258 | displayText(last, 17); 259 | } 260 | 261 | void loop() { 262 | if (millis() > ntpUpdateDueTime) { 263 | timeClient.update(); 264 | ntpUpdateDueTime = millis() + delayBetweenNTPUpdates; 265 | } 266 | 267 | if (millis() > requestDueTime) { 268 | if (kss.getProjectStats(KS_USER, KS_PROJECT)) 269 | { 270 | Serial.println("---------Project Stats---------"); 271 | Serial.print("Id: "); 272 | Serial.println(kss.projectStats.id); 273 | Serial.print("State Changed At: "); 274 | Serial.println(kss.projectStats.state_changed_at); 275 | Serial.print("State: "); 276 | Serial.println(kss.projectStats.state); 277 | Serial.print("Backers Count: "); 278 | Serial.println(kss.projectStats.backers_count); 279 | 280 | backerCount = kss.projectStats.backers_count; 281 | 282 | Serial.print("Pledged: $"); 283 | Serial.println(kss.projectStats.pledged); //This comes back in the KS user's currency 284 | pledged = kss.projectStats.pledged; 285 | 286 | Serial.print("Comments Count: "); 287 | Serial.println(kss.projectStats.comments_count); 288 | Serial.println("------------------------"); 289 | 290 | updateScreen(pledged, backerCount); 291 | 292 | } 293 | 294 | requestDueTime = millis() + delayBetweenRequests; 295 | } 296 | } 297 | -------------------------------------------------------------------------------- /LED-Matrix-Mario-Display/LED-Matrix-Mario-Display.ino: -------------------------------------------------------------------------------- 1 | /******************************************************************* 2 | Using a 64 * 32 RGB Matrix to display a mario image 3 | * * 4 | Written by Brian Lough 5 | https://www.youtube.com/channel/UCezJOfu7OtqGzd5xrP3q6WA 6 | *******************************************************************/ 7 | 8 | // ---------------------------- 9 | // Standard Libraries - Already Installed if you have ESP8266 set up 10 | // ---------------------------- 11 | 12 | #include 13 | 14 | // ---------------------------- 15 | // Additional Libraries - each one of these will need to be installed. 16 | // ---------------------------- 17 | 18 | 19 | #include 20 | // The library for controlling the LED Matrix 21 | // Needs to be manually downloaded and installed 22 | // https://github.com/2dom/PxMatrix 23 | 24 | 25 | Ticker display_ticker; 26 | 27 | // Pins for LED MATRIX 28 | #define P_LAT 16 29 | #define P_A 5 30 | #define P_B 4 31 | #define P_C 15 32 | #define P_OE 2 33 | #define P_D 12 34 | #define P_E 0 35 | 36 | // PxMATRIX display(32,16,P_LAT, P_OE,P_A,P_B,P_C); 37 | // PxMATRIX display(64,32,P_LAT, P_OE,P_A,P_B,P_C,P_D); 38 | PxMATRIX display(64, 32, P_LAT, P_OE, P_A, P_B, P_C, P_D, P_E); 39 | 40 | // Some standard colors 41 | uint16_t myRED = display.color565(255, 0, 0); 42 | uint16_t myGREEN = display.color565(0, 255, 0); 43 | uint16_t myBLUE = display.color565(0, 0, 255); 44 | uint16_t myWHITE = display.color565(255, 255, 255); 45 | uint16_t myYELLOW = display.color565(255, 255, 0); 46 | uint16_t myCYAN = display.color565(0, 255, 255); 47 | uint16_t myMAGENTA = display.color565(255, 0, 255); 48 | uint16_t myBLACK = display.color565(0, 0, 0); 49 | 50 | uint16 myCOLORS[8] = {myRED, myGREEN, myBLUE, myWHITE, myYELLOW, myCYAN, myMAGENTA, myBLACK}; 51 | 52 | // This is a horribly inefficient way of drawing this, but meh.. :) 53 | // Converted using the following site: http://www.rinkydinkelectronics.com/t_imageconverter565.php 54 | uint16_t static mario[] = { 55 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0010 (16) pixels 56 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0020 (32) pixels 57 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0030 (48) pixels 58 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0040 (64) pixels 59 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0050 (80) pixels 60 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0060 (96) pixels 61 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0070 (112) pixels 62 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0080 (128) pixels 63 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0090 (144) pixels 64 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x00A0 (160) pixels 65 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x00B0 (176) pixels 66 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x00C0 (192) pixels 67 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x00D0 (208) pixels 68 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x00E0 (224) pixels 69 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, // 0x00F0 (240) pixels 70 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0100 (256) pixels 71 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0110 (272) pixels 72 | 0x07FF, 0x07FF, 0x0000, 0x0000, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0x0000, 0x07FF, 0x07FF, // 0x0120 (288) pixels 73 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFFFF, // 0x0130 (304) pixels 74 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8410, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0140 (320) pixels 75 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0150 (336) pixels 76 | 0x07FF, 0x07FF, 0x0000, 0x6180, 0x6180, 0x0000, 0x07FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6180, 0x0000, 0x07FF, 0x07FF, // 0x0160 (352) pixels 77 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFFFF, 0xFFFF, // 0x0170 (368) pixels 78 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8410, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0180 (384) pixels 79 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0190 (400) pixels 80 | 0x07FF, 0x07FF, 0x0000, 0x6180, 0x6180, 0x6180, 0x0000, 0xF800, 0xF800, 0xF800, 0xF800, 0x0000, 0x6180, 0x0000, 0x07FF, 0x07FF, // 0x01A0 (416) pixels 81 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFFFF, 0xFFFF, // 0x01B0 (432) pixels 82 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8410, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x01C0 (448) pixels 83 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x01D0 (464) pixels 84 | 0x07FF, 0x07FF, 0x0000, 0x6180, 0x6180, 0x6180, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0x0000, 0x07FF, 0x07FF, 0x07FF, // 0x01E0 (480) pixels 85 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFFFF, 0xFFFF, // 0x01F0 (496) pixels 86 | 0xFFFF, 0xFFFF, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0x8410, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0200 (512) pixels 87 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0210 (528) pixels 88 | 0x07FF, 0x07FF, 0x0000, 0x6180, 0x6180, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07FF, 0x07FF, // 0x0220 (544) pixels 89 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0230 (560) pixels 90 | 0xFFFF, 0xFFFF, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8410, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0240 (576) pixels 91 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0250 (592) pixels 92 | 0x07FF, 0x07FF, 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07FF, // 0x0260 (608) pixels 93 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0270 (624) pixels 94 | 0xFFFF, 0xFFFF, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8410, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0280 (640) pixels 95 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0290 (656) pixels 96 | 0x07FF, 0x07FF, 0x0000, 0xF800, 0x0000, 0x0000, 0xFF4F, 0xFF4F, 0xFF4F, 0xFF4F, 0xFF4F, 0xFF4F, 0x0000, 0x0000, 0x07FF, 0x07FF, // 0x02A0 (672) pixels 97 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02B0 (688) pixels 98 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8410, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x02C0 (704) pixels 99 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x02D0 (720) pixels 100 | 0x07FF, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF4F, 0xFF4F, 0xFF4F, 0x0000, 0xFF4F, 0x0000, 0xFF4F, 0x0000, 0x07FF, 0x07FF, 0x07FF, // 0x02E0 (736) pixels 101 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02F0 (752) pixels 102 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8410, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0300 (768) pixels 103 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0310 (784) pixels 104 | 0x07FF, 0x0000, 0xFF4F, 0x0000, 0x0000, 0xFF4F, 0xFF4F, 0xFF4F, 0x0000, 0xFF4F, 0x0000, 0xFF4F, 0x0000, 0x07FF, 0x07FF, 0x07FF, // 0x0320 (800) pixels 105 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0330 (816) pixels 106 | 0xFFFF, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0x8410, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0340 (832) pixels 107 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0350 (848) pixels 108 | 0x0000, 0xFF4F, 0xFF4F, 0x0000, 0x0000, 0x0000, 0xFF4F, 0xFF4F, 0xFF4F, 0xFF4F, 0xFF4F, 0xFF4F, 0xFF4F, 0x0000, 0x07FF, 0x07FF, // 0x0360 (864) pixels 109 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFFFF, 0xFFFF, // 0x0370 (880) pixels 110 | 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0x8410, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0380 (896) pixels 111 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0390 (912) pixels 112 | 0x0000, 0xFF4F, 0xFF4F, 0xFF4F, 0x0000, 0xFF4F, 0xFF4F, 0x0000, 0xFF4F, 0xFF4F, 0xFF4F, 0xFF4F, 0xFF4F, 0x0000, 0x07FF, 0x07FF, // 0x03A0 (928) pixels 113 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFFFF, 0xFFFF, // 0x03B0 (944) pixels 114 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8410, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x03C0 (960) pixels 115 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x03D0 (976) pixels 116 | 0x07FF, 0x0000, 0xFF4F, 0xFF4F, 0xFF4F, 0xFF4F, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF4F, 0xFF4F, 0x0000, 0x0000, 0x0000, 0x07FF, // 0x03E0 (992) pixels 117 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0x8410, 0xFFFF, // 0x03F0 (1008) pixels 118 | 0xFFFF, 0xFFFF, 0xFFFF, 0x8410, 0x8410, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8410, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0400 (1024) pixels 119 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0410 (1040) pixels 120 | 0x07FF, 0x07FF, 0x0000, 0x0000, 0xFF4F, 0xFF4F, 0xFF4F, 0xFF4F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07FF, 0x07FF, // 0x0420 (1056) pixels 121 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0x8410, // 0x0430 (1072) pixels 122 | 0x8410, 0x8410, 0x8410, 0x0000, 0x0000, 0x8410, 0x8410, 0x8410, 0x8410, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0440 (1088) pixels 123 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0450 (1104) pixels 124 | 0x07FF, 0x07FF, 0x07FF, 0x0000, 0x0000, 0x0000, 0xFF4F, 0xFF4F, 0xFF4F, 0xFF4F, 0xFF4F, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0460 (1120) pixels 125 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, // 0x0470 (1136) pixels 126 | 0x0000, 0x0000, 0x0000, 0x07FF, 0x07FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0480 (1152) pixels 127 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0490 (1168) pixels 128 | 0x07FF, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07FF, // 0x04A0 (1184) pixels 129 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x04B0 (1200) pixels 130 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x04C0 (1216) pixels 131 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0x0000, // 0x04D0 (1232) pixels 132 | 0x0000, 0x0000, 0xF800, 0xF800, 0xF800, 0xF800, 0x0000, 0x013F, 0x0000, 0xF800, 0x0000, 0x0000, 0xFF4F, 0xFF4F, 0xFF4F, 0x0000, // 0x04E0 (1248) pixels 133 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x04F0 (1264) pixels 134 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0500 (1280) pixels 135 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFF4F, 0xFF4F, // 0x0510 (1296) pixels 136 | 0xFF4F, 0xFF4F, 0x0000, 0xF800, 0xF800, 0xF800, 0xF800, 0x0000, 0x013F, 0x0000, 0xF800, 0x0000, 0x0000, 0xFF4F, 0xFF4F, 0x0000, // 0x0520 (1312) pixels 137 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0530 (1328) pixels 138 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0540 (1344) pixels 139 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0000, 0xFF4F, 0xFF4F, // 0x0550 (1360) pixels 140 | 0xFF4F, 0xFF4F, 0xFF4F, 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x013F, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x07FF, // 0x0560 (1376) pixels 141 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0570 (1392) pixels 142 | 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, // 0x0580 (1408) pixels 143 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0590 (1424) pixels 144 | 0x0000, 0xFF4F, 0xFF4F, 0x0000, 0xF800, 0x0000, 0x0000, 0x013F, 0x013F, 0x0000, 0x0000, 0x0000, 0x013F, 0x0000, 0x4FE0, 0x4FE0, // 0x05A0 (1440) pixels 145 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x05B0 (1456) pixels 146 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x05C0 (1472) pixels 147 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x0000, 0x0000, 0x6180, 0x6180, 0x6180, 0x6180, // 0x05D0 (1488) pixels 148 | 0x6180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x013F, 0x013F, 0xFEC0, 0xFEC0, 0x013F, 0x013F, 0xFEC0, 0x0000, 0x4FE0, 0x4FE0, // 0x05E0 (1504) pixels 149 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x05F0 (1520) pixels 150 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x0600 (1536) pixels 151 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x0000, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, // 0x0610 (1552) pixels 152 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x013F, 0x013F, 0xFEC0, 0xFEC0, 0x013F, 0x013F, 0xFEC0, 0x0000, 0x4FE0, 0x4FE0, // 0x0620 (1568) pixels 153 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x0630 (1584) pixels 154 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x0640 (1600) pixels 155 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x0000, 0x6180, 0x6180, 0x6180, 0x6180, 0x0000, // 0x0650 (1616) pixels 156 | 0x013F, 0x013F, 0x013F, 0x013F, 0x013F, 0x013F, 0x013F, 0x013F, 0x013F, 0x013F, 0x013F, 0x013F, 0x0000, 0x4FE0, 0x4FE0, 0x4FE0, // 0x0660 (1632) pixels 157 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x0670 (1648) pixels 158 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x0680 (1664) pixels 159 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x0000, 0x0000, 0x6180, 0x6180, 0x6180, 0x0000, // 0x0690 (1680) pixels 160 | 0x013F, 0x013F, 0x013F, 0x013F, 0x013F, 0x013F, 0x013F, 0x013F, 0x013F, 0x013F, 0x013F, 0x013F, 0x0000, 0x4FE0, 0x4FE0, 0x4FE0, // 0x06A0 (1696) pixels 161 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x06B0 (1712) pixels 162 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x06C0 (1728) pixels 163 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x013F, // 0x06D0 (1744) pixels 164 | 0x013F, 0x013F, 0x013F, 0x013F, 0x013F, 0x013F, 0x0000, 0x0000, 0x013F, 0x013F, 0x0000, 0x0000, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x06E0 (1760) pixels 165 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x06F0 (1776) pixels 166 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x0700 (1792) pixels 167 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x0000, 0x013F, // 0x0710 (1808) pixels 168 | 0x013F, 0x013F, 0x0000, 0x0000, 0x0000, 0x0000, 0x013F, 0x013F, 0x0000, 0x0000, 0x0000, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x0720 (1824) pixels 169 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x0730 (1840) pixels 170 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x0740 (1856) pixels 171 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x0000, 0x013F, // 0x0750 (1872) pixels 172 | 0x013F, 0x0000, 0x6180, 0x6180, 0x0000, 0x0000, 0x0000, 0x0000, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x0760 (1888) pixels 173 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x0770 (1904) pixels 174 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x0780 (1920) pixels 175 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x0000, // 0x0790 (1936) pixels 176 | 0x0000, 0x4FE0, 0x0000, 0x0000, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x07A0 (1952) pixels 177 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x07B0 (1968) pixels 178 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x07C0 (1984) pixels 179 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x07D0 (2000) pixels 180 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x07E0 (2016) pixels 181 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x07F0 (2032) pixels 182 | 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, 0x4FE0, // 0x0800 (2048) pixels 183 | }; 184 | 185 | 186 | // ISR for display refresh 187 | void display_updater() 188 | { 189 | 190 | display.display(70); 191 | 192 | } 193 | void setup() { 194 | Serial.begin(9600); 195 | display.begin(16); 196 | display.clearDisplay(); 197 | Serial.print("Pixel draw latency in us: "); 198 | unsigned long start_timer = micros(); 199 | display.drawPixel(1, 1, 0); 200 | unsigned long delta_timer = micros() - start_timer; 201 | Serial.println(delta_timer); 202 | 203 | Serial.print("Display update latency in us: "); 204 | start_timer = micros(); 205 | display.display(0); 206 | delta_timer = micros() - start_timer; 207 | Serial.println(delta_timer); 208 | 209 | display_ticker.attach(0.002, display_updater); 210 | yield(); 211 | display.clearDisplay(); 212 | drawImage(0, 0); 213 | delay(500); 214 | } 215 | 216 | void drawImage(int x, int y) 217 | { 218 | int imageHeight = 32; 219 | int imageWidth = 64; 220 | int counter = 0; 221 | for (int yy = 0; yy < imageHeight; yy++) 222 | { 223 | for (int xx = 0; xx < imageWidth; xx++) 224 | { 225 | display.drawPixel(xx + x , yy + y, mario[counter]); 226 | counter++; 227 | } 228 | } 229 | } 230 | 231 | 232 | void loop() { 233 | } 234 | -------------------------------------------------------------------------------- /RGBMatrixWithGraphs/RGBMatrixWithGraphs.ino: -------------------------------------------------------------------------------- 1 | /******************************************************************* 2 | Draw bar graphs using an ESP8266 and LED Matrix 3 | 4 | By Brian Lough 5 | YouTube: https://www.youtube.com/brianlough 6 | Twitch: https://www.twitch.tv/brianlough 7 | Twitter: https://twitter.com/witnessmenow 8 | 9 | ********************************************************************/ 10 | 11 | #include 12 | 13 | #ifdef ESP32 14 | 15 | #define P_LAT 22 16 | #define P_A 19 17 | #define P_B 23 18 | #define P_C 18 19 | #define P_D 5 20 | #define P_E 15 21 | #define P_OE 2 22 | hw_timer_t * timer = NULL; 23 | portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED; 24 | 25 | #endif 26 | 27 | #ifdef ESP8266 28 | 29 | #include 30 | Ticker display_ticker; 31 | #define P_LAT 16 32 | #define P_A 5 33 | #define P_B 4 34 | #define P_C 15 35 | #define P_D 12 36 | #define P_E 0 37 | #define P_OE 2 38 | 39 | #endif 40 | // Pins for LED MATRIX 41 | 42 | uint8_t display_draw_time=0; 43 | 44 | //PxMATRIX display(32,16,P_LAT, P_OE,P_A,P_B,P_C); 45 | //PxMATRIX display(64,32,P_LAT, P_OE,P_A,P_B,P_C,P_D); 46 | //PxMATRIX display(64,64,P_LAT, P_OE,P_A,P_B,P_C,P_D,P_E); 47 | PxMATRIX display(64, 32, P_LAT, P_OE, P_A, P_B, P_C, P_D, P_E); 48 | 49 | // Some standard colors 50 | uint16_t myRED = display.color565(255, 0, 0); 51 | uint16_t myGREEN = display.color565(0, 255, 0); 52 | uint16_t myBLUE = display.color565(0, 0, 255); 53 | uint16_t myWHITE = display.color565(255, 255, 255); 54 | uint16_t myYELLOW = display.color565(255, 255, 0); 55 | uint16_t myCYAN = display.color565(0, 255, 255); 56 | uint16_t myMAGENTA = display.color565(255, 0, 255); 57 | uint16_t myBLACK = display.color565(0, 0, 0); 58 | 59 | uint16_t myCOLORS[8]={myRED,myGREEN,myBLUE,myWHITE,myYELLOW,myCYAN,myMAGENTA,myBLACK}; 60 | 61 | uint8_t static weather_icons[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0xff,0xe0,0x00,0x00,0x00,0x00,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00 62 | ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xdf,0x07,0xdf,0x07,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xdf,0x00,0x00,0x00,0x00,0x07,0xff,0x00,0x00,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0x00,0x00 63 | ,0x00,0x00,0x00,0x00,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xff,0xe0,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xdf,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00 64 | ,0x00,0x20,0x00,0x00,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xff,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0xff,0xe0,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xdf,0x07,0xff,0x07,0xdf,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xdf,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xdf,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x07,0xdf,0x07,0xdf,0x07,0xff,0xff,0xe0,0xff,0xe0,0x00,0x00 65 | ,0x00,0x00,0xff,0xe0,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xdf,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0xff,0xe0,0x00,0x20,0x00,0x00,0x07,0xdf,0x07,0xdf,0x07,0xdf,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xdf,0x07,0xdf,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0xff,0xff,0x07,0xff,0x07,0xff,0x07,0xdf,0x07,0xff,0x00,0x00,0x07,0xff,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xdf,0x00,0x00,0x00,0x00,0x07,0xff,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00 66 | ,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xdf,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x07,0xff,0x00,0x20,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xdf,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xdf,0x00,0x00,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xdf,0x00,0x00,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0xff,0xe0,0xff,0xe0,0x07,0xdf,0x07,0xdf,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00 67 | ,0x00,0x00,0x00,0x00,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0xff,0xe0,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0xff,0xe0,0xff,0xe0,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00 68 | ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xdf,0x07,0xdf,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xdf,0x07,0xff,0x00,0x00,0x00,0x00,0x07,0xff,0x00,0x00,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0xff,0xe0,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00 69 | ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xdf,0x07,0xdf,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0xff,0xe0,0x07,0xdf,0x07,0xff,0x07,0xff,0x00,0x00,0x00,0x00,0x00,0x00 70 | ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 71 | }; 72 | 73 | #ifdef ESP8266 74 | // ISR for display refresh 75 | void display_updater() 76 | { 77 | display.display(display_draw_time); 78 | } 79 | #endif 80 | 81 | #ifdef ESP32 82 | void IRAM_ATTR display_updater(){ 83 | // Increment the counter and set the time of ISR 84 | portENTER_CRITICAL_ISR(&timerMux); 85 | display.display(display_draw_time); 86 | portEXIT_CRITICAL_ISR(&timerMux); 87 | } 88 | #endif 89 | 90 | 91 | void display_update_enable(bool is_enable) 92 | { 93 | 94 | #ifdef ESP8266 95 | if (is_enable) 96 | display_ticker.attach(0.002, display_updater); 97 | else 98 | display_ticker.detach(); 99 | #endif 100 | 101 | #ifdef ESP32 102 | if (is_enable) 103 | { 104 | timer = timerBegin(0, 80, true); 105 | timerAttachInterrupt(timer, &display_updater, true); 106 | timerAlarmWrite(timer, 2000, true); 107 | timerAlarmEnable(timer); 108 | } 109 | else 110 | { 111 | timerDetachInterrupt(timer); 112 | timerAlarmDisable(timer); 113 | } 114 | #endif 115 | 116 | 117 | } 118 | 119 | void pixel_time_test(uint8_t draw_time) 120 | { 121 | 122 | Serial.print("Pixel draw latency in us: "); 123 | unsigned long start_timer=micros(); 124 | display.drawPixel(1,1,0); 125 | unsigned long delta_timer=micros()-start_timer; 126 | Serial.println(delta_timer); 127 | 128 | Serial.print("Display update latency in us: "); 129 | start_timer=micros(); 130 | display.display(draw_time); 131 | delta_timer=micros()-start_timer; 132 | Serial.println(delta_timer); 133 | 134 | 135 | display.clearDisplay(); 136 | display.setTextColor(myCYAN); 137 | display.setCursor(2,0); 138 | display.print("Bar Charts"); 139 | display.setTextColor(myMAGENTA); 140 | display.setCursor(2,8); 141 | display.print("By"); 142 | display.setCursor(2,16); 143 | display.print("Brian"); 144 | display.setCursor(2,24); 145 | display.print("Lough"); 146 | 147 | display_update_enable(true); 148 | 149 | yield(); 150 | delay(3000); 151 | 152 | display_update_enable(false); 153 | } 154 | 155 | 156 | void setup() { 157 | Serial.begin(9600); 158 | // Define your display layout here, e.g. 1/8 step 159 | display.begin(16); 160 | 161 | // Define your scan pattern here {LINE, ZIGZAG, ZAGGIZ} (default is LINE) 162 | //display.setScanPattern(LINE); 163 | 164 | // Define multiplex implemention here {BINARY, STRAIGHT} (default is BINARY) 165 | //display.setMuxPattern(BINARY); 166 | 167 | // Compare draw latency at similar display brightness for standard and fast drawing 168 | display.setFastUpdate(false); 169 | Serial.println("Draw test without fast update"); 170 | display_draw_time=15; 171 | pixel_time_test(display_draw_time); 172 | Serial.println("Draw test with fast update"); 173 | display.setFastUpdate(true); 174 | display_draw_time=0; 175 | pixel_time_test(display_draw_time); 176 | 177 | display.setFastUpdate(false); 178 | display_draw_time=15; 179 | display.clearDisplay(); 180 | display_update_enable(true); 181 | //display.setColorOffset(15,15,0); 182 | } 183 | union single_double{ 184 | uint8_t two[2]; 185 | uint16_t one; 186 | } this_single_double; 187 | 188 | // This draws the weather icons 189 | void draw_weather_icon (uint8_t icon) 190 | { 191 | if (icon>10) 192 | icon=10; 193 | for (int yy=0; yy<10;yy++) 194 | { 195 | for (int xx=0; xx<10;xx++) 196 | { 197 | uint16_t byte_pos=(xx+icon*10)*2+yy*220; 198 | this_single_double.two[1]=weather_icons[byte_pos]; 199 | this_single_double.two[0]=weather_icons[byte_pos+1]; 200 | display.drawPixel(1+xx,yy,this_single_double.one); 201 | } 202 | } 203 | } 204 | 205 | int dataPoints[7] = {4, 7, 9, 2, 12, 5, 1}; 206 | 207 | void autoDrawBarGraph(int x, int y, int width, int height, int data[], int dataSize, uint16_t colour) { 208 | int barWidth = 1; 209 | while(((4*barWidth)/3)*dataSize < width){ 210 | //Serial.println(((4*barWidth)/3)*numDataPoints + barWidth/3); 211 | barWidth++; 212 | } 213 | 214 | barWidth = barWidth - 1; 215 | 216 | int maxValue = getMaxValue(data, dataSize); 217 | 218 | int multiplier = 1; 219 | int actualChartHeight = getActualChartHeight(height, maxValue); 220 | 221 | int gapWidth = barWidth/3; 222 | 223 | drawBarGraph(x, y, data, dataSize, colour, barWidth, gapWidth, actualChartHeight, maxValue); 224 | } 225 | 226 | int getActualChartHeight(int height, int maxValue){ 227 | int multiplier = 1; 228 | int actualChartHeight = height; 229 | if(maxValue < height){ 230 | while(maxValue*multiplier < height){ 231 | multiplier++; 232 | } 233 | multiplier = multiplier -1; 234 | actualChartHeight = maxValue*multiplier; 235 | } else if(maxValue < height) { 236 | multiplier++; 237 | while(maxValue/multiplier > height){ 238 | multiplier++; 239 | } 240 | actualChartHeight = maxValue/multiplier; 241 | } 242 | 243 | return actualChartHeight; 244 | } 245 | 246 | int getMaxValue(int data[], int dataSize){ 247 | int maxValue = data[0]; 248 | for(int i = 1; i < dataSize; i++){ 249 | if(maxValue < data[i]){ 250 | maxValue = data[i]; 251 | } 252 | } 253 | 254 | return maxValue; 255 | } 256 | 257 | void drawBarGraph(int x, int y, int data[], int dataSize, uint16_t colour, int barWidth, int gapWidth, int actualChartHeight, int maxValue){ 258 | 259 | for(int i = 0; i < dataSize; i++){ 260 | int barX = x + ((gapWidth + barWidth) * i); 261 | int barHeight = map(data[i], 0, maxValue, 0, actualChartHeight); 262 | int barY = y- barHeight; 263 | //int barY = y - (dataPoints[i] * multiplier); 264 | //int barHeight = y - barY; 265 | if(barHeight > 0){ 266 | display.fillRect( barX, barY, barWidth, barHeight, colour ); 267 | } 268 | } 269 | } 270 | 271 | 272 | int dataSet1[] = {4, 7, 9, 2, 12, 5, 1}; 273 | int dataSet1Size = 7; 274 | int dataSet2[] = {20, 34, 60, 26}; 275 | int dataSet2Size = 4; 276 | int dataSet3[] = {30, 24, 50, 13}; 277 | int dataSet3Size = 4; 278 | void loop() { 279 | 280 | display.clearDisplay(); 281 | 282 | int actualHeight = getActualChartHeight(30, 60); 283 | drawBarGraph(4, 31, dataSet2, dataSet2Size, myBLUE, 6, 8, actualHeight, 60); 284 | drawBarGraph(11, 31, dataSet3, dataSet3Size, myGREEN, 6, 8, actualHeight, 60); 285 | //drawBarGraph(2, 30, 62, 30, dataSet2, dataSet2Size, myBLUE, 4, 7, 60); 286 | 287 | delay(8000); 288 | display.clearDisplay(); 289 | autoDrawBarGraph(2, 30, 62, 30, dataSet1, dataSet1Size, myBLUE); 290 | 291 | delay(4000); 292 | 293 | display.clearDisplay(); 294 | autoDrawBarGraph(2, 30, 62, 30, dataSet2, dataSet2Size, myGREEN); 295 | 296 | delay(4000); 297 | 298 | display.clearDisplay(); 299 | autoDrawBarGraph(2, 30, 20, 30, dataSet1, dataSet1Size, myRED); 300 | 301 | delay(4000); 302 | 303 | display.clearDisplay(); 304 | autoDrawBarGraph(2, 30, 30, 20, dataSet1, dataSet1Size, myBLUE); 305 | autoDrawBarGraph(32, 30, 30, 20, dataSet1, dataSet1Size, myGREEN); 306 | 307 | delay(4000); 308 | 309 | display.clearDisplay(); 310 | autoDrawBarGraph(2, 16, 30, 15, dataSet1, dataSet1Size, myRED); 311 | autoDrawBarGraph(31, 16, 30, 15, dataSet1, dataSet1Size, myBLUE); 312 | autoDrawBarGraph(2, 30, 30, 15, dataSet1, dataSet1Size, myGREEN); 313 | autoDrawBarGraph(31, 30, 30, 15, dataSet1, dataSet1Size, myMAGENTA); 314 | 315 | delay(4000); 316 | 317 | } 318 | -------------------------------------------------------------------------------- /Wiring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/witnessmenow/LED-Matrix-Display-Examples/d5f1de781fe2c981c256432c2558f931820dc7c1/Wiring.png --------------------------------------------------------------------------------