人が侵入したらアクションを起こす その4 人の動きを映像化

 前回、8×8の非接触の温度計が動きましたが、シリアル出力の温度を見ていても、温度分布を頭の中で瞬時に判断できません。map関数を使って、0~2の範囲を表示するようにすると、センサの上で指を動かしても、その動きがわかるようになります。

#include <Wire.h>
const byte AMG8833addr=0x68;
byte readbuffer[8][16];
float temp[8][16];
long PP;

void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("\n Start ");
}

void loop() {
for (int j=0; j<8; j=j+1){
Wire.beginTransmission(AMG8833addr);
Wire.write(0x80+0x10*j);
Wire.endTransmission();
Wire.requestFrom(AMG8833addr, 16);
Serial.print(j); Serial.print(":");
for (int i=0; i<16;i=i+2){
readbuffer[j][i+1] = Wire.read();readbuffer[j][i] = Wire.read();
temp[j][i] =( ((readbuffer[j][i] & 0x07)<<8 )+ readbuffer[j][i+1])*0.25;
PP=map(temp[j][i],21,30,0,3);
Serial.print(PP);Serial.print(" ");
}
Serial.println();
}
Serial.println();delay(1000);
}

グラフィック・ディスプレイに表示

 持ち運びしても人の動きがわかるように、小型のOLEDグラフィック・ディスプレイを利用します。白黒表示なので、黒地に23℃以上の範囲をグレーの表示をするようにしました。

 こちらのページでドライバを導入しました。

接続

(訂正2018/8/5) 下記の図でAMG8833のA4とA5の配線が逆でした。申し訳ございません。SCLはA5へ、SDAはA4へ配線してください。

スケッチ

 グラフィックの表示は、ハートのマークをスプライトの機能で表示するデモをベースに修正して使いました。表示できるエリアは128×64ですが、64×64のエリアに8×8のイメージ・データを表示します。

#include <Wire.h>
#include "ssd1306.h"
const PROGMEM uint8_t heartImage[8] ={
0B10001000,
0B00100010,
0B10001000,
0B00100010,
0B10001000,
0B00100010,
0B10001000,
0B00100010
};

const byte OLEDaddr=0x3c;
const byte AMG8833addr=0x68;
byte readbuffer[8][16];
float temp[8][16];
const int spriteWidth = sizeof(heartImage);
SPRITE sprite;

void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("\n Start ");
ssd1306_128x64_i2c_init();
ssd1306_fillScreen(0x00);
sprite = ssd1306_createSprite( 0, 0, spriteWidth, heartImage );
sprite.draw();
}

void loop() {
ssd1306_clearScreen();
for (int j=0; j<8; j=j+1){
Wire.beginTransmission(AMG8833addr);
Wire.write(0x80+0x10*j);
Wire.endTransmission();
Wire.requestFrom(AMG8833addr, 16);
for (int i=0; i<16;i=i+2){
readbuffer[j][i+1] = Wire.read();readbuffer[j][i] = Wire.read();
temp[j][i] =( ((readbuffer[j][i] & 0x07)<<8 )+ readbuffer[j][i+1])*0.25;
if ((temp[j][i])>23){
sprite.x = 8*j;
sprite.y = 4*i;
sprite.draw();
}
}
}
}
// Copyright (c) 2016-2018, Alexey Dynda

 このスケッチでは、Y軸方向は正しいのですが、X軸が逆になっています。

 実行中です。センサの上で指を左右に動かしました。ほぼリアルタイムで表示が変化します。

前へ

人が侵入したらアクションを起こす その3 赤外線アレイ・センサで人をキャッチ

次へ

Stepperライブラリでモータを動かす その1 1個だけ