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

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

ただいまの
回答率

90.52%

  • Android

    6513questions

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

  • C

    3670questions

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

  • Milkcocoa

    101questions

    Milkcocoaとは、バックエンド機能を提供するBaaSサービスの一つです。サーバを準備することなく、フロントエンドのコーディングだけでデータの保存・更新・取得、またPub/Sub通信行うことが可能です。

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

解決済

回答 1

投稿 編集

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

bobby2128

score 33

前提・実現したいこと

ランプ(赤色)が点灯している時、光センサでそれを検知し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へ無事に送信されますが、その後は②、③、④を繰り返します。

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

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

該当のソースコード

/**
 * ループ処理
 */
void loop() {
  // Milkcocoaのループ処理を実行
  milkcocoa.loop();

  // センサーの値
  int sensorValue = analogRead(sensorPin);
  int sensorValue1 = analogRead(sensorPin1);
  int sensorValue2 = analogRead(sensorPin2);
  int sensorValue3 = analogRead(sensorPin3);
  int partscounter = 0;
  int bluestep = 0;  
  int step1 = 0;
  int step2 = 0;
  int STEP = 0;
  int zennou = 0;

  Serial.print("Sensor Value : ");
  Serial.println(sensorValue);
  Serial.print("Sensor Value1 : ");
  Serial.println(sensorValue1);
  Serial.print("Sensor Value2 : ");
  Serial.println(sensorValue2); 
  Serial.print("Sensor Value3 : ");
  Serial.println(sensorValue3);
  Serial.print("zennou : ");
  Serial.println(zennou);  


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
/////////////////////////////////////////////////////////↓↓↓赤ランプ点灯判定(モード3)↓↓↓/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  if(sensorValue3 > threshold3){
    digitalWrite(AKA,HIGH);
    digitalWrite(ledPin1, HIGH); //noticeボタン近くのLED点灯
    nowSensorState3 = true;
    zennou = 4;

    sensorValue1 = analogRead(sensorPin1);
    sensorValue2 = analogRead(sensorPin2);
    sensorValue3 = analogRead(sensorPin3);
    Serial.print("Sensor Value1 : ");
    Serial.println(sensorValue1);
    Serial.print("Sensor Value2 : ");
    Serial.println(sensorValue2); 
    Serial.print("Sensor Value3 : ");
    Serial.println(sensorValue3);
    Serial.print("zennou : ");
    Serial.println(zennou);    

  // Milkcocoaへ送信するデータを作成
    DataElement elem = DataElement();

  // 各データ名で値を追加
    elem.setValue("zennou", zennou);   
    elem.setValue("Partscounter", partscounter);

  // Milkcocoaへデータを送信
    milkcocoa.push(MILKCOCOA_DATASTORE, &elem);

  // 1秒処理を止める
    delay(1000);

///////////////////////////////////////////////////////↑↑↑赤ランプ点灯判定(モード3)↑↑↑/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////↓↓↓赤色ランプ点灯時の動作↓↓↓/////////////////////////////////////////////////////////////
  // 赤色ランプ点灯している間    
  while(sensorValue3 > threshold3){
    STEP = 1;
    if(step1 == 1){
      zennou = 6;
    }
    if(step1 == 0){
    zennou = 4;
    }

    sensorValue1 = analogRead(sensorPin1);
    sensorValue2 = analogRead(sensorPin2);
    sensorValue3 = analogRead(sensorPin3);
    Serial.print("Sensor Value1 : ");
    Serial.println(sensorValue1);
    Serial.print("Sensor Value2 : ");
    Serial.println(sensorValue2); 
    Serial.print("Sensor Value3 : ");
    Serial.println(sensorValue3);
    Serial.print("zennou : ");
    Serial.println(zennou);
   // Milkcocoaへ送信するデータを作成
    DataElement elem = DataElement();

  // 各データ名で値を追加
    elem.setValue("zennou", zennou);   
    elem.setValue("Partscounter", partscounter);

  // Milkcocoaへデータを送信
    milkcocoa.push(MILKCOCOA_DATASTORE, &elem);

  // 1秒処理を止める
    delay(1000);    

//   オペレーターのnotice待ち
    if(digitalRead(operatornoticebutton) == HIGH){                 //operatorがnoticeボタンをONしたら
      digitalWrite(ledPin1, LOW); //noticeボタン用のライトが消える
      digitalWrite(ledPin2, HIGH); //finishボタン用のライトを点灯させる
      step1 = 1;
      zennou=6;

      sensorValue1 = analogRead(sensorPin1);
      sensorValue2 = analogRead(sensorPin2);
      sensorValue3 = analogRead(sensorPin3);
      Serial.print("Sensor Value1 : ");
      Serial.println(sensorValue1);
      Serial.print("Sensor Value2 : ");
      Serial.println(sensorValue2); 
      Serial.print("Sensor Value3 : ");
      Serial.println(sensorValue3);
      Serial.print("zennou : ");
      Serial.println(zennou);    

      // Milkcocoaへ送信するデータを作成
        DataElement elem = DataElement();

      // lightというデータ名で値を追加
        elem.setValue("zennou", zennou);         
        elem.setValue("Partscounter", partscounter);

      // Milkcocoaへデータを送信
        milkcocoa.push(MILKCOCOA_DATASTORE, &elem);

      // 1秒処理を止める
        delay(1000);            
    }


// オペレーターのnotice後  
    if(zennou == 6 && digitalRead(operatorfinishbutton) == HIGH){    //operatorがfinishボタンをONしたら
      step2 = 1;
      zennou = 6;
      digitalWrite(ledPin2, LOW);
      digitalWrite(ledPin1, LOW);

   // Milkcocoaへ送信するデータを作成
      DataElement elem = DataElement();

   // lightというデータ名で値を追加
      elem.setValue("zennou", zennou);         
      elem.setValue("Partscounter", partscounter);

   // Milkcocoaへデータを送信
      milkcocoa.push(MILKCOCOA_DATASTORE, &elem);

   // 1秒処理を止める
      delay(1000);

    }//operatornotice後のif文カッコ閉じ
  }//赤色ランプ点灯している間
  sensorValue1 = analogRead(sensorPin1);
  sensorValue2 = analogRead(sensorPin2);
  sensorValue3 = analogRead(sensorPin3);
  Serial.print("Sensor Value1 : ");
  Serial.println(sensorValue1);
  Serial.print("Sensor Value2 : ");
  Serial.println(sensorValue2); 
  Serial.print("Sensor Value3 : ");
  Serial.println(sensorValue3);
  Serial.print("zennou : ");
  Serial.println(zennou); 

  STEP = 0;
  step1 = 0;
  step2 = 0;
  nowSensorState3 = false; //赤ランプ点灯終わったらnowSensorState3の状態を更新
  }//赤ランプ点灯判定 モード3

  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin1, LOW);
  digitalWrite(AKA,LOW);
  STEP = 0;
  step1 = 0;
  step2 = 0;
/////////////////////////////////////////////↑↑↑赤色ランプ点灯時の動作↑↑↑//////////////////////////////////////////////////////

//赤色ランプが点灯していないとき 
if(sensorValue3<threshold3){
  nowSensorState3 = false;  
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////↑↑↑赤ランプ(モード3)関連のプログラム↑↑↑//////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////↓↓↓何も点灯していないとき点灯判定(モード0)↓↓↓////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 if(sensorValue1 < threshold1 && sensorValue2 < threshold2 && sensorValue3 < threshold3){
   zennou = 0;

  while(sensorValue1 < threshold1 && sensorValue2 < threshold2 && sensorValue3 < threshold3){   //無点灯の間
    sensorValue1 = analogRead(sensorPin1);
    sensorValue2 = analogRead(sensorPin2);
    sensorValue3 = analogRead(sensorPin3);
    Serial.print("Sensor Value1 : ");
    Serial.println(sensorValue1);
    Serial.print("Sensor Value2 : ");
    Serial.println(sensorValue2); 
    Serial.print("Sensor Value3 : ");
    Serial.println(sensorValue3);
    Serial.print("zennou : ");
    Serial.println(zennou);

    // Milkcocoaへ送信するデータを作成
    DataElement elem = DataElement();

    // 各データ名で値を追加
    elem.setValue("zennou", zennou);
    elem.setValue("Partscounter", partscounter);

    // Milkcocoaへデータを送信
    milkcocoa.push(MILKCOCOA_DATASTORE, &elem);

    // 1秒処理を止める
    delay(1000);
    }//無点灯を続けている限り
  }//もし何も点灯していないとき。
////////////////////////////////////////////↑↑↑何も点灯していないとき点灯判定(モード0)↑↑↑////////////////////////////////////////////////////  
}//loop文のカッコ閉じ


/*
 * Milkcocoaへ光センサーの値がpushされた
 */
void milkcocoaPushDataHandler(DataElement *pelem) {
  // 明るさの状態を更新
  sensorState1 = nowSensorState1;
  sensorState2 = nowSensorState2;
  sensorState3 = nowSensorState3;  
}

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

Arduino IDE 1.8.0
Arduino M0Pro
ESP-WROOM-02

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

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

void loop() {
    // Milkcocoaのループ処理を実行
    milkcocoa.loop();

    // センサーの値
    int sensorValue = analogRead(sensorPin);
    int sensorValue1 = analogRead(sensorPin1);
    int sensorValue2 = analogRead(sensorPin2);
    int sensorValue3 = analogRead(sensorPin3);
    int partscounter = 0;
    int zennou = 0;
    static int mode = 0;

    Serial.print("Sensor Value : ");
    Serial.println(sensorValue);
    Serial.print("Sensor Value1 : ");
    Serial.println(sensorValue1);
    Serial.print("Sensor Value2 : ");
    Serial.println(sensorValue2); 
    Serial.print("Sensor Value3 : ");
    Serial.println(sensorValue3);
    Serial.print("zennou : ");
    Serial.println(zennou);  

    // Milkcocoaへ送信するデータを作成
    DataElement elem = DataElement();

    // 各データ名で値を追加
    elem.setValue("zennou", zennou);
    elem.setValue("Partscounter", partscounter);

    // Milkcocoaへデータを送信
    milkcocoa.push(MILKCOCOA_DATASTORE, &elem);

    switch(mode){
        // 全消灯
        case 0:
            // 赤点灯判定
            if(sensorValue3 > threshold3){
                digitalWrite(AKA,HIGH);
                digitalWrite(ledPin1, HIGH); //noticeボタン近くのLED点灯
                nowSensorState3 = true;
                mode = 1;
            }
            break;

        // 赤点灯
        case 1:
            // operatorがnoticeボタンをONしたら
            if(digitalRead(operatornoticebutton) == HIGH){
                digitalWrite(ledPin2, LOW);
                digitalWrite(ledPin1, LOW);
                delay(1000);
                digitalWrite(ledPin2, LOW);
                digitalWrite(ledPin1, LOW);
            }

            // 赤消灯判定
            if(sensorValue3 <= threshold3){
                digitalWrite(ledPin2, LOW);
                digitalWrite(ledPin1, LOW);
                digitalWrite(AKA,LOW);
                mode = 0;
            }
            break;

        default:
            break;
    }

    // 1秒処理を止める
    delay(1000);
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/22 10:18

    ttyp03様
    いつも親切にご回答くださり誠にありがとうございます。
    また、プログラムの提供をいただき、大変勉強になりました。

    自分でいろいろ試した結果、milkcocoa.loop();をもう一つ、シリアルプリントの下(ランプ点灯判定モードの手前)に追記したところ、動作としてはうまく動きましたが、ttyp03様のおっしゃる通り、プログラムの作りが悪いので、今後ご提案いただきましたコードを参考に、形を修正していきたいと思います。

    ありがとうございました。
    (現在はRTCモジュールのコンパイルで問題が出たので、それをまた現在質問させていただいております。)

    キャンセル

  • 2017/02/22 10:22

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

    キャンセル

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

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

関連した質問

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

  • Android

    6513questions

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

  • C

    3670questions

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

  • Milkcocoa

    101questions

    Milkcocoaとは、バックエンド機能を提供するBaaSサービスの一つです。サーバを準備することなく、フロントエンドのコーディングだけでデータの保存・更新・取得、またPub/Sub通信行うことが可能です。