Dieser Artikel beschreibt die Verwendung des 8x8-Infrarot-Array-Sensors "AMG8833" von Arduino, der die Daten in Echtzeit an einen PC sendet und mit Python (PyQt5, PyQtGraph) visualisiert.
Es wird in Echtzeit wie im Bild unten dargestellt.
Arduino Arduino erfasst Thermografiedaten und sendet sie über serielle Kommunikation an einen PC (Python). AMG8833 Dieses Mal verwende ich Switch Science Conta ™ Thermografie AMG8833 installiert.
Laut Switch Science
Der Temperaturmessbereich für jedes Element liegt zwischen 0 ° C und 80 ° C. Der Messbereich ist eine quadratische Pyramide vor dem Sensor (ungefähr 60 Grad vertikal und horizontal), und ein zweidimensionales Bild, das durch Teilen dieses Bereichs in 8 × 8 Pixel erhalten wird, kann erhalten werden.
Wir verwenden auch Conta ™ Base Shield, um die Verwendung von AMG8833 zu vereinfachen.
Auf der Switch Science-Seite werden einige AMG8833-Bibliotheken aufgelistet, aber hier verwende ich SparkFuns SparkFun_GridEYE_Arduino_Library. Das folgende Programm ist nur eine geringfügige Änderung des Beispielprogramms.
Bei der seriellen Kommunikation werden 8x8 = 64 Temperaturdaten als durch "," getrennte Zeichenfolgen übertragen.
amg8833-serial.ino
#include <SparkFun_GridEYE_Arduino_Library.h>
#include <Wire.h>
float pixelTable[64];
GridEYE grideye;
void setup() {
Wire.begin();
//Die AMG8833-Adresse von switch science ist standardmäßig auf 0x68 eingestellt.
grideye.begin(0x68);
Serial.begin(115200);
}
void loop() {
// 8x8=Ermitteln Sie die Temperatur für 64 Pixel und speichern Sie sie in grideye.
for(unsigned char i = 0; i < 64; i++){
pixelTable[i] = grideye.getPixelTemperature(i);
}
//Die Temperatur aller Pixel","Durch eine Leitung getrennt und angeordnet und durch serielle Kommunikation übertragen.
for(unsigned char i = 0; i < 64; i++){
Serial.print(pixelTable[i]);
if(i != 63){
Serial.print(",");
}
}
Serial.println();
delay(50);
}
Python Die Wärmekarte wird in Echtzeit basierend auf den von Arduino empfangenen Temperaturdaten angezeigt.
--pyserial --serielle Kommunikation
Die Datenvisualisierung in Python ist matplotlib, hat jedoch den Nachteil, dass sie zu schwer ist, um den Bildschirm in Echtzeit mit matplotlib zu aktualisieren. Daher verwenden wir anstelle von matplotlib eine leichtgewichtige Bibliothek namens pyqtgraph.
Dieses Mal verwende ich jedoch einen Teil von matpotlib, um die Temperaturdaten in Farbe (RGBA) umzuwandeln. Es scheint, dass pyqtgraph ähnlich sein kann, aber in diesem Fall müssen Sie anscheinend die Farbe angeben, die für die Farbkarte verwendet werden soll. Hier verwenden wir matplotlib, das standardmäßig eine Farbkarte bereitstellt.
heatmap.py
from pyqtgraph.Qt import QtGui, QtCore
import matplotlib.cm as cm
import matplotlib as mpl
import pyqtgraph as pg
import numpy as np
import serial
#TEMP, um die Heatmap besser sichtbar zu machen_MAX=40.Auf 0 setzen
TEMP_MIN = 0.0
TEMP_MAX = 40.0
app = QtGui.QApplication([])
win = pg.GraphicsLayoutWidget(show=True, title="AMG8833")
win.resize(600,600)
win.setWindowTitle('AMG8833')
pg.setConfigOptions(antialias=True)
view = win.addViewBox()
view.setAspectLocked(True)
img = pg.ImageItem(border='w')
view.addItem(img)
#Farbkarte zur Umwandlung der Temperatur in Farbe
norm = mpl.colors.Normalize(vmin=TEMP_MIN, vmax=TEMP_MAX)
cmap = cm.jet
m = cm.ScalarMappable(norm=norm, cmap=cmap)
#Serielle Kommunikation
ser = serial.Serial("COM13", 115200, timeout=1)
#8x8 Temperaturdaten
data = np.zeros((8, 8))
def get_data():
global data, ser
if ser.in_waiting:
#Erhalten Sie Daten von Arduino
#Die Ausnahmebehandlung ist einfach, da beim Erfassen von Daten ein Fehler auftritt.
try:
line = ser.readline().decode().strip()
temps = [float(t) for t in line.split(",")]
data = np.array(temps).reshape((8, 8))
except:
pass
def update_plot():
global img, data
img.setImage(m.to_rgba(data))
#Datenempfang alle 50ms
timer1 = QtCore.QTimer()
timer1.timeout.connect(get_data)
timer1.setInterval(50)
timer1.start()
#Heatmap-Update alle 100ms
timer2 = QtCore.QTimer()
timer2.timeout.connect(update_plot)
timer2.setInterval(100)
timer2.start()
if __name__ == '__main__':
import sys
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
QtGui.QApplication.instance().exec_()
Im obigen Programm sind Datenempfang und Heatmap-Aktualisierung in separate QTimer unterteilt. Wenn die Wärmekarte jedes Mal aktualisiert wird, wenn Daten empfangen werden, wird die Wärmekarte möglicherweise nicht rechtzeitig aktualisiert. Um dies zu verhindern, können Datenempfang und Heatmap-Aktualisierung separat durchgeführt werden.
Recommended Posts