學習目標 : 認識faya 紫外線感應模組的功能及使用方式
學習時間 : 50min
示範模組 : (1) fayaduino Nano
(2) faya 紫外線感應模組
(3) faya 串列LCD顯示模組
其它工具 : (1) 樂高積木底板 (相容)
(2) 紫外線手電筒 (或天然陽光)
====================功能介紹====================
faya紫外線感應模組使用了一紫外線感應晶片(ML8511),根據紫外線的強度將光電流轉換為電壓值,透圖表的比對,讓紫外線感測模組所測得的輸出電壓,依照曲線對映出相對UV值,可運用在紫外線等級監視器、環境監測儀、氣象站、DIY紫外線互動裝置等…。
產品特徴 (取自 ML8511 datasheet)
● 適用於UV-A和UV-B頻段
● 嵌入式運算放大器
● 類比電壓輸出
● 工作電流低(典型值 300uA),待機電流低(典型值 0.1uA)
● 小而薄的表面貼裝封裝(4.0mm x 3.7mm x 0.73mm,12引腳陶瓷QFN)
====================相關知識====================
faya紫外線感應模組採用ML8511傳感器,它具有UV光電二極管和內部放大器,可根據UV光強度將光電流轉換為電壓輸出,有興趣深入了解 ML8511的使用者,可以參照datasheet。
紫外線的波長位於 100 ~ 400 nm ( nanometer ) 的範圍,按照ISO-DIS-21348此範圍可分為 UV-C、UV-B 和 UV-A 這三大區段,分別解釋如下:
● UVA ( 波長 315 - 400 nm )
在紫外線中佔 95 %,可以穿透透明的玻璃和塑膠,可以直達肌膚的真皮層,導致皮膚曬傷、曬黑、老化與產生皺紋。
● UVB ( 波長 280 - 315 nm )
到達地球表面的 UVB,在紫外線中只佔 2%,只有在夏天或是午後特別強。部分的 UVB 會被透明玻璃吸收,過量照射會使得皮膚曬黑、曬傷脫皮勝制有致癌的可能。但適當的 UVB 能觸進體內礦物質代謝與形成維生素 D。
● UVC ( 波長 100 - 280 nm )
此波長範圍無法穿透透明玻璃與塑膠。短時間曝曬會灼傷皮膚,長時間曝曬會導致皮膚癌,但可作為殺菌燈使用。
其中UV-A和UV-B就是我們一開始提到適合ML8511感應的頻段,從datasheet所提供的資料,也可以發現感測器在此範圍的反應特別敏感。
===================範例實作(1)===================
了解模組功能(原理)後,我們用以下範例來展示模組的功能:
目標:
(1)每3秒在Arduino Serial Monitor和LCD模組秀出目前ML8511各電壓值與UV值 (0~15)
接線:
(1) 電源線連接如下圖所示,連接的說明請看這篇文章 或簡易版
(2) 訊號線連接
Arduino_A0 ===> 紫外線感應模組_VOUT
Arduino_A1 ===> 紫外線感應模組_Vref 3.3
Arduino_A4 ===> LCD顯示模組_SDA
Arduino_A5 ===> LCD顯示模組_SCL
範例程式:
備註:
- LCD顯示模組的使用方式與範例請參考[模組介紹:faya串列LCD模組]
- L30~32 : 為了還原Vout電壓值,我們先將Vout和Vref的類比值取出(L30-31),並利用L32的公式算出Vout電壓
- L33 : 利用mapFloat求出Vout電壓所對應出的UV強度
- L58~60 : mapFloat副程式,用法和map()相同,但可針對浮點數進行轉換,可參考Arduino map()的功能介紹。
● 嵌入式運算放大器
● 類比電壓輸出
● 工作電流低(典型值 300uA),待機電流低(典型值 0.1uA)
● 小而薄的表面貼裝封裝(4.0mm x 3.7mm x 0.73mm,12引腳陶瓷QFN)
模組在Vref3.3V的腳位會輸出恆定的3.3V電壓,如此一來微控制器(Arduino)進行類比數位轉換的時候,才能讓所轉換的Vout類比值有穩定的相對電壓數值可參考...方法是將Vout和Vref腳位分別接到Arduino的不同類比腳位,此時Vref所測得的類比值會恆定,大約等於(1024/5)x3.3附近 (視VCC而定),另外Vout也會測得一個類比值,大約等於 (1024/5)xVout)
有了以上兩個數值,我們就可以還原Vout電壓值
analogRead(Vout) / analogRead(Vref) = [(1024/5) x Vout] / [(1024/5) x 3.3]
Vout = 3.3 * analogRead (Vout) / analogRead(Vref)
接著根據此Vout值,即可從datasheet所提供的(輸出電壓與UV強度)曲線中找出相對應的UV強度,曲線圖如下
大家可以發現從在室溫時(25C的紫色曲線),UV的輸出電壓從0.99V上升到2.8V時,UV的強度則以線性的方式由0上升到15。
有了此關係,我們可以透過公式回歸出在某電壓所對應的出的強度值,由於兩者關係是線性的,最簡單的方式就用Arduino內建的map()函式,但時由於map()函式只適用於整數,因此我們必須在程式中自行創造一能夠處理浮點版本的map()函式,mapFloat(),使用方式和map相同。
====================相關知識====================
faya紫外線感應模組採用ML8511傳感器,它具有UV光電二極管和內部放大器,可根據UV光強度將光電流轉換為電壓輸出,有興趣深入了解 ML8511的使用者,可以參照datasheet。
紫外線的波長位於 100 ~ 400 nm ( nanometer ) 的範圍,按照ISO-DIS-21348此範圍可分為 UV-C、UV-B 和 UV-A 這三大區段,分別解釋如下:
● UVA ( 波長 315 - 400 nm )
在紫外線中佔 95 %,可以穿透透明的玻璃和塑膠,可以直達肌膚的真皮層,導致皮膚曬傷、曬黑、老化與產生皺紋。
● UVB ( 波長 280 - 315 nm )
到達地球表面的 UVB,在紫外線中只佔 2%,只有在夏天或是午後特別強。部分的 UVB 會被透明玻璃吸收,過量照射會使得皮膚曬黑、曬傷脫皮勝制有致癌的可能。但適當的 UVB 能觸進體內礦物質代謝與形成維生素 D。
● UVC ( 波長 100 - 280 nm )
此波長範圍無法穿透透明玻璃與塑膠。短時間曝曬會灼傷皮膚,長時間曝曬會導致皮膚癌,但可作為殺菌燈使用。
其中UV-A和UV-B就是我們一開始提到適合ML8511感應的頻段,從datasheet所提供的資料,也可以發現感測器在此範圍的反應特別敏感。
===================範例實作(1)===================
了解模組功能(原理)後,我們用以下範例來展示模組的功能:
目標:
(1)每3秒在Arduino Serial Monitor和LCD模組秀出目前ML8511各電壓值與UV值 (0~15)
接線:
(1) 電源線連接如下圖所示,連接的說明請看這篇文章 或簡易版
(2) 訊號線連接
Arduino_A0 ===> 紫外線感應模組_VOUT
Arduino_A1 ===> 紫外線感應模組_Vref 3.3
Arduino_A4 ===> LCD顯示模組_SDA
Arduino_A5 ===> LCD顯示模組_SCL
範例程式:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 2018/03/28 | |
// Faya-Nugget 範例程式 (uv_1.ino) | |
// 單元: 模組介紹-faya 紫外線感應模組 | |
// 網址: https://fayalab.blogspot.com/2019/03/uv.html | |
// 目標: (1) 利用UV感測器測得當前UV強度 | |
// (2) 將結果顯示在串列傳輸監視視窗與LCD顯示模組 | |
// 接線: Arduino ==> faya模組 | |
// A0 ==> 紫外線模組_Vout | |
// A1 ==> 紫外線模組_Vref3.3V | |
// A4 ==> LCD顯示模組_SDA | |
// A5 ==> LCD顯示模組_SCL | |
#include <Wire.h> //引入I2C函式庫 | |
#include <LiquidCrystal_I2C.h> //引入串列LCD模組函式庫 | |
//定義LCD的位址與參數 | |
LiquidCrystal_I2C faya_LCD(0x20, 16, 2); // LCD位址:0x20 ; LCD規格:16x2 | |
void setup() | |
{ | |
Serial.begin(9600); //啟動串列傳輸介 | |
faya_LCD.init(); //初始化LCD | |
faya_LCD.backlight(); //啟動背光 | |
} | |
void loop() | |
{ | |
int portUVout = analogRead(A0); //儲存Vout的類比值 | |
int portVref33 = analogRead(A1); //儲存Vref3.3V類比值 | |
float vOut = (3.33 / portVref33) * portUVout; //儲存電壓值 | |
float uvIntensity = (mapFloat(vOut,0.99,2.8,0,15)); //儲存UV強度 | |
//顯示結果於串列監控視窗 | |
Serial.println("===== fayaLab UV Sensor ====="); | |
Serial.print("Vout (analog value) = "); //顯示Vout類比值 | |
Serial.println(portUVout); | |
Serial.print("vREF33 (analog value) = "); //顯示Vref3.3V類比值 | |
Serial.println(portVref33); | |
Serial.print("uv Voltage = "); //顯示Vout電壓值 | |
Serial.print(vOut); | |
Serial.println(" (V)"); | |
Serial.print("uv Intensity = "); //顯示UV強度 | |
Serial.print(uvIntensity); | |
Serial.println(" (mW/cm2)\r\n"); | |
//顯示結果於LCD顯示器 | |
faya_LCD.setCursor(0, 0); //座標移到第0列第0行 | |
faya_LCD.print("uvIntensity = "); //印出文字 | |
faya_LCD.setCursor(0, 1); //座標移到第0行第1列 | |
faya_LCD.print(uvIntensity); //印出UV值 | |
faya_LCD.print(" (mW/cm2)"); //印出單位 | |
delay(3000); | |
faya_LCD.clear(); | |
} | |
//map float副程式 | |
float mapFloat(float value, float fromLow, float fromHigh, float toLow, float toHigh) { | |
return (value - fromLow) * (toHigh - toLow) / (fromHigh - fromLow) + toLow; | |
} |
備註:
- LCD顯示模組的使用方式與範例請參考[模組介紹:faya串列LCD模組]
- L30~32 : 為了還原Vout電壓值,我們先將Vout和Vref的類比值取出(L30-31),並利用L32的公式算出Vout電壓
- L33 : 利用mapFloat求出Vout電壓所對應出的UV強度
- L58~60 : mapFloat副程式,用法和map()相同,但可針對浮點數進行轉換,可參考Arduino map()的功能介紹。
範例結果:
首先利用紫外線手電筒做測試
另外我們在不同的時間在陽光下做測試
在上午10點的時候,我們從氣象局的即時系統得知台北紫外線指數大約在等級4
從模組上測的UV值為 (4.9mW/cm2)
下午1點的時候,紫外線指數高達7~8
到了下午五點的時候太陽下山了,氣象局報導紫外線子指數下降至1
我們的感測器UV強度也明顯地跟著下降到1.03 (mW/cm2)
同一個時間,我們將感測器稍微一動一下到有陰影的位置,可以發現UV數值又下降了 (0.88 mw/cm2),
最後我們觀察一段影片,看看由室內到有陽光的地方的UV值所產生的變化差距 (隔日 上午11:30,天氣多雲,比前一天陰暗許多),量測當時的氣象局即時測報如下圖
討論:
(1) 模組上所量測到的紫外線強度 (mW/cm2)和氣象局所預測的紫外線指數是不同的,ML8511只針對特定的紫外線頻段進行偵測,並且算出其強度,而氣象局所公布的紫外線指數,是經由一系列的紫外線量測,搭配不同頻段給予的權重,並且考量雲層與地理位置狀況,所算出來從0~10的指數,千萬不要把模組量測出來的數值當成紫外線指數,兩者並不相同,但是所得到的相對趨勢倒是一致的。
有興趣了解氣象局指外線指數如何算出來的人,底下這篇文章有精簡的介紹
https://www.cwb.gov.tw/V7/knowledge/announce/PDFfile/service13.pdf
(2)
類比轉數位(A/D)的晶片使用上,參考電壓 (Vref) 的穩定度非常重要喔!
以 10-bit 解析度的 ADC 來說,若Vref是 3.3V,則每一個變化代表 3.223 mV (3.3/1024) 的變化。若Vref降為 3.25V,則每一個變化代表 3.174 mV (3.25/1024) 的變化。當 ADC 取值為 100 時,兩者之間的差距就會有 4.883 mV;這是在電壓變化 0.05V 的輸出差距。
解決的方法可以使用穩定的參考電壓晶片,或是額外將參考電壓引入到另一個類比轉數位通道中,先取一定的值後,再取平均值,得到平均的參考電壓在與取值後的數據做運算,就能得到特定通道中更準確的類比轉數位值。
也歡迎大家在底下留言或到我們的粉絲團留言喔!
====================================
fayalab 粉絲團
FB本篇留言版
沒有留言:
張貼留言