Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

ラズパイ+赤外線アレイセンサより収集したセンサ値を用いて温度分布を表示

前回、RaspberryPi + 赤外線アレイセンサによりセンサ値を収集する方法をまとめました。
elsammit-beginnerblg.hatenablog.com

今回は赤外線アレイセンサから得られたセンサ値をサーバ(PC)から取得要求を行い、
PCにて取得したセンサ値を元に温度マップを表示までの処理をまとめたいと思います。



■構成

今回も利用する赤外線アレイセンサはこちらのAMG8833です。

AMG8833 IR 8 * 8サーマルイメージャーアレイ温度センサーモジュール8x8赤外線カメラセンサー

新品価格
¥5,100から
(2020/10/31 18:10時点)

そして、全体の構成のポンチ絵ですがこんな感じです。
今回はこちらの構成で動作させていきたいと思います!!
f:id:Elsammit:20201031171813p:plain


RaspberryPi側:go言語
PC側:Python
で実装していきます。

■RaspberryPiからPCへのセンサ値送信

PCからセンサ値の要求があった場合にセンサ値を返せるようにhttpサーバを用意していきたいと思います。
今回赤外線アレイセンサはgo言語で制御しているため、httpサーバもgo言語で作成!!
httpサーバの作成はこちらにまとめておりますので、詳細はこちらを参考に。
elsammit-beginnerblg.hatenablog.com
elsammit-beginnerblg.hatenablog.com

最終的なコードはこちらです。

package main

import (
	"fmt"
	"time"

	"github.com/gin-gonic/gin"
	"github.com/jweissig/amg8833"
)

func Do_Post() {
	r := gin.Default()

	r.POST("/ping/", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": gridpost,
		})
	})
	r.Run()
}

var gridpost []float64

func main() {
	amg, err := amg8833.NewAMG8833(&amg8833.Opts{
		Device: "/dev/i2c-1",
		Mode:   amg8833.AMG88xxNormalMode,
		Reset:  amg8833.AMG88xxInitialReset,
		FPS:    amg8833.AMG88xxFPS10,
	})
	if err != nil {
		panic(err)
	}

	ticker := time.NewTicker(1 * time.Second)
	go Do_Post()
	for {
		gridpost = amg.ReadPixels()
		fmt.Println(gridpost)
		<-ticker.C
	}
}

■センサ値取得とグラフ表示

次にPC側でRaspberryPiへhttp Requestを送信しセンサ値を取得⇒グラフ表示についてまとめていきます。
pythonにてhttp Requestを行う際の実装はこちらでまとめておりますので割愛。
elsammit-beginnerblg.hatenablog.com

次にグラフ表示です。
グラフ表示はこちらを参考にし、
https://qiita.com/tm_nagoya/items/32d7e5becf73ba8a6110

このように、matplotlib.pyplotにてこちらのように実装しました。

fig = plt.imshow(array.reshape(8, -1), cmap="inferno", interpolation="bicubic")

前回のブログにて記載しました通り、センサ値は8×8(64)が1次元配列で格納されております。
2次元配列に変換するために、

array = np.array(センサ値)
array.reshape(8, -1)

とし、numpyを用いて1次元配列から2次元配列に変換しております。

最終的なコードはこちらのようになります。

import requests
import numpy as np
import json
import matplotlib.pyplot as plt
from time import sleep

while True:
    response = requests.post('httpパス')
    print(response.status_code)
    test = json.loads(response.text)
    array = np.array(test['message'])
    fig = plt.imshow(array.reshape(8, -1), cmap="inferno", interpolation="bicubic")
    plt.colorbar()

    plt.pause(.1)
    plt.clf()

■動作させてみた

実際に動作させてみると、このようになります。
f:id:Elsammit:20201101185058g:plain

一番温度の高い位置に頭があります。
結構はっきりと温度分布が見られたので満足!!

■最後に

今回RaspberryPiにhttpサーバも立ててしまったのですが、本来であればセンサ値を管理するサーバみたいなものがあった方がいいよな??とも思いました😅
後でやってみようかな??🤔
まぁ、RaspberryPi-PC間にサーバが新たに追加になってデータが流れるだけなのでそこまで難しくないし、やっても旨味ないかも😅