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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

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

Q&A

2回答

871閲覧

ESP32でセンサ1が最大値をとったときのセンサ2の値を知りたい

Uka

総合スコア28

Arduino

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

0グッド

0クリップ

投稿2020/01/28 13:23

編集2020/01/28 15:12

前提・実現したいこと

ESP32を使って、センサ1が最大値をとったときのセンサ2の値を知りたい。

発生している問題・エラーメッセージ

下記のソースコードを作成し、Serial.printでセンサ1の最大値であるpeakの値は正しく出力されるが、そのときのセンサ2の値であるpeak2は-100が出力されてしまう。
センサ1の最大値を返す関数であるmaxv関数は正常に動作しているが、センサ1が最大値をとるときのセンサ2の値を返すmaxV関数(maxv関数をベースに書き加えた)では初期値である-100が
返され、本来の正しい値が返されていない。

センサ1が最大値をとったときのセンサ2の値を得るにはどのように記述すればよいかアドバイスいただけるとありがたいです。
よろしくお願いします。

該当のソースコード

double x[N];
double y[N];
double z[N];
define N 1000

void setup(){省略}

void loop(){

//最大値を表示
double peak = maxv(x,N); //センサ1の最大値を入れるための変数
double peak2 = maxV(y,z,N); //センサ1が最大値のときのセンサ2の値を入れるための変数

Serial.print(peak,3);
Serial.print("");
Serial.println(peak2,3);

}

double maxv(double data[],int num){     //センサ1の最大値を求めるための関数
double maxnum=-100;//仮の最大値
double sensor1;

for(int i=i;i<num;i=i+1){

sensor1 = analogRead(A0);

if(sensor1>0.1){ data[i] = sensor1; //より大きな値に入れ替える if(maxnum < data[i]) maxnum=data[i]; delay(10); }

if(maxnum*0.7>=data[i])
break;
}
//値を返す
return maxnum;
}

double maxV(double data[],double data2[],int num){ //センサ1の最大値のときのセンサ2の値を求めるための関数
double maxnum=-100;//仮の最大値
double maxnum2=-100;//仮の最大値
double sensor1;
double sensor2;

for(int i=i;i<num;i=i+1){

sensor1 = analogRead(A0);
sensor2 = analogRead(A1);

if(sensor1>0.1){ data[i] = sensor1; data2[i] = sensor2; //より大きな値に入れ替える if(maxnum < data[i]) maxnum=data[i]; //i番目のときのdata配列をmaxnumに入れる maxnum2=data2[i];   //i番目のときのdata2配列をmaxnum2に入れる delay(10); }

if(maxnum*0.7>=data[i])
break;
}
//値を返す
return maxnum2;
}

試したこと

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

まさかと思いますけど、ArduinoはUNOじゃないですよね?
UNOだとRAM容量が2KBだから...
(試してみるとビルドは通ってしまう。怖い。)

投稿2020/01/28 14:46

thkana

総合スコア7639

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Uka

2020/01/28 15:00

回答いただきましてありがとうございます。 すみません、マイコンはArduinoではなく、ESP32です。
thkana

2020/01/28 22:38

あ、ちゃんと書いてありますね。 失礼しました。
thkana

2020/01/28 23:01

値の取得と最大値の検出がごっちゃになってるのが怪しいな。 今スマホなので詳細は(それまでに解決してなければ)今夜にでも。
thkana

2020/01/29 13:50

引数2つのmaxvで引っ掛ける「最大」と引数3つのmaxvでの「最大」は違うものだというのは承知のうえですね? それはともかく。よく見れば怪しいと思ったところではなくて for (int i = i; i < num; i = i + 1) { これでしょうね。C/C++(C++をベースにしたArduino言語)では、ローカル変数(関数の中で宣言した変数)がstaticでない場合、その初期値は不定(実行してみるまでわからない)です。 int i=i; について、いろいろ疑問はありますが、その値が不定なので、たまたま0になるかも、-100になるかも、20億になるかも、とにかくわかりません。numより大きな値になっていれば、forの繰り返しは素通りしてしまい、即returnするので-100が返る、ということになっている気がします。
Uka

2020/01/30 14:16

アドバイスありがとうございます。たしかに引数2つでのmaxv関数についても初期値がi=iになっていますが、たまたまうまくいっていただけかもしれませんね。引数3つのmaxV関数の初期値をi=0に修正し、関数の中身も再考してみたいと思います。
guest

0

if(maxnum < data[i]) maxnum=data[i]; //i番目のときのdata配列をmaxnumに入れる

maxnum2=data2[i];   //i番目のときのdata2配列をmaxnum2に入れる

maxnumに値が入るときに、maxnum2に値を入れなければなりませんが、そうなってません。
maxnum2 の行は、if文の結果に関わらず実行されてしまいますね

投稿2020/01/28 13:33

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Uka

2020/01/28 14:19

ご回答いただきありがとうございます。 以下のようにifのあとを波カッコ{}でくくってみましたが、結果は変わりませんでした。これだと、if条件が真のときに、i番目のmaxnum2を更新することになりませんでしょうか? if(maxnum < data[i]){ maxnum=data[i];  maxnum2=data2[i];    delay(10); } ちなみに、配列を一義的に定義した以下のサンプルだと思い通りに動くので、これを参考にセンサ値を配列かして書き換えているのですが、上記の記述が間違っていますでしょうか? void loop() { int c[5] = {5,7,2,6,8}; int d[5] = {1,9,3,8,5}; int maxnum=0; int maxd=0; for(int i=0;i<5;i=i+1){ if(maxnum < c[i]){ maxnum=c[i]; maxd=d[i]; } } Serial.print(maxnum); Serial.print(","); Serial.println(maxd); } 出力値:8,5
y_waiwai

2020/01/28 14:44

double x[N]; double y[N]; double z[N]; define N 1000 この定義ではコンパイルエラーになると思いますが、ホンマにこのとおりでしょうか?
Uka

2020/01/28 14:50

はい、コンパイルは通っています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問