2016年8月17日水曜日

ESP+400円あれば10分で作れる睡眠計

ただし送料は別ですw

秋月電子通商のサイトから

これは毎度おなじみのPIRセンサー、赤外線を発する物体が動いたことを検出してくれるセンサーです。主に防犯用途で使われるものですが、安い割には高感度なので鳩の検出や来客の検出など便利に使えます。なお、このHC-SR501は安いんですが、動きを検出したあと信号を数秒〜数分間引き伸ばして出力する仕様です。侵入者を検知してランプを点灯するためのものなので。そういう意味ではSE-10というセンサーの方が正確に把握できるんですが、高いのと5V電源では正常に動作しないので、今回は見送ります。

今回はこの400円のセンサーと無料のThingSpeak.comを使って10分で睡眠記録デバイスを作ってみます。

当然ESP-WROOM-02のモジュールも必要です。それにはぜひ倉橋屋Board1をご検討ください:-)

…他にオス - メスのジャンパワイヤとかブレッドボードが必要ですが、それはさておき。

まず、PIRとESP-WROOM-02を接続します。PIRの電極は、ドームを上、ピンを手前にした状態で左からGnd, Signal, Vccです。GndとESPのGnd、SignalとIO12、Vccと電源(5v以上…Board1をUSBにつないでいる場合はVin、ESPrなどではVOUT)を接続します。Signal出力は約3vなので、ESPと直結しても大丈夫です。なお、PIRによってはもっと電圧の高いものやオープンコレクタのものもあるので、その場合は仕様に従ってください(コメント欄に書いていただければ、わかる範囲でお答えします)。

接続はこれでおしまいです。HC-SR501はボリュームが2つ付いていて、それぞれ感度調整と持続時間調整です。感度はその通り感度で時計回りに回すほど敏感になります。持続時間は一度動きを検出した時にその後何秒出力HIGHを維持するかを設定できます。睡眠計として使うのであれば、感度は最低(時計回り目一杯)+持続時間最小(時計回り目一杯)で良いと思います。あとジャンパが一箇所ありますが、基板の端の方にするとHIGHになっているときに次の動きを検出してもLOWになるタイミングは延長されませんが、基板端から離れた方に挿すと動きを検出した時点でHIGHが延長されます。これ、どっちが良いでしょうね。

ThingSpeak.comのアカウントを登録します。ThingSpeak.comは「チャンネル」という単位で送信されてくるデータを管理します。一つのチャンネルは最大8個までのデータ列を記録することができます。New Channelで新しいチャンネルを登録し、Nameは適当に、Field1に「movement」というタイトルを付けチェックします。下の方の「Save Channel」をクリックすればOKです。次にAPI Keysというタブをクリックし、「Write API Key」の値をコピーしておきます。

あとは、以下のソースをArduino IDEで開き、お使いのWiFiのSSIDとパスワード、それからさっきコピーしたWrite API KeyをapiKeyにセットすればOKです。

// Sleep log by PIR by Koichi Kurahashi 2016-08-13
//
//
// WiFi
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include "../../private_ssid.h"
//const char *ssid = "*************";
//const char *pass = "*************";
//String apiKeyTest = "*************";
WiFiClient client;
//
// 時間
#include <Time.h>
#include <TimeLib.h>
int prevMinute = -1; // 分単位の処理をするためのフラグ
//
// PIR Sensor
//
const int kPIRSensor = 12;
volatile int pirCounter = 0; // volatileは最適化せずメモリに置いとけというコンパイラへの指示
// 割り込みの中でアクセスする変数などに指定。
//
// タイマー割り込み関連
//
extern "C" {
#include "user_interface.h"
}
os_timer_t myTimer;
//
// Setup
//
void setup() {
//
// Serial
Serial.begin(115200);
//
// PIR
pinMode(kPIRSensor, INPUT); // PIR Sensorを入力モードで使う
prevMinute = -1;
// Interval Timer
os_timer_setfn(&myTimer, timerCountPIR, NULL); // myTimerを使い, 割り込みが起こったらtimerCountPIRを呼ぶ
os_timer_arm(&myTimer, 1000, true); // myTimerの割り込みは1000mSecごとに、繰り返し(true)起こす
//
// WiFi
//
// 接続&接続確認
Serial.print("WiFi Connectiong");
WiFi.begin(ssid, password);
}
//
// メインループ
//
void loop() {
//
// 1分ごとに処理
if (prevMinute != minute()) {
if (prevMinute != -1) { // 最初の1回は飛ばす
//
// PIRの値を文字列に変換
char pirBuf[10];
itoa(pirCounter, pirBuf, 10); // air to pirBuffer, in Decimal
// 変換し終わったら素早くカウンタを0にリセット
pirCounter = 0;
//
// 人間の動きっぷりをシリアルへ出力
Serial.print("Movement: ");
Serial.print(pirBuf);
Serial.println(" s/min");
// Thing Speak 
String postStr = "&field1=" + String(pirBuf);
sendToThingSpeak(postStr);
}
prevMinute = minute();
}
delay(1000);
}
void sendToThingSpeak(String inPostStr) {
Serial.print("Connecting...");
if (client.connect("184.106.153.149", 80)) { // api.thingspeak.com
Serial.print("Connected....");
String postStr = apiKeyTest + inPostStr + "\r\n\r\n";
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: " + apiKeyTest + "\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(postStr.length());
client.print("\n\n");
client.print(postStr);
Serial.println("posted.");
}
client.stop();
}
//
// タイマー割り込みでPIRがHIGHならカウントアップ
//
void timerCountPIR(void *temp) {
if (digitalRead(kPIRSensor) == HIGH) {
pirCounter ++;
}
}
一晩走らせてみた結果がこちら。

会社のIoT勉強会で使ったThinkSpeakを流用したのでArkの名前がw

そのままグラフにすると細かすぎてわからないので10分ごとの平均を480分表示させています。SE-10で取得したデータほどすっきり分離されないですが、xx時にベッドに入り、xx頃入眠、xxにトイレに起きてxx時起床というのが(言われれば)おわかりいただけるかと思います。

私は初老なので睡眠導入剤などを使っていますが、とりあえずこういうグラフがあれば「どの食事/運動/薬/サプリが有効なのか」を客観的に知ることができるかなー…と思っています。昼間部長とメールバトルした日などはドキドキして眠れないので、なかなか客観的な評価は難しいのですが(笑)。

小心者指数を計れるデバイスが出たら買います。買うべきです。ま、買っても役に立ちませんががが。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。