のほほん停留所

つぶやきのなりそこないの溜まり場

体重計を自作してみた (仮)

最近、飲み会が増えてきて本格的に体重が気になってきました。しかし、体重計に乗るだけで満足して記録を忘れてしまい、全然管理できない毎日です。そもそも、自分の体重なんていう向き合いたくないものを記録するということがもう苦痛です、自分みたいな人間には無理です、不可能です。ですので、乗っただけで自動記録する体重計を自作してみることにしました。

といっても「そもそも体重計ってどうやって作るんだ?」というレベルからスタートしたので、プロトタイプから作ってみました。

プロトタイプのゴール

  1. 重さを測れること
  2. 測った重さを外部にPOSTすること

部品表

合計: 9,360円

構成

f:id:Nonchalanttan:20160929022039j:plain

上のような回路を組んで、圧力センサーにかかる荷重を計算していきます。Arduino IDEを用いて、Sketchと呼ばれるプログラムを組んで測定します。

f:id:Nonchalanttan:20160929030856p:plain

// 変数の宣言
double Vo, Rf, fg, kg;
int ain = analogRead(1);
// アナログ入力値から出力電圧を計算
Vo = ain * 5.0 / 1024;
// 出力電圧からFRSの抵抗値を計算
Rf = R1*Vo / (5.0 - Vo);
// FRSの抵抗値から圧力センサの荷重を計算
fg = 880.79/Rf + 47.96;
kg = (fg / 4448) * 10;

上が測定部分のプログラムです。アナログ入力値からセンサーの固有値を用いて荷重を測定します。センサーは負荷をかければかけるほど抵抗値が下がって、負荷をかけていないときはこの回路では無限として扱います。そして、測定した値をFlash Airのテキストファイルに書き込みます。

File dataFile = SD.open("DATALOG.TXT", FILE_WRITE);
if (dataFile) {
  dataFile.println(fg);
  dataFile.close();
  Serial.println(fg);
} else {
  Serial.println("error opening datalog.txt");
}

datalog.txtというファイルを開いて、先程測定した値を書き込みます。これで、Arduino上で行うことは以上です。

Sketchのソースコード

測定したデータを外部にPOSTする部分はFlash Airで行います。Flash Airは「撮った写真をその場でシェアできる」というキャッチコピーで東芝から売り出されているSDカードです。Flash Airは単体でWebサーバーとして機能して、luaという軽量スクリプトを動かすことができます。Flash Airに書き込みされたことをフックしてluaスクリプトを走らせて、測定したデータを外部にPOSTします。

// Flash Airの設定ファイル

[Vendor]
APPSSID=TokyoWifi // Wifi
APPNETWORKKEY=*************
STA_RETRY_CT=3
LUA_SD_EVENT=/post_script.lua // 書き込み時に走るスクリプト

APPNAME=flashair
APPMODE=5
PRODUCT=FlashAir
VENDOR=TOSHIBA
MASTERCODE=28a02b85ed79
LOCK=1
VERSION=FA9CAW3AW3.00.00
CID=02544d535731364731dc16867900f901
file, msg = io.open("DATALOG.TXT", "r")

if file then
    data = file:read("*a")

    t = {}
    for line in string.gmatch(data, "(.-)\n") do
        table.insert(t, string.sub(line, 1, #line))
    end

    latest = t[table.maxn(t)]
    if latest == "" then
        return
    end

    boundary = "--61141483716826"
    contentType = "multipart/form-data; boundary=" .. boundary

    token = "**************************************"
    local ENDPOINT_URL = "https://slack.com/api/chat.postMessage?token=" .. token .. "&channel=%23toybox&text=" .. latest .. "kg&as_user=true&link_names=channel"

    b, c, h = fa.request {
        url = ENDPOINT_URL,
        headers = {
            ["Content-Type"] = contentType
        }
    }

    print(b)
    print(c)
    print(h)
else
    print(msg)
end

DATALOG.TXTというファイルを読み込んで最新の書き込みを探して、今回はSlackに測定データをPOSTしています。

f:id:Nonchalanttan:20160929030617p:plain

luaのソースコード

これで最初に目標としてプロトタイプは完成しました!

まとめ

10kgまでですが圧力を感知してPOSTするデバイスが完成しました。これを100kg程度まで測れるように改良して、グラフとかを表示するWebクライアントを作れば完成だと思ってた矢先、見つけてしまいました...自分が求めてたものが...

Withings

Bluetoothで接続して、乗るだけで体重を記録してくれて、割りとおしゃれなWebクライアントもある。即ポチりました(涙

f:id:Nonchalanttan:20160929031037p:plain

色々と勉強にはなったので良かったといえば良かったのですが、まずはちゃんと調査する大切さがよく分かりました。

参考にしたサイト