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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Arduino

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

Q&A

解決済

1回答

7020閲覧

Arduinoープログラム(恐らくwhile文)で、途中で止まっているようです。

bobby2128

総合スコア42

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Arduino

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

0グッド

0クリップ

投稿2017/02/15 13:26

###前提・実現したいこと
1.Arduinoプログラムを書き込み実行したのですが、if文による条件分岐の先に進むと、プログラムが止まってしまいます。(恐らくwhile文の箇所で止まっているかと思われます。)
2.milkcocoaとESP-WROOM-02を用いておりますが、milkcocoa上にもデータが送信されていない状態です。

以下に詳しく症状を示します。
※プログラムが長く、質問投稿ができなかったため、プログラムが止まってしまう該当箇所を抜粋し記載させていただきます。

###プログラムの概要
1.ランプの点灯or非点灯を光センサで読み取り、点灯した直後にmilkcocoaにランプの情報を送信する。
2.ランプが点灯中は、常にランプの点灯非点灯を確認し、スイッチが押されるまで待機する。

###発生している問題・エラーメッセージ
プログラムが止まる(具体的には、シリアルモニタ上にセンサの読み取り値が連続的に表示されずに止まってしまう、さらに、milkcocoa上にもデータが送信されていない事を確認しました。)

具体的な症状としては、ランプが点灯するまで、シリアルモニタ上にセンサの読み取り値が常に更新されます。ところがランプが点灯してからは、確認用のLEDが点灯して、シリアルモニタ上にデータが一つ表示されてからは、ランプが消灯した後でも、状態が変わらずそのまま動作が止まってしまいます。

自分としてはwhile文がうまく抜けれていないのかと思われますが、どうかアイデアなどございましたらお教えいただきますと幸甚に存じます。

c

1/////////////////////////////////////////////////////////↓↓↓赤ランプ点灯判定(モード3)↓↓↓///////////////////////////////////////////////////////// 2 if(sensorValue3 > threshold3){ 3 digitalWrite(AKA,HIGH); 4 nowSensorState3 = true; 5 nowOperatorNoticeRed = false; 6 Ralarmstart = millis(); //50日のループ 7 digitalWrite(ledPin1, HIGH); 8 Serial.print("Sensor Value1 : "); 9 Serial.println(sensorValue1); 10 Serial.print("Sensor Value2 : "); 11 Serial.println(sensorValue2); 12 Serial.print("Sensor Value3 : "); 13 Serial.println(sensorValue3); 14 15 // Milkcocoaへ送信するデータを作成 16 DataElement elem = DataElement(); 17 18 // 各データ名で値を追加 19 elem.setValue("lightState1", nowSensorState1); 20 elem.setValue("lightState2", nowSensorState2); 21 elem.setValue("lightState3", nowSensorState3); 22 elem.setValue("AlarmStart", Ralarmstart); //ミリセカンドで送信 23 elem.setValue("nowOperatorNoticeRed", nowOperatorNoticeRed); 24 elem.setValue("nowOperatorNoticeYellow", nowOperatorNoticeYellow); 25 elem.setValue("Partscounter", partscounter); 26 27 // Milkcocoaへデータを送信 28 milkcocoa.push(MILKCOCOA_DATASTORE, &elem); 29 30 // 1秒処理を止める 31 delay(1000); 32 33/////////////////////////////////////////////////////////↑↑↑赤ランプ点灯判定(モード3)↑↑↑///////////////////////////////////////////////////////// 34/////////////////////////////////////////////////////////↓↓↓赤色ランプ点灯時の動作↓↓↓///////////////////////////////////////////////////////////// 35 // 赤色ランプ点灯している間 36 while(sensorValue3 > threshold3){ 37 STEP = 1; 38 sensorValue1 = analogRead(sensorPin1); 39 sensorValue2 = analogRead(sensorPin2); 40 sensorValue3 = analogRead(sensorPin3); 41 Serial.print("Sensor Value1 : "); 42 Serial.println(sensorValue1); 43 Serial.print("Sensor Value2 : "); 44 Serial.println(sensorValue2); 45 Serial.print("Sensor Value3 : "); 46 Serial.println(sensorValue3); 47 // オペレーターのnotice待ち 48 if(digitalRead(operatornoticebutton == HIGH)){ //operatorがnoticeボタンをONしたら 49 nowOperatorNoticeRed = false; 50 step1 = 1; 51 Roperatornotice = millis(); //その瞬間の時間を格納 52 TTN = Roperatornotice - Ralarmstart; //Time TO Noticeを算出 53 54 // Milkcocoaへ送信するデータを作成 55 DataElement elem = DataElement(); 56 57 // lightというデータ名で値を追加 58 elem.setValue("lightState1", nowSensorState1); 59 elem.setValue("lightState2", nowSensorState2); 60 elem.setValue("lightState3", nowSensorState3); 61 elem.setValue("AlarmStart", Ralarmstart); 62 elem.setValue("OperatorNotice", Roperatornotice); 63 elem.setValue("TTN", TTN); 64 elem.setValue("nowOperatorNoticeRed", nowOperatorNoticeRed); 65 elem.setValue("nowOperatorNoticeYellow", nowOperatorNoticeYellow); 66 elem.setValue("Partscounter", partscounter); 67 68 // Milkcocoaへデータを送信 69 milkcocoa.push(MILKCOCOA_DATASTORE, &elem); 70 71 // 1秒処理を止める 72 delay(1000); 73 } 74

###補足情報(言語/FW/ツール等のバージョンなど)
Arduino M0 Pro
Arduino IDE 1.8.0
ESP-WROOM-02
Milkcocoa

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

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

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

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

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

guest

回答1

0

ベストアンサー

ここのif文でしょうかね。

c

1if(digitalRead(operatornoticebutton == HIGH)){ //operatorがnoticeボタンをONしたら 23if(digitalRead(operatornoticebutton) == HIGH){ //operatorがnoticeボタンをONしたら

投稿2017/02/15 23:58

ttyp03

総合スコア16998

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

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

bobby2128

2017/02/16 00:31 編集

ttyp03様 こんにちはご回答いただきまして誠にありがとうございました。 ボタンの箇所を修正し再度トライしてみましたが、症状が変わらない結果となりました。 ところが、気づいた事として、ランプが点灯してからのセンサーの読み取り値(非点灯時よりもはるかに高い数値)が、二回シリアルモニタに表示されることから、if文の下にあるシリアルモニタ表示と、while文の中にあるシリアルモニタ表示の命令文が一回ずつ実行されているものと思われます。そして、一度その状態(停止状態)になってから、ランプを消灯してみても、状態が変わらないことから、while文の判別式sensorValue3 > threshold3を読み取っていないように思います。 従いまして、while文の中のif文の中で、停止してしまっているように思います。break文、もしくは変数のリセットを入れる必要があるのでしょうか。 お手数をおかけいたしますが、またアイデアなどございましたらご教授よろしくお願いいたします。
ttyp03

2017/02/16 00:48

ダメでしたか。すみません。 となると、while文の最初の出力は出てるっぽく、またボタンを押していないのであれば、if文の後ろにある(提示されたコードには載っていない)処理に何かあるのかなと思われます。 breakが必要かどうかは、どのような仕様なのかによりますが、赤ランプが点灯中はボタンの受け付けを行うということであれば特に必要はないと思います。
bobby2128

2017/02/16 01:09

ttyp03様 コメントいただきまして誠にありがとうございます。 説明が不足してしまい申し訳ございません。念のため補足説明させていただきますと、ボタンを押しているのですが、それでも反応しない状態となっています。
ttyp03

2017/02/16 01:16

申し訳ない。ソースだけでは原因特定できそうもありません。 if文の中にもSerial.printでデバッグ文を入れて、どこまで動いているのか、どこで止まっているのかを特定したほうが早いと思います。
ttyp03

2017/02/16 01:18

また、原因ではないかと推測しているif文の箇所を丸ごとコメント化して、動作の違いを見てみるのも良いかと思います。 while文内のSerial.printが連続して出力されるのであれば、やはり原因はif文の処理ということになりますし、それでも止まってしまうのであれば、他に原因があります。
bobby2128

2017/02/16 02:48

ttyp03 様 ご提案いただきまして誠にありがとうございます。 現在ご提案いだいた手法でデバック作業をしていると、milkcocoaに送信する以下の部分を // 各データ名で値を追加 elem.setValue("lightState1", nowSensorState1); elem.setValue("lightState2", nowSensorState2); elem.setValue("lightState3", nowSensorState3); elem.setValue("AlarmStart", Ralarmstart); //ミリセカンドで送信 elem.setValue("nowOperatorNoticeRed", nowOperatorNoticeRed); elem.setValue("nowOperatorNoticeYellow", nowOperatorNoticeYellow); elem.setValue("Partscounter", partscounter); こちらに示すようにコメント化するとシリアルモニタが連続して表示されました。 // 各データ名で値を追加 elem.setValue("lightState1", nowSensorState1); elem.setValue("lightState2", nowSensorState2); elem.setValue("lightState3", nowSensorState3); // elem.setValue("AlarmStart", Ralarmstart); //ミリセカンドで送信 elem.setValue("nowOperatorNoticeRed", nowOperatorNoticeRed); // elem.setValue("nowOperatorNoticeYellow", nowOperatorNoticeYellow); // elem.setValue("Partscounter", partscounter); 取り急ぎ途中経過まで
ttyp03

2017/02/20 06:43

解決されたのでしょうか。 原因や解決策を記入していただけると、他の方の参考になりますので、是非お願いします。
bobby2128

2017/02/20 08:03

ttyp03様 こんにちはコメントいただき誠にありがとうございます。 elem.setValueの数が3つ以上になると動作が止まる現象がみられたので、 2つまでにすると正常に動作いたしました。 また、現在新たに問題が発生し、それを先ほど質問させていただきましたので、 お手数おかけいたしますが、よろしければご確認をよろしくお願いいたします。
ttyp03

2017/02/20 08:06

ご報告ありがとうございます。 本日は多忙なため、新たな質問は明日拝見させていただきます。 それまでに解決していると良いのですが。
bobby2128

2017/02/20 08:32

ttyp03 様 ご多忙の中コメントをいただきありがとうございました。 どうか、どうかよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問