ワンボタンでiPhoneのヘルスケアにカフェイン摂取記録をつけるデバイスを作った

普段スマートリングでiPhoneのヘルスケアに睡眠記録をとったりしているのですが、ヘルスケアにはカフェインの項目もあり、影響を見てみたいなと思いました。

カフェイン記録をとるアプリ等もありますが、コーヒーを飲むたびにiPhoneを手に取ってアプリを開いて記録を…というのは手間がかかりすぎて続かないので、簡単に1ボタンで記録を取れるようにしてみます。

記録ボタン

簡単さ最重視ということで、1プッシュするとコーヒー1杯分のカフェイン量50mgを記録する方式にします。

ボタンはたまたまあった M5StickS3 を使いました。電源が入ったら、HTTPリクエストを送信して、電源が切れるという簡単なスケッチを入れておきます。*1

#include <M5Unified.h>
#include <WiFi.h>
#include <HTTPClient.h>

char ssid[] = "...";
char pass[] = "...";

HTTPClient http;

void setup() {
  auto cfg = M5.config();
  cfg.internal_spk  = true;
  M5.begin(cfg);
  M5.Speaker.begin();
  M5.Speaker.setVolume(160);

  M5.Lcd.setBrightness(100);
  M5.Lcd.setFont(&fonts::Font4);
  M5.Lcd.setTextColor(WHITE, BLACK);

  WiFi.mode(WIFI_STA);
  //手動でIPアドレスを割り振ればより高速に接続が完了してバッテリーの減りも軽減される
  //WiFi.config(ip,gateway,subnet);
  WiFi.begin(ssid, pass);
  M5.Lcd.drawString("WiFi on..", 4, 160);
  while (true) {
     if (WiFi.status() == WL_CONNECTED) break;
     delay(200);
  }

  Serial.println("sending...");
  M5.Lcd.drawString("sending..", 4, 160);
  http.begin("http://192.168.x.y/button");
  int httpCode = http.GET();
  M5.Lcd.drawString(String("result: ") + httpCode + "   ", 4, 160);

  if (httpCode == HTTP_CODE_OK) {
    M5.Speaker.tone(659, 100);
    delay(100);
    M5.Speaker.tone(523, 100);
    delay(100);
  } else {
    M5.Speaker.tone(440, 100);
    delay(100);
    M5.Speaker.tone(440, 100);
    delay(100);
  }

  M5.Power.powerOff();
}

void loop() {
}

適当なWebサーバーを用意し、以下の簡易な呼び出されたら時刻を記録するだけの CGI シェルスクリプトを /button として置きます。

button

#!/bin/sh
echo "Content-Type: text/plain"
echo
echo "OK"

date +%F\ %T >> button.txt

もう一つ、この結果を取得すると同時に削除するスクリプトも /button_data として置きます。

button_data

#!/bin/sh
echo "Content-Type: text/plain"
echo
cat button.txt
:>button.txt

そして iPhone に以下のようなショートカットを作ります。

オートメーションタブでこのショートカットを毎日決まった時間に実行するように設定すれば出来上がりです。


あとはキッチンにこれを置いておいて、コーヒーを淹れるたびに電源ボタンをポチッと押せば記録が取れます。

余談

M5StickS3 なら振って電源ONにすることもできるらしい。
https://docs.m5stack.com/ja/arduino/m5sticks3/m5pm1

*1:Amazon Dash Button があった頃ならそれを使いたいところですが…