Androidのメモとか

ポキオの日記です。京急は神。

Nefry BTにプログラムを書き込もうとした時に"A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header"というエラーが出て泣きそうになった話

問題は解決しました。

Nefry BT

Nefry BTをお借りしてます

dotstud.io

初心者でも簡単に触れるIoTボード。Wi-FiとBLEが使えて夢が広がるわけなんですが、1箇所ハマったポイントがあるのでメモしておきます。

ハマったポイント

Arduino IDEでプログラムを書き込もうとしたら、

A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header

こんなエラーが。 ぐぐってみると、プログラムを書き込むタイミングで、ボードが書き込みモードに遷移できていないことが原因っぽいです。

私の開発環境

やったこと

ターミナルで、カーネルエクステンションを確認しました。

kextstat | grep FTDI

すると、どうやらAppleの標準のFTDIのドライバしか入っていませんでした。こんな感じ。

  121    0 0xffffff7f811e7000 0x7000     0x7000     com.apple.driver.AppleUSBFTDI (1.0.1b16) <102 38 5 4 3>

そこで、FTDIのページからMac版のドライバをダウンロードして、インストール。

www.ftdichip.com

もう一度カーネルエクステンションを確認すると、ちゃんとFTDIが確認できます。(2つはいっている状態でも大丈夫なんでしょうか・・・)

  121    0 0xffffff7f811e7000 0x7000     0x7000     com.apple.driver.AppleUSBFTDI (1.0.1b16) <102 38 5 4 3>
  130    0 0xffffff7f829bf000 0x7000     0x7000     com.FTDI.driver.FTDIUSBSerialDriver (2.4.2) <102 38 5 4 3 1>

これでプログラムが書き込めるように!

準備されているライブラリのお陰で、RGB LEDの色指定も簡単だしログ出力も秒でできます。さーて、何を作ろうかな。

Amazon Dash Buttonが押されたらESP8266経由でIFTTTのWebhookを叩いて幸せになる

幸せになるんだ・・・!

Amazon Dash Button ESP8266 IFTTT Webhook

前回までの話

relativelayout.hatenablog.com

ESP8266はAP+STAモードで使えるということを確認しました。これはつまり、Amazon Dash Buttonの接続先をESP8266のAPにしてしまって、そのイベントを受けて、ESP8266(STA)が接続しているAP経由で、IFTTTを叩いて何かしてみようと思いました。

大切なことは、この辺に全部書いてあります。

qiita.com

relativelayout.hatenablog.com

まずはコーディング

基本的に、前回のコードに少し毛が生えたレベルです。ポイントは以下のとおりです。

  • Wi-Fiのイベントを受けて、ソースのデバイスMACアドレスを確認する
  • ターゲットのAmazon Dash Buttonと同じMACアドレスか比較する
  • 同じだったらWebAPIをPOSTしてIFTTTのWebhookを叩く
  • Wi-Fiのイベントは制限していないが、チャタるのでスリープを挟んでいる
  • STAの設定より前にAPの設定をすると、上手くAmazon Dash ButtonWi-Fiイベントを取得できないので、APの設定を最後に行う

こんな感じ。

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>


extern "C" {
#include <user_interface.h>
}

#define AP_SSID "APのSSID"
#define AP_PW "APのPW"
#define SOFTAP_SSID "SOFT APのSSID"
#define SOFTAP_PW "SOFT APのPW"

// Dash ButtonのWi-Fi MACアドレス
uint8_t targetMac[6] = {255, 255, 255, 255, 255, 255};

// Dash Buttonを検知したらTrueに倒す
boolean isFound;

void ICACHE_FLASH_ATTR wifi_handle_event_cb(System_Event_t *evt) {
  uint8_t* foundMac = evt->event_info.ap_probereqrecved.mac;

  if (memcmp(foundMac, targetMac, sizeof(uint8_t) * 6) != 0) {
    return;
  }

  isFound = true;
}

void setup() {
  Serial.begin(115200);
  Serial.println("");

  // AP+STAモードの設定
  WiFi.mode(WIFI_AP_STA);

  // STAとして振る舞うための接続先APのSSIDとPW情報
  WiFi.begin(AP_SSID, AP_PW);

  // APへの接続完了待ち
  while (WiFi.status() != WL_CONNECTED) {
    delay(100);
    Serial.print(". ");
  }
  Serial.println("connected!");

  // APとして振る舞うためのSSIDとPW情報
  WiFi.softAP(SOFTAP_SSID, SOFTAP_PW);

  // Wi-Fiのイベントを受け取る
  wifi_set_event_handler_cb(wifi_handle_event_cb);
}

void loop() {
  if (isFound) {
    Serial.println("FOUND");
    doHttpPost();
    delay(3000); // チャタるので3秒位待つ
    isFound = false; // 最後にFalseに倒す
  }
}

// IFTTTにPOSTする
void doHttpPost() {
  HTTPClient http;

  // テキトーなJSON
  String json = "{\"value1\":\"" + String("test") + "\"}";

  http.begin("http://maker.ifttt.com/trigger/XXX/with/key/YYY");
  http.addHeader("Content-Type", "application/JSON");
  http.addHeader("Content-Length", String(json.length()));
  int httpCode =  http.POST(json);
  String result = http.getString();
  http.end();
  Serial.println(result);
}

Amazon Dash Buttonの設定

Amazon Dash ButtonにEPS8266のSSID/PWを覚えさせなければなりません。

皆さん御存知の通り、スマホアプリでAmazon Dash Buttonの設定を進めて、SSID/PWを設定し終わったらアプリを閉じればOK。…なんですが、ESP8266のAPはネットに接続できず、EPS8266のAPに接続しているAmazon Dash Buttonを完了させられないため、同じSSID/PWのAPを立てて設定だけさせる必要があります。

ボタンを押してみる

ボタンを押しても、たまに接続を検知できないケースもありますが、ほとんど検知出来ました。イベントは必ずしも1回とは限らず、2回呼ばれたり、もっとすごい回数呼ばれたりするので、SW的にチャタリングの制御は必要そうです。

今回は、IFTTTにHTTP-POSTしたあと、LINEにメッセージを送るように設定してみました。

Amazon Dash Button ESP8266 IFTTT Webhook

こんな感じ。ちゃんと動いてそうです。IFTTTのTriggerを叩ければ、その先はノンプログラミングで実装できるので、簡単にトリガーに対するアウトプットを変更することが出来ます。これで、かなり夢が広がりますね。

ESP8266をAP+STAモードで使う

AP?STA?

ESP8266 AP STA

ESP8266のモードの話

普段、ESP8266はSTAモードで使っているはず。知らず知らずのうちに。

WiFi.mode(WIFI_STA);

Wi-Fi接続する際に、こういうコードをおまじないのように書いているはず。これがSTAモード。ESP8266がいわゆるWi-Fiの子機(ステーション、STA)になって動作するわけです。

AP+STAモードとは?

言うまでもないですが、STAと振る舞いながら、EPS8266はAP(アクセスポイント、いわゆるWi-Fiの親機)としても振る舞うモード。何に使うのかは別として、簡単にコーディングできます。

#include <ESP8266WiFi.h>

#define AP_SSID "xxxx"
#define AP_PW "yyyy"
#define SOFTAP_SSID "pokio"
#define SOFTAP_PW "pokipokio"

void setup() {
  Serial.begin(115200);
  Serial.println("");

  // AP+STAモードの設定
  WiFi.mode(WIFI_AP_STA);

  // APとして振る舞うためのSSIDとPW情報
  WiFi.softAP(SOFTAP_SSID, SOFTAP_PW);

  // STAとして振る舞うための接続先APのSSIDとPW情報
  WiFi.begin(AP_SSID, AP_PW);

  // APへの接続完了待ち
  while (WiFi.status() != WL_CONNECTED) {
    delay(100);
    Serial.print(". ");
  }
  Serial.println("connected!");
}

void loop() {
  // do nothing
}

ポイントは2点。

  • WiFi.mode(WIFI_AP_STA); でAP+STAモードを指定
  • WiFi.softAP(SOFTAP_SSID, SOFTAP_PW); でAPとして振る舞うの情報を設定

あとはSTAモードと全く同じ。ね、簡単。

実際に動かしてみる

ESP8266 AP STA

シリアルモニターには接続完了の表示が。

ESP8266 AP STA

Macのアクセスポイント一覧には pokio の表示が!AP+STAでちゃんとワークしてそうです。

何に使うのか?

AMAZON DASH BUTTONのハックに便利です。

qiita.com

relativelayout.hatenablog.com

なにかと面倒なAmazon Dash Buttonハック。パケットを監視するマシン・スクリプトが必要になるわけですが、そのためにRPiやパソコンを使うのは面倒というか、勿体ないわけです。そういう処理こそESP8266にやらせて、幸せになりましょう。

Google Apps Scriptから色んな鉄道の遅延情報を取得する

もちろん、京急も取れます。

便利なサイトがあります

鉄道遅延情報のjson

以前、どなたかに教えて頂いたサイト。Tetsudo.com(鉄道コム)の情報をいい感じにまとめてJSONで取得できるようにしている、神サイト。

具体的には、こんな感じで取得できます。

[  
   {  
      "name":"浅草線",
      "company":"都営地下鉄",
      "lastupdate_gmt":1500478567,
      "source":"鉄道com RSS"
   },
   {  
      "name":"京急線",
      "company":"京急電鉄",
      "lastupdate_gmt":1500478506,
      "source":"鉄道com RSS"
   },
   {  
      "name":"押上線",
      "company":"京成電鉄",
      "lastupdate_gmt":1500478506,
      "source":"鉄道com RSS"
   },
   {  
      "name":"久大本線",
      "company":"JR九州",
      "lastupdate_gmt":1500478505,
      "source":"鉄道com RSS"
   },
   {  
      "name":"豊肥本線",
      "company":"JR九州",
      "lastupdate_gmt":1500478505,
      "source":"鉄道com RSS"
   },
   {  
      "name":"日田彦山線",
      "company":"JR九州",
      "lastupdate_gmt":1500478505,
      "source":"鉄道com RSS"
   },
   {  
      "name":"山田線",
      "company":"JR東日本",
      "lastupdate_gmt":1500478504,
      "source":"鉄道com RSS"
   },
   {  
      "name":"只見線",
      "company":"JR東日本",
      "lastupdate_gmt":1500478504,
      "source":"鉄道com RSS"
   },
   {  
      "name":"飯山線",
      "company":"JR東日本",
      "lastupdate_gmt":1500478504,
      "source":"鉄道com RSS"
   },
   {  
      "name":"上越線",
      "company":"JR東日本",
      "lastupdate_gmt":1500478504,
      "source":"鉄道com RSS"
   }
]

ほうほう。細かい遅延理由などは取得できないものの、遅延しているか否かは簡単に取得できそうです。

GASから取得してみる

今回は、(やっぱり)京急が遅延しているかどうかを取得してみます。

var chien = "https://rti-giken.jp/fhc/api/train_tetsudo/delay.json";

function checkTrainInfo(){
  Logger.log(isKeikyuDelayed(getJson())); 
}

function getJson() {
  var response = UrlFetchApp.fetch(chien); 
  var json = JSON.parse(response.getContentText()); 
  return json;
}

function isKeikyuDelayed(json){
  for (var i=0; i<json.length; i++) {
    if(json[i].name == "京急線"){
      Logger.log("遅延しています");
      return true;
    }
  }
  
  Logger.log("遅延していません");
  return false;
}

さっそく実行してみると・・・

Google Apps Script 京急

うん、遅延しているようです。実際に、京急様のHPを見てみると・・・

Google Apps Script 京急

【運行情報】六郷土手駅で発生した人身事故のため品川駅〜京急川崎駅間の上下線の運転を見合わせています。 運転再開の見込みはたっておりません。 JR線・東急東横線横浜市営地下鉄線・東京モノレール線・都営浅草線にて振替輸送を行っています。

やっぱり遅延しているようです。なんかヤバそうですね・・・。

サマリ

  • 鉄道遅延情報のjsonを使うと、簡単に運行情報が取得できそう。
  • 京急以外もJRやその他私鉄などにも対応しているので、夢が広がる。
  • ただし、詳しい遅延理由などは分からない。

Arduino/EPS8266のコードをVisual Studio Codeから書ける歓びを噛みしめる

いやー、体中を電気が走ったような感じがした。

CodeからArduinoが書ける時代

forest.watch.impress.co.jp

要点はこの記事を読んで理解して下さい。サマると、Arduinoのコーディングとかバイナリのアップロードが、Visual Studio Codeから行えるようになるよ!ということ。ただし、

なお、本拡張機能を利用するには「Arduino IDE」v1.6.0以降の導入が必要。“Microsoft ストア”で配布されているバージョンは対応していないため、“Arduino”の公式サイトからインストーラー版かZIP版をダウンロード・インストールする必要がある。

今のところは本家のIDEも必要そうです。

とりあえずやってる

Arduino拡張はMarketPlaceからダウンロード可能。

Visual Studio Code Arduino ESP8266

さくっとインストール。ただ、インストールが完了してもあまり見栄えは変わりません。ただし、.inoファイルを開くと、こんな感じ。F1ボタンを押すと、おなじみのメニューが表示されます。

Visual Studio Code Arduino ESP8266

たとえば、Arduino: Board Configを開くと、Arduino IDEでインストール済みのボートが選択できます。もちろん、ESP8266も選択可能。

Visual Studio Code Arduino ESP8266

ほうほう。意外と使えるのね。

コンパイルには注意が必要

そのままだと、includeしているライブラリを参照できなかったりして、コンパイルが成功しません。

Visual Studio Code Arduino ESP8266

その場合は、Codeで開いているワーキングディレクトリにJSON形式の設定ファイル(c_cpp_properties.json)を作成し、そこにArduinoのライブラリのパスを書く必要がある。コード上のincludeの部分がCode上で怒られてる状態だと、その設定ファイルは簡単に作れる。JSONの、"configurations" -> "browse" -> "path" に、以下の2行を追加した。(僕の環境の場合は、ですが)

"/Users/(ユーザー名)/Library/Arduino15/",
"/Users/(ユーザー名)/Documents/Arduino" 

そうすれば、ちゃんとライブラリのincludeができるようになりました。

いざコンパイル

今回は、ポキオ基板v2(ESPr Developer)にバイナリを流し込んでみました。

ESPr Developer(ESP-WROOM-02開発ボード)

ESPr Developer(ESP-WROOM-02開発ボード)

Visual Studio Code Arduino ESP8266

プログラムの流し込みも基本的にはIDEと変わらず、F1ボタンからBoard Configを選択して、ボードの設定をしてから、Select Serial Portでポートの選択、そしてUploadを押すとコンパイル・流し込みが開始されます。

Visual Studio Code Arduino ESP8266

ただ、本家IDEと決定的に違うのは、ボードをUSB接続したタイミングで、「もしかして、このボードですか?(意訳)」見たいなメッセージが出ること。これは便利!と思いきや、ESPrを挿してるのに、SparkFun製のボードと判定されてしまうハプニング。まぁ、これからの伸びしろということで。

流し込み完了・・・したの・・・?

ボードの設定、ポートの設定を無事に済ませてESPrに書き込もうとすると、最後の罠が。

[Starting] Upload sketch - unko2/unko2.ino
構成をロード中…
パッケージを初期化中…
ボードを準備中…
検証中…
最大1044464バイトのフラッシュメモリのうち、スケッチが231913バイト(22%)を使っています。
最大81920バイトのRAMのうち、グローバル変数が32240バイト(39%)を使っていて、ローカル変数で49680バイト使うことができます。
マイコンボードに書き込んでいます...
Uploading 236064 bytes from /var/folders/jl/xtvx_dl51qg1yn70n399sfv00000gn/T/arduino_build_932727/unko2.ino.bin to flash at 0x00000000
................................................................................ [ 34% ]
................................................................................ [ 69% ]
.........................[Done] Uploaded the sketch: unko2/unko2.ino

こんな感じで、ESP8266へのバイナリの書き込みのProgressが100%に達しない件。正確には100%に達する前にProgressが停止。少し経って[Done]と表示される。これで大丈夫か?と思うけど、ちゃんとプログラムはESPrに書き込まれてるっぽい。こんなんでいいのかな(笑)

サマリ

というわけで、Visual Studio CodeからESP8266へプログラムの書き込みを行ってみました。

Pros

  • Visual Studio Codeから書き込めるワクワク感
  • Syntax Highlightが本家IDEよりリッチな感じがする
  • 補完機能やエディタ本来の機能は本家IDEより上

Cons

  • 現状、Arduino IDEがインストールされている必要がある
  • Codeの独特の操作感に慣れる必要がある

今後、Codeだけでプログラムの書き込みができるようになったらいいなぁ。Codeのエディタとしての基本性能が高いだけに、今後に期待せざるをえない感じです。

Google Apps ScriptのWebAPIで、ESP8266が光らせるLEDの色を指定する

GASとESP8266の禁断の関係。 (タイトルの日本語がおかしかったので修正したけど、まだなんかおかしい)

ESP8266ですべて処理させる時代は終わった

個人的にはそう思ってます(笑)

relativelayout.hatenablog.com

以前、思いつきで、「GASですべて判断して、ESP8266はGPIOだけ制御してればイイのでは?」みたいなことを考えていました。

ESP8266 Google Apps Script

要は、何かWeb上の情報をもとに判断して、フルカラーのLEDの光る色を変えるくらいなら、判断ロジックをGASに集約させて、GASとESP8266の界面では、何色に光らせるか会話しておけばいいのでは?ということでした。だんだん動作確認ができてきたので、実際にそういうコードを書いてみます。

GAS側の実装

WebAPIでアクセスされた時に、何色に光らせるかをRGBで返すようにします。特に難しいことはしたくないので、Plain Textで返すクソコードになっています。また、今回は色は決め打ちで赤としています。

function doGet() {
  return ContentService.createTextOutput("pokio,255,0,0");
}

pokioという文字をプレフィックスで付けています。念のため、ESP8266側では、プレフィックスの有無を確認します。(たぶん、その必要はないと思うけど、念のため)

ESP8266側

WebAPIを叩いて取得した文字列で、まずプレフィックスの有無を確認。その後、R/G/Bの値をintに変換して、その色で一定期間光らせます。WebAPIは定期的に叩いて、その都度色を計算します。

#include <ESP8266WiFi.h>
#include <Adafruit_NeoPixel.h>
#include <HTTPSRedirect.h>

#define PIN 4
#define NUMLED 1
#define SSID "xxxxx"
#define PASSWORD "yyyyy"

#define HTTPS_PORT 443
#define HOST "script.google.com"
#define URL "/macros/s/zzzzz/exec"
#define FINGERPRINT "ここにフィンガープリント"

#define INTERVAL_SEC 60 // 60秒おきにWebAPIを叩くつもり

HTTPSRedirect* client = nullptr;
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMLED, PIN, NEO_RGB + NEO_KHZ800);

void setup() {
  // Serialの初期化
  Serial.begin(115200);
  Serial.println("");

  // マイコン内蔵RGB LEDの初期化
  pixels.begin();
}

void loop() {
  // Wi-Fi接続開始
  connectWifi();

  // Google Apps Scriptを叩く
  String result = doRedirectGet();

  // Wi-Fi接続終了
  disconnectWifi();

  // サフィックスを念のため確認
  if (!result.startsWith("pokio")) {
    delay(INTERVAL_SEC * 1000);
    return;
  }

  letMeBlink(result);
}

// Wi-Fi接続
void connectWifi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(SSID, PASSWORD);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    blinkRGB(3, 255, 255, 255);
  }

  Serial.println("Wi-Fi connected");
}

// Wi-Fi切断
void disconnectWifi() {
  WiFi.disconnect();
  Serial.println("Wi-Fi disconnected");
}

// 取得した文字列をパースして、指定された色で光らせる
void letMeBlink(String result) {
  result = result.substring(result.indexOf(",") + 1);
  int r =  result.substring(0, result.indexOf(",")).toInt();

  result = result.substring(result.indexOf(",") + 1);
  int g =  result.substring(0, result.indexOf(",")).toInt();

  result = result.substring(result.indexOf(",") + 1);
  int b =  result.substring(0, result.indexOf(",")).toInt();

  Serial.println(String("blinking : ") + r + "," + g + "," + b);
  blinkRGB(INTERVAL_SEC, r, g, b);
}

// 点滅
void blinkRGB(int sec, int r, int g, int b) {
  int count = 0;

  while (count < sec) {
    for (int i = 0; i < 256; i += 5) {
      setColor((r * i / 255), (g * i / 255), (b * i / 255));
    }

    for (int i = 255; i >= 0; i -= 5) {
      setColor((r * i / 255), (g * i / 255), (b * i / 255));
    }

    count++;
  }
}

// LEDを指定した色で光らせる
void setColor(int r, int g, int b) {
  for (int i = 0 ; i < NUMLED; i++) {
    pixels.setPixelColor(i, pixels.Color(r, g, b));
    pixels.show();
  }
  delay(10);
}

// Redirectを回避してHTTP-GETする
String doRedirectGet() {
  String body = "";
  client = new HTTPSRedirect(HTTPS_PORT);

  if (!client->connect(HOST, HTTPS_PORT)) {
    Serial.println("connection failed");
    return body;
  }

  if (!client->verify(FINGERPRINT, HOST)) {
    Serial.println("certificate doesn't match");
  }

  client->GET(URL, HOST);
  body = client->getResponseBody();
  delete client;
  client = nullptr;
  return body;
}

動作確認

まず、シリアルモニターから。

..Wi-Fi connected
Wi-Fi disconnected
blinking : 255,0,0

しっかり、赤で光らせることを理解できていそうです。

ESP8266 Google Apps Script

ポキオ基板v2上のLEDも赤く光っています。

これはイケそう

というわけで、ESP8266は判断ロジックは持たず、すべてGASにまとめても、LEDの色を変えることはできそう。今後は、GASに色んなロジックを搭載して、LEDを光らせまくります。Lチカ最高。

暗闇だと趣深いですね。

ESP8266からGoogle Apps Scriptを叩くのはちょっと面倒

一定のつらみ。

Google Apps ScriptのWebAPIは厳しい

GASのWebAPIをESP8266から叩くときに、2つの大きな問題があります。

  1. HTTPSに対応すること
  2. HTTPリダイレクトに対応すること

HTTPS対応

いままではポート80にアクセスしていましたが、HTTPSになると443にアクセスしなければなりません。また、それでだけでは不十分で、通常のHTTP接続を行ってくれる便利クラスのインスタンスのコンストラクタで、フィンガープリントなる文字列を引数に与えなければなりません。

www.grc.com

そこで、便利なのがこのサイト。アクセスしたいアドレスを打ち込むだけで、フィンガープリントを生成してくれます。ターミナルからSSLのコマンドを売ったりする必要はありません。

HTTPリダイレクト対応

Google Apps Scriptで作ったWebAPIは、アドレスにアクセスしても別のアドレスにリダイレクトされてしまいます。

Content Service  |  Apps Script  |  Google Developers

For security reasons, content returned by the Content service isn’t served from script.google.com, but instead redirected to a one-time URL at script.googleusercontent.com.

ただし、ESP8266の実装でよく使われるHTTPClientやWifiClient (WifiClientSecure)はリダイレクションに対応していないようで、上手く動作しません。そこで、今回はHTTPSRedirectというライブラリを使って実装をしてみます。

github.com

サンプルコードも載っているので非常にわかりやすいです。

いざ実装

今回は、以前作ったポキオ基板v2を使って実装してみます。

relativelayout.hatenablog.com

ESP8266 HTTP REDIRECTION

基本的にはESPr Developerで、IO4がマイコン内蔵RGB LEDとつながっています。また、アクセスする先は、前回作ったpokioという文字列を返すだけのGASのWebAPIです。

relativelayout.hatenablog.com

クソコードはこんな感じ。

#include <ESP8266WiFi.h>
#include <Adafruit_NeoPixel.h>
#include <HTTPSRedirect.h>

#define PIN 4
#define NUMLED 1

#define SSID "xxxxx"
#define PASSWORD "yyyyy"

#define HTTPS_PORT 443
#define HOST "script.google.com"
#define URL "/macros/s/zzzzz/exec"
#define FINGERPRINT "FI NG ER PR IN T!"

HTTPSRedirect* client = nullptr;
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMLED, PIN, NEO_RGB + NEO_KHZ800);

void setup() {
  // Serialの初期化
  Serial.begin(115200);
  Serial.println("");

  // マイコン内蔵RGB LEDの初期化
  pixels.begin();
}

void loop() {
  // Wi-Fi接続開始
  connectWifi();

  // Google Apps Scriptを叩く
  Serial.println(doRedirectGet());

  // Wi-Fi接続終了
  disconnectWifi();

  delay(10000);
}

// Wi-Fi接続
void connectWifi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(SSID, PASSWORD);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    blinkWhite(3);
  }

  Serial.println("Wi-Fi connected");
}

// Wi-Fi切断
void disconnectWifi() {
  WiFi.disconnect();
  Serial.println("Wi-Fi disconnected");
}

// 白い点滅
void blinkWhite(int sec) {
  int count = 0;

  while (count < sec) {
    for (int i = 0; i < 256; i += 5) {
      setColor( i, i, i);
    }

    for (int i = 255; i >= 0; i -= 5) {
      setColor( i, i, i);
    }

    count++;
  }
}

// LEDを指定した色で光らせる
void setColor(int r, int g, int b) {
  for (int i = 0 ; i < NUMLED; i++) {
    pixels.setPixelColor(i, pixels.Color(r, g, b));
    pixels.show();
  }
  delay(10);
}

// Redirectを回避してHTTP-GETする
String doRedirectGet() {
  String body = "";
  client = new HTTPSRedirect(HTTPS_PORT);

  if (!client->connect(HOST, HTTPS_PORT)) {
    Serial.println("connection failed");
    return body;
  }

  if (!client->verify(FINGERPRINT, HOST)) {
    Serial.println("certificate doesn't match");
  }

  client->GET(URL, HOST);
  body = client->getResponseBody();
  delete client;
  client = nullptr;
  return body;
}

動作確認

Serial Monitorの出力はこんな感じ。

.Wi-Fi connected
pokio

Wi-Fi disconnected

いい感じですね。たまに、

..Wi-Fi connected
certificate doesn't match
pokio

Wi-Fi disconnected

こんな感じでフィンガープリントでの認証が通らない時もありますが、それでもAPIは正しく返ってきています(笑)

「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。