ESP-WROOM-02のMQTT接続で嵌まった
Arduino IDEを使って行うESP-WROOM-02の開発は(小さな不具合を除けば)順調に進み、いよいよMQTTの接続を試すことにしました。
参考にしたのはこちら(↓)のサイトです。
電子工作界隈で話題のWi-Fiモジュール「ESP8266」でMQTTを使う方法 | 株式会社LIG
必要な作業がまとめて記されているので、初めての方でも取り組みやすいのではないか、と思います。(ただし、一点を除いて)
既にWindows環境にmosquittoブローカが立ち上がっていて、ESP8266の開発環境もArduino IDEに組み込み済みなので、これ(↓)をコピペして実行する所から始めたのですが・・・
esp8266-mqtt-quicktest/mqtt_esp8266_test.ino at master · kiyopikko/esp8266-mqtt-quicktest · GitHub
Exception (3)を起こし、リスタートを繰り返します。orz
”Exception Decorder”をインストールして解析すると・・・
---------------------
Exception 3: LoadStoreError: Processor internal physical address or data error during load or store
Decoding 9 results
0x402301e0: sleep_reset_analog_rtcreg_8266
0x40202f76: Adafruit_MQTT::connect()
0x40203408: Print::println()
0x40201e08: MQTT_connect()
0x40201e3a: loop
0x40203768: loop_wrapper
0x40100718: cont_norm
---------------------
どうやら、LoadStore命令で不正アクセスを起こしてたようです。
しかし、Arduino IDEでMQTT_connect()から先の処理を調べるには、どうしたら良いのでしょうか?いくら調べても、その方法が見つかりません。sleep_reset_analog_rtcreg_8266が何なのか?それも分かりません。orz
”MQTT Exception 3”で検索を掛けて、ようやくこれを見つけました。
どうやら”PROGMEM”が悪さをしているようです。コピペしたサンプル・コードにもPROGMEMが使われています。
コピペしたコード(↓)
const char MQTT_SERVER PROGMEM = YOUR_SERVER;
const char MQTT_CLIENTID PROGMEM = __TIME__ "_test_client_id";
const char MQTT_USERNAME PROGMEM = YOUR_USERNAME;
const char MQTT_PASSWORD PROGMEM = YOUR_PASSWORD;
”最新のexampleを調べろ”ということなので、スケッチ例-->Adafruit MQTT Library-->mqtt_esp8266を実行すると・・・
WiFi connected
IP address:
192.168.2.108
Connecting to MQTT... MQTT Connected!
Sending photocell val 0...OK!
Sending photocell val 1...OK!
動きました!
勿論、こちらのコードにはPROGMEMは使われていません。¥(^_^)
一時はどうなることかと思い(ESP-WROOM-02の利用を諦めかけ)ました。
Arduino IDEを使っていると、ライブラリが頻繁にアップデートされます。ネット上のサンプル・コードではなく、ライブラリと一緒に提供される『スケッチ例』を最初に試すべきなのだと気づきました。
また、経験値が一つ上がった!
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
今回のように、インストールしたライブラリの不具合を、皆はどうやって追いかけるんだろう?
謎だ!