Arduino筆記(81):光照度感應器TEMT6000與GY-30 BH1750的測試比較

先前有實作過另一個光感測模組GY-30 BH1750FVI:Arduino筆記(57):光照度感測器 GY-30 BH1750FVI。實作的結果測得光照度單位為流明,這篇實作要來測試一下另一個感測模組TEMP6000,將兩個模組測得的值呈現在LCD1602上,看看兩個感測器偵測到的光照度差異是否會很大?

TEMT6000模組的特行如下:
  • 工作電壓:DC3.3~5V
  • 工作溫度:-40~85℃
  • 輸出訊號:模擬電壓,範圍約0~VCC
  • 感測光範圍:1~1000Lux(流明)
  • 模組不須額外過濾鏡,良好的線性輸出
  • 對可見光照度反應與人眼類似,可模擬人對環境光線的強度判斷
  • 應用:照明控制、螢幕背光控制等
  • 光感應器的最高靈敏度為570nm,其具有 ±60° 的較寬半靈敏度角度。
  • 該模組包括一個10K電阻器,隨著光強度的增加,電流也增加。

[材料]

  • Arduino Uno
  • 光照度感應器 TEMT6000
  • 光照度感應器 GY-30 BH1750
  • LCD1602液晶顯示器
  • I2C/介面 LCD1602轉接板
  • 排線 N 條

[安裝 Library]

本實作需要安裝以下程式庫:
程式庫(Library)安裝方法請參考另一篇文章:  Arduino筆記:安裝 Arduino IDE 程式庫(Library)

[線路圖]

Arduino UNOTEMT6000GY-30 BH1750LCD1602
5VVCCVCCVCC
GNDGNDGNDGND
A0SIG--
A5-SCL-
A4-SDA-
SDA--SDA
SCL-SCL



[程式一]

測試TEMT6000得到的流明值,並顯示在串列埠上,每秒顯示一次。
int temtPin = A0;
int light_value;
void setup() {
  Serial.begin(112500);
  pinMode(temtPin, INPUT); //data pin for ambientlight sensor
  pinMode(13, OUTPUT);
}

void loop() {
  int light_value = analogRead(temtPin);
  float volts = analogRead(A0) * 5.0 / 1024.0;   // 將5V電壓分成 1024等分
  float amps = volts / 10000.0;      // 電流=電壓/電阻(10K歐姆)
  float microamps = amps * 1000000;  //得到毫安培
  float lux = microamps * 2.0;       // 乘以2,得到流明

  Serial.print ("Raw ADC data: ");
  Serial.print (light_value);
  Serial.print ("  Volts: ");
  Serial.print (volts);
  Serial.print ("  Lux: ");
  Serial.println (lux);  
  delay(1000);
  if (light_value > 1000) {  //感測值超過1000時,亮Arduino板上的LED燈
    digitalWrite(13, HIGH);
  }
  else {digitalWrite(13,LOW);}
}

[程式二]

將GY-30 BH1750 跟 TEMT6000比較一下測得的數據,並顯示在LCD1602上。
#include <Wire.h>
#include <BH1750.h>
#include <LiquidCrystal_I2C.h>   // 引用 LiquidCrystal_I2C Library
LiquidCrystal_I2C lcd(0x27,16,2);  // 設定 LCD 位址為 0x27,有 16 個字元 2 列
  
BH1750 lightMeter;

int temtPin = A0;
int light_value;

void setup() {
  Serial.begin(112500);
  pinMode(temtPin, INPUT); //data pin for ambientlight sensor
  pinMode(13, OUTPUT);

  Wire.begin();
  lightMeter.begin();
  lcd.init();           // 初始化 lcd 
  lcd.backlight();      // 設定背板為亮    
}

void loop() {
  lcd.clear();       

  int light_value = analogRead(temtPin);
  float volts = analogRead(A0) * 5.0 / 1024.0;   // 將5V電壓分成 1024等分
  float amps = volts / 10000.0;      // 電流=電壓/電阻(10K歐姆)
  float microamps = amps * 1000000;  //得到毫安培
  float lux_temt = microamps * 2.0;       // 乘以2,得到流明  
  float lux_bh1750 = lightMeter.readLightLevel();    
  lcd.setCursor(0,0);  
  lcd.print("TEMT6000:"); 
  lcd.print(lux_temt);    
  lcd.setCursor(0,1);
  lcd.print("  BH1750:"); 
  lcd.print(lux_bh1750);      
     
  Serial.print ("Raw ADC data: ");
  Serial.print (light_value);
  Serial.print ("  Volts: ");
  Serial.print (volts);
  Serial.print ("  Lux: ");
  Serial.print (lux_temt); 
  
  Serial.print ("  BH1750 Lux: ");
  Serial.println (lux_bh1750); 
   
  delay(1000);
}

[結果]

以下照片在燈光暗時,兩者測得的感測值很接近。

可是當光線較強時(我在手機拍攝時,下方投出LED手電筒光線),可以看到BH1750的數值一下就飆升很高,更接近時,顯示2000多的數值,而 TEMT6000才450左右,兩者差距甚大。由於沒有公正的檢測儀器,我也不知道哪個數值比較正確?我猜是TEMT6000會比較準確吧!!


程式一的串列埠顯示的畫面如下:
程式一的串列埠顯示的畫面如下:

[參考資料]

Post a Comment

較新的 較舊