這篇文章介紹如何利用溫度 Temperature sensor LM35 和 Gas Sensor TGS2620,實做出一個測量VoC 的 Arduino 專案,並能以溫度對讀取 VoC 值做校正補償。
我做了在辦公室使用的「產生新鮮空氣的自動供水環保智能盆栽」,但一直無法知道使用前後的差異。所以我做的這個 Arduino 專案就是為了測量溫度和 VoC 濃度。
關於 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 電阻。 - 幾條套件用電線
關於 TGS 2620 Gas Sensor
TGS-2602 是日本 FIGARO 公司所生產的金屬氧化物半導體氣體感測元件 (Metal Oxide Semiconductor Gas Sensor),內部由加熱器與氧化鋁基板上的二氧化錫(SnO2)半導體組成,外部由透氣不鏽鋼罩包覆,以阻隔灰塵並防止氣爆。
TGS-2602的運作原理是裏面的加熱器會持續對二氧化錫加熱,以提高活性造成其氧化,由於氧氣容易吸附電子形成負離子,會將二氧化錫內自由電子吸附到表面以達平衡,如此會造成晶體內的自由電子減少,導電性降低,電阻值上升。但當目標氣體濃度上升時,吸附在二氧化錫表面之氧氣濃度下降造成脫離或參與還原反應,均會恢復晶體內的自由電子,當自由電子增加就會增加導電性使電阻值下降。
從 Spec 的圖片看來,Pin1 和 Pin4 是加熱器迴路,Pin2 和 Pin3 是感測器迴路。
- Pin1 - GND
- Pin2 - GND 串聯10K的電阻,電阻接到 Arduino 的 Pin A1
- Pin3 - 5V
- Pin4 - 5V
FIGARO 官方文件提到關於 TGS 系列之準備時間、反應時間與恢復時間。
- 一般準備時間是指標準電路下,元件啟動後進入待測狀態所需時間,啟動時間會根據元件儲存之環境有關係,第一次啟動完成(持續加熱約兩天)後,準備時間大約在 2 分鐘左右。
- 反應時間為元件感測氣體後,需要多少時間開始回應感測數據。一般而言在 15 秒以內。
- 恢復時間則是感測氣體後,放置潔淨空器內,需要多少時間恢復至待測狀態。一般而言在 2 分鐘以內。
校正 TGS 2620 Gas Sensor
從 Spec 的內容來看,此類感測元件之感測阻值比(SRR, Sensor Resistance Ratio)會受三種條件影響而大幅改變電阻值:溫度、濕度、電壓變化。Ro 為潔淨空氣溫度攝氏 20 度及相對濕度 65% 條件之電阻值,Rs 為潔淨空氣中各種不同溫濕度之電阻值。
當溫度越高時,電阻值也越低,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
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 電阻值。
這個是我從《室內VOC氣體感測網路系統實作》找到的參考資料,可以從電阻對應VoC的濃度。但因為我沒有檢驗設備,所以做好了也還是沒有辦法做更精確的校正。
- produktinfo -《FIGARO TGS-2620 GAS SENSOR Product Information》
- 臺灣博碩士論文知識加值系統 -《室內VOC氣體感測網路系統實作》
- 拉夫多多思考 -《Arduino動手做 - 使用TGS2602偵測空氣中的揮發物汙染》
- instructables -《How To Smell Pollutants》
- electroschematics -《Arduino Fan Speed Controlled by Temperature》
Jose’s Google+ profile
沒有留言:
張貼留言