2016年10月22日土曜日

ESP-WROOM-02 + IFTTTでワンダーコアの腹筋回数カウンタを作った



ワンダーコアSmartでの腹筋回数を自動で記録し履歴を可視化するための装置および一連のWEB処理を作成したので紹介します。

機能というか特徴としては
・複数ユーザ(2人)を切り替え可能にする
・グラフをスマートフォンから簡単に確認できるようにする

使用したもの
1) WiFiマイコン ESP-WROOM-02
2) WEBサービス連携 IFTTT
3) データのグラフ化 Google Spreadsheet

いずれも詳しい説明は優れたWEB記事が他にありますので、ここでは本目的のためのポイントに絞って記述します。




1) ESP-WROOM-02
WiFi通信可能で安価な小型マイコンモジュールです。
Arduinoとしてプログラムしました。
プログラムは本記事末尾に記載します。

12番ピン: 動作表示用LED
13番ピン: ユーザ切り替え用スライドスイッチ(プルアップしておき、HIGHでユーザ1、LOWでユーザ2)
14番ピン: 回数カウント用マイクロスイッチ(ワンダーコアの背もたれが倒れたときスイッチを押す)

スライドスイッチは2回路2接点のものを使用して電源スイッチとユーザ切り替えを兼ねさせました。

プログラム(スケッチ)開発時はSWITCH SCIENCEさんの開発ボードを使用しましたが、今回はブレッドボードでなくESP-WROOM-02単体をちゃんとケースに収めて完成品としたかったので、結局開発ボードと同じような機能の書き込み装置を別途製作しなければなりませんでした。
このへん、手軽に単品書き込みできる商品(ICソケットのようなもの)があればいいなあと感じました。

書き込んだESP-WROOM-02単体をユニバーサル基盤上に半田付けし、他のスイッチやLEDも配線してケースに収めました。
ケースはドリルやヤスリで加工し、グルーガンでLED等を固定しました。
電源は単三電池2本の3.0Vでもいちおう動作しました。




背もたれの倒れ角度によるマイクロスイッチON範囲の調整のため、針金(クリップ)を曲げてマイクロスイッチにかぶせる格好にしてあります。
針金が適度にしなるので、背もたれが倒れすぎてスイッチが破損することを防いでくれます。




2) IFTTT

様々なWEBサービスを自作ルールで連携させることのできるWEBサービスです。
Maker Channelを使用して、ESP-WROOM-02からのトリガでGoogle Spreadsheetに1行ポストするように設定しました。
つまり 腹筋1回 = IFTTTに1トリガ = Spreadsheetの1行 です。

当初はESP-WROOM-02でカウントを保持しておき、最後に合計回数をIFTTTに投稿するという流れも考えましたが、この場合この処理のためのボタンか何かを装置側に設置しなければならず手軽でないのと、任意のタイミングで電源OFFしても正常にデータ送信できるようにしたかったため、最終的に上記の方法にしました。
数秒に1回程度であればIFTTTも正常に処理してくれています。


3) Google Spreadsheet


Googleの表計算WEBサービスです。
IFTTT経由で腹筋1回につき1行、タイムスタンプとユーザ名が表に追加されていきます。
これを集計して、ユーザ2名につき過去2週間の1日ごとの腹筋回数をグラフで表示するようにしました。

IFTTTからのタイムスタンプは October 9, 2016 at 06:25PM の形で来るようなので、特定の日付を検索するためにTODAY, SPLIT, VLOOKUP関数などで検索キーとなる日付の文字列を整形したうえで、COUNTIFS関数により日付・ユーザで集計しました。

今回初めて知ったのですが表計算上の検索でワイルドカード "*" が使えるんですね。当初は正規表現を使わなければならないと思い込んで試行錯誤していたのが、簡単に解決できました。

「グラフを公開」からWEBページとしてアクセスできるようにし(「変更が加えられると自動的に再公開」にチェックしておきます)、スマートフォンでブックマークしておけば手軽にグラフが見られます。

※このグラフ画像はイメージです。リアルタイム更新ではありません。


プログラム(スケッチ)

最後にESP-WROOM-02に書き込んだプログラム(スケッチ)を記載します。

スイッチONでWiFi接続を試みます。接続中はLEDが点滅し、接続後は点灯します。
マイクロスイッチがONからOFFになった瞬間を検知してIFTTTにトリガを送り、またLEDが一瞬消灯します。
所々に Serial.print() がありますが開発時のデバッグ用なので実際の完成品にとっては特に意味のない命令です。
また所々に delay(1) などありますが、本当に必要かどうかは未検証です。動いてるのでOKと考えています。

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

//ルーターのSSID
const char* ssid = "XXXXXXXXXXX";
//ルーターのパスワード
const char* password = "XXXXXXXXXXXXXX";

const char* host = "maker.ifttt.com";
const char* event = "wondercore";
const char* secretkey = "XXXXXXXXXXXXXXXX";

String user = "user1";
boolean microswitch = false;

void setup() {
  pinMode(12, OUTPUT); //LED
  digitalWrite(12, LOW);
  pinMode(13, INPUT_PULLUP); //user
  pinMode(14, INPUT_PULLUP); //micro-switch
  if (!digitalRead(13)) {
    user = "user2";
  }
  Serial.begin(115200);
  delay(10);
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(250);
    Serial.print(".");
    digitalWrite(12, HIGH);
    delay(250);
    digitalWrite(12, LOW);
  }
  digitalWrite(12, HIGH);
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  if (!digitalRead(14)){
    microswitch = true;
    delay(1);
  }
  if (digitalRead(14) && microswitch) {
    delay(1);
    Serial.println("Trigger!");
    digitalWrite(12, HIGH);
    delay(50);
    digitalWrite(12, LOW);
    Serial.print("connecting to ");
    Serial.println(host);
    WiFiClient client;
    const int httpPort = 80;
    if (!client.connect(host, httpPort)) {
      Serial.println("connection failed");
      return;
    }
    String url = "/trigger/";
    url += event;
    url += "/with/key/";
    url += secretkey;
    url += "?value1=";
    url += user;
    Serial.print("Requesting URL: ");
    Serial.println(url);
    client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                 "Host: " + host + "\r\n" +
                 "Connection: close\r\n\r\n");
    delay(10);
    while (client.available()) {
      String line = client.readStringUntil('\r');
      Serial.print(line);
    }
    Serial.println();
    Serial.println("closing connection");
    microswitch = false;
  }
}
-----------------------------------------------------



参考にさせていただいた主な記事
ESPr Developer ( ESP-WROOM-02 開発ボード )の使い方をザッと紹介


 

0 件のコメント:

コメントを投稿