make the smart speaker smarter 9

09/22

felt someone or sumn

さて、今回は4番をやる。

  1. When I Want(時間で)
  2. If She Felt Temp/Humidity(温湿度センサから)
  3. When She Saw(カメラから)
  4. If She Felt Someone(人感センサから)

先日注文したHCSR501が届いたので
セットアップしてみる。

Pin Assignment

チップを裏から見たときに
左からGND、Output、+Powerと
なっている。
下のように接続した。
今回もブレッドボードの余った場所に
マウントした。
ピンアサインは以下の通り。

Chip Pi
GND P6
Out P12
PWR P4

さてこの設定を有効にするには以下のように行う。

pi@raspberrypi:/srv/google-home-helper $ sudo sh -c "echo 18 > /sys/class/gpio/export"
pi@raspberrypi:/srv/google-home-helper $ sudo sh -c "echo 'in' > /sys/class/gpio/gpio18/direction"
pi@raspberrypi:/srv/google-home-helper $ ls -l /sys/class/gpio/gpio18/value
-rwxrwx--- 1 root gpio 4096  9月 15 11:52 /sys/class/gpio/gpio18/value
pi@raspberrypi:/srv/google-home-helper $ ls -l /sys/class/gpio/gpio18/value
1
pi@raspberrypi:/srv/google-home-helper $ vi /etc/rc.local

echo 18 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio18/direction
#<-- added

exit 0

値はファイルの中身を見るだけ。
非常に簡単だ。
0のときは無反応。
1のときは動くものがいるということ。

mysql table

まずは他のセンサと同様にmysqlに
データを蓄積することとする。

mysql> create table sensor_moti(id integer primary key auto_increment not null, dt_created datetime not null, val_sensor text not null);

setting up module

DBモジュールを少しいじる。

    //DBクラス内のどこかに追加
    insertMoti(param){
        param.table_name="sensor_moti";
        this.insert(param);
    }

    selectMoti(param){
        param.table_name='sensor_moti';
        return this.select(param);
    }

get sense

さて、Node.jsモジュールにする。

const fs=require('fs');
const path=require('path');
const DB=require('./db');
const dt=require('date-utils');


getMotionSensorData=async ()=>{
    let dir='/sys/class/gpio/';
    let pin=18;
    let value=0;

    let gpio18=path.join(dir, 'gpio' + pin);
    //値の読み込み
    value=await fs.readFileSync(path.join(gpio18, 'value'));

    let now=await new Date();
    let db=await new DB();
    let data={};
    await db.open();
    data.dt_created=now.toFormat('YYYY/MM/DD HH24:MI:SS');
    data.val_sensor=new String(value).replace(/\r?\n/g,'');
    await db.insertMoti(data);
    db.close();

    setTimeout(await getMotionSensorData,20 * 1000);

    return (value==1)?true:false;
}

exports.HCSR501init=()=>{
    console.log('motion sensor daemon started');
    getMotionSensorData();
}

これをHCSR501Collector.jsというファイルで保存。
んで、センサー用のモジュールsensor.jsに
取り込んでみる。

const bme=require('./BME280Collector');
const tsl=require('./TSL2561Collector');
const hcsr=require('./HCSR501Collector');

console.log('bme280 collector start');
bme.BME280init().then(async() => {
    await bme.readBME280Data();
});

console.log('tsl2561 collector start');
tsl.readLuxData();

console.log('hcsr501 collector start');
hcsr.HCSR501init();
pi@raspberrypi:/srv/google-home-helper $ forever stop sensor.js
pi@raspberrypi:/srv/google-home-helper $ forever start sensor.js

これで20秒間隔でデータがさきほど作ったテーブルに
insertされるはず。

mysql> select * from sensor_moti limit 1;
+----+---------------------+------------+
| id | dt_created          | val_sensor |
+----+---------------------+------------+
| 1  | 2018-09-22 00:00:01 | 0          |
+----+---------------------+------------+
1 row in set (0.00 sec)

Next

さて次は、人感センサのデータを評価してみる。
0が1に変わっただけで判断するのはいささか乱暴な気がするので
そこをどう評価するかを検討してみる。


コメント: