MAX7219の使い方8×8LCD無ライブラリー(7)ESP32編

何年か前に,ワイヤレスのテパを作るのに,Xbee とPICであれこれやりました。当時は,ESP32については
知りませんでしたのでもし存在が分かってたら間違いなくESP32の方を使ったと思います。ということで,
今回は,ESP32を使って, arduino で走らせていた 8×8 表示のLEDの表示をあれこれやってみようと
思います。幸い,arduino と ESP32 は かなりの互換性があるようで,それほどてを加えないで,同じ
ことができます。さらにいいことには,標準で,wify と bluetooth が搭載されていますので,そのま
まで,wify に接続 できますし,bluetooth 経由のシリアル通信もできてしまいます。メモリーもかな
多くて,

     ESP32  フラッシュメモリー 4MB(プログラム可能領域 約1.3MB)
     arduino フラッシュメモリー 32KB 

ですから,よほど大きなスケッチ(プログラム)を組まない限り,余裕だと思います。設定をかえることで
プログラム可能領域は,3MB程度まで,増やせるようです。

流れで,写真のような,ブレッドボードで,インターネット時計を表示させるべく,あれこれやりまし
た。ESP32に直接MAX7219を接続されている方もいるようですが,一応,レベラ-を間にいれて,3.3V→5vに
してあります。

スケッチ(プログラム)の作成では,表示の部分で,その9割ぐらいの労力をさきました。SPIのライブラリー
は使いましたが,後は,自前で準備です。今回,はまったのは,switch case 文で,

     String ch;
     switch(ch){
       case ”今日”:
       case ”明日”:

のような表現ができなかったことです。arduino では,switchの括弧の中で使えるのは,int 型の数値だけ
のようで,最初分からず手間取りました。表示に必要な情報は,2進数で表現するため,あれやこれやで,
ビットの操作を今までになくやりました。

下記のスケッチは,作成に結構時間のかかった,数字の表示のサブルーチンです。キャラクターも適当に作り
ましたので,諸兄のような,かっこいい物ではありません。後日,動いている様子もUPします。

/**********************************************************
*数字セット
*
***********************************************************/
uint8_t suuji[12][8]={{0x0,0x38,0x28,0x28,0x28,0x28,0x38,0x0},//0
                {0x0,0x10,0x10,0x10,0x10,0x10,0x10,0x0},//1
                {0x0,0x38,0x8,0x38,0x20,0x20,0x38,0x0},//2
                {0x0,0x38,0x8,0x38,0x8,0x8,0x38,0x0},//3
                {0x0,0x28,0x28,0x38,0x8,0x8,0x8,0x0},//4
                {0x0,0x38,0x20,0x38,0x8,0x8,0x38,0x0},//5
                {0x0,0x38,0x20,0x38,0x28,0x28,0x38,0x0},//6
                {0x0,0x38,0x28,0x8,0x8,0x8,0x8,0x0},//7
                {0x0,0x38,0x28,0x38,0x28,0x28,0x38,0x0},//8
                {0x0,0x38,0x28,0x38,0x8,0x8,0x38,0x0},//9
                {0x0,0x0,0x10,0x0,0x0,0x10,0x0,0x0},//:
                {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}};//""
/***************************************************************
*number_set(int y,int x,string num)
*
***************************************************************/
void number_set(int y,int x,String ch){
  int num;
  if(ch=="0"){num=0;}
  if(ch=="1"){num=1;}
  if(ch=="2"){num=2;}
  if(ch=="3"){num=3;}
  if(ch=="4"){num=4;}
  if(ch=="5"){num=5;}
  if(ch=="6"){num=6;}
  if(ch=="7"){num=7;}
  if(ch=="8"){num=8;}
  if(ch=="9"){num=9;}
  if(ch=="10"){num=10;}

 int u_num=(x-1)/8+1;
  if((x % 8)==0){
    x=8;
  }
  else{
    x=x % 8;
  }
 
  switch (x){    
      case 8:
      case 7:
      case 6:
      case 5:
      case 4:      
      case 3:
        for(int i=1;i<9;i++){
          if(bitRead(suuji[num][i-1],5)){
            bitSet(dot_hoji[u_num][i],x-1);
          }
          else{
            bitClear(dot_hoji[u_num][i],x-1);
          }
          if(bitRead(suuji[num][i-1],4)){
            bitSet(dot_hoji[u_num][i],x-2);
          }
          else{
            bitClear(dot_hoji[u_num][i],x-2);
          }
          if(bitRead(suuji[num][i-1],3)){
            bitSet(dot_hoji[u_num][i],x-3);
          }
          else{
            bitClear(dot_hoji[u_num][i],x-3);
          }
        }
        break;
      case 2:
        for(int i=1;i<9;i++){  
          if(bitRead(suuji[num][i-1],5)){
            bitSet(dot_hoji[u_num][i],x-1);
          }
          else{
            bitClear(dot_hoji[u_num][i],x-1);
          }
          if(bitRead(suuji[num][i-1],4)){
            bitSet(dot_hoji[u_num][i],x-2);
          }
          else{
            bitClear(dot_hoji[u_num][i],x-2);
          }
          if(u_num>1){
            if(bitRead(suuji[num][i-1],3)){
              bitSet(dot_hoji[u_num-1][i],7);
            }
            else{
              bitClear(dot_hoji[u_num-1][i],7);
            }  
          }
        }
        break;
      case 1:
        for(int i=1;i<9;i++){  
            if(bitRead(suuji[num][i-1],5)){
              bitSet(dot_hoji[u_num][i],x-1);
            }
            else{
              bitClear(dot_hoji[u_num][i],x-1);
            }
            if(u_num>1){
              if(bitRead(suuji[num][i-1],4)){
                bitSet(dot_hoji[u_num-1][i],7);
              }
              else{
                bitClear(dot_hoji[u_num-1][i],7);
              }
              if(bitRead(suuji[num][i-1],3)){
                bitSet(dot_hoji[u_num-1][i],6);
              }
              else{
                bitClear(dot_hoji[u_num-1][i],6);
              }
            }
        }
      break;
      }
for(int i=1;i<9;i++){ 
    switch (u_num){
      case 1:
          maxTransfer(0,0);
          maxTransfer(0,0);
          maxTransfer(0,0);
          maxTransfer(i,dot_hoji[1][i]);
          digitalWrite(CS_PIN, HIGH);        
          break;
      case 2:
          maxTransfer(0,0);
          maxTransfer(0,0);
          maxTransfer(i,dot_hoji[2][i]);
          maxTransfer(i,dot_hoji[1][i]);
          digitalWrite(CS_PIN, HIGH);
          break;
      case 3:
          maxTransfer(0,0);
          maxTransfer(i,dot_hoji[3][i]);
          maxTransfer(i,dot_hoji[2][i]);
          maxTransfer(0,0);
          digitalWrite(CS_PIN, HIGH);
          break;  
      case 4:
          maxTransfer(i,dot_hoji[4][i]);
          maxTransfer(i,dot_hoji[3][i]);
          maxTransfer(0,0);
          maxTransfer(0,0);
          digitalWrite(CS_PIN, HIGH);
   }
}

また,数値の表示を呼び出すサブルーチンの引数は,数字を保存してある配列を呼び出すのに都合がよかった
のでint型にしていますが,時刻の表示を string の変数か呼び出すので,急遽 string 型にしましたが,
ここでも変換の備え付けの関数をつかいましたがうまくいかなかったので,サブルーチンの中で,
if 文で string から int に変換しました。