SHIROのIchigoJam日記

マイコン「IchigoJam」(イチゴジャム)の電子工作とプログラミングをメインに

見守りシステム

IchigoJam+MixJuice(Wi-fiボード)+赤外線人感センサーで作る、見守りシステムのシミュレーションです。
人感センサーで人間の動きを検知して、ネットでデータを送信。Webサイトで一覧表示します。
ネットを使ったプログラミングの教材を想定しています。
f:id:shiro0922:20210828162110j:plain


★注意★ 簡単なプログラムなのでセキュリティを一切考えていません。教室を行う時だけサイトを設置して、終わったら削除や移動をするようにしてください。サイトを置きっぱなしにすると、悪意のある人にアクセスされてデータベースを破壊されたり乗っ取られたりする危険性があります。

上記の乗っ取りなどを防ぐために、教室内にサーバーPCとWi-fiルーターを置いて、ローカルネット環境で動かすことをお勧めします。

人感センサー基板


赤外線人感センサーを搭載した拡張基板です。
センサーの受光角度が広いので、黒ビニールテープでフードを付けてみました。


MJ-Dakeのソケットに差して使います。

f:id:shiro0922:20210828171513j:plain
通常のIchigoJam/IchigoDakeのCN4ソケットにも差すことができます。

f:id:shiro0922:20210822163450p:plain
回路としては、赤外線人感センサーからの出力で、抵抗内蔵トランジスタ・DTC143ELをスイッチングしています。
IchigoJamからはボタン入力(BTN)のON/OFFとして検知できます。
今回は専用基板を作りましたが、簡単な回路なのでブレッドボードでも作れるでしょう。

f:id:shiro0922:20210822163502p:plain

*同じ基板を8枚割り付けしています。
*この基板データは、CC BYライセンスとします。どうぞご利用ください。

(C) 2021 Shiro Saito (https://www.ichigojaman.jp)

準備

■Webサーバー

PHPMySQLが動くWebサーバーを用意します。
新規に作るならXAMPPなどを利用すると良いでしょう。

MySQLのデータベース、テーブル

phpMyAdminなどを使って、見守りのデータを記録するデータベース(例「mimamori」)を新規に作ります。
その中に「mimamori」テーブルを作成して、「time」列(datetime型)、「userid」列(text型)を作ります。
あらかじめtimeとユーザーIDの内容を埋めたテーブルにしておいてください。
※人数分のデータを初期化するSQLの例

DELETE FROM `mimamori` WHERE 1;
INSERT INTO `mimamori`(`time`, `userid`) VALUES ('0','UEDA01');
INSERT INTO `mimamori`(`time`, `userid`) VALUES ('0','UEDA02');
INSERT INTO `mimamori`(`time`, `userid`) VALUES ('0','UEDA03');
INSERT INTO `mimamori`(`time`, `userid`) VALUES ('0','UEDA04');
INSERT INTO `mimamori`(`time`, `userid`) VALUES ('0','UEDA05');
INSERT INTO `mimamori`(`time`, `userid`) VALUES ('0','UEDA06');
INSERT INTO `mimamori`(`time`, `userid`) VALUES ('0','UEDA07');
INSERT INTO `mimamori`(`time`, `userid`) VALUES ('0','UEDA08');
INSERT INTO `mimamori`(`time`, `userid`) VALUES ('0','UEDA09');
INSERT INTO `mimamori`(`time`, `userid`) VALUES ('0','UEDA10');

■ページの設置

www.example.jp/dir/(サイトのアドレス)内に、以下のWebページファイルを設置します。

db_login.php

ログイン情報を入れるファイルです。
dbnameはデータベース名、usernameはデータベースにアクセスするユーザー名、passwordはそのユーザーのパスワードを記述します。

<?php
$db_host='localhost';
$db_database='dbname';
$db_username='username';
$db_password='password';
?>
index.php

見守り結果の一覧表を表示するWebページです。10秒ごとに表示が自動更新されます。

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>見守りシステム</title>
<link rel="stylesheet" href="styles.css" type="text/css" />
<meta http-equiv="refresh" content="10; URL=">
</head>

<body>
<h1>見守りシステム</h1>

<?php

// ログイン情報のインクルード
include('db_login.php');

// データベースサーバーへ接続
$connection = mysqli_connect($db_host, $db_username, $db_password, $db_database);
if (!$connection) {
	die ("DB接続エラー<br />". mysql_error());
}

// === mimamoriテーブルから一覧表 ===

// 一覧表クエリを作成
$query = "SELECT * FROM mimamori ORDER BY userid";

// クエリを実行
$result = mysqli_query($connection, $query);
if (!$result) {
	die ("DBクエリエラー<br />". mysql_error());
}

// 結果から一覧表を表示
echo "<table>\r\n";
echo "<tr><th>ID</th><th>Time</th></tr>\r\n";

$n = 0;

foreach ($result as $row) {
	echo "<tr><td>" . $row['userid'] . "</td><td>" . $row['time'] . "</td></tr>\r\n";
}

echo "</table>\r\n";

// === 終了処理 ===

// データベース接続を閉じる
mysqli_close($connection);

?>

</body>
</html>
styles.css

一覧表ページの見栄えを設定するスタイルシートです。お好みで改造してください。

html {
background-color: #FFFFFF;
font-family: sans-serif;
}

body {
margin: 20px auto 10px auto;
width: 920px;
text-align: center;
font-size: middle;
line-height: 1.3em;
color: #000000;
}

h1 {
height: 40px;
margin: 0px;
padding-left: 10px;
font-size: 18pt;
line-height: 40px;
color: #000000;
}

table {
margin: 10px auto 10px auto;
border-style: solid;
border: 2px solid #8888ff;
}

th {
text-align: center;
font-size: 14pt;
padding: 2px;
border: 1px solid #8888ff;
}

td {
font-size: 14pt;
padding: 2px;
border: 1px solid #8888ff;
}
mimamori.php

センサー見守りのデータを受信して、データベースに書き込むWebページです。
「receive.log」にアクセスログが出力されます。もしデータベース接続エラーなどが出た場合は、このログを参照してください。

<?php

// ログイン情報のインクルード
include('db_login.php');

// データ受信

if (isset($_GET['ID'])) {

	$strParas = $_GET['ID'];
	$strID = $strParas;
	
	// ログファイルの相対パス
	$strDataFilePath = 'receive.log';

	// ログファイルを追記モードでオープン
	$fp = fopen($strDataFilePath, "a");

	// 日付、時刻を取得
	date_default_timezone_set('Asia/Tokyo');
	$dt = new DateTime();
	$strDateTime = $dt->format('Y-m-d H:i:s');

	// 受信した値をログファイルに書き込み
	fwrite($fp, $strDateTime . ',ID=' . $strID . "\r\n");

	// データベースサーバーへ接続
	$connection = mysqli_connect($db_host, $db_username, $db_password, $db_database);
	if (!$connection) {
		fwrite($fp, "DB接続エラー\r\n");
	}

	// === mimamoriテーブルを更新 ===

	// データ変更クエリを作成
	$query = "UPDATE mimamori SET time = '$strDateTime' WHERE userid = '$strID'";

	// クエリを実行
	$result = mysqli_query($connection, $query);
	if (!$result) {
		fwrite($fp, "データ更新エラー\r\n");
	}

	// === 終了処理 ===

	// データベース接続を閉じる
	mysqli_close($connection);

	// ログファイルポインタをクローズ
	fclose($fp);

}

?>

■ページの動作テスト

PCのブラウザで「www.example.jp/dir/index.php」を開くと、一覧表ページが表示されます。

ブラウザの別ウインドウで、書き換えページへ以下のようにアクセスすると、信号を送信したことになります。

www.example.jp/dir/mimamori.php?ID=UEDA01

「UEDA01」はユーザーIDです。
信号を送信した後、一覧表ページで受信されていることを確認してください。

教室での使い方

(1)IchigoJam+MixJuiceを動かして、Wi-fiアクセスポイントに接続します。

?”MJ APC ssid password”

ssidWi-fiアクセスポイントのSSID、passwordはパスワードです。ちゃんと接続するまで1分ほど待ってください。
(一度接続するとその設定が記憶され、次回は入力しなくても自動接続されます)

(2)以下の送信プログラムを入力して実行します。

100 B=BTN():?B
110 WAIT 30
120 IF B=0 GOTO 100
130 ?"MJ GET www.example.jp/dir/MIMAMORI.PHP?ID=UEDA01"
140 GOTO 100

130行の「UEDA01」はユーザーIDです。それぞれのIchigoJamで別のIDにしてください。

f:id:shiro0922:20210828162111j:plain
実行すると、赤外線人感センサーの読み取り値が0.5秒ごとに表示されます。
センサーの前に手をかざすと、値が「1」になり、信号がサーバーへ送信されます。

(3)PCのブラウザで一覧表ページ「www.example.jp/dir/index.php」を開くと、見守り先の一覧が表示されます。

f:id:shiro0922:20210828172838p:plain
この画面をスクリーンなどに映して、教室内で共有するといいでしょう。

例えば、それぞれのIchigoJamを独居老人の住宅のトイレに設置すれば、赤外線人感センサーが人間を検知するたびに信号がサーバー側に送信されます。一覧表画面を見るだけで「この人はちゃんと生きて生活しているな。倒れたりしていないな」と、遠隔地から見守ることができます。
銀行の金庫や美術館の高価な展示品のそばに置いて動かせば、夜間の警備システムにもなります。