ちょっと気分転換に展示会用のネームを作ってみましたw
どうにかバルキリーのリモコンの方を色々と考えて最終仕様決定しました。
実は一旦ブログにその経緯を書いてみたのですが、
壮絶に面白くないwwwwww
ボツとなりましたwwww
とりあえず、ESP32が2個とarduino nano1個、DFPlayer2個の構成となります。
その途中で、あまりにもすったもんだやってて飽きてしまいましたのでwちょっと気分転換に展示会用のネームを以前からM5stackを使ってみたいなと思っていたのでそのプログラム作ってみましたww
展示会に行くと、困るのはtwitterとかで名前は知っているけど顔が分からない事。
それ以上にもっと困るのが、以前会った事有るのに顔が思い出せないとか最悪の状態もw
さらに作品と名前が一致しないとかそんなことが結構あるんですよね~。
ですからネームを首から下げておられる方とか非常にありがたい^^
そこで、さらに製作物を一緒に表示したら、名前は知らないけどこの作品は知っている!という人にも声とかけてもらいやすくなるかなと思いM5stackで簡単な物作ってみましたw
プログラムは1日で作ったお手軽物なので配列とか使うともっとスッキリしたものになるとは思いますが、とりあえずは力業でwww
こんな感じです。
パラパラ動画の再生とスライドショーを表示することが出来ます。
問題はバッテリーがどのくらい保かですねw
ちなみにノーマルのバッテリーでは20分くらいしたら切れてましたwww
バッテリーモジュールを購入して試してみますw!
連番のパラパラ画像の作り方はこちらを見て下さい。
マイクロSDカードを使用します。
こんな感じでフォルダを作成してそこに画像を入れていきます。
使い方は動画を見てもらうとわかると思いますが、フォルダの1,2,4が動画用となっていてフォルダ3はスライドショー用となっています。
この辺はプログラムのコピペと書き換えでどちらの仕様でも、いくらでもSDカードの要領が許す限り増やせます。
プログラムの方はパラパラ動画のフォルダを増やしたい時はこれをループ内の最後にコピペして
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 |
if(main_page==1){ //ページ番号 ikaidake++; if(ikaidake==1){ lcd.drawJpgFile(SD,"/Folder01/1.jpg", 0,30); //フォルダ名 lcd.setTextColor(TFT_GREEN); lcd.setTextSize(5); lcd.setCursor(0,0); lcd.print("Folder01");//フォルダ名 } if(ikaidake>1)ikaidake=2; if(digitalRead(BUTTON_B) == 0) {//A botton B:38 C:37 lcd.fillScreen(0); delay(buttan_time); lcd.setTextColor(TFT_GREEN); lcd.setTextSize(5); lcd.setCursor(0,0); lcd.print("6jiro"); int i=1; while(1){i++; String fileName = "/Folder01/"+ String(i) +".jpg"; //フォルダ名 char jpegs[fileName.length()+1]; fileName.toCharArray(jpegs, sizeof(jpegs)); lcd.drawJpgFile(SD,jpegs, 0,50); if(i>=folder01_max)i=1;//画像最大数 if(digitalRead(BUTTON_B) == 0){break;} } lcd.fillScreen(0); ikaidake=0; delay(buttan_time); } } |
コメントが書かれている部分の数字を変更します。
SDのFolder05内の表示を行いたいのであればmain_pageを5になればフォルダ名をFolder05にすればオッケーです。
さらに
1 2 |
byte main_page_max=4;//ページ最大数 int folder01_max=1624, folder02_max=1961, folder03_max=14,folder04_max=2033;//画像最大数 |
変数の設定部分にfolder05_max=写真の最大数の追加と、main_page_max=ページの最大数を変更してください。
これでパラパラ動画フォルダの追加が出来ます。
スライドショータイプの追加がしたい場合は
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 |
if(main_page==3){//ページ番号 ikaidake++; if(ikaidake==1){ lcd.drawJpgFile(SD,"/Folder03/1.jpg", 0,0); //フォルダ名 lcd.setTextColor(TFT_GREEN); lcd.setTextSize(5); lcd.setCursor(0,0); lcd.print("Folder03");//フォルダ名 } if(ikaidake>1)ikaidake=2; if(digitalRead(BUTTON_B) == 0) {//A botton B:38 C:37 delay(1000); if(digitalRead(BUTTON_B) == 0) {//A botton B:38 C:37 lcd.fillScreen(TFT_BLUE); delay(1000); lcd.fillScreen(0); for(int i=1;i<=folder03_max;i++){//画像最大数 String fileName = "/Folder03/"+ String(i) +".jpg";//フォルダ名 char jpegs[fileName.length()+1]; fileName.toCharArray(jpegs, sizeof(jpegs)); lcd.drawJpgFile(SD,jpegs, 0,0); if(digitalRead(BUTTON_B) == 0){break;} delay(slide_wait); } lcd.fillScreen(0); ikaidake=0; delay(buttan_time); } else{ sub_page=3;//サブページ番号 lcd.fillScreen(0); lcd.setTextColor(TFT_GREEN); lcd.setTextSize(5); lcd.setCursor(15,80); lcd.print("Manual"); delay(1000); lcd.drawJpgFile(SD,"/Folder03/1.jpg", 0,0); //フォルダ名 } } if(sub_page==3){ if(digitalRead(BUTTON_C) == 0){delay(buttan_time); photo_03++;//写真番号 if(photo_03>folder03_max){photo_03=1;}//画像最大数//写真番号 String fileName = "/Folder03/"+ String(photo_03) +".jpg";//フォルダ名//写真番号 char jpegs[fileName.length()+1]; fileName.toCharArray(jpegs, sizeof(jpegs)); lcd.drawJpgFile(SD,jpegs, 0,0); } if(digitalRead(BUTTON_A) == 0){delay(buttan_time); photo_03--;//写真番号 if(photo_03<=0){photo_03=folder03_max;}//画像最大数//写真番号 String fileName = "/Folder03/"+ String(photo_03) +".jpg";//フォルダ名//写真番号 char jpegs[fileName.length()+1]; fileName.toCharArray(jpegs, sizeof(jpegs)); lcd.drawJpgFile(SD,jpegs, 0,0); } if(digitalRead(BUTTON_B) == 0){sub_page=0; lcd.fillScreen(0); delay(1000); ikaidake=0; //delay(buttan_time); } } } |
をloopの最後に追加してください。
ココも同じように増やしたフォルダの番号に従ってコメントの有る部分の数字を変更してください。
1 2 3 4 5 6 7 |
byte main_page_max=4;//ページ最大数 int folder01_max=1624, folder02_max=1961, folder03_max=14,folder04_max=2033;//画像最大数 int main_page=0; byte sub_page=0; byte ikaidake=0; int photo_03=1;//写真番号 |
先ほどと同様にページ最大数の変更とフォルダ内の写真枚数の最大数を登録してください。
それとスライドの場合は、上記の最後の行に当たる部分にFolder06の場合はphoto_06=1等の様にフォルダ番号に合わせて変数を足してやって下さい。
てな感じでプログラムの追加を行ってやって下さい。
では最後に全体のプログラム載せて置きます。
あっ、そうそうLovyanGFXとSdFatライブラリーのインストールが必要です。
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 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 |
#include <SdFat.h> SdFat SD; #define LGFX_USE_V1 #define LGFX_M5STACK // M5Stack (Basic / Gray / Go / Fire) #include <LovyanGFX.hpp> #include <LGFX_AUTODETECT.hpp> #define TFCARD_CS_PIN 4 #define BUTTON_A 39 #define BUTTON_B 38 #define BUTTON_C 37 static LGFX lcd; int buttan_time=500,slide_wait=3000;//待ち時間変更 byte main_page_max=4;//ページ最大数 int folder01_max=1624, folder02_max=1961, folder03_max=14,folder04_max=2033;//画像最大数 int main_page=0; byte sub_page=0; byte ikaidake=0; int photo_03=1;//写真番号 void setup() { pinMode(BUTTON_A,INPUT); pinMode(BUTTON_B,INPUT); pinMode(BUTTON_C,INPUT); lcd.init(); lcd.setRotation(1); lcd.setBrightness(255); lcd.setColorDepth(24); lcd.fillScreen(0); SD.begin(TFCARD_CS_PIN, 25000000); lcd.setTextColor(TFT_GREEN); lcd.setTextSize(10); lcd.setCursor(15,80); lcd.print("6jiro"); } void loop() { if(sub_page==0){ if(digitalRead(BUTTON_A) == 0) {delay(buttan_time); main_page--; ikaidake=0; sub_page=0; if(main_page<0)main_page=main_page_max; lcd.fillScreen(0); } if(digitalRead(BUTTON_C) == 0) {delay(buttan_time); main_page++; ikaidake=0; sub_page=0; if(main_page>main_page_max)main_page=0; lcd.fillScreen(0); } } if(main_page==0){ ikaidake++; if(ikaidake==1){ lcd.setTextColor(TFT_GREEN); lcd.setTextSize(10); lcd.setCursor(15,80); lcd.print("6jiro"); } if(ikaidake>1)ikaidake=2; } if(main_page==1){ //ページ番号 ikaidake++; if(ikaidake==1){ lcd.drawJpgFile(SD,"/Folder01/1.jpg", 0,30); //フォルダ名 lcd.setTextColor(TFT_GREEN); lcd.setTextSize(5); lcd.setCursor(0,0); lcd.print("Folder01");//フォルダ名 } if(ikaidake>1)ikaidake=2; if(digitalRead(BUTTON_B) == 0) {//A botton B:38 C:37 lcd.fillScreen(0); delay(buttan_time); lcd.setTextColor(TFT_GREEN); lcd.setTextSize(5); lcd.setCursor(0,0); lcd.print("6jiro"); int i=1; while(1){i++; String fileName = "/Folder01/"+ String(i) +".jpg"; //フォルダ名 char jpegs[fileName.length()+1]; fileName.toCharArray(jpegs, sizeof(jpegs)); lcd.drawJpgFile(SD,jpegs, 0,50); if(i>=folder01_max)i=1;//画像最大数 if(digitalRead(BUTTON_B) == 0){break;} } lcd.fillScreen(0); ikaidake=0; delay(buttan_time); } } if(main_page==2){ ikaidake++; if(ikaidake==1){ lcd.drawJpgFile(SD,"/Folder02/1.jpg", 0,30); //フォルダ名 lcd.setTextColor(TFT_GREEN); lcd.setTextSize(5); lcd.setCursor(0,0); lcd.print("Folder02");//フォルダ名 } if(ikaidake>1)ikaidake=2; if(digitalRead(BUTTON_B) == 0) {//A botton B:38 C:37 lcd.fillScreen(0); delay(buttan_time); lcd.setTextColor(TFT_GREEN); lcd.setTextSize(5); lcd.setCursor(0,0); lcd.print("6jiro"); int i=1; while(1){i++; String fileName = "/Folder02/"+ String(i) +".jpg"; //フォルダ名 char jpegs[fileName.length()+1]; fileName.toCharArray(jpegs, sizeof(jpegs)); lcd.drawJpgFile(SD,jpegs, 0,50); if(i>=folder02_max)i=1;//画像最大数 if(digitalRead(BUTTON_B) == 0){break;} } lcd.fillScreen(0); ikaidake=0; delay(buttan_time); } } if(main_page==3){//ページ番号 ikaidake++; if(ikaidake==1){ lcd.drawJpgFile(SD,"/Folder03/1.jpg", 0,0); //フォルダ名 lcd.setTextColor(TFT_GREEN); lcd.setTextSize(5); lcd.setCursor(0,0); lcd.print("Folder03");//フォルダ名 } if(ikaidake>1)ikaidake=2; if(digitalRead(BUTTON_B) == 0) {//A botton B:38 C:37 delay(1000); if(digitalRead(BUTTON_B) == 0) {//A botton B:38 C:37 lcd.fillScreen(TFT_BLUE); delay(1000); lcd.fillScreen(0); for(int i=1;i<=folder03_max;i++){//画像最大数 String fileName = "/Folder03/"+ String(i) +".jpg";//フォルダ名 char jpegs[fileName.length()+1]; fileName.toCharArray(jpegs, sizeof(jpegs)); lcd.drawJpgFile(SD,jpegs, 0,0); if(digitalRead(BUTTON_B) == 0){break;} delay(slide_wait); } lcd.fillScreen(0); ikaidake=0; delay(buttan_time); } else{ sub_page=3;//サブページ番号 lcd.fillScreen(0); lcd.setTextColor(TFT_GREEN); lcd.setTextSize(5); lcd.setCursor(15,80); lcd.print("Manual"); delay(1000); lcd.drawJpgFile(SD,"/Folder03/1.jpg", 0,0); //フォルダ名 } } if(sub_page==3){ if(digitalRead(BUTTON_C) == 0){delay(buttan_time); photo_03++;//写真番号 if(photo_03>folder03_max){photo_03=1;}//画像最大数//写真番号 String fileName = "/Folder03/"+ String(photo_03) +".jpg";//フォルダ名//写真番号 char jpegs[fileName.length()+1]; fileName.toCharArray(jpegs, sizeof(jpegs)); lcd.drawJpgFile(SD,jpegs, 0,0); } if(digitalRead(BUTTON_A) == 0){delay(buttan_time); photo_03--;//写真番号 if(photo_03<=0){photo_03=folder03_max;}//画像最大数//写真番号 String fileName = "/Folder03/"+ String(photo_03) +".jpg";//フォルダ名//写真番号 char jpegs[fileName.length()+1]; fileName.toCharArray(jpegs, sizeof(jpegs)); lcd.drawJpgFile(SD,jpegs, 0,0); } if(digitalRead(BUTTON_B) == 0){sub_page=0; lcd.fillScreen(0); delay(1000); ikaidake=0; //delay(buttan_time); } } } if(main_page==4){ //ページ番号 ikaidake++; if(ikaidake==1){ lcd.drawJpgFile(SD,"/Folder04/1.jpg", 0,30); //フォルダ名 lcd.setTextColor(TFT_GREEN); lcd.setTextSize(5); lcd.setCursor(0,0); lcd.print("Folder04");//フォルダ名 } if(ikaidake>1)ikaidake=2; if(digitalRead(BUTTON_B) == 0) { lcd.fillScreen(0); delay(buttan_time); lcd.setTextColor(TFT_GREEN); lcd.setTextSize(5); lcd.setCursor(0,0); lcd.print("6jiro"); int i=1; while(1){i++; String fileName = "/Folder04/"+ String(i) +".jpg"; //フォルダ名 char jpegs[fileName.length()+1]; fileName.toCharArray(jpegs, sizeof(jpegs)); lcd.drawJpgFile(SD,jpegs, 0,50); if(i>=folder04_max)i=1; //画像最大数 if(digitalRead(BUTTON_B) == 0){break;} } lcd.fillScreen(0); ikaidake=0; delay(buttan_time); } } }//loop |
やってみたいけど分からないとか有りましたら連絡下さい^^
関連すると思われる記事:
- None Found
ぽっかーん。
ってこんな難しいことセンセしか
やりませんてば!!
でも僕もパラパラ漫画の名札していこうかな?って思ったりらじばんだり
とてもユニークな着眼点かつガジェットではあると思うのですがね。
バズジロー先生には無用の長物ではないかと思うのですよ。
強烈な作品と、せんせーのルックスと、迫力の弾丸トークと、それらひっくるめたオーラが一度見たら忘れたくても忘れられない。強烈な個性ww
名刺なんて不要www
てつのさん こんばんは!
やるなら連絡くれたら完成まで付き合うよww!
てつのさんもyoutubeの動画とか有るから活用できるかもよ~!
gyoさん こんばんは!
面白いガジェットでしょう~。
これみんなつけてくれたら展示会でかなり声かけやすくなるww
え~~~こんな控えめな私を捕まえてなんちゅことをw
弾丸トークしてるかなww?
心許した人にはついついしゃべり過ぎちゃう時は時としてありますwww
次の日喉枯れてるもんねwww
こんばんは!
更新間隔が空いているかなぁ~、と思ったらこんな工作をされていたんですね!
6jiroさんの様に作品が多いと、「顔」と「名前」と「作品」が一致して、一石三鳥ですね。
M5では、ちょっと小さいので、いっそiPadにPR用動画を入れて、首から下げて再生!
なんて、受けるかもです(笑)
gyoさんもおっしゃってますが、6jiroさん、有名ですから、名札は不要でしょうね。
Vividさん こんばんは!
間隔開いていたのはリモコンの方でしてw
なんかESP32でBluetoothとI2Cのスレイブが両立できなくて、コンパイルは出来るのですが暴走しちゃうんですよね・・・・その辺でちょっと躓いていましたw
多分その辺は記事書いても、ここに見に来ている方ではVividさん位しか分からないかもしれないので、記事も面白くないし没にしましたww
そうなんですよね~ちょっと小さいのが難点ですよね~。
私なんてまだまだ雑草ですのでwwたまたま気が付かれた方が声かけてくれたらいいかなと思い作ってみましたw
こんばんは
これは面白い。
作品写真を名札に入れるってのはよくあるけど、電子的にそのバリエーション増やすとか。いっそのこと音声もいれましょう。センセーがしゃべらなくても名札が挨拶してくれるとかww
センセーもVividさんも近頃ESP32でもリソース不足に陥ってるみたいですね。いっそのことARMのごついの積んだもっと上位のマイコン使ってみては?
なおさん こんばんは!
画面動いている方が人目にもとまりやすいしね~!
なおさんもお一ついかがですかw
画像とか扱い出すとリソース不足に悩まされますね・・・・
かと言って、ライブラリーが無ければ何もできないマンなので、範囲内で遊んでいますw
Vividさんは行けるかもですよね~!