Arduino UNOに非接触温度センサ(NCIR)をつけてみる
2月の半ばに差し掛かった頃の話です。
まだ一般の体温計も手に入る時期だったと思うのですが、コロナウイルスが流行期に入り、セキュリティゲートや入退室認証と組み合わせてみると利用価値があるかなと思ってサーモグラフィについて調べていたのです。
解像度が高く、距離が離れていても使用できるものはやはり高価なようでした。
画像認識でうまく人間の顔の位置(座標)を特定できれば、額で体温計測することは可能だと考え、実験してみたいという思いがある一方で、いきなり高価なものに手を出すにはハードルの高さも感じていました。
そこで、まずは非接触温度センサを使ってみることにしました。
放射した赤外線の跳ね返りで温度を測定するものです。
できるだけ短時間で完成させたかったため、ユニット化されているものを使用しました。
参考
M5Stack用非接触温度センサユニットマルツオンライン
※M5StickC + 非接触温度センサHatを使用すればかなりコンパクトになると思います。残念ながら本体を所有していないため断念しました。
参考
M5StickC 非接触温度センサ Hatスイッチサイエンス
配線する
M5Stack用非接触温度センサユニットはGroveコネクタ(I2C)で接続します。
Groveコネクタには+5V/GNDに加えて信号線2本(シリアルデータ (SDA)/シリアルクロック (SCL) )の計4本が出ています。
手元のマイコンにはGroveコネクタが付いているものがなかったので、昨年LPWAを試した際に使用したSigfox Shield for Arduino (UnaShield V2S)+ Arduino UNOを使うことにしました。
参考
Sigfox Shield for Arduino V2S【UNASHIELD-V2S】マルツオンライン
接続はGroveコネクタを挿すだけなので簡単です。
2つあるコネクタのうち、SDA/SDLと書かれている方に接続します。
UnaShieldのGroveVCCジャンパーピンは5V側に挿してください。
PCと接続しなくても確認できるように、以前試したことのある1602LCDも接続してみました。
使用してみて
Temp欄に中心温度、Ambient欄に周辺温度を表示しています。
測定可能な距離は5cm程のようです。
通常の体温計と比べて、
額計測では約2℃程低め表示されるようでした。
脇計測の場合はほぼ同じ計測値になりました。
非接触で計測できれば衛生的ですし、一瞬で測定結果が表示されるのでとても便利です。
現在はUSB給電なのでケーブルを挿す必要がありますが、電池切れの心配がないのは良いですね。
(体温計は頻繁に使用するものではないため、使いたいときに電池切れしていたことも経験があり)
モバイルバッテリーでも動作可能です。
スケッチ(プログラム)
ここでは簡易なサンプルとして計測してLCDに表示する単純なスケッチを掲載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include <LiquidCrystal.h> #include <Adafruit_MLX90614.h> Adafruit_MLX90614 mlx = Adafruit_MLX90614(); // LCD pin 1 : GND // pin 2 : +5V // pin 3 : GND // pin 4 : RS (Register Select Signal) // pin 5 : +5V (R/W (GND:Write Mode / +5V:Read Mode)) // pin 6 : E (Operation (Data R/W) Enable Signal) // pin11 : DB4 (Data Bus Line) // pin12 : DB5 (Data Bus Line) // pin13 : DB6 (Data Bus Line) // pin14 : DB7 (Data Bus Line) // pin15 : +5V(BackLight Power supply) // pin16 : GND(BackLight GND) LiquidCrystal lcd( 4, 6, 10, 11, 12, 13 ); void setup() { lcd.begin( 16, 2 ); lcd.clear(); lcd.setCursor(0, 0); mlx.begin(); Serial.begin(9600); } void loop() { // 表面温度の表示 Serial.print("Temperature : "); Serial.println(mlx.readObjectTempC()); // 周囲温度の表示 Serial.print("Ambient : "); Serial.println(mlx.readAmbientTempC()); Serial.println(); lcd.setCursor(0, 0); lcd.print("Temp : "); lcd.setCursor(11, 0); lcd.print(mlx.readObjectTempC()); lcd.setCursor(0, 1); lcd.print("Ambient : "); lcd.setCursor(11, 1); lcd.print(mlx.readAmbientTempC()); delay(100); } |
改善するなら
この後、UnaShieldを使用していることもあり、Sigfoxクラウドに計測データを送るようにカスタマイズをしてみました。
UnaShieldのボタンを押すと測定値をSigfoxクラウドへ送信だけのものです。
これだけではあまり意味がありませんが、もう少し作り込んでAWSなどのDBに計測値をため込んでいくようにすれば、グラフ表示したりLineやメールで通知するなど利用範囲も広がるでしょう。
また、今回のセンサでは距離的に難しいかもしれませんが、仮に入退室ゲートや出退勤管理と連動させられた場合は、「体温が高い人は入室させない」「上長へ通知する」といった対応も可能になると思います。
ご家庭では、例えば他のセンサーと組み合わせて、歯磨きしているときに体温を測ってしまう等も良いかもしれませんね。
測定距離に関しては、もしスマホレンズ等を使用して伸ばすことができたら、とても便利になると思います。
(可視光線とは焦点距離が変わってくるでしょうし、正常に測定できるかはわかりませんが)
測定距離の短さがネックですが、手軽に扱えることから、もっと作りこんでいけばより活用できそうに感じました。
謝辞
以下のサイトを参考にさせていただいたきました。ありがとうございます。