WiFiClientSecure でなく HTTPClient を使って M5Stack から HTTPS で AirTable にデータを書き込むメモ

WiFiClientSecure でなく HTTPClient を使って M5Stack から HTTPS で AirTable にデータを書き込むメモです。

背景

M5Stack から HTTPS で AirTable にデータを書き込むメモ

以前、こちらの記事を書いたのですが、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");
  }
}