前提・実現したいこと
Arduino IDEのプログラミングについて
自身でTESTというクラスを作成したのですが、クラスの特定の変数に対して配列のようにアクセスしたいと思っています。
Test_Data型として
・Height;
・Weight;
・Length;
・Position;
の4つがある場合、値を代入するときは個々の変数名を使用したいのですが、シリアルモニタ等データを出力する際は配列を参照する様に
処理できればなと思っています。
プログラミングの経験が浅く、検索するにもやりたい事に対するキーワードが分からず質問させていただきました。
上記の方法を実現する方法がありましたらご教示いただけると幸いです。
【TEST.h】
c
1#ifndef TEST_H 2#define TEST_H 3#include "arduino.h" 4 5class TEST{ 6 public: 7 struct Test_Data{ 8 int32_t Val; 9 uint16_t Offset; 10 String Name; 11 }; 12 13 //この変数に配列の様にアクセスしたい 例)TestAry[2].Valと記述するとLength.Valにアクセスできる等 14 Test_Data Height; //[0] 15 Test_Data Weight; //[1] 16 Test_Data Length; //[2] 17 Test_Data Position; //[3] 18 19 bool Test_A; 20 bool Test_B; 21 bool Test_C; 22 23 void Ini(); 24 void GetData(); 25 void DataConvert(Test_Data & Data); 26 27 private: 28}; 29#endif
【Main.ino】
c
1#include "TEST.h" 2TEST test; 3 4uint32_t LastTime; 5 6void setup(){ 7 Serial.begin(9600); 8 9 pinMode(0, INPUT_PULLUP); 10 pinMode(1, INPUT_PULLUP); 11 pinMode(2, INPUT_PULLUP); 12 pinMode(3, INPUT_PULLUP); 13 14 test.Ini(); 15 16 LastTime = millis(); 17} 18 19void loop(){ 20 if(digitalRead(0)){ 21 test.Height.Val= analogRead(4); 22 } 23 24 if(digitalRead(1)){ 25 test.Weight.Val= analogRead(5); 26 } 27 28 if(digitalRead(2)){ 29 test.Length.Val= analogRead(6); 30 } 31 32 if(digitalRead(3)){ 33 test.Position.Val= analogRead(7); 34 } 35 36 if(millis() - LastTime >= 1000){ 37 Serial.print(test.Height.Val); 38 Serial.print(", "); 39 Serial.print(test.Weight.Val); 40 Serial.print(", "); 41 Serial.print(test.Length.Val); 42 Serial.print(", "); 43 Serial.print(test.Position.Val); 44 45// 上記をできれば配列の様にForで回したい 46// for (uint8_t i = 0; i <= 3; i++){ 47// Serial.print(test.DataAry[i].Val); 48// Serial.print(", "); 49// } 50 51 Serial.println(); 52 53 LastTime = millis(); 54 } 55}
補足情報
・Test_Data型の変数は本来100個ほどあるのですが、見づらくなってしまうので例として4個で記述しました
###回答を頂いた例を参考にして
ポインタ・列挙体・オペレータを使用する方法を試しましたが、全てやりたかったことが実現できました。
が、やりたいことは出来たのですが全ての方法で微妙に差があるためどれが適した方法なのか悩ましいです。
個人的にはオペレータを使用した方法がクラスの使用時にシンプルかと思いましたが、メリット・デメリットありますでしょうか?
【TEST.h】
c
1#ifndef TEST_H 2#define TEST_H 3#include "arduino.h" 4 5class TEST { 6 public: 7 struct Test_Data { 8 int32_t Val; 9 uint16_t Offset; 10 String Name; 11 }; 12 13 //この変数に配列の様にアクセスしたい 例)TestAry[2].Valと記述するとLength.Valにアクセスできる等 14 Test_Data Height; //[0] 15 Test_Data Weight; //[1] 16 Test_Data Length; //[2] 17 Test_Data Position; //[3] 18 19 //ポインタ////////////////////////////////////////////////// 20 Test_Data *DataAry_P[4] = { 21 &Height, 22 &Weight, 23 &Length, 24 &Position 25 }; 26 27 //列挙体////////////////////////////////////////////////// 28 enum TestIndex { 29 H_Index, 30 W_Index, 31 L_Index, 32 P_Index 33 }; 34 35 Test_Data DataAry_E[sizeof(TestIndex)]; 36 37 Test_Data &H(){return DataAry_E[H_Index];} 38 Test_Data &W(){return DataAry_E[W_Index];} 39 Test_Data &L(){return DataAry_E[L_Index];} 40 Test_Data &P(){return DataAry_E[P_Index];} 41 42 //オペレータ////////////////////////////////////////////////// 43 Test_Data& operator[] (uint8_t n) { 44 switch (n) { 45 case 0: return Height; 46 case 1: return Weight; 47 case 2: return Length; 48 case 3: return Position; 49 } 50 }; 51 52 bool Test_A; 53 bool Test_B; 54 bool Test_C; 55 56 57 private: 58}; 59#endif
【Main.ino】
c
1#include "TEST.h" 2TEST test; 3 4uint32_t LastTime; 5uint32_t Cnt; 6 7void setup() { 8 Serial.begin(9600); 9 10 LastTime = millis(); 11} 12 13void loop() { 14 if (millis() - LastTime >= 1000) { 15 LastTime = millis(); 16 Serial.println(Cnt); 17 18 //オペレータ////////////////////////////////////////////////// 19 test.Height.Val = 1; 20 test.Weight.Val = 2; 21 test.Length.Val = 3; 22 test.Position.Val = 4; 23 Serial.print("Operator:"); 24 for (uint8_t i = 0; i <= 3; i++) { 25 Serial.print(test[i].Val); 26 Serial.print(", "); 27 } 28 Serial.println(); 29 30 //列挙体////////////////////////////////////////////////// 31 test.H().Val = 100; 32 test.W().Val = 200; 33 test.L().Val = 300; 34 test.P().Val = 400; 35 Serial.print("Enumerate:"); 36 for (uint8_t i = 0; i <= 3; i++) { 37 Serial.print(test.DataAry_E[i].Val); 38 Serial.print(", "); 39 } 40 Serial.println(); 41 42 //ポインタ////////////////////////////////////////////////// 43 test.DataAry_P[0]->Val = 1000; 44 (*test.DataAry_P[1]).Val = 2000; 45 test.DataAry_P[2]->Val = 3000; 46 test.DataAry_P[3]->Val = 4000; 47 Serial.print("Pointer:"); 48 for (uint8_t i = 0; i <= 3; i++) { 49 Serial.print(test.DataAry_P[i]->Val); 50 Serial.print(", "); 51 } 52 Serial.println(); 53 54 Serial.println(); 55 Cnt++; 56 } 57}
回答3件
あなたの回答
tips
プレビュー