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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

1564閲覧

Arduino M0 Pro, ESP-WROOM-02, MILKCOCOA, Arduino IDEープログラム動作検証ー

bobby2128

総合スコア42

C

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2017/02/20 04:57

編集2017/02/20 05:18

###前提・実現したいこと
ランプ(赤色)が点灯している時、光センサでそれを検知しarduinoとESP-WROOM-02を用いてmilkcocoaへ送信させたいため、プログラムを下記のように作成いたしました。点灯していないときも、点灯していない情報を同様にmilkcocoaへ送信させます。

###発生している問題・エラーメッセージ
①点灯が無い場合のモード(モード0)の全箇所をコメント化した際は、赤ランプが点灯した際にmilkcocoaへランプの点灯情報を送信しました。
②しかし、無点灯のモードに関わるプログラムを有効にし実行すると、(初期状態は無点灯です。)無点灯中は無事にmilkcocoaへ無点灯中の情報を送信するのですが、そこからランプを点灯させると、Arduino IDEのシリアルモニタ上では点灯情報(zennouという変数が4になり)連続的に出力しているにもかかわらず、milkcocoaにはデータが来ていない状態になります。
③その後さらにランプを消灯すると、シリアルモニタ上にはzennou変数が0になり連続的に出力しているのにも関わらず、milkcocoaへはデータが来ていない状態が続きます。
④その後さらにランプを点灯させると、シリアルモニタに「Connecting to MQTT... MQTT Connected!」と表示された後、zennou変数が4とシリアルモニタに連続的に表示された後、不思議とmilkcocoaにデータが送信されるようになります。

※④の後消灯すると、シリアルモニタ上にはzennnou変数が0になり無点灯の情報がmilkcocoへ無事に送信されますが、その後は②、③、④を繰り返します。

従いまして、奇数回目の点灯は送信されず、偶数回目の点灯は送信されている不思議な状態です。

全ての状態を送信したいのですが、何か解決に際して良いアイデアや助言、アドバイスなどございましたらお教えいただけますと幸甚に存じます。

###該当のソースコード

c

1/** 2 * ループ処理 3 */ 4void loop() { 5 // Milkcocoaのループ処理を実行 6 milkcocoa.loop(); 7 8 // センサーの値 9 int sensorValue = analogRead(sensorPin); 10 int sensorValue1 = analogRead(sensorPin1); 11 int sensorValue2 = analogRead(sensorPin2); 12 int sensorValue3 = analogRead(sensorPin3); 13 int partscounter = 0; 14 int bluestep = 0; 15 int step1 = 0; 16 int step2 = 0; 17 int STEP = 0; 18 int zennou = 0; 19 20 Serial.print("Sensor Value : "); 21 Serial.println(sensorValue); 22 Serial.print("Sensor Value1 : "); 23 Serial.println(sensorValue1); 24 Serial.print("Sensor Value2 : "); 25 Serial.println(sensorValue2); 26 Serial.print("Sensor Value3 : "); 27 Serial.println(sensorValue3); 28 Serial.print("zennou : "); 29 Serial.println(zennou); 30 31 32///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 33/////////////////////////////////////////////////////////↓↓↓赤ランプ点灯判定(モード3)↓↓↓///////////////////////////////////////////////////////// 34///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 35 36 if(sensorValue3 > threshold3){ 37 digitalWrite(AKA,HIGH); 38 digitalWrite(ledPin1, HIGH); //noticeボタン近くのLED点灯 39 nowSensorState3 = true; 40 zennou = 4; 41 42 sensorValue1 = analogRead(sensorPin1); 43 sensorValue2 = analogRead(sensorPin2); 44 sensorValue3 = analogRead(sensorPin3); 45 Serial.print("Sensor Value1 : "); 46 Serial.println(sensorValue1); 47 Serial.print("Sensor Value2 : "); 48 Serial.println(sensorValue2); 49 Serial.print("Sensor Value3 : "); 50 Serial.println(sensorValue3); 51 Serial.print("zennou : "); 52 Serial.println(zennou); 53 54 // Milkcocoaへ送信するデータを作成 55 DataElement elem = DataElement(); 56 57 // 各データ名で値を追加 58 elem.setValue("zennou", zennou); 59 elem.setValue("Partscounter", partscounter); 60 61 // Milkcocoaへデータを送信 62 milkcocoa.push(MILKCOCOA_DATASTORE, &elem); 63 64 // 1秒処理を止める 65 delay(1000); 66 67///////////////////////////////////////////////////////↑↑↑赤ランプ点灯判定(モード3)↑↑↑///////////////////////////////////////////////////////// 68/////////////////////////////////////////////////////////↓↓↓赤色ランプ点灯時の動作↓↓↓///////////////////////////////////////////////////////////// 69 // 赤色ランプ点灯している間 70 while(sensorValue3 > threshold3){ 71 STEP = 1; 72 if(step1 == 1){ 73 zennou = 6; 74 } 75 if(step1 == 0){ 76 zennou = 4; 77 } 78 79 sensorValue1 = analogRead(sensorPin1); 80 sensorValue2 = analogRead(sensorPin2); 81 sensorValue3 = analogRead(sensorPin3); 82 Serial.print("Sensor Value1 : "); 83 Serial.println(sensorValue1); 84 Serial.print("Sensor Value2 : "); 85 Serial.println(sensorValue2); 86 Serial.print("Sensor Value3 : "); 87 Serial.println(sensorValue3); 88 Serial.print("zennou : "); 89 Serial.println(zennou); 90 // Milkcocoaへ送信するデータを作成 91 DataElement elem = DataElement(); 92 93 // 各データ名で値を追加 94 elem.setValue("zennou", zennou); 95 elem.setValue("Partscounter", partscounter); 96 97 // Milkcocoaへデータを送信 98 milkcocoa.push(MILKCOCOA_DATASTORE, &elem); 99 100 // 1秒処理を止める 101 delay(1000); 102 103// オペレーターのnotice待ち 104 if(digitalRead(operatornoticebutton) == HIGH){ //operatorがnoticeボタンをONしたら 105 digitalWrite(ledPin1, LOW); //noticeボタン用のライトが消える 106 digitalWrite(ledPin2, HIGH); //finishボタン用のライトを点灯させる 107 step1 = 1; 108 zennou=6; 109 110 sensorValue1 = analogRead(sensorPin1); 111 sensorValue2 = analogRead(sensorPin2); 112 sensorValue3 = analogRead(sensorPin3); 113 Serial.print("Sensor Value1 : "); 114 Serial.println(sensorValue1); 115 Serial.print("Sensor Value2 : "); 116 Serial.println(sensorValue2); 117 Serial.print("Sensor Value3 : "); 118 Serial.println(sensorValue3); 119 Serial.print("zennou : "); 120 Serial.println(zennou); 121 122 // Milkcocoaへ送信するデータを作成 123 DataElement elem = DataElement(); 124 125 // lightというデータ名で値を追加 126 elem.setValue("zennou", zennou); 127 elem.setValue("Partscounter", partscounter); 128 129 // Milkcocoaへデータを送信 130 milkcocoa.push(MILKCOCOA_DATASTORE, &elem); 131 132 // 1秒処理を止める 133 delay(1000); 134 } 135 136 137// オペレーターのnotice後 138 if(zennou == 6 && digitalRead(operatorfinishbutton) == HIGH){ //operatorがfinishボタンをONしたら 139 step2 = 1; 140 zennou = 6; 141 digitalWrite(ledPin2, LOW); 142 digitalWrite(ledPin1, LOW); 143 144 // Milkcocoaへ送信するデータを作成 145 DataElement elem = DataElement(); 146 147 // lightというデータ名で値を追加 148 elem.setValue("zennou", zennou); 149 elem.setValue("Partscounter", partscounter); 150 151 // Milkcocoaへデータを送信 152 milkcocoa.push(MILKCOCOA_DATASTORE, &elem); 153 154 // 1秒処理を止める 155 delay(1000); 156 157 }//operatornotice後のif文カッコ閉じ 158 }//赤色ランプ点灯している間 159 sensorValue1 = analogRead(sensorPin1); 160 sensorValue2 = analogRead(sensorPin2); 161 sensorValue3 = analogRead(sensorPin3); 162 Serial.print("Sensor Value1 : "); 163 Serial.println(sensorValue1); 164 Serial.print("Sensor Value2 : "); 165 Serial.println(sensorValue2); 166 Serial.print("Sensor Value3 : "); 167 Serial.println(sensorValue3); 168 Serial.print("zennou : "); 169 Serial.println(zennou); 170 171 STEP = 0; 172 step1 = 0; 173 step2 = 0; 174 nowSensorState3 = false; //赤ランプ点灯終わったらnowSensorState3の状態を更新 175 }//赤ランプ点灯判定 モード3 176 177 digitalWrite(ledPin2, LOW); 178 digitalWrite(ledPin1, LOW); 179 digitalWrite(AKA,LOW); 180 STEP = 0; 181 step1 = 0; 182 step2 = 0; 183/////////////////////////////////////////////↑↑↑赤色ランプ点灯時の動作↑↑↑////////////////////////////////////////////////////// 184 185//赤色ランプが点灯していないとき 186if(sensorValue3<threshold3){ 187 nowSensorState3 = false; 188} 189////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 190////////////////////////////////////////////↑↑↑赤ランプ(モード3)関連のプログラム↑↑↑////////////////////////////////////////////////// 191////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 192 193////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 194////////////////////////////////////////////↓↓↓何も点灯していないとき点灯判定(モード0)↓↓↓//////////////////////////////////////////// 195////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 196 197 if(sensorValue1 < threshold1 && sensorValue2 < threshold2 && sensorValue3 < threshold3){ 198 zennou = 0; 199 200 while(sensorValue1 < threshold1 && sensorValue2 < threshold2 && sensorValue3 < threshold3){ //無点灯の間 201 sensorValue1 = analogRead(sensorPin1); 202 sensorValue2 = analogRead(sensorPin2); 203 sensorValue3 = analogRead(sensorPin3); 204 Serial.print("Sensor Value1 : "); 205 Serial.println(sensorValue1); 206 Serial.print("Sensor Value2 : "); 207 Serial.println(sensorValue2); 208 Serial.print("Sensor Value3 : "); 209 Serial.println(sensorValue3); 210 Serial.print("zennou : "); 211 Serial.println(zennou); 212 213 // Milkcocoaへ送信するデータを作成 214 DataElement elem = DataElement(); 215 216 // 各データ名で値を追加 217 elem.setValue("zennou", zennou); 218 elem.setValue("Partscounter", partscounter); 219 220 // Milkcocoaへデータを送信 221 milkcocoa.push(MILKCOCOA_DATASTORE, &elem); 222 223 // 1秒処理を止める 224 delay(1000); 225 }//無点灯を続けている限り 226 }//もし何も点灯していないとき。 227////////////////////////////////////////////↑↑↑何も点灯していないとき点灯判定(モード0)↑↑↑//////////////////////////////////////////////////// 228}//loop文のカッコ閉じ 229 230 231/* 232 * Milkcocoaへ光センサーの値がpushされた 233 */ 234void milkcocoaPushDataHandler(DataElement *pelem) { 235 // 明るさの状態を更新 236 sensorState1 = nowSensorState1; 237 sensorState2 = nowSensorState2; 238 sensorState3 = nowSensorState3; 239} 240

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

ソースを見てみましたが、決定的な原因はわかりませんでした。
しかし決定的に作りが悪い(それが原因とは思えませんが)のでリファクタリングをしてみました。
動作環境がないので確認はできていないのですが、以下のような感じで良いのかなと思います。
状態遷移という手法です。
変数modeに従ってloop関数が呼ばれるたびに処理を行うようにしています。
ざっくり作り直しただけなので足りないところとか端折ったがあるかもしれませんが、大まかな流れとして見てみてください。

c

1void loop() { 2 // Milkcocoaのループ処理を実行 3 milkcocoa.loop(); 4 5 // センサーの値 6 int sensorValue = analogRead(sensorPin); 7 int sensorValue1 = analogRead(sensorPin1); 8 int sensorValue2 = analogRead(sensorPin2); 9 int sensorValue3 = analogRead(sensorPin3); 10 int partscounter = 0; 11 int zennou = 0; 12 static int mode = 0; 13 14 Serial.print("Sensor Value : "); 15 Serial.println(sensorValue); 16 Serial.print("Sensor Value1 : "); 17 Serial.println(sensorValue1); 18 Serial.print("Sensor Value2 : "); 19 Serial.println(sensorValue2); 20 Serial.print("Sensor Value3 : "); 21 Serial.println(sensorValue3); 22 Serial.print("zennou : "); 23 Serial.println(zennou); 24 25 // Milkcocoaへ送信するデータを作成 26 DataElement elem = DataElement(); 27 28 // 各データ名で値を追加 29 elem.setValue("zennou", zennou); 30 elem.setValue("Partscounter", partscounter); 31 32 // Milkcocoaへデータを送信 33 milkcocoa.push(MILKCOCOA_DATASTORE, &elem); 34 35 switch(mode){ 36 // 全消灯 37 case 0: 38 // 赤点灯判定 39 if(sensorValue3 > threshold3){ 40 digitalWrite(AKA,HIGH); 41 digitalWrite(ledPin1, HIGH); //noticeボタン近くのLED点灯 42 nowSensorState3 = true; 43 mode = 1; 44 } 45 break; 46 47 // 赤点灯 48 case 1: 49 // operatorがnoticeボタンをONしたら 50 if(digitalRead(operatornoticebutton) == HIGH){ 51 digitalWrite(ledPin2, LOW); 52 digitalWrite(ledPin1, LOW); 53 delay(1000); 54 digitalWrite(ledPin2, LOW); 55 digitalWrite(ledPin1, LOW); 56 } 57 58 // 赤消灯判定 59 if(sensorValue3 <= threshold3){ 60 digitalWrite(ledPin2, LOW); 61 digitalWrite(ledPin1, LOW); 62 digitalWrite(AKA,LOW); 63 mode = 0; 64 } 65 break; 66 67 default: 68 break; 69 } 70 71 // 1秒処理を止める 72 delay(1000); 73} 74

投稿2017/02/21 04:36

ttyp03

総合スコア16996

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

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

bobby2128

2017/02/22 01:18

ttyp03様 いつも親切にご回答くださり誠にありがとうございます。 また、プログラムの提供をいただき、大変勉強になりました。 自分でいろいろ試した結果、milkcocoa.loop();をもう一つ、シリアルプリントの下(ランプ点灯判定モードの手前)に追記したところ、動作としてはうまく動きましたが、ttyp03様のおっしゃる通り、プログラムの作りが悪いので、今後ご提案いただきましたコードを参考に、形を修正していきたいと思います。 ありがとうございました。 (現在はRTCモジュールのコンパイルで問題が出たので、それをまた現在質問させていただいております。)
ttyp03

2017/02/22 01:22

これだ!という原因まで回答できなくて申し訳ありません。 どうやらmilkcocoa.loop();は定期的に呼び出さないといけないのかもしれませんね。 怪しいとは思っていましたが、マニュアルを見てもそれについての説明は書いてありませんでした。 今回提案したコードでは定期的に呼び出す作りにはなっているので、解消されるものと思われます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問