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

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

ただいまの
回答率

88.83%

ESP8266-ARDUINOでの実装において、受信(.on)のみを行う場合のkey設定方法について

受付中

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 3,391
退会済みユーザー

退会済みユーザー

御社のサンプルを参考に、ESP8266を用いてARDUINO IDEにて開発を行っております。ESP8266を2台用い、1台は送信のみ、もう1台は受信のみを行う実装を行いたいのですが、受信側のkeyの設定がうまくいっていないのかエラーとなってしまいます。

※受信側でkey"v"の値を読み込む際に、elem.getInt("v")がエラー(→obj is NULL)となる。送信側でpushした直後にエラーが表示されるので、.on自体は機能しているようです。

受信のみを行う場合のkey設定方法を教えて頂けますでしょうか?


<実装内容>
・送信側は御社サンプルをそのまま使用し、Datastore”ESP8266”中のkey”v”に値をpush
(http://blog.mlkcca.com/iot/milkcocoa-arduino/)
・受信側は御社サンプルより必要部分を抜粋し仕様、Datastore”ESP8266”中のkey”v”の値を監視し受け取る

<以下、受信側コード抜粋>
void setup() {
  /*シリアル・wifi接続は省略(御社サンプルまま)*/
  Serial.println( milkcocoa.on(MILKCOCOA_DATASTORE, "push", onpush) );
};

void loop() {
  milkcocoa.loop();
  DataElement elem = DataElement();
  elem.setValue("v", 1); //★ここが間違い?
  delay(7000);
};

void onpush(DataElement elem) {
  Serial.println("onpush");
  Serial.println(elem.getInt("v"));
};
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+1

Milkcocoa開発チームのものです。
ライブラリを使って頂きありがとうございます。

「受信側でkey"v"の値を読み込む際に、elem.getInt("v")がエラー(→obj is NULL)となる。」とのことですが、
状況を正確に把握・再現したいため、大変お手数ですが送信側のコードも拝見してもよろしいでしょうか...?

受け取ったデータでobj is NULLとエラーが出ているということは、送信側に問題があるかもしれないとちょっと思っています。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

ご確認ありがとうございます。投稿者です。ご指摘の件、実は途中から送信側をESP8266→自作HTMLに変更しており、先ほどESP8266に戻したところ提示したコードで受信できました。お騒がせしてすみません。。
(keyの設定の問題と決めつけており、送信側も色々試していましたが、最初のESP8266での送信時に何かミスしていたようです…。)

なお、HTMLの方では依然 obj is NULL とエラーが出ているのですが、こちらの確認をお願いできますでしょうか…?以下、送信側のコードです。HTML上スライダに連動してDatastore上にデータをpushする仕様です。下記コードでmilkcocoaのdashboardではデータが反映されています。
※受信側ESP8266は上記投稿のまま

■HTMLファイル
<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title> モーター操作デモ</title>
  <script type='text/javascript' src='slider_mcc.js'></script>
  <link rel="stylesheet" type="text/css" href="/css/result-light.css">
  <style type='text/css'>
  </style>
</head>
<body>
  <script src="https://cdn.mlkcca.com/v2.0.0/milkcocoa.js"></script>
<div>
    <div id="todos">
    </div>
    <div>
    <input id ="slide_bar" type="range" name="num" min="-80" max="80" step="5" value="0">
    <span id="val">0</span>
    </div>
</div>
</body>
</html>


■JSファイル
window.onload=function(){
var new_content = document.getElementById("new_content");
var create_button = document.getElementById("create_btn");
var todos = document.getElementById("todos");
var slide_bar = document.getElementById("slide_bar");
var val = document.getElementById("val");

var milkcocoa = new MilkCocoa('seaighlmu9z.mlkcca.com');
var todoDataStore = milkcocoa.dataStore("esp8266");

slide_bar.addEventListener("change",function(){
    val.innerHTML = this.value;
    todoDataStore.push({
      v : this.value
    });
},false);

function render_todo(todo) {
    var element = document.createElement('div');
    element.textContent = todo.content
    todos.appendChild(element);
}
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/11/11 08:55

    HTML、JSファイルを試してみましたが、DataStoreへ値がちゃんと送られているので大丈夫そうです。受信側は実機がないのでなんとも言えません。すみません。
    それと、断片的な情報しかないので、問題となっている状態の送受信どちらのコードも全部載せていただけると助けられるかもしれません。

    キャンセル

  • 2015/11/11 10:29

    ご対応ありがとうございます。お手数おかけしてすみません。

    受信側は基本的にESP8266に下記コードを書き込んでいます。(サンプルから)
    また、エラー発生時のメッセージについても載せておきます。
    送信側は上のコメントのHTML&JSファイルです。

    ■送信側コード(ESP8266にARDUINO IDEで書き込み)

    #include <ESP8266WiFi.h>
    #include <Milkcocoa.h>

    /************************* WiFi Access Point *********************************/

    #define WLAN_SSID "***"
    #define WLAN_PASS "***"


    /************************* Your Milkcocoa Setup *********************************/

    #define MILKCOCOA_APP_ID "***"
    #define MILKCOCOA_DATASTORE "esp8266"

    /************* Milkcocoa Setup (you don't need to change this!) ******************/

    #define MILKCOCOA_SERVERPORT 1883

    /************ Global State (you don't need to change this!) ******************/

    // Create an ESP8266 WiFiClient class to connect to the MQTT server.
    WiFiClient client;

    const char MQTT_SERVER[] PROGMEM = MILKCOCOA_APP_ID ".mlkcca.com";
    const char MQTT_CLIENTID[] PROGMEM = __TIME__ MILKCOCOA_APP_ID;

    Milkcocoa milkcocoa = Milkcocoa(&client, MQTT_SERVER, MILKCOCOA_SERVERPORT, MILKCOCOA_APP_ID, MQTT_CLIENTID);

    void setup() {
    Serial.begin(115200);
    delay(10);

    Serial.println(F("Milkcocoa SDK demo"));

    // Connect to WiFi access point.
    Serial.println(); Serial.println();
    Serial.print("Connecting to ");
    Serial.println(WLAN_SSID);

    WiFi.begin(WLAN_SSID, WLAN_PASS);
    while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    }
    Serial.println();

    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());

    Serial.println( milkcocoa.on(MILKCOCOA_DATASTORE, "push", onpush) );

    };

    void loop() {
    milkcocoa.loop();

    DataElement elem = DataElement();
    elem.setValue("v", 1);

    //milkcocoa.push(MILKCOCOA_DATASTORE, elem);
    delay(7000);

    };

    void onpush(DataElement elem) {
    Serial.println("onpush");
    Serial.println(elem.getInt("v"));
    };


    ■エラー発生時のシリアル出力
    Milkcocoa SDK demo


    Connecting to ***
    .......
    WiFi connected
    IP address:
    192.168.*.***
    1
    Connecting to MQTT... MQTT Connected!
    onpush
    obj is NULL

    Exception (28):
    epc1=0x40206cf4 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000018 depc=0x00000000

    ctx: cont
    sp: 3ffebb80 end: 3ffebdc0 offset: 01a0

    >>>stack>>>
    3ffebd20: 3fff3bf8 3ffea990 3ffebe18 40202213
    3ffebd30: 3fff41e8 3ffebd50 3ffeacc0 40206c39
    3ffebd40: 3fffdc20 3ffea990 00000000 4020701b
    3ffebd50: 3fff41e8 401013ff 3ffeada0 3ffeacf0
    3ffebd60: 3fff3bfd 3ffebdec 40201c88 3ffeada0
    3ffebd70: 4020154e 00001b58 00001b58 3ffebdec
    3ffebd80: 3fffdc20 00000000 3ffebde4 40202337
    3ffebd90: 40201ca9 c201a8c0 00000000 00000000
    3ffebda0: 3fffdc20 00000000 3ffebde4 40201d06
    3ffebdb0: 00000000 00000000 3ffeada0 40100458
    <<<stack<<<

    ets Jan 8 2013,rst cause:1, boot mode:(1,7)


    ets Jan 8 2013,rst cause:4, boot mode:(1,7)

    wdt reset

    キャンセル

0

こちら、JavaScript SDK側に問題がありました。。
修正してアップロードしましたので、動作するかもう一度確認頂けますでしょうか。

Node.jsでお使いになる場合は、v0.2.4にアップデートしてから利用頂ければ幸いです。

ご迷惑をおかけして申し訳ありません。。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/11/12 10:08

    返信遅くなり申し訳ありません。
    ご対応誠にありがとうございます。

    動作確認致しました。(前コメント中のHTML&JS→ESP8266)
    onpushを受け取ることは出来るようになったのですが、
    中身の値が送っている整数値と異なるものになっているようです。

    例)HTMLから”80”を送信
     →ESP8266では”1073693664”を受信
     →DataStore中には”80"が入っている(DashBoardで確認)
     →もう一度”80”を送信したら、今度は違う値”1073694496”を受信

    ご確認よろしくお願いいたします。

    キャンセル

  • 2015/11/12 11:13 編集

    前コメント中に貼って頂いたコードで確認させて頂きましたが、
    slide_barのaddEventListener内のthis.valueがString型になっていました。

    受信側でgetInt()と書いているので、HTML側でpushする値をNumber(this.value)に変えて頂いて再度確認頂けますでしょうか...?

    ちなみに管理画面のデータストアビューではダブルクオテーションがあるかどうかでStringがNumberかが判断できます。

    Valueの列にて
    {"v":1} → Number
    {"v":"1"} → String

    キャンセル

  • 2015/11/12 11:22

    ご回答ありがとうございます。
    HTML側でpushする値をNumber(this.value)に変えて試したところうまくいきました!
    こちらの不注意ですみません。。

    何度もご対応頂き、誠にありがとうございました。
    また、こちらの質問の仕方が悪くお手間をとらせてしまい申し訳ありませんでした。
    また何かあれば質問させて頂ければと思いますので、よろしくお願いいたします。

    キャンセル

  • 2015/11/12 11:26

    いえいえ、むしろこの問題に気づくことができたのはkawa_kari様のおかげなので、もの凄く感謝しております!
    今後ともよろしくお願い致します。

    キャンセル

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

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

関連した質問

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