AMG8833, eğer öncülü AMG883’ü duyduysanız veya kullandıysanız, size oldukça tanıdık gelebilir. Bu blogda, AMG8833 hakkında bilmeniz gereken her şeyi ve nasıl kullanılacağını ele alacağız!

Bunu söyledikten sonra, ele alacağımız içerik şunlardır:
- AMG8833 Genel Bakış
- AMG8833 Demo
- AMG8833 vs MLX90640 vs MLX90641
AMG8833 Genel Bakış
AMG8833 Nedir?
AMG8833, Panasonic’in sekiz satırdan oluşan ve her birinde sekiz piksel barındıran 8×8 IR Grid-Eye dedektörüdür. Bu dedektör, 8-15 mikron termal aralığında siyah cisim radyasyonunu ölçme yeteneğine sahiptir.
AMG8833, kızılötesi termal sıcaklık sensörü dizisinde yaygın olarak kullanılmakta olup, sıcaklık tespiti için yüksek hassasiyet sağlar. Bunun yanı sıra, sensör otomatik kapılar/asansörler ve klima gibi ev uygulamalarında da kullanılmaktadır.
AMG8833 Özellikleri
- İki boyutlu alanın sıcaklık tespiti: 8 × 8 (64 piksel)
- I2C çıkışı (sıcaklık değeri çıkışı yeteneği)
- Ölçüm nesnesinin sıcaklık aralığı: 0 °C ile 80 °C +32 °F ile +176 °F
- Uzun tespit mesafesi
- Komple SMD paket (reflow montajına uyumlu)
- RoHS uyumlu
- Hem Arduino hem de Raspberry Pi ile uyumlu
Teknik Özellikler
| Boyutlar | 40mm x20mm x6mm |
| Ağırlık | G.W 10g |
| Pil | Hariç |
| Çalışma Voltajı | 3.3V / 5V |
| Ölçüm nesnesinin sıcaklık aralığı | 0 °C ile 80 °C +32 °F ile +176 °F |
| Çalışma sıcaklığı aralığı | 0 °C ile 80 °C +32 °F ile +176 °F |
| Depolama sıcaklığı aralığı | −20 °C ile 80 °C –4 °F ile +176 °F |
| Sıcaklık hassasiyeti | Tipik ±2.5 °C ±4.5 °F |
| Görüş açısı | Tipik 60 ° |
| Optik eksen boşluğu | Tipik ±5.6 ° içinde |
| Piksel sayısı | 64 (Dikey 8 × Yatay 8 Matris) |
| Dış arayüz | I2C |
| I2C Adresi | 0x68 (varsayılan) \ 0x69 (isteğe bağlı) |
Pinler


AMG8833 Demosu
Artık AMG8833 hakkında biraz bilgi sahibi olduğumuza göre, kullanıma nasıl hazırlandığımızı öğrenme zamanı! Demosunda Grove – AMG8833 8×8 Kızılötesi Termal Sıcaklık Sensörü Dizisi kullanacağız.
Arduino için

Gereksinimler:
- Seeeduino V4.2 // Herhangi bir Arduino uyumlu kart
- Grove Base Shield V2.0 // Temel shield
- Grove – AMG8833 8×8 Kızılötesi Termal Sıcaklık Sensörü Dizisi
- 2.8 TFT Touch Shield V2.0 // Herhangi bir ekran
Donanımı bağlama adımları:
Adım 1: Grove – Kızılötesi Sıcaklık Sensörü Dizisini (AMG8833) Grove-Base Shield’ın I2C portuna bağlayın.
Adım 2: Grove – Base Shield’ı Seeeduino’ya takın.
Adım 3: 2.8 TFT Touch Shield V2.0’ı Grove – Base Shield’a takın.
Adım 4: Seeeduino’yu bir USB kablosu ile PC’ye bağlayın.
Yazılımla çalışma adımları:
Adım 1. Github’dan Seeed_AMG8833 Kütüphanesini indirin.
Adım 2. Arduino için Kütüphane nasıl yüklenir belgesine başvurun.
Adım 3. Arduino IDE’yi yeniden başlatın. Örneği açın, bunu üç şekilde açabilirsiniz:
a. Arduino IDE’de doğrudan şu yol ile açın: Dosya → Örnekler → Grove IR Matris Sıcaklık Sensörü AMG8833 → TFT_ekran_demo.

b. Bilgisayarınızda, TFT_ekran_demo.ino dosyasını tıklayarak açın. Bu dosyayı XXXXArduino\libraries\Seeed_AMG8833-master\examples\TFT_screen_demo klasöründe bulabilirsiniz; XXXX, Arduino IDE’yi yüklediğiniz yerdir.

c. Ya da, aşağıdaki kodu Arduino IDE’de yeni bir skeç içine kopyalayabilirsiniz.
#include <stdint.h>
#include <TFTv2.h>
#include <SPI.h>
#include "Seeed_AMG8833_driver.h"
AMG8833 sensor;
#define TFT_PIXELS_NUM 30
void parse_int_status(u8* status)
{
u8 val=0;
for(u32 i=0;i<8;i++)
{
if(status[i])
{
for(u32 j=0;j<8;j++)
{
if(status[i]&((1<<j)))
{
Serial.print("pixel ");
Serial.print(8*i+j+1);
Serial.println("interrupt is generated!!!");
}
}
}
}
}
void print_status(u8* status)
{
for(u32 i=0;i<8;i++)
{
Serial.print(status[i],HEX);
Serial.print(" ");
}
Serial.println(" ");
}
void setup()
{
Serial.begin(115200);
sensor.init();
TFT_BL_ON;
/*2.8 TFT screen. url:https://www.seeedstudio.com.tr/2.8-TFT-Touch-Shield-V2.0-p-1286.html*/
Tft.TFTinit();
}
void loop()
{
u8 val=0;
float pixels_temp[PIXEL_NUM]={0};
u16 color[PIXEL_NUM]={0};
/*Read temperature*/
sensor.read_pixel_temperature(pixels_temp);
/*Different temperature correspond to different color.*/
for(u32 i=0;i<PIXEL_NUM;i++)
{
if(pixels_temp[i]<29)
{
color[i]=BLUE;
}
else if((pixels_temp[i]>=29)&&(pixels_temp[i]<30))
{
color[i]=GREEN;
}
else if((pixels_temp[i]>=30)&&(pixels_temp[i]<31))
{
color[i]=YELLOW;
}
else if((pixels_temp[i]>=31)&&(pixels_temp[i]<33))
{
color[i]=0xfd00;
}
else
{
color[i]=RED;
}
}
/*Use a TFT screen to display.*/
for(u32 i=0;i<PIXEL_NUM;i++)
{
Tft.fillScreen(TFT_PIXELS_NUM*(i%8),TFT_PIXELS_NUM*(i%8+1),TFT_PIXELS_NUM*(8-i/8),TFT_PIXELS_NUM*(7-i/8),color[i]);
}
}
Adım 4: Demo’yu yükleyin. Kodu nasıl yükleyeceğinizi bilmiyorsanız, lütfen Kodu nasıl yüklerim belgesine bakın.
Her şey yolunda gittiyse, bunu görebilmelisiniz:
“`html

Raspberry Pi için

Gerekli olanlar:
- Raspberry Pi 3 Model B // Ya da herhangi bir Raspi uyumlu kart
- Raspberry Pi için Grove Base Hat
- Grove – AMG8833 8×8 Kızılötesi Termal Sıcaklık Sensörü Dizisi
- 5 inç 800×480 Kapasitif Dokunmatik Ekran // Ya da herhangi bir ekran
Donanımı bağlama adımları:
Adım 1. Grove – Kızılötesi Sıcaklık Sensörü Dizisi (AMG8833) ile Grove Base Hat for Raspberry Pi’nin I2C portunu bağlayın.
Adım 2. Grove Base Hat for Raspberry Pi’yi Raspberry Pi’ye takın.
Adım 3. 5 inç 800×480 Kapasitif Dokunmatik Ekranı HDMI kablosu ile Raspberry Pi’ye bağlayın.
Adım 4. Raspberry Pi’yi bir mikro-USB kablosu ile PC’ye bağlayın, 5 inç 800×480 Kapasitif Dokunmatik Ekranı başka bir mikro-USB kablosu ile besleyin.
Yazılımla çalışma adımları:
Adım 1. Raspberry Pi’niz için I2C arayüzünü açın. Bir terminal açabilir ve aşağıdaki komutu yazabilirsiniz.
sudo raspi-config

Adım 2. Yukarıdaki resmi gördüğünüzde, Interfacing Options seçeneğini seçin, ardından I2C seçeneğini seçerek I2C arayüzünü etkinleştirin.

Adım 3. İşlemi tamamladıktan sonra, kontrol etmek için aşağıdaki komutu kullanabilirsiniz.
sudo i2cdetect -y 1

I2C adresini görebildiğinizde, bu Raspberry’nin sensörü tespit ettiği anlamına gelir. Eğer göremiyorsanız, lütfen adım 1~3’ü tekrar edin. Bunu tamamladıktan sonra devam edebiliriz.
Adım 4. Terminalde ilgili bağımlılıkları yüklemek için aşağıdaki komutları yazın.
sudo apt-get update
sudo apt-get install -y build-essential python-pip python-dev python-smbus git
sudo apt-get install -y python-scipy python-pygame
sudo pip install colour
Adım 5. Seeed AMG8833 Python Kütüphanesini indirin.
git clone https://github.com/Seeed-Studio/Seeed_AMG8833_Raspberry_Python.git
Adım 6. AMG8833 klasörüne gidin ve demoyu çalıştırın.
pi@raspberrypi:~ $ cd Seeed_AMG8833_Raspberry_Python/
pi@raspberrypi:~/Seeed_AMG8833_Raspberry_Python $ ls
driver.py README.md Seeed_AMG8833.pyc
driver.pyc Seeed_AMG8833.py thermal_cam.py
pi@raspberrypi:~/Seeed_AMG8833_Raspberry_Python $ python thermal_cam.py
Her şey yolunda gittiyse, bunu görebilmelisiniz:

Wio Terminal kullanarak bir IR Termal Görüntüleme Kamerası Yapma

Gerekli olanlar:
Adım 1. LCD ekran Kütüphanesini Seeed_Arduino_LCD yükleyin, daha fazla bilgi için lütfen Wio Terminal LCD‘yi ziyaret edin.
Adım 2. Seeed_AMG8833 depolarını ziyaret edin ve tüm repoyu yerel sürücünüze indirin. Seeed_AMG8833 kütüphanesi daha sonra Arduino IDE’ye yüklenebilir.
Adım 3. Arduino IDE’yi açın ve sketch -> Include Library -> Add .ZIP Library seçeneğine tıklayın ve indirdiğiniz Seeed_AMG8833 dosyasını seçin.
Adım 4. Grove – Kızılötesi Sıcaklık Sensörü Dizisi (AMG8833) ile Wio Terminal’in Grove I2C Arayüzüne bağlayın.
Adım 5. Tam kodu buradan indirin veya aşağıdakini kopyalayarak kodu yükleyin:
“`
/*
Bu program, bir 8 x 8 termal kamera okuma dizisini büyütmek içindir
10 kat büyütecek ve 240 x 320 boyutunda görüntüleyecektir
enterpolasyon lineerdir ve "yeterince iyi"dir, çünkü ekran 5-6-5 renk paletidir
Nihai toplam dizi, yalnızca iç noktaların 70 x 70'lik bir dizisidir
Revizyonlar
1.0 Kasprzak İlk kod
1.1 Anson(Seeed Studio) Grove - Kızılötesi Sensör(AMG8833) ile Wio Terminal'e uyarlanmıştır
*/
#include <Seeed_AMG8833_driver.h>
#include <TFT_eSPI.h> // Grafik kütüphanesini dahil et (bu, sprite fonksiyonlarını içerir)
TFT_eSPI tft = TFT_eSPI();
TFT_eSprite Display = TFT_eSprite(&tft); // "tft" nesnesine işaretçi ile "img" Sprite nesnesi oluştur
// işaretçi, pushSprite() tarafından TFT'ye itmek için kullanılır
unsigned long CurTime;
uint16_t TheColor;
// bazı başlangıç renkleri ile başla
uint16_t MinTemp = 25;
uint16_t MaxTemp = 35;
// enterpolasyonlu renkler için değişkenler
byte red, green, blue;
// satır/sütun enterpolasyonu için değişkenler
byte i, j, k, row, col, incr;
float intPoint, val, a, b, c, d, ii;
byte aLow, aHigh;
// bir ekran "pikselinin" boyutu
byte BoxWidth = 3;
byte BoxHeight = 3;
int x, y;
char buf[20];
// ekran ızgarasını açıp kapatmak için değişken
int ShowGrid = -1;
// 8 x 8 ölçülen pikseller için dizi
float pixels[64];
// enterpolasyonlu dizi için dizi
float HDTemp[80][80];
// kamera nesnesini oluştur
AMG8833 ThermalSensor;
// Izgarayı açıp kapat
void toggleGrid() {
ShowGrid = ShowGrid *-1;
Display.fillRect(15, 15, 210, 210, TFT_BLACK);
yield();
}
void setup() {
Serial.begin(115200);
// ekranı başlat ve arka planı siyah yap
tft.begin();
tft.fillScreen(TFT_BLACK);
// Izgarayı açıp kapatmak için kesme
pinMode(WIO_KEY_A, INPUT);
attachInterrupt(digitalPinToInterrupt(WIO_KEY_A), toggleGrid, FALLING);
// ekran döndürmesini ayarla (ekranına bağlı olarak 0'a değiştirmen gerekebilir)
tft.setRotation(3);
// bir açılış ekranı göster
tft.setCursor(20, 20);
tft.setTextColor(TFT_BLUE, TFT_BLACK);
tft.print("Termal ");
tft.setTextColor(TFT_RED, TFT_BLACK);
tft.print("Kamera");
// sensörün açılmasına izin ver
bool status = ThermalSensor.init();
delay(100);
if (!status) {
Serial.print("AMG8833 başlatılamadı");
}
// ilk test için kamerayı oku
ThermalSensor.read_pixel_temperature(pixels);
// durumu kontrol et ve sonuçları göster
if (pixels[0] < 0) {
while (1) {
tft.setCursor(20, 40);
tft.setTextColor(TFT_RED, TFT_BLACK);
tft.print("Okumalar: BAŞARISIZ");
delay(500);
}
}
else {
tft.setCursor(20, 40);
tft.setTextColor(TFT_GREEN, TFT_BLACK);
tft.print("Okumalar: TAMAM");
delay(2000);
}
tft.fillScreen(TFT_BLACK);
Display.createSprite(TFT_HEIGHT, TFT_WIDTH);
Display.fillSprite(TFT_BLACK);
// renk enterpolasyon rutinleri için kesme noktalarını al
// bu fonksiyon, sıcaklık ölçeği değiştiğinde çağrılır
Getabcd();
// sensörlerin maksimum ve minimum değerleriyle eşleşen bir efsane çiz
DrawLegend();
}
void loop() {
CurTime = millis();
// sıcaklık alanı için büyük beyaz bir kenarlık çiz
Display.fillRect(10, 10, 220, 220, TFT_WHITE);
// sensörü oku
ThermalSensor.read_pixel_temperature(pixels);
// artık 8 x 8 sensör dizisine sahibiz
// daha büyük bir ekran elde etmek için enterpolasyon yap
// önce 8 sensör pikseli arasındaki 70 sütun noktasını enterpole et
for (row = 0; row < 8; row ++) {
for (col = 0; col < 70; col ++) {
// ilk dizi noktasını al, sonra bir sonraki
// ayrıca sonraki satırlar için 8 artırmamız gerekiyor
aLow = col / 10 + (row * 8);
aHigh = (col / 10) + 1 + (row * 8);
// her 10 sütun için enterpolasyon miktarını al
// burada basit lineer enterpolasyon yapıyoruz, esasen performansı yüksek tutmak için ve
// ekran 5-6-5 renk paleti olduğu için şatafatlı enterpolasyon düşük renk derinliğinde kaybolacaktır
intPoint = (( pixels[aHigh] - pixels[aLow] ) / 10.0 );
// her sütunu ne kadar artıracağımızı belirle (temelde 0-9)
incr = col % 10;
// enterpolasyonlu değeri bul
val = (intPoint * incr ) + pixels[aLow];
// 70 x 70 dizisine kaydet
// ekran dışarıyı gösterdiği için, satır verilerini transpoze etmek için satırı ters çevir
HDTemp[ (7 - row) * 10][col] = val;
}
}
// artık 70 sütun ile ham veriye sahibiz
// her 70 sütunu enterpole et
// Arduino'yu unut..hız açısından yeterince hızlı değil..Teensy > 72 mhz ile başlangıç noktasıdır
for (col = 0; col < 70; col ++) {
for (row = 0; row < 70; row ++) {
// ilk dizi noktasını al, sonra bir sonraki
// ayrıca sonraki sütunlar için 8 artırmamız gerekiyor
aLow = (row / 10 ) * 10;
aHigh = aLow + 10;
// her 10 sütun için enterpolasyon miktarını al
// burada basit lineer enterpolasyon yapıyoruz, esasen performansı yüksek tutmak için ve
// ekran 5-6-5 renk paleti olduğu için şatafatlı enterpolasyon düşük renk derinliğinde kaybolacaktır
intPoint = (( HDTemp[aHigh][col] - HDTemp[aLow][col] ) / 10.0 );
// her sütunu ne kadar artıracağımızı belirle (temelde 0-9)
incr = row % 10;
// enterpolasyonlu değeri bul
val = (intPoint * incr ) + HDTemp[aLow][col];
// 70 x 70 dizisine kaydet
HDTemp[ row ][col] = val;
}
}
// 70 x 70 dizisini göster
DisplayGradient();
// Ekranın ortasında nişangah
Display.drawCircle(115, 115, 5, TFT_WHITE);
Display.drawFastVLine(115, 105, 20, TFT_WHITE);
Display.drawFastHLine(105, 115, 20, TFT_WHITE);
// Sprite'ı ekrana it
Display.pushSprite(0, 0);
// Ekranın ortasında sıcaklığı göster
tft.setRotation(3);
tft.setTextColor(TFT_WHITE);
tft.drawFloat(HDTemp[35][35], 2, 90, 20);
// Kare hızını yazdırmak için bunu yorumdan çıkar
Serial.print("Kare hızı: "); Serial.println(1/(0.001*(millis() - CurTime)));
}
// sonuçları göstermek için fonksiyon
void DisplayGradient() {
tft.setRotation(4);
// 70 satır boyunca geç
for (row = 0; row < 70; row ++) {
// titreme yapmayan bir ızgara çizmenin hızlı yolu--her 10 pikseli 2x2 yapmak, 3x3 yerine
// ızgaradan sonra çizilen çizgiler çok fazla titrer
if (ShowGrid < 0) {
BoxWidth = 3;
}
else {
if ((row % 10 == 9) ) {
BoxWidth = 2;
}
else {
BoxWidth = 3;
}
}
// ardından her 70 sütun boyunca geç
for (col = 0; col < 70; col++) {
// titreme yapmayan bir ızgara çizmenin hızlı yolu--her 10 pikseli 2x2 yapmak, 3x3 yerine
if (ShowGrid < 0) {
BoxHeight = 3;
}
else {
if ( (col % 10 == 9)) {
BoxHeight = 2;
}
else {
BoxHeight = 3;
}
}
// nihayet her 70 x 70 noktayı çizebiliriz, enterpolasyonlu rengi almak için çağrıyı unutma
Display.fillRect((row * 3) + 15, (col * 3) + 15, BoxWidth, BoxHeight, GetColor(HDTemp[row][col]));
}
}
}
// hızlı ama etkili renk enterpolasyon rutinim
uint16_t GetColor(float val) {
/*
değeri geçir ve R G B'yi hesapla
bunu yapmanın birkaç yayınlanmış yolu var, ben esasen R G B'yi grafikleştirdim ve basit lineer denklemler geliştirdim
tekrar, 5-6-5 renkli bir ekran, R G B renk hesaplaması için doğru sıcaklığa ihtiyaç duymaz
denklemler
http://web-tech.ga-usa.com/2012/05/creating-a-custom-hot-to-cold-temperature-color-gradient-for-use-with-rrdtool/index.html
*/
red = constrain(255.0 / (c - b) * val - ((b * 255.0) / (c - b)), 0, 255);
if ((val > MinTemp) & (val < a)) {
green = constrain(255.0 / (a - MinTemp) * val - (255.0 * MinTemp) / (a - MinTemp), 0, 255);
}
else if ((val >= a) & (val <= c)) {
green = 255;
}
else if (val > c) {
green = constrain(255.0 / (c - d) * val - (d * 255.0) / (c - d), 0, 255);
}
else if ((val > d) | (val < a)) {
green = 0;
}
if (val <= b) {
blue = constrain(255.0 / (a - b) * val - (255.0 * b) / (a - b), 0, 255);
}
else if ((val > b) & (val <= d)) {
blue = 0;
}
else if (val > d) {
blue = constrain(240.0 / (MaxTemp - d) * val - (d * 240.0) / (MaxTemp - d), 0, 240);
}
// ekranın renk haritalama fonksiyonunu kullanarak 5-6-5 renk paletini al (R=5 bit, G=6 bit, B-5 bit)
return Display.color565(red, green, blue);
}
// sıcaklık ile RGB grafiğinde kesme noktalarını almak için fonksiyon
void Getabcd() {
a = MinTemp + (MaxTemp - MinTemp) * 0.2121;
b = MinTemp + (MaxTemp - MinTemp) * 0.3182;
c = MinTemp + (MaxTemp - MinTemp) * 0.4242;
d = MinTemp + (MaxTemp - MinTemp) * 0.8182;
}
// bir efsane çizme fonksiyonu
void DrawLegend() {
// maksimum ve minimum metin ile renk efsanesi
j = 0;
float inc = (MaxTemp - MinTemp ) / 160.0;
for (ii = MinTemp; ii < MaxTemp; ii += inc) {
tft.drawFastHLine(260, 200 - j++, 30, GetColor(ii));
}
tft.setTextSize(2);
tft.setCursor(245, 20);
tft.setTextColor(TFT_WHITE, TFT_BLACK);
sprintf(buf, "%2d/%2d", MaxTemp, (int) (MaxTemp * 1.8) + 32);
tft.print(buf);
tft.setTextSize(2);
tft.setCursor(245, 210);
tft.setTextColor(TFT_WHITE, TFT_BLACK);
sprintf(buf, "%2d/%2d", MinTemp, (int) (MinTemp * 1.8) + 32);
tft.print(buf);
}
// KODUN SONU
AMG8833, MLX90640 ve MLX90641 Arasındaki Karşılaştırma
AMG8833’ün benzer sensörlerle nasıl bir performans sergileyeceğini merak edebileceğinizi düşündük, bu nedenle işte farklılıklarını ve benzerliklerini gösteren bir tablo!
| Ürün | Pixel boyutu | Sıcaklık ölçüm aralığı | Çalışma sıcaklığı |
| AMG8833 | 8 × 8 = 64 piksel | 0 °C ile 80 °C | 0 °C ile 80 °C |
| MLX90640 | 32 × 24=768 piksel | -40°C~+300°C | -40°C ~ +85°C |
| MLX90641 | 16 × 12=192 piksel | -40°C~+300°C | -40°C ~ +125°C |
Gördüğünüz gibi, AMG8833’ün diğer termal kameralarla karşılaştırıldığında özellikleri olağanüstü değil, ancak uzun algılama aralığı ve yüksek hassasiyeti ile bunu telafi ediyor! Ancak daha yüksek görüntü kalitesi ve daha geniş sıcaklık ölçüm aralığı arıyorsanız, MLX90640 ve MLX90641 bu konuda daha iyi bir iş çıkaracaktır.
MLX90640 ve MLX90641 ile ilgileniyorsanız, bunları buradan satın alabilirsiniz:
- Grove – Termal Görüntüleme Kamerası – MLX90641 BCA 16×12 IR Dizisi ile 110° FOV
- Grove – Termal Görüntüleme Kamerası / IR Dizisi MLX90640 110 derece
Özet
Ve AMG3388 hakkında söyleyeceklerimiz bu kadar! Bu makaleyi okuduktan sonra bu sensör hakkında daha iyi bir anlayışa sahip olmanızı umuyoruz! Bu ürün hakkında ne düşündüğünüzü bize bildirin ve listedeki bağlantılardan satın alabilirsiniz.
MSG3388 ile ilgili daha fazla kaynağa ihtiyacınız olursa, aşağıdaki bağlantılara göz atmayı unutmayın!

