###前提・実現したいこと
以前の質問「 ESP-WROOM-02をWi-FiモジュールとしてArduinoに接続(SoftwareSerial)してMilkcocoa Arduino SDKを使用する方法について」でArduino M0からMilkcocoaへ値をpush
することはできるようになりました。
次のステップとして、スマートフォンのWebブラウザからJavaScriptで数値をMilkcocoaへpush
し、Arduino M0のmilkcocoa.on()
でスマートフォンからpush
された値を取得したいのですが、Arduino M0が値を取得中にスマートフォンから連続でpush
したりすると、Arduino M0の処理が止まったり、取得した値が古いものが返ってきたりしました。
安定して動作させるためのアドバイスをいただけますと幸いです。
※milkcocoa.loop()
を実行したタイミングでスマートフォンからpush
すると正しい値が取得できます。
###ソースコード
#include "ESP8266.h" #include "Milkcocoa.h" #include "Client_ESP8266.h" /************************* WiFi Access Point *********************************/ // Wi-Fi SSID #define WLAN_SSID "SSID" // Wi-Fi PASSWORD #define WLAN_PASS "PASSWORD" /************************* Your Milkcocoa Setup *********************************/ // MilkcocoaのアプリID #define MILKCOCOA_APP_ID "APP_ID" #define MILKCOCOA_DATASTORE "led" /************* Milkcocoa Setup (you don't need to change this!) ******************/ #define MILKCOCOA_SERVERPORT 1883 /************ Global State (you don't need to change this!) ******************/ // Create an ESP8266Client class to connect to the MQTT server. ESP8266Client wifi; const char MQTT_SERVER[] PROGMEM = MILKCOCOA_APP_ID ".mlkcca.com"; const char MQTT_CLIENTID[] PROGMEM = __TIME__ MILKCOCOA_APP_ID; Milkcocoa milkcocoa = Milkcocoa(&wifi, MQTT_SERVER, MILKCOCOA_SERVERPORT, MILKCOCOA_APP_ID, MQTT_CLIENTID); int value; // LEDを接続するピン const int ledPin = 13; /** * 初期設定 */ void setup() { // デジタル13番ピンを出力として設定 pinMode(ledPin, OUTPUT); SerialUSB.begin(115200); Serial5.begin(115200); SerialUSB.println("Milkcocoa SDK demo"); // Connect to WiFi access point. SerialUSB.println(); SerialUSB.println(); SerialUSB.print("Connecting to "); SerialUSB.println(WLAN_SSID); wifi.begin(Serial5, 115200); SerialUSB.print("FW Version:"); SerialUSB.println(wifi.getVersion().c_str()); if (wifi.setOprToStation()) { SerialUSB.print("to station ok\r\n"); } else { SerialUSB.print("to station err\r\n"); } if (wifi.joinAP(WLAN_SSID, WLAN_PASS)) { SerialUSB.print("Join AP success\r\n"); SerialUSB.print("IP: "); SerialUSB.println(wifi.getLocalIP().c_str()); } else { SerialUSB.print("Join AP failure\r\n"); } if (wifi.disableMUX()) { SerialUSB.print("single ok\r\n"); } else { SerialUSB.print("single err\r\n"); } if (milkcocoa.on(MILKCOCOA_DATASTORE, "push", onpush)) { SerialUSB.println("milkcocoa on sucesss"); } else { SerialUSB.println("milkcocoa on failure"); } value = 10; }; /** * ループ処理 */ void loop() { SerialUSB.println("Loop ..."); // Milkcocoaのループ処理を実行します milkcocoa.loop(); // 1秒処理を止める delay(1000); }; void onpush(DataElement *pelem) { SerialUSB.println("onpush"); //SerialUSB.println(pelem->getInt("state")); // 取得した値が1ならば if (pelem->getInt("state")) { SerialUSB.println("LED ON"); // LEDを接続しているピンをHIGH状態に変更(点灯) digitalWrite(ledPin, HIGH); } // 取得した値が1以外ならば else { SerialUSB.println("LED OFF"); // LEDを接続しているピンをLOW状態に変更(消灯) digitalWrite(ledPin, LOW); } };
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/21 07:19 編集
2016/02/21 09:49
2016/02/22 01:12
2016/02/22 09:45
2016/02/23 13:11
2016/02/24 00:49