CoroFenceサーマルディテクター:Grid-EYE & PIRセンサー搭載IoT体温監視
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Panasonic Grid-EYE (AMG8833等) | 1 | 8×8ピクセル サーモパイルアレイ |
| PIRセンサー(検知距離7m) | 1 | 人体検知トリガー用 |
| ブザー | 1 | 高温警報用 |
| RGB LED | 1 | 温度帯表示用 |
| Arduino Nano 33 IoT | 1 | Wi-Fi/Bluetooth内蔵 |
| LiPoバッテリー 3.7V | 1 | |
| プラスチックジャンクションボックス | 1 | 筐体用 |
使用アプリ・オンラインサービス
- Arduino IDE
- DasData Maker Data Storage Channel(データ可視化・蓄積)
プロジェクト概要
背景:パンデミック下での体温スクリーニング
WHOは感染拡大防止として「手洗い、咳エチケット、十分な加熱調理、呼吸器症状者との接触回避」を推奨。空港等でのサーマルスキャナー設置が一般化する中、自宅/オフィス/研究室の入り口に簡易導入できる体温検知デバイスを自作しました。
入力センサー
Grid-EYE(非接触8×8サーモパイルアレイ)
従来の単点温度センサーと異なり、MEMS技術で非接触でエリア全体の温度分布を測定。64ピクセル、視野角60°、I²C通信、1/10fps、割り込み機能搭載。1.5mで人体検知、5-7mでターゲット捕捉可能。
- 寸法:11.6×4.3×8.0mm
- 動作電圧:3.3V/5V
- 測定範囲:-20〜100°C
PIRセンサー
約10m(実測5-12m)で人体動作を検知。Grid-EYEの測定トリガーとして併用します。低消費電力、広角レンズ、簡単インターフェースが特長。
出力:視覚・音響フィードバック
- RGB LED:検知温度に応じ色変化(青→シアン→アクア→緑→黄→マゼンタ→赤)
- ブザー:37°C超過で警報音
筐体への組み込み
センサー類をジャンクションボックスに収め、窓から検知面を露出させます。

テスト結果
正常時は緑LED点灯。スチームアイロンで擬似高温テストを行い、赤LED点灯とブザー警報を確認。

データ可視化・拡張
Node.jsターミナルアプリでシリアル経由の温度マップをリアルタイム表示可能。将来的にはDasDataプラットフォームと連携し、データ蓄積・モデリングを予定。
ライブストリーム:https://dasdata.co/camera/
ソースコード
#include <Wire.h>
#include <SparkFun_GridEYE_Arduino_Library.h>
GridEYE grideye;
String heatData;
int ledState;
unsigned long meetime;
uint16_t seconds = 3142;
int bluePin = 8, greenPin = 9, redPin = 10, buzzPin = 11;
int inputPin = 12; // PIR入力
int pirState = LOW, val = 0;
float tempC;
void setup() {
pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT); pinMode(buzzPin, OUTPUT);
pinMode(inputPin, INPUT);
Wire.begin();
grideye.begin();
Serial.begin(115200);
}
void loop() {
// シリアルコマンドでLED有効/無効切替('1'で有効)
if (Serial.available() > 0) {
char c = Serial.read();
ledState = (c == '1') ? 1 : 0;
}
val = digitalRead(inputPin);
if (val == HIGH) {
if (pirState == LOW) {
meetime = millis();
Serial.println("Motion detected!");
pirState = HIGH;
getHeatmap();
// 温度帯別LED制御
if (tempC < 16) setColor(0, 0, 255);
else if (tempC < 20) setColor(0, 255, 255);
else if (tempC < 24) setColor(0, 255, 0);
else if (tempC < 28) setColor(255, 255, 0);
else if (tempC < 37) setColor(255, 20, 20);
else { setColor(255, 0, 0); tone(buzzPin, 1000); }
Serial.println(heatData);
delay(1500);
}
} else {
if (pirState == HIGH) {
noTone(buzzPin);
Serial.println("Motion ended!");
setColor(0, 0, 0);
meetime = 0;
pirState = LOW;
}
}
}
void getHeatmap() {
heatData = "";
float previousVal = 0;
for (unsigned char i = 0; i < 64; i++) {
if (previousVal > 37) {
Serial.println("High temperature!");
setColor(255, 0, 0);
tone(buzzPin, 1000);
}
tempC = grideye.getPixelTemperature(i);
heatData += String(tempC) + ",";
previousVal = tempC;
}
Serial.println();
}
void setColor(int r, int g, int b) {
#ifdef COMMON_ANODE
r = 255 - r; g = 255 - g; b = 255 - b;
#endif
analogWrite(redPin, r);
analogWrite(greenPin, g);
analogWrite(bluePin, b);
}
完全版コード・Node.js可視化アプリ:GitHub
回路図

製造プロセス
- 名刺サイズPCBで作る4×4三目並べゲーム - 設計・製作・プログラミングガイド
- スマートホーム連携向けマルチポジション温度センサーシステム
- 862D+はんだごて用DIY温度コントローラー:精度と信頼性を両立
- MotionSense: ArduinoとESP8266で作るスマート侵入検知システム
- 3Dプリンター火災予防:スマートセンサーセーフティシステム
- Arduino、Yaler、IFTTTでWeb対応IoTゲージを構築する
- Arduinoで作る斥力式磁気浮上装置: シンプル回路とDIYガイド
- 高度なリモートコントロールグリッパーロボット: 精密ハンドリング向け
- 高性能 Arduino 気象観測気球データロガーの製作ガイド
- ArduFarmBot Part 2:リモートIoT制御ステーションの構築
- Arduino Nanoで作る8×8 LEDマトリックスのフリップクロック - 自作リアルタイムクロック