2015/09/29

Arduino 室內 VOC 氣體感測器實作 Indoor VOC Air Pollution Sensor with Temperature Gas Sensor LM35 TGS2620

Arduino 室內 VOC 氣體感測器實作 Indoor VOC Air Pollution Monitoring System with Temperature Gas Sensor LM35 TGS2620

這篇文章介紹如何利用溫度 Temperature sensor LM35 和 Gas Sensor TGS2620,實做出一個測量VoC 的 Arduino 專案,並能以溫度對讀取 VoC 值做校正補償。

我做了在辦公室使用的「產生新鮮空氣的自動供水環保智能盆栽」,但一直無法知道使用前後的差異。所以我做的這個 Arduino 專案就是為了測量溫度和 VoC 濃度。
Arduino Project Temperature Gas Sensor LM35 TGS2620

關於 VoC 揮發性有機物


所謂的 VoC (Volatile Organic Compound)揮發性有機物,Wikipedia的解釋如下:
按照世界衛生組織的定義,如果在氣壓101.32kPa下,該化合物的沸點在50℃-250℃,就是揮發性有機物。它們會在常溫下以氣體形式存在。按其化學結構的不同,可以進一步分為八類:烷類、芳烴類、烯類、鹵代烴類、酯類、醛類、酮類和其他。VOC的主要成分有:烴類、鹵代烴、氧烴和氮烴,它包括:苯系物、有機氯化物、氟里昂系列、有機酮、胺、醇、醚、酯、酸和石油烴化合物等。
我不是化學系的,所以老實說我也分不清楚烷類和芳烴類的化學式有什麼不同?不過,我看得懂其他的部份。

VoC 揮發性有機物的主要來源:
在室外,主要來自燃料燃燒和交通運輸產生的工業廢氣、汽車尾氣、光化學污染等;

而在室內則主要來自燃煤和天然氣等燃燒產物、吸菸、採暖和烹調等的煙霧,建築和裝飾材料、家具、 家用電器、清潔劑和人體本身的排放等。在室內裝飾過程中,揮發性有機物主要來自油漆、塗料和膠粘劑。

一般油漆中VOC含量為每公升30至70克。由於揮發性有機物具有強揮發性,一般情況下,油漆施工後的10小時內,可揮發出90%。

VoC 揮發性有機物的危害:
揮發性有機物的危害很明顯,當居室中揮發性有機物濃度超過一定濃度時,在短時間內人們感到頭痛、噁心、嘔吐、四肢乏力;嚴重時會抽搐、昏迷、記憶力減退。揮發性有機物傷害人的肝臟、腎臟、大腦和神經系統,其中還包含了很多致癌物質。室內空氣被揮發性有機物污染已引起各國重視。
簡單地說,我們要儘量避免處理有VoC的環境內。

所需材料


在這個實作中,我們需要以下的材料:
  • Arduino UNO 1 片
  • USB 線 1 條
  • LM 35 溫度 sensor 1 個
  • TGS2620 Gas Sensor 1 個
  • 10K OHM 電阻 Resistor
    理論上為了與校準儀器的數值比較,應該要使用可變電阻,但因為我沒有校準的儀器,所以我就先使用了10K OHM 電阻。
  • 幾條套件用電線
Arduino Project Temperature Gas Sensor LM35 TGS2620

關於 TGS 2620 Gas Sensor


TGS-2602 是日本 FIGARO 公司所生產的金屬氧化物半導體氣體感測元件 (Metal Oxide Semiconductor Gas Sensor),內部由加熱器與氧化鋁基板上的二氧化錫(SnO2)半導體組成,外部由透氣不鏽鋼罩包覆,以阻隔灰塵並防止氣爆。

TGS-2602的運作原理是裏面的加熱器會持續對二氧化錫加熱,以提高活性造成其氧化,由於氧氣容易吸附電子形成負離子,會將二氧化錫內自由電子吸附到表面以達平衡,如此會造成晶體內的自由電子減少,導電性降低,電阻值上升。但當目標氣體濃度上升時,吸附在二氧化錫表面之氧氣濃度下降造成脫離或參與還原反應,均會恢復晶體內的自由電子,當自由電子增加就會增加導電性使電阻值下降。

從 Spec 的圖片看來,Pin1 和 Pin4 是加熱器迴路,Pin2 和 Pin3 是感測器迴路。
TGS 2620 針腳定義

  • Pin1 - GND
  • Pin2 - GND 串聯10K的電阻,電阻接到 Arduino 的 Pin A1
  • Pin3 - 5V
  • Pin4 - 5V

FIGARO 官方文件提到關於 TGS 系列之準備時間、反應時間與恢復時間。
  • 一般準備時間是指標準電路下,元件啟動後進入待測狀態所需時間,啟動時間會根據元件儲存之環境有關係,第一次啟動完成(持續加熱約兩天)後,準備時間大約在 2 分鐘左右。
  • 反應時間為元件感測氣體後,需要多少時間開始回應感測數據。一般而言在 15 秒以內。
  • 恢復時間則是感測氣體後,放置潔淨空器內,需要多少時間恢復至待測狀態。一般而言在 2 分鐘以內。
TGS-2620 啟動完成後,準備時間

校正 TGS 2620 Gas Sensor


從 Spec 的內容來看,此類感測元件之感測阻值比(SRR, Sensor Resistance Ratio)會受三種條件影響而大幅改變電阻值:溫度、濕度、電壓變化。Ro 為潔淨空氣溫度攝氏 20 度及相對濕度 65% 條件之電阻值,Rs 為潔淨空氣中各種不同溫濕度之電阻值。
TGS-2620 溫度、濕度感測阻值校正
當溫度越高時,電阻值也越低,Rs/Ro 比值就會跟著下降。攝氏 20 度濕度 65%,Rs/Ro 比值為 1。但隨著溫度上升至攝氏 30 度時,Rs/Ro 比值約為 0.74,攝氏 40 度時 Rs/Ro 比值約為 0.62,因此我們需要在程式中以溫度對讀取值做校正補償。

當濕度越高時,電阻值也越低,Rs/Ro 比值就會跟著下降。攝氏 20 度濕度 65%,Rs/Ro 比值為 1。但隨著濕度提高至 95% 時,Rs/Ro 比值降低至 0.75,但濕度降低至 50% 時,Rs/Ro 比值提高至 1.2,因為這次的設備中欠缺濕度計,所以我們暫時以濕度 65% 做為校正補償的依據,不以其他濕度對讀取值做校正補償。

最後,電壓變化會造成加熱器對感測元件加熱程度不一,但因為我們並沒有要改變電壓,因此,我們不考慮這個因素。

關於 LM 35 Temperature Sensor


  • Pin1 - 5V
  • Pin2 - 5Vout 接到 Arduino 的 Pin A0
  • Pin3 - GND

LM35

Arduino 連接 LM35 和 TGS2620


Arduino 連接 LM35 和 TGS2620

Arduino 程式碼


這個程式碼如下:
int def_baudrate = 9600; //定義port Baud Rate 9600
int def_pin_temp = A0; // the output pin of LM35
int def_pin_gas = A1; // the output pin of TGS2620
int def_pin_led = 8; // led pin
int def_time_delay = 10000; // 一秒更新一次

int sensorTempValue = 0; //TempSensor 讀取的數值
float sensorGasValue = 0; //GasSensor 讀取的數值
float tempValue = 0; //TempSensor 轉換後的數值
float gasValue = 0; //GasSensor 轉換後的數值
float tempRHLow =0;
float tempRHHigh =0;
float gasCorrection =0;
float rh65[] = {1.72,1.72,1.3,1.3,1,0.74,0.74,0.62,0.62}; //RH65%時的修正值

void setup()
{
  Serial.begin(def_baudrate);
  pinMode(def_pin_temp, INPUT);
  pinMode(def_pin_gas, INPUT);
  pinMode(def_pin_led, OUTPUT);
}
void loop()
{
  tempValue = readSensorTemp(); // get the temperature
  sensorGasValue = readSensorGas(); // get the gas
  gasCorrection = getGasCorrection (tempValue); //以溫度取得校正補償值
  gasValue = sensorGasValue/gasCorrection; //補償後的GAS
  
  Serial.print("TEMP: "); // display the temperature value
  Serial.println(tempValue,1);
  Serial.print("GAS-corrective: "); // display the gas value after corrective
  Serial.println( gasValue,1 );
  delay(def_time_delay);
}

float readSensorTemp() { // get the temperature and convert it to celsius
  sensorTempValue = analogRead(def_pin_temp);
  tempValue = (float)sensorTempValue/1023*500; //換算為浮點電壓值
  return tempValue;
}

float readSensorGas() { // get the gas value and corrective it
  sensorGasValue = analogRead(def_pin_gas);
  return sensorGasValue;
}

float getGasCorrection (float tempValue) { // get the gas value and corrective it
  for (int i =0; i <10; i=i+1){     tempRHLow = i*2.5+(i-1)*2.5;     tempRHHigh = (i+1)*2.5+i*2.5;     if (tempRHLow <= tempValue && tempValue <=tempRHHigh){       return rh65[i];     }   } }


執行結果


Compile 後上傳到板子,可以從 serial port 看到回傳的溫度和校正後的 VOC 電阻值。
Arduino Project Temperature Gas Sensor LM35 TGS2620 serial port 執行結果
這個是我從《室內VOC氣體感測網路系統實作》找到的參考資料,可以從電阻對應VoC的濃度。但因為我沒有檢驗設備,所以做好了也還是沒有辦法做更精確的校正。
ADC PPM 濃度對照表

沒有留言:

張貼留言