対象物の温度測定をする赤外線センサアレイ(AMG8833)をArduino環境でRaspberry Pi Picoをつかって制御しました。
赤外線センサアレイ(AMG8833)
簡単紹介
対象物の温度を8×8マトリクスで読み取る。

ピン配置

外観

使ってみた
◆開発環境
Arduino環境で開発しました。
読み出しマイコンにはRP2040搭載Raspberry Pi Picoを使いました。
AMG8833を制御するためのボードライブラリにはAdafruitの「Adafruit AMG88xxLibrary by Adafruit」を使いました。
インストール時に多くの依存関係のインストールを促しますが基本的には不要です。
I2Cで通信しますが、Adafruitライブラリを使用するとI2Cアドレスを意識することなく使用できます。
ADO端子をGNDにショートすることでI2Cアドレスを68(h)に変更できます。
ライブラリ側の変更に手間がかかるので、当記事ではデフォルトの69(h)で作業します。
◆温度読み取り
温度を読み取りました。
温度情報の読み出しをシリアルに読み出します。
読み出した情報を並び替えてマトリクス(8×8)にします。
読み出した温度を色情報に変換してWS2812(8×8)に表示しました。

準備
開発環境
Arduino環境でRaspberryPi Picoを使用します。
Arduino環境の準備はこちらの記事で紹介しています。
ボードライブラリ
今回RP2040搭載基板を使用します。
Arduino IDEのボードマネージャからRP2040用のライブラリのインストールとボードの選択をします。
ボードライブラリには「Raspberry Pi Pico/RP2040 by Earle F. Philhower, III」を使用します。
Generic RP2040またはRaspberry Pi Picoを使用します。
追加のボードマネージャのURL | https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json |
検索 | RP2040 |
ボードライブラリ | Raspberry Pi RP2040 Boards(x.x.x)※ |
Raspberry Pi Pico | Raspberry Pi RP2040 Boards(x.x.x) > Raspberry Pi Pico |
モジュールライブラリ
AMG8833を使うためのモジュールライブラリにはAdafruit製を使いました。
インストール時に多くの依存関係のインストールを促しますが、必要なライブラリは以下2点。
ライブラリ名 | 検索 | 動作確認Ver |
---|---|---|
Adafruit AMG88xx Library by Adafruit | amg88 | 1.3.2 |
Adafruit BusIO by Adafruit | busio | 1.16.3 |

WS2812を使用する場合は、以下のライブラリをインストールします。
ライブラリ名 | 検索 | 動作確認Ver |
---|---|---|
Adafruit NexPixel by Adafruit | neopixel | 1.12.4 |
スケッチ
8×8温度読み出しとWS2812表示
説明
読み出した温度情報を色情報に変換しWS2812に表示します。
2度ごとにLEDの色を変えて表示します。
温度と色は以下の関係にします。

配線

スケッチ
#include <Wire.h>
#include <Adafruit_AMG88xx.h>
#include <Adafruit_NeoPixel.h>
#define AMG8833_SDA (4)
#define AMG8833_SCL (5)
#define PIN_DIN_WS2812 (0) // NeoPixel DINピン
#define WS2812_COUNT (8 * 8) // 連結数
Adafruit_NeoPixel pixels(WS2812_COUNT, PIN_DIN_WS2812, NEO_GRB + NEO_KHZ800);
Adafruit_AMG88xx amg;
float TempArray[AMG88xx_PIXEL_ARRAY_SIZE];
uint32_t ConvertTEMP2Palette(float Temp);
void setup()
{
// Wire.setSDA(AMG8833_SDA);
// Wire.setSCL(AMG8833_SCL);
pixels.begin();
bool status;
status = amg.begin();
if (!status)
{
Serial.println("Could not find a valid AMG88xx sensor, check wiring!");
while (1);
}
}
void loop()
{
amg.readPixels(TempArray);
for(int i = 1; i <= AMG88xx_PIXEL_ARRAY_SIZE; i ++)
{
pixels.setPixelColor((i - 1), ConvertTEMP2Palette(TempArray[(i - 1)]));
}
pixels.show();
delay(100);
}
//温度に対する色(パレット情報)を返す
//Temp : 温度
//戻り値 : WS2812パレット情報
uint32_t ConvertTEMP2Palette(float Temp)
{
//20℃から2℃温度が上昇するごとに色を変化させています。
uint32_t retPalette = 0;
if(Temp < 20)
{
retPalette = pixels.Color(0, 0, 10);
}
else if(Temp < 22)
{
retPalette = pixels.Color(0, 0, 40);
}
else if(Temp < 24)
{
retPalette = pixels.Color(0, 20, 40);
}
else if(Temp < 26)
{
retPalette = pixels.Color(0, 40, 20);
}
else if(Temp < 28)
{
retPalette = pixels.Color(0, 40, 0);
}
else if(Temp < 30)
{
retPalette = pixels.Color(20, 40, 0);
}
else if(Temp < 32)
{
retPalette = pixels.Color(40, 0, 0);
}
else
{
retPalette = pixels.Color(40, 0, 20);
}
return retPalette;
}
結果
手のひらの温度を測りました。
手を振ると温度の移動している様子がわかります。
手の表面温度は30℃前後と思いますが、10cmほどに近づくと予想している温度付近になります。
コメント