Help us understand the problem. What is going on with this article?

快適な睡眠を目指して寝床内気象を測定する(温度編) #sleeptech

良い睡眠を取るために

みなさん、良い睡眠は取れていますか??
私は1日に夜8時間睡眠+日中仮眠を数回取らないと夕方にはクタクタになってしまいます。

毎日8時間睡眠を取るのはなかなか難しいので、睡眠の質を上げていきたいわけです。

その一環として、前回の記事(よく風邪を引くのでちょうどいい布団を教えてくれるLINE BOT作った)でちらっと紹介しましたが、今回は寝床内気象にフォーカスを当てたいと思います。

寝床内気象とは?

寝床内気象でググるといろんなサイトがヒットします。

寝床内気象とは、快適な眠りに関わる条件のうち、布団内の温度・湿度のことを指すようです。

bed-temp.jpg
(「 寝室環境・寝床内の研究 ぐっすり眠るために最適な温度や湿度は?」より引用)

日本睡眠化学研究所さんの研究によると、

理想的な寝床内温度・湿度を明らかにするために数々の実験を重ね、その結果、「温度33±1℃」「湿度50±5%RH」という数値を導きだしました。

とのこと。

つまり、良い睡眠を得るためには、布団の温度を湿度が適切な値になっている必要があるようです。
手元にObnizと温度センサーがあったので、早速温度を測る準備を始めましょう。(湿度はまた今度)

ところで寝床内気象って何て読むんでしょうか…ねどこないきしょう?しんしょうないきしょう?

アプリイメージ

  • 5分ごとに布団内部の温度を測りデータベースに登録することで、データを集めていく。 app-image.jpg

システムイメージ

  • マイコンの知識がないので、お手軽に使えるObnizを使用。
  • Lambdaを使って、Obnizからの温度取得とDynamoDBへの保存を行う。
  • 上記処理をCron実行させるため、CloudWatchEventsを使用

sys-image.jpg

回路イメージ

今回はObnizでお手軽に実装するため、ObnizのJSパーツライブラリで対象となっている温度センサーを使用していきます。

Obniz

Obnizとは、

obniz(オブナイズ)は、ON/OFFやUART通信などのIO制御をクラウドのAPI経由で行える仕組みです。センサーやアクチュエーター、既存機器をネットワーク経由で直接操作でき、クラウド中心のIoT開発が可能です。

とのこと。青色のかわいいやつです。
公式サイト→ https://obniz.io/ja/

使用した素子

接続イメージは以下の通り。
circuit.jpg

処理の流れ

Lambda関数

大まかな処理の流れは、
  ①Obnizから温度取得
  ②DynamoDBへの保存
です。

ソースをピックアップして説明します。

Obnizに接続
const Obniz = require('obniz');
const obniz = new Obniz(process.env.OBNIZ_ID);

const getTemperature = async () => {
  await obniz.connectWait(); // 接続を試し、接続するまで待つ
  const tempsens = obniz.wired("LM35DZ", { gnd:0 , output:1, vcc:2});
  return await tempsens.getWait(); // センサーの温度を取得
}

getTemperature().then((temperature) => {
  console.log(`${temperature}度`);
})
  • 取得した値をDynamoDBに保存する。 DynamoDBの操作には、DocumentClient(公式ドキュメント)を使います。
取得した温度をDBへ保存
const AWS = require('aws-sdk');
const documentClient = new AWS.DynamoDB.DocumentClient();

const uuidv4 = require('uuid/v4');
const dayjs = require('dayjs');

documentClient.put({ // putメソッドでDynamoDBにアイテムを作成
  TableName: 'BedSensorTable',
  Item: {
    dataId: uuidv4(), // パーティションキー。UUIDを入れる。
    created: dayjs().unix(), // ソートキー。現時刻のUNIX時間を入れる。
    temperature: temperatureValue // 上記で取得した温度を入れる。
  }
}).promise();

CloudWatchEvents

上記で作成したLambda関数を5分に1回実行するようにルールを設定する。

AWSコンソール > CloudWatch > ルール > ルールの作成から適当にルールを作る。

cloudwatchevents.jpg

これで完成!

早速設置し、寝てみる

ベッドに設置してみた。
bed.jpg
うん。なかなかシュールだ。
シーツをかけると見た目は普通のベッドになりました。
bed2.jpg

実際に寝てみる。ベッドが柔らかいおかげか、意外と気にならなかった。

結果は、こんな感じとなった。
result.png

布団に入ると内部の温度が上昇し、40±2℃くらいで推移しているようです。
体感ではちょうど良い温度だったのですが、33℃前後って少し寒いのでは…?

改善したいこと

  • 意外と気にならないとは言っても、無意識にセンサーを避けて寝ていた。また、寝ていてObnizの熱を感じる。
    Obnizの熱+温度センサーが近い=温度が高めに取得されている?
    どちらにせよ壊れるのはいやなので、Obnizとセンサーの間にケーブルを入れて、Obnizはベッドの外に出したほうがよさそう。
  • Obniz直挿しだと素子がすぐ抜けてしまう。ちゃんとやるならはんだ付けなどをしないと。 morning.jpg
  • 温度の見える化。時間の関係で、見える化にまでは至らなかった。LINE LIFFのv2が公開されたらしいので使ってみたい。

詰まったところ

Obniz接続時のエラー(Error: ad 1 is not valid io)

Obnizを使って温度センサーの値を取得しようとすると以下のようなエラーが出てきた。

const Obniz = require('obniz');
const obniz = new Obniz(process.env.OBNIZ_ID);

const tempsens = this.obniz.wired("LM35DZ", { gnd:0 , output:1, vcc:2});
const result = await tempsens.getWait();
console.log(result);
{
  "errorType": "Error",
  "errorMessage": "ad 1 is not valid io",
  "trace": [
    "Error: ad 1 is not valid io",
    "    at Obniz.getAD (/var/task/node_modules/obniz/obniz/ObnizComponents.js:200:13)",
    "    at LM35DZ.wired (/var/task/node_modules/obniz/parts/TemperatureSensor/analog/AnalogTemperatureSensor.js:11:21)",
    "    at Obniz.wired (/var/task/node_modules/obniz/obniz/ObnizParts.js:54:17)",
    "    at Runtime.exports.handler (/var/task/index.js:5:26)",
    "    at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)",
    "    at process._tickCallback (internal/process/next_tick.js:68:7)"
  ]
}

ドキュメントをちゃんと見ると、onconnectのコールバックとして温度取得の処理を入れないといけないらしい。

const Obniz = require('obniz');
const obniz = new Obniz(process.env.OBNIZ_ID);

obniz.onconnect = async function() { // 追加
  const tempsens = this.obniz.wired("LM35DZ", { gnd:0 , output:1, vcc:2});
  const result = await tempsens.getWait();
  console.log(result);
}

なんか書きにくいなぁと思いながらドキュメントを眺めていると、connectWait関数なる関数を発見。

const Obniz = require('obniz');
const obniz = new Obniz(process.env.OBNIZ_ID);

obniz.connectWait().then(async () => { // connectWaitに変更
  const tempsens = obniz.wired("LM35DZ", { gnd:0 , output:1, vcc:2});
  const result = await tempsens.getWait();
  console.log(result);
});

最終的に、温度を1回分取得する関数として以下のように落ち着いた。

const Obniz = require('obniz');
const obniz = new Obniz(process.env.OBNIZ_ID);

// きれいになった
const getTemperature = async () => {
  await obniz.connectWait();
  const tempsens = obniz.wired("LM35DZ", { gnd:0 , output:1, vcc:2});
  return await tempsens.getWait();
}

// 使うときはこんな感じ。async/awaitで書いてもよい。
getTemperature().then((temp) => {
  console.log(temp);
})
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした