壁時計に使っているESP32と32×8 LEDパネルのスケッチを書き換えてSendai Micro Maker Faire用のウェルカムボードを作りました。
使用部品と配線はESP32と32×8フルカラーLEDでデジタル壁時計をつくるを参照してください。
外装についてはデジタル壁時計の組み立てを参照してください。
英数字の5×8フォントを作って表示させたのが新しい点です。フォントデータが96行あるので見苦しいですが、それ以外はシンプルに書いたつもりです。左端から右端に向かってLEDの色が変化していくプログラムに、”フォントピクセルだけ表示する”という条件をつけています。
フォントデータはAppleⅡeの資料を見かけたのでデータ化してみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 |
//ESP32(MH-ET LIVE ESP32 MiniKIT) //Quimat RGB LEDパネルQWS03 (8X32) //2020.01.18 Koji Ohashi MaDA Lab@Morioka Iwate Japan #include <FastLED.h> #define DATA_PIN 16 #define WIDTH 32 #define HEIGHT 8 #define NUM_LEDS (WIDTH * HEIGHT) CRGBArray<NUM_LEDS> leds; int Pos[WIDTH][HEIGHT]; boolean FontMask[WIDTH][HEIGHT]; //96 font starting from ' '(space) byte FFont[96*5]={ 0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x5F,0x00,0x00, 0x00,0x07,0x00,0x07,0x00, 0x14,0x7F,0x14,0x7F,0x14, 0x24,0x2A,0x7F,0x2A,0x12, 0x23,0x13,0x08,0x64,0x62, 0x36,0x49,0x56,0x20,0x50, 0x00,0x00,0x07,0x00,0x00, 0x00,0x1C,0x22,0x41,0x00, 0x00,0x41,0x22,0x1C,0x00, 0x22,0x14,0x7F,0x14,0x22, 0x08,0x08,0x3E,0x08,0x08, 0x00,0x40,0x30,0x00,0x00, 0x08,0x08,0x08,0x08,0x08, 0x00,0x00,0x40,0x00,0x00, 0x20,0x10,0x08,0x04,0x02, 0x3E,0x51,0x49,0x45,0x3E, 0x00,0x42,0x7F,0x40,0x00, 0x62,0x51,0x49,0x49,0x46, 0x21,0x41,0x49,0x4D,0x33, 0x18,0x14,0x12,0x7F,0x10, 0x27,0x45,0x45,0x45,0x39, 0x3C,0x4A,0x49,0x49,0x31, 0x01,0x71,0x09,0x05,0x03, 0x36,0x49,0x49,0x49,0x36, 0x46,0x49,0x49,0x29,0x1E, 0x00,0x00,0x14,0x00,0x00, 0x00,0x40,0x34,0x00,0x00, 0x08,0x14,0x22,0x41,0x00, 0x14,0x14,0x14,0x14,0x14, 0x00,0x41,0x22,0x14,0x08, 0x02,0x01,0x59,0x05,0x02, 0x3E,0x41,0x5D,0x59,0x4E, 0x7C,0x12,0x11,0x12,0x7C, 0x7F,0x49,0x49,0x49,0x36, 0x3E,0x41,0x41,0x41,0x22, 0x7F,0x41,0x41,0x41,0x3E, 0x7F,0x49,0x49,0x49,0x41, 0x7F,0x09,0x09,0x09,0x01, 0x3E,0x41,0x41,0x51,0x71, 0x7F,0x08,0x08,0x08,0x7F, 0x00,0x41,0x7F,0x41,0x00, 0x20,0x40,0x40,0x40,0x3F, 0x7F,0x08,0x14,0x22,0x41, 0x7F,0x40,0x40,0x40,0x40, 0x7F,0x02,0x0C,0x02,0x7F, 0x7F,0x04,0x08,0x10,0x7F, 0x3E,0x41,0x41,0x41,0x3E, 0x7F,0x09,0x09,0x09,0x06, 0x3E,0x41,0x51,0x21,0x5E, 0x7F,0x09,0x19,0x29,0x46, 0x26,0x49,0x49,0x49,0x32, 0x01,0x01,0x7F,0x01,0x01, 0x3F,0x40,0x40,0x40,0x3F, 0x1F,0x20,0x40,0x20,0x1F, 0x7F,0x20,0x18,0x20,0x7F, 0x63,0x14,0x08,0x14,0x63, 0x03,0x04,0x78,0x04,0x03, 0x61,0x51,0x49,0x45,0x43, 0x7F,0x7F,0x41,0x41,0x41, 0x02,0x04,0x08,0x10,0x20, 0x41,0x41,0x41,0x7F,0x7F, 0x10,0x08,0x04,0x08,0x10, 0x40,0x40,0x40,0x40,0x40, 0x00,0x01,0x02,0x04,0x00, 0x20,0x54,0x54,0x54,0x78, 0x7F,0x44,0x44,0x44,0x38, 0x38,0x44,0x44,0x44,0x44, 0x38,0x44,0x44,0x44,0x7F, 0x38,0x54,0x54,0x54,0x58, 0x08,0x7E,0x09,0x09,0x02, 0x18,0xA4,0xA4,0xA4,0x78, 0x7F,0x04,0x04,0x04,0x78, 0x00,0x44,0x7D,0x40,0x00, 0x40,0x80,0x84,0x7D,0x00, 0x00,0x7F,0x10,0x28,0x44, 0x00,0x41,0x7F,0x40,0x00, 0x7C,0x04,0x18,0x04,0x7C, 0x7C,0x04,0x04,0x04,0x78, 0x38,0x44,0x44,0x44,0x38, 0xFC,0x24,0x24,0x24,0x18, 0x18,0x24,0x24,0x24,0xFC, 0x7C,0x08,0x04,0x04,0x04, 0x48,0x54,0x54,0x54,0x24, 0x04,0x3F,0x44,0x40,0x20, 0x3C,0x40,0x40,0x20,0x7C, 0x1C,0x20,0x40,0x20,0x1C, 0x7C,0x40,0x30,0x40,0x7C, 0x44,0x28,0x10,0x28,0x44, 0x1C,0xA0,0xA0,0xA0,0x7C, 0x44,0x64,0x54,0x4C,0x44, 0x08,0x3E,0x77,0x41,0x41, 0x00,0x00,0xFF,0x00,0x00, 0x41,0x41,0x77,0x3E,0x08, 0x02,0x01,0x03,0x02,0x01, 0x2A,0x14,0x2A,0x14,0x2A, }; int count=0; //Display Word char word0[] = "Nice"; char word1[] = "to"; char word2[] = "MEET"; char word3[] = "YOU"; char word4[] = "SQUARE"; char word5[] = "CUBE"; char word6[] = "PUZZLE"; void setup() { Serial.begin(115200); FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS); //LEDS.setBrightness(20); LEDS.setBrightness(40); Serial.println("WelcomeDisplay06"); initFontMask(); setPosArray(); } void loop(){ static uint8_t hue; if(count>18){ count=0;} if(count==0){ dispWord(word0,4);} if(count==2){ dispWord(word1,2);} if(count==4){ dispWord(word2,4);} if(count==6){ dispWord(word3,3);} if(count==8){ initFontMask();} if(count==9){ dispWord(word4,6);} if(count==12){ dispWord(word5,4);} if(count==15){ dispWord(word6,6);} for(int j=0;j<WIDTH;j++){ for(int i=0; i < HEIGHT; i++){ if(FontMask[j][i]==true){ int led_num=Pos[j][i]; leds[led_num] = CHSV(hue++,255,255); } } leds.fadeToBlackBy(10); FastLED.delay(50); } count=count+1; } void FontArray2BitMap(int Num, int Pos){ for(int i=0;i<5;i++){ byte font_col=FFont[Num*5+i];//FullFont for(int j=0;j<8;j++){ if((font_col & 1)==1){ FontMask[Pos+i][j]=true; } else { FontMask[Pos+i][j]=false; } font_col=font_col>>1; } } } void dispWord(char *s1,int n){ initFontMask(); for(int i=0;i<n;i++){ FontArray2BitMap(s1[i]-' ',i*5);//from space } } void setPosArray(){ for(int i=0; i < HEIGHT; i++){ for(int j=0; j < WIDTH; j++){ if(i%2==0){ Pos[j][i]=i*WIDTH+j; } else{ Pos[j][i]=(i+1)*WIDTH-j-1; } } } } void initFontMask(){ for(int i=0; i < HEIGHT; i++){ for(int j=0; j < WIDTH; j++){ FontMask[j][i]=false; } } } |