WiFiClientSecure でなく HTTPClient を使って M5Stack から HTTPS で AirTable にデータを書き込むメモです。
背景
以前、こちらの記事を書いたのですが、HTTPClient というライブラリも使いやすそうなので、試してみます。
コードを書いていく中で、以下の記事が参考になりました。ありがとうございます。
- ESP8266でHTTP GETするならWiFiClientじゃなくてHTTPClientのほうが良い – Androidのメモとか
- 【ESP32】JSONをPOSTするには?HTTPClientがおすすめ! | ばすにっきTips
- M5Stick-CでJsonをPOSTする – Qiita
- HTTPClientライブラリリファレンス
Arduino ソースコード
ソースコードはこちらです。HTTPClient は追加インストールすることなく ESP32 で使えます。
また、コード内で設定するものは、以前の M5Stack から HTTPS で AirTable にデータを書き込むメモ のときと同じです。くわしくはそちらをご覧ください。
#include <M5Stack.h> #include <HTTPClient.h> // WiFiClientSecure から HTTPClient 変更 // Wi-FiのSSID char *ssid = "<Wi-FiのSSID>"; // Wi-Fiのパスワード char *password = "<Wi-Fiのパスワード>"; void setup() { // init lcd, serial, but don't init sd card // LCD ディスプレイとシリアルは動かして、SDカードは動かさない設定 M5.begin(true, false, true); // スタート M5.Lcd.fillScreen(BLACK); M5.Lcd.setCursor(10, 10); M5.Lcd.setTextColor(WHITE); M5.Lcd.setTextSize(2); // Arduino のシリアルモニタ・M5Stack LCDディスプレイ両方にメッセージを出す Serial.print("START"); // Arduino のシリアルモニタにメッセージを出す M5.Lcd.print("START"); // M5Stack LCDディスプレイにメッセージを出す(英語のみ) // WiFi 接続開始 WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); // Arduino のシリアルモニタ・M5Stack LCDディスプレイ両方にメッセージを出す Serial.print("."); M5.Lcd.print("."); } // WiFi Connected // WiFi 接続完了 M5.Lcd.setCursor(10, 40); M5.Lcd.setTextColor(WHITE); M5.Lcd.setTextSize(2); // Arduino のシリアルモニタ・M5Stack LCDディスプレイ両方にメッセージを出す // 前のメッセージが print で改行入っていないので println で一つ入れる Serial.println(""); // Arduino のシリアルモニタにメッセージを出し改行が最後に入る M5.Lcd.println(""); // M5Stack LCDディスプレイにメッセージを出す改行が最後に入る(英語のみ) // Arduino のシリアルモニタ・M5Stack LCDディスプレイ両方にメッセージを出す Serial.println("WiFi Connected."); // Arduino のシリアルモニタにメッセージを出す M5.Lcd.println("WiFi Connected."); // M5Stack LCDディスプレイにメッセージを出す(英語のみ) } void send_message(String msg) { // AirTable ホスト String airtableHost = "api.airtable.com"; // AirTable の自分のトークン // https://airtable.com/account から自分の API Key を反映します。 String airtableToken = "<AirTable の自分のトークン>"; // AirTable の Base 名 // https://airtable.com/api に各Baseでの HTTP 仕様が確認できるので、そこから Base ID を反映します。 String airtableBaseName = "<AirTable の Base 名>"; // AirTable の Table 名 // Table 名は、AirTable の表示上では Table 1。 // %20 はスペースを HTTP で送るためにエンコードしているので Table%201 と指定しています。 String airtableTableName = "Table%201"; M5.Lcd.fillScreen(BLACK); M5.Lcd.setCursor(10, 10); M5.Lcd.println("-> AirTable send data"); Serial.println("-> AirTable send data"); M5.Lcd.print("msg: "); Serial.print("msg: "); M5.Lcd.println(msg); Serial.println(msg); // 送るデータを JSON で。 String queryString = "{\"records\": [{\"fields\": {\"Name\": \"" + msg + "\"}}]}"; // URL 作成 String url = "https://" + airtableHost + "/v0/" + airtableBaseName + "/" + airtableTableName; HTTPClient httpClient; // URL 設定 httpClient.begin(url); // Content-Type httpClient.addHeader("Content-Type", "application/json"); // Authorization httpClient.addHeader("Authorization", "Bearer " + airtableToken); // ポストする int status_code = httpClient.POST(queryString); if( status_code == 200 ){ String response = httpClient.getString(); M5.Lcd.println("sended."); Serial.println("sended."); M5.Lcd.println("response:"); M5.Lcd.println(response); } httpClient.end(); delay(2000); } void loop() { M5.update(); if (M5.BtnA.wasReleased()) { // A ボタンを押したらテキストメッセージを送る send_message("Pushed A"); } else if (M5.BtnB.wasReleased()) { // B ボタンを押したらテキストメッセージを送る send_message("Pushed B"); } else if (M5.BtnC.wasReleased()) { // C ボタンを押したらテキストメッセージを送る send_message("Pushed C"); } }