Haberler

AMG8833 nedir? Özellikler ve Demo

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!

What is an AMG8833? Features and Demo

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:

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:

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:


Ö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!

Kaynaklar

Leave a Reply

Your email address will not be published. Required fields are marked *