ESP-IDFとIFTTTを使ってツイートする
ESP-IDFを使った記事があまり見つからないので書きました。
(みんなArduinoライブラリが好きなのね)
できる限りESP-IDFのサンプルプログラムを流用します。
- 実行環境の紹介
- 事前準備
- HTTPS Requestのサンプルを実行してWiFi接続を確認
- IFTTTの準備
- HTTPS Requestのサンプルを編集してツイートする
- 応用例(課題?)
- 失敗例
- 参考ページ
実行環境の紹介
以下の環境でテストしました。
- ESP32デバイス
- ESP32-DevKitC-32D
- ESP-WROOM-32Dが実装されています。
- 秋月で購入しました 。
- akizukidenshi.com
- 開発PCのOS
- Linux (Xubuntu18.04)
- ESP32 toolchain
- xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz
- ESP-IDF
- WiFi
- IEEE802.11g規格を使用します。(ESP-WROOM-32Dはb / g / nに対応)
- SSIDとパスワードを把握してます。
事前準備
ESP-IDFの環境を整える
このページに従って、開発環境を構築してください。
Hello Worldを実行する
ESP-IDFのサンプルプログラムを実行します。
このページに実行手順が書かれています。
https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html#start-a-project
HTTPS Requestのサンプルを実行してWiFi接続を確認
esp-idf/examples/protocols/https_request at master · espressif/esp-idf · GitHub
ESP-IDFのHTTPS Request Exampleを編集すれば、 ESP32でツイートできます。
まずはサンプルコードをそのまま実行します。
サンプルコードを開発ディレクトリ(~/esp)にコピーします。
cd ~/esp cp -r $IDF_PATH/examples/protocols/https_request .
menuconfigを実行します。
cd ~/esp/https_request
make menuconfig
こんな画面が出ます。 Example Configurationを選んでください。
こんな画面が出ます。接続したいWiFiのSSIDとパスワードを入力します。
SSIDを入力します。
パスワードを入力します。(****みたいに隠されないので注意)
Save & Exitで画面を抜けます。
ディレクトリにsdkconfig というファイルが生成されます。ここにSSIDとパスワードがそのまま入力されているので、絶対に他人に見せないように!!!
プログラムをmakeし、ESP32に書き込みます。
# ESP32をPCに接続していること
make flash
プログラムが正しく動いたのか、ターミナル画面で確認します。
make monitor # ~~~ 以下実行結果 ~~~ Toolchain path: /home/akshota/esp/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc Toolchain version: crosstool-ng-1.22.0-80-g6c4433a Compiler version: 5.2.0 Python requirements from /home/akshota/esp/esp-idf/requirements.txt are satisfied. MONITOR # ~~~ 省略 ~~~ I (5345) example: Reading HTTP response... HTTP/1.0 200 OK Content-Length: 2091 Access-Control-Allow-Origin: * Content-Type: application/json Date: Sun, 27 Jan 2019 09:46:48 GMT Strict-Transport-Security: max-age=631138519; includeSubdomains; preload # ~~~ 省略 ~~~
正常な応答が返ってきました。WiFiの接続確認は終了です。
IFTTTの準備
ESP32から直接ツイートすることも可能ですが、今回はIFTTTを経由してつぶやきます。
Webhookという仕組みを使います。
信号(メッセージ)の流れは、ESP32 → IFTTT → Twitter という関係になります。
一度、ESP32 - IFTTT間のWebhookを用意しておけば、ESP32のソースコードを書き換えなくても、 Twitter・FaceBook・LINE・GMail・Discord等のサービスと連携できます。
IFTTT Appletの作成
IFTTTにアクセスします。 初めてIFTTTを使う人はアカウントを作成してください。
Discover IFTTT and Applets - IFTTT
右上のアカウントボタンからNew Applet を開きます。
IF を開き、Webhookを選択します。
Event NameはESP32にしました。
THATを開き、Twitterを選択します。 Actionは、Post a tweetにしました。
Add Ingredientで、Tweet Textの末尾にOccuredAtを追加します。
Twitterの仕様で、連続して同じツイートを投稿できません。 OccuredAtを追加すると、ツイートの末尾にAction実行時刻を追加します。 これにより何度でもツイートできます。(1日に投稿できる最大数は決まってるので注意)
WebhookのKeyを確認
右上のアカウントボタンからServices を開きます。
webhookを開きます。
右上のDocumentationを開きます。
Your key is:~ と書かれたページが表示されます。Keyは絶対に他人に見せないように!!!
{event}にESP32を入力します。
ページ下のTest it を押して、ツイートされるか確認しましょう。
続いてpemファイルのダウンロードをします。このページは閉じないでください。
pemファイルのダウンロード
maker.ifttt.comの証明書をpemファイルとしてダウンロードします。
ブラウザはGoogle Chromeを使用します。ブラウザによって方法は変わると思うので調べてください。
URLバーの鍵マークを開き、証明書を選択します。
詳細タブを開き、証明書の階層の一番上を選択します。 その状態でエクスポートを押します。
ダイアログが表示されるので、 ~/esp/https_request/main/server_root_cert.pem に上書き保存します。
これでpemファイルのダウンロードは終了です。
IFTTT以外のサービス(例えばZapier)を使う場合、サービスごとにpemファイルを準備してください。
HTTPS Requestのサンプルを編集してツイートする
IFTTTに対してリクエストを送るようにサンプルを編集します。
以下のように、~/esp/https_request/main/https_request_example_main.cを書き換えてください。
key/以下はユーザによってちがうので注意
/* Constants that aren't configurable in menuconfig */ #define WEB_SERVER "maker.ifttt.com" #define WEB_PORT "443" #define WEB_URL "https://maker.ifttt.com/trigger/ESP32/with/key/----------------------------------------"
ファイルを保存したら、プログラムをmakeし、ESP32に書き込みます。
# ESP32をPCに接続していること
make flash
プログラムが正しく動いたのか、ターミナル画面で確認します。
make monitor # ~~~以下実行結果~~~ Toolchain path: /home/akshota/esp/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc Toolchain version: crosstool-ng-1.22.0-80-g6c4433a Compiler version: 5.2.0 Python requirements from /home/akshota/esp/esp-idf/requirements.txt are satisfied. MONITOR # ~~~省略~~~ Congratulations! You've fired the ESP32 eventI (5865) example: connection closed
ツイートできました!
確認できたらUSBケーブルを抜きましょう!電源OFFです!
10秒おきにツイートしてしまうので、タイムラインが荒れます!!!
応用例(課題?)
GPIOのサンプルコードを参考にして、ボタンが押されたらツイートするプログラムを書きましょう。
esp-idf/examples/peripherals/gpio at master · espressif/esp-idf · GitHub
(力尽きたので記事にはしてません)
失敗例
WiFiのパスワードを間違えた
接続しようと何回も挑戦してる。(かわいい)
make monitor # ~~~以下実行結果 一部省略 I (275) example: Setting WiFi configuration SSID unko_wifi_g... I (375) phy: phy_version: 4007, 9c6b43b, Jan 11 2019, 16:45:07, 0, 0 I (375) wifi: mode : sta (30:ae:a4:cb:02:8c) I (1225) wifi: new:<7,0>, old:<1,0>, ap:<255,255>, sta:<7,0>, prof:1 I (2205) wifi: state: init -> auth (b0) I (2215) wifi: state: auth -> assoc (0) I (2215) wifi: state: assoc -> run (10) I (9185) wifi: state: run -> init (fc0) I (9185) wifi: new:<7,0>, old:<7,0>, ap:<255,255>, sta:<7,0>, prof:1 I (11725) wifi: new:<7,0>, old:<7,0>, ap:<255,255>, sta:<7,0>, prof:1 I (11725) wifi: state: init -> auth (b0) I (11725) wifi: state: auth -> assoc (0) I (11735) wifi: state: assoc -> run (10) I (18685) wifi: state: run -> init (fc0) I (18685) wifi: new:<7,0>, old:<7,0>, ap:<255,255>, sta:<7,0>, prof:1 I (21225) wifi: new:<7,0>, old:<7,0>, ap:<255,255>, sta:<7,0>, prof:1 I (21225) wifi: state: init -> auth (b0) I (21235) wifi: state: auth -> assoc (0) I (21235) wifi: state: assoc -> run (10)
pemファイルを変更し忘れた
esp-tls: mbedtls_ssl_handshake returned -0x2700 とエラーが発生する
make monitor # ~~~以下実行結果 一部省略 I (3215) example: Connected to AP E (3955) esp-tls: mbedtls_ssl_handshake returned -0x2700 I (3955) esp-tls: Failed to verify peer certificate! I (3955) esp-tls: verification info: ! The certificate is not correctly signed by the trusted CA ! The certificate is signed with an E (3975) esp-tls: Failed to open new connection E (3975) example: Connection failed... I (3985) example: Completed 1 requests I (3985) example: 10... I (4985) example: 9... I (5985) example: 8... I (6985) example: 7... I (7985) example: 6...
参考ページ
ESP32からIFTTTを使ってLINE Notifyで通知を送ってみた - Qiita
knaka Tech-blog: esp32, HTTPS で、IFTTT(Maker Webhooks)に接続する, ESP-IDF