質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • Arduino

    516questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

unsigned char で const char * に変換させる方法を教えてください。

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 407

Hiroyadesu

score 4

Arduinoで16進数(82)を10進数(130)に進数変換したいです。

unsigned char num = 82;
const char *str = num;
long num = stratal(str, NULL, 16);
Serial.println(num); 

上記のプログラムで、unsigned char を const char * に変換させなければいいのはわかってるのですが、方法がわかりません。(事情により、必ずunsigned char 型 で宣言する必要があります)

コードの追記します。Arduinoでひらがな、アルファベットを判別し、その文字に対応してLEDを点滅させようと考えています。ひらがなが3バイトの16進数でそれを受け取るために、str[]はunsigned char 型を使用しています。

ライブラリの方で、送信した16進数のstr2のみを10進数変換し、その値により、処理を分岐させようと考えています。見辛いとは思いますが、どなたか教えていただければ幸いです。

#include "NTP.h"

//extern const BRAILLE[10][7];
extern const short int BRAILLE[10][7];
unsigned char str[6] = {};
unsigned char get_char;
int flag = 0;
int flag_func = 0; 

void setup() {

  // put your setup code here, to run once:
  Serial.begin(9600); 
  pinMode(13,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(9,OUTPUT);
  pinMode(8,OUTPUT);
}

void loop() { 

  //ここでtest関数の動作確認を今はしています。
  if(flag_func<1){
    str[1] = 81; 
    str[2] = 82;
    test(str[0], str[1], str[2], str[3], str[4], str[5]);
    flag_func++;
  }

  // put your main code here, to run repeatedly:
  if(Serial.available() > 0){  //値が送信されて来た場合       
    flag++;
    get_char = Serial.read();
    Serial.println(get_char,HEX);


    if(str[0] == 0 && get_char == 0xE3){  //受け取り文字がひらがな(3バイト)の場合
      str[0] = get_char;           
      get_char = 0;      
    } else if(str[0] == 0 && str[1] == 0 && str[2] == 0 && get_char != 0xE3){ //受け取り文字がアルファベット(1バイト)の場合
      str[0] = 1;
      str[1] = 1;
      str[2] = get_char;
    }

    else if(str[0] != 0 && str[2] != 0 && get_char == 0xE3){
      str[3] = get_char;
      get_char = 0;
    }else if(str[0] != 0 && str[2] != 0 && str[3] == 0 && str[4] == 0 && get_char != 0xE3){
      str[3] = 1;
      str[4] = 1;
      str[5] = get_char;
    }

    if(str[0] == 0xE3){   //ひらがなを受け取っている場合
      if(str[1] == 0){
        str[1] = get_char;
      }else if(str[2] == 0){
        str[2] = get_char;
      }
    }


     if(str[3] == 0xE3){   //ひらがなを受け取っている場合
      if(str[4] == 0){
        str[4] = get_char;
      }else if(str[5] == 0){
        str[5] = get_char;
      }
    }

 Serial.println("================");    
  Serial.println("途中経過です");
    for(int i=0;i<6;i++){          
      Serial.print("str");
      Serial.print(i);
      Serial.print(" = ");
      Serial.println(str[i],HEX);      
    }
     Serial.println("================");

if(str[0] != 0 && str[5] != 0){  //str配列に2文字以上格納された場合
    if(  //小文字ならば    
     ( str[4] == 0x82 && str[5] == 0x83) //「ゃ」の文字コード    
  || ( str[4] == 0x82 && str[5] == 0x85) //「ゅ」の文字コード
  || ( str[4] == 0x82 && str[5] == 0x87) //「ょ」の文字コード
    ){
      Serial.println("小文字です。str[0]~str[5]の文字コードを比較して出力します");
      digitalWrite(12,HIGH);
      digitalWrite(9,HIGH);
      delay(2000);
      digitalWrite(12,LOW);
      digitalWrite(9,LOW);
      delay(1000);

      //文字参照
      //test();
      //test(str[0], str[1], str[2], str[3], str[4], str[5]);

      for(int i=0;i<6;i++){
        str[i] = 0;
      }
    } else if(str[0] == 1 && str[1] == 1 ) {  //アルファベット(1バイト)ならば
      Serial.println("アルファベット(1バイト)文字です");
      digitalWrite(12,HIGH);
      digitalWrite(11,HIGH);
      digitalWrite(9,HIGH);
      digitalWrite(8,HIGH);
      delay(2000);
      digitalWrite(12,LOW);
      digitalWrite(11,LOW);
      digitalWrite(9,LOW);
      digitalWrite(8,LOW);
      delay(1000);
      str[0] = str[3];
      str[1] = str[4];
      str[2] = str[5];
      str[3] = 0;
      str[4] = 0;
      str[5] = 0;
    } else {  
      Serial.println("大文字です");
      digitalWrite(13,HIGH);
      digitalWrite(10,HIGH);
      delay(2000);
      digitalWrite(13,LOW);
      digitalWrite(10,LOW);
      delay(1000);
      str[0] = str[3];
      str[1] = str[4];
      str[2] = str[5];
      str[3] = 0;
      str[4] = 0;
      str[5] = 0;
    }
}

  } else if(str[0] != 0 && str[1] != 0 && str[2] != 0 && str[3] == 0 && flag > 0){ //最後の文字出力
digitalWrite(11,HIGH);
digitalWrite(12,HIGH);
digitalWrite(13,5);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
delay(2000);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
delay(1000);
 Serial.println("================");    
 Serial.println("最後の文字です!おめでとう!"); 
    for(int i=0;i<6;i++){           
      Serial.print("str");
      Serial.print(i);
      Serial.print(" = ");
      Serial.println(str[i],HEX);      
    }
     Serial.println("================");

    Serial.println("1文字出力です");    
    Serial.print("flag = ");
    Serial.println(flag);
    flag = 0;
    str[0] = 0;
    str[1] = 0;
    str[2] = 0;
    str[3] = 0;
    str[4] = 0;
    str[5] = 0;
  }

//バッファに溜まった値をクリア
Serial.flush();
}

以下ライブラリです。

#include "NTP.h"

const short int BRAILLE[400][7] = {
  {0,0,0,0,0,0,0},
  {0,0,0,0,0,0,1},
  {0,0,0,0,0,1,1},
  {0,0,0,0,1,1,1}  
  };   

 const short int TEST[10][20] = {
  {0xE3,81,82,0,0,0,100,1,1,0,0,0,0,0,0,0,0,0,0,0}, //「あ」
  {0xE3,81,84,0,0,0,101,1,1,1,0,0,0,0,0,0,0,0,0,0}, //「い」
  {0xE3,82,80,0,0,0,102,1,1,0,1,1,1,1,0,0,0,0,0,0}, //「む」
  {0xE3,82,84,0,0,0,103,1,0,0,1,1,0,0,0,0,0,0,0,0}, //「や」 
  {0xE3,83,86,0,0,0,104,1,1,1,1,1,1,0,0,0,0,0,0,0}, //「テ」
  {0xE3,83,88,0,0,0,105,1,0,1,1,1,1,0,0,0,0,0,0,0}, //「ト」
  {1,1,61,0,0,0,200,2,0,0,0,0,1,1,1,0,0,0,0,0}, //「a」
  {1,1,62,0,0,0,201,2,0,0,0,0,1,1,1,1,0,0,0,0}, //「b」
  {0xE3,81,0x8d,0,82,85,300,2,0,0,0,1,0,0,1,0,0,1,0,1}, //「きゅ」
  {0xE3,81,0x8d,0,82,87,301,2,0,0,0,1,0,0,0,1,0,1,0,1} //「きょ」
  };

//以下テスト関数です。ここで受け取った16進数のstr2のみを10進数に変換したいです。
int test(unsigned char str0, unsigned char str1, unsigned char str2, unsigned char str3, unsigned char str4, unsigned char str5){

  if(str1 == 81 ){
    Serial.println("str1 = 81 です");

    const char *str = "82";   


    //str[2]を10進数変換したものをnumに代入(http://marycore.jp/prog/c-lang/convert-binary-octal-decimal-hex-string-to-number/)
    //long n = strtol("82", NULL, 16);  //82が16進数ならば 10進数に変換した値をnに代入     
    long num = strtol(str, NULL, 16);
    Serial.println(num);    


    /*
    BRAILLE[num][0]; //打点数
    BRAILLE[num][1]; 
    BRAILLE[num][2];
    BRAILLE[num][3];
    BRAILLE[num][4];
    BRAILLE[num][5];
    BRAILLE[num][6];         
    */

  }

  if(str1 == 82){
    Serial.println("str1 = 82 です");
  }

  if(str1 == 83){
    Serial.println("str1 = 83 です");
  }

  if(str1 == 1){
    Serial.println("str = 1 です");
  }

  }




int bra(){
    //BRAILLE[0][7];
    Serial.println(BRAILLE[1][6]);
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Hiroyadesu

    2018/05/15 18:01

    はい、間違いありません。16進数特有の0xは無しでプログラムを組み立てています。

    キャンセル

  • maisumakun

    2018/05/15 18:04

    変換したいデータは、どこから入ってくるものでしょうか(コードにリテラルとして書いてあるのは、テストのためだけのものなのか、実際に動かすためのコードでもそうなるのか、そこが知りたいです)。

    キャンセル

  • Hiroyadesu

    2018/05/15 18:06

    申し訳ありません。コードの全体像を質問に追記します。

    キャンセル

回答 4

+2

前の回答にも書きましたが、unsigned char num = 82;と書いた時点で、それは10進法の82という意味にしかなりません。本当にしたいことは、「10進数の整数を16進数だと無理やり解釈させる」ことで間違いないのでしょうか。

  • ただ16進数の値をコードで使いたいだけであれば、0x82と書くだけでCコンパイラが適切に処理してくれます。
  • strtolの引数がchar *であることからわかるように、この関数は文字列を必要としています。「strtolを使う」事自体が目的なのであれば、"82"と文字列で与えるのが適切で、コードに82と整数として書くことが不適切です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/15 18:19

    お待たせしてしまい、申し訳有りません。コードを追記しました。

    今現在、自分で16進数を10進数に変換するプログラムを作成しようかとも考えています。

    キャンセル

  • 2018/05/15 18:24

    呼ぶ側と使う側が両方とも自分のコードなのであれば、正しい方策は「両側を書き換えて、そんな変な形式での値のやり取りを排除する」ことです。

    「整数だけど16進数として再解釈しないといけない」というようなイレギュラーなルールの付いた引数は、あとあとバグの原因にしかなりません。

    キャンセル

+1

ムリクリするならこんな方法

long num;
char bff[10];
unsigned char num = 82;
sprintf(bff,"%x",num);
num = strtol(bff, NULL, 16);
----

って、スペルミスしてまんがなw

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/15 18:22

    このようなやり方があるのですか。ありがとうございます。
    本当にみなさんは様々な知識があり脱帽です。

    もう少しだけやってみて、もしできそうになければy_waiwaiさんの方法で試してみます。

    キャンセル

  • 2018/05/15 18:30

    結局、sprintfで整数を16進文字列に変換して、strtolで整数に変換してるだけ、でその後の
    Serial.println(str[i],HEX); では整数を16進文字列に変換してる、というはなしですな。

    しかし、、、イマドキはUTF8なのね。

    キャンセル

+1

まず、Hiroyadesuさんの意図を尊重しますと、strtolは使用しません。
したがって、変換後の型もchar *ではありません。

今回の場合、自分でそのような変換するプログラムを書く必要があります。

コードを書いてしまっては丸投げに答えてしまうことになりますので、流れだけ記載します。

  • 82を10の位、1の位に分離します
  • 10の位に変換後の基数を掛けます
  • 足し合わせます

・・・ほぼほぼ答えじゃないかorz

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/15 18:24

    解答ありがとうございます。
    はい、自分も既存の関数ではなく、16進数の原理から勉強し直してみようと思います。
    本当にありがとうございます。

    キャンセル

  • 2018/05/15 18:25

    const short int TEST[10][20] を16進数10進数まぜこぜで宣言してしまっているのが、問題作成者の質もイマイチ、という気がしますな。。。

    キャンセル

check解決した方法

0

遅くなってしまい大変申し訳ありません。
無事に処理することができました。みなさん本当にありがとうございます。
以下大幅に手直ししたライブラリです。

#include "NTP.h"
#include <avr/pgmspace.h>  

//int flag_RBI;

const PROGMEM short int BRAILLE[4][7] = {
  {1,2,3,4,5,6,7},
  {10,0,0,0,0,0,1},
  {20,0,0,0,0,1,1},
  {30,0,0,0,1,1,1}  
  };   

 const PROGMEM short int TEST[600][19] = {  //フラッシュメモリに配列を格納

  {0,0,0,0,0,0,0,0,0,0,0,0,0},  //0
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, 
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, 
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, 
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, 
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, 
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, 
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, 
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, 
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, 
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, //10
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, 
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, 
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, 
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, 
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, 
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, 
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, 
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, 
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, 
  {2,0,0,1,1,1,1,0,1,0,1,1,0}, //20 //数字の0
  {2,0,0,1,1,1,1,1,0,0,0,0,0}, 
  {2,0,0,1,1,1,1,1,1,0,0,0,0}, 
  {2,0,0,1,1,1,1,1,0,0,1,0,0}, 
  {2,0,0,1,1,1,1,1,0,0,1,1,0}, 
  {2,0,0,1,1,1,1,1,0,0,0,1,0}, //数字の5
  {2,0,0,1,1,1,1,1,1,0,1,0,0}, 
  {2,0,0,1,1,1,1,1,1,0,1,1,0}, 
  {2,0,0,1,1,1,1,1,1,0,0,1,0}, 
  {2,0,0,1,1,1,1,0,1,0,1,0,0}, //数字の9
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, //30
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, 
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, 
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, 
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, 
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, 
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, 

          ・・・

  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {1,0,1,1,0,1,0,0,0,0,0,0,0}, //500〜 //!
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {1,0,1,1,0,1,1,0,0,0,0,0,0}, //(
  {1,0,1,1,0,1,1,0,0,0,0,0,0}, // )
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, //510〜
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0}, //520〜
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {1,0,1,0,0,0,1,0,0,0,0,0,0}, //? //530〜
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {1,0,0,0,0,1,0,0,0,0,0,0,0},//540〜 //・
  {2,0,1,0,0,1,0,0,1,0,0,1,0},//ー
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0},//550〜

  };

int test(unsigned char str0, unsigned char str1, unsigned char str2, unsigned char str3, unsigned char str4, unsigned char str5){


  if(str1 == 0x80){

    Serial.println("str1 = 80 です");
    int num = str2 + 331; //460〜  //特殊記号受け取りスタート位置
    Refer_Array(num);

  }else if(str1 == 0x81 ){

      Serial.println("str1 = 81 です");       
      int num = str2 - 30; //100〜 
      Refer_Array(num);

   }else if(str1 == 0x82){

    Serial.println("str1 = 82 です");    
    int num = str2 + 42; //170〜
    Refer_Array(num);        

  }else if(str1 == 0x83){

    if(str2 >= 187){
      Serial.println("str1 = 83 で str2 >= 187 以上です");
      int num = str2 + 273 + 80; //540〜 //特殊記号「・」「ー」の受け取り
      Refer_Array(num);
    }else {
    Serial.println("str1 = 83 です");
    int num = str2 + 112;
    Refer_Array(num); //240〜
    }

  }else if(str1 == 0xBC){

    Serial.println("str1 = BC です");
    int num = str2 + 291 + 80; //500〜 //特殊記号「(」「)」「?」「!」の受け取り
    Refer_Array(num);

  }

}

//拗音処理関数
int Youon(unsigned char str0, unsigned char str1, unsigned char str2, unsigned char str3, unsigned char str4, unsigned char str5){

Serial.println("拗音です");
 if(str1 == 0x81 && str2 == 0xb4){
    int num = str2 + str5 + 54; //311〜 //「ぴゃ」「ぴゅ」「ぴょ」の受け取り
    Refer_Array(num);

  }else if(str1 == 0x81){  

  int num = str2 + str5 + 28; //300〜
  Refer_Array(num);

 }else if(str1 == 0x82 && str2 == 0x8a){

  int num = str2 + str5 + 91; //360〜  //「りゃ」「りゅ」「りょ」の受け取り
  Refer_Array(num);

 }else if(str1 == 0x82){

  int num = str2 + str5 + 44; //380〜 //カタカナ拗音文字開始
  Refer_Array(num);

 }else if(str1 == 0x83 && str2 == 0x94){

  int num = str2 + str5 + 139;  //450〜 //ぴゃぴゅぴょ
  Refer_Array(num);

 }else if(str1 == 0x83){

  int num = str2 + str5 + 108; //400〜
  Refer_Array(num);

 }

}

//1バイト文字処理関数
int Byte_One(unsigned char str0, unsigned char str1, unsigned char str2, unsigned char str3, unsigned char str4, unsigned char str5, int FlagBigChar, int FlagSmallChar, int FlagNumChar){
  Serial.println("str1 = 1 です------------------------");
    int num = str2 - 28; //20〜
    Serial.print("FlagNumChar = ");
    Serial.println(FlagNumChar);
    Serial.print("FlagBigChar = ");
    Serial.println(FlagBigChar);
    Serial.print("FlagSmallChar = ");
    Serial.println(FlagSmallChar);

    short int RBI;    
    int CycleNum;

    RBI = pgm_read_word(&TEST[num][0]); //打点数取得

    Serial.print("打点数: TEST = [num][0] = ");
    Serial.println(RBI); 

    if(FlagNumChar > 1){
      RBI = 2;
      CycleNum = 2;
      Led_Flush_1Byte(num,RBI,CycleNum);
    }else if(FlagBigChar > 1){
      RBI = 3;
      CycleNum = 3;
      Led_Flush_1Byte(num,RBI,CycleNum); 
    }else if(FlagSmallChar > 1){
      RBI = 2;
      CycleNum = 2;
      Led_Flush_1Byte(num,RBI,CycleNum); 
    }else {
      Led_Flush(num,RBI);
    }

}


int Refer_Array(int num){ //配列参照関数

    Serial.print("num = ");
    Serial.println(num);

    short int RBI;    
    RBI = pgm_read_word(&TEST[num][0]); //打点数取得

    Serial.print("打点数: TEST = [num][0] = ");
    Serial.println(RBI); 

    Led_Flush(num,RBI);

 }




int Led_Flush(int num, int RBI){        // LED点灯関数    

 for(int i = 1; i<= RBI ; i++){
  /*
      digitalWrite(13,TEST[num][1+(i-1)*6]*5);
      digitalWrite(12,TEST[num][2+(i-1)*6]*5);
      digitalWrite(11,TEST[num][3+(i-1)*6]*5);

      digitalWrite(10,TEST[num][4+(i-1)*6]*5);
      digitalWrite( 9,TEST[num][5+(i-1)*6]*5);
      digitalWrite( 8,TEST[num][6+(i-1)*6]*5);
  */

      Serial.println("LED 点灯");
      digitalWrite(13,(int)pgm_read_word(&TEST[num][1+(i-1)*6])*5);
      digitalWrite(12,(int)pgm_read_word(&TEST[num][2+(i-1)*6])*5);
      digitalWrite(11,(int)pgm_read_word(&TEST[num][3+(i-1)*6])*5);

      digitalWrite(10,(int)pgm_read_word(&TEST[num][4+(i-1)*6])*5);
      digitalWrite( 9,(int)pgm_read_word(&TEST[num][5+(i-1)*6])*5);
      digitalWrite( 8,(int)pgm_read_word(&TEST[num][6+(i-1)*6])*5);


      delay(600);

      digitalWrite(13,LOW);
      digitalWrite(12,LOW);
      digitalWrite(11,LOW);
      digitalWrite(10,LOW);
      digitalWrite( 9,LOW);
      digitalWrite( 8,LOW);


      if(RBI > 1){
        delay(400);
      }else{
        delay(1000);
      }

    }

}



int Led_Flush_1Byte(int num, int RBI, int CycleNum){        // LED点灯関数(1バイト文字)

 for(int i = CycleNum; i<= RBI ; i++){  
      Serial.println("LED 点灯");
      digitalWrite(13,(int)pgm_read_word(&TEST[num][1+(i-1)*6])*5);
      digitalWrite(12,(int)pgm_read_word(&TEST[num][2+(i-1)*6])*5);
      digitalWrite(11,(int)pgm_read_word(&TEST[num][3+(i-1)*6])*5);

      digitalWrite(10,(int)pgm_read_word(&TEST[num][4+(i-1)*6])*5);
      digitalWrite( 9,(int)pgm_read_word(&TEST[num][5+(i-1)*6])*5);
      digitalWrite( 8,(int)pgm_read_word(&TEST[num][6+(i-1)*6])*5);

      delay(600);

      digitalWrite(13,LOW);
      digitalWrite(12,LOW);
      digitalWrite(11,LOW);
      digitalWrite(10,LOW);
      digitalWrite( 9,LOW);
      digitalWrite( 8,LOW);   

      if(RBI > 1){
        delay(400);
      }else{
        delay(1000);
      }      
    }

}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Arduino

    516questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。