【雕爷学编程】Arduino动手做(143)---ML8511紫外线传感器模块
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百四十三:ML8511紫外线传感器模块 模拟量输出UV Sensor Breakou
ML8511
是紫外线传感器,适用于获取室内或室外的紫外线强度。 配有内部放大器,可根据紫外线强度将光电流转换为电压。这项独特的功能为与ADC等外部电路提供了便捷的接口。 在掉电模式下,典型待机电流为0.1μA,因此可以延长电池寿命。
ML8511芯片,是日本商号冲电气工业株式会社(Oki Electric Industry Co., Ltd.)生产的,敏感波长:UV-A(320-400nm),UV-B(280-320nm) 。
ML8511主要参数
RoHS: 是
产品: Light to Voltage Converters
峰值波长: 365 nm
最大工作温度: + 70 C
最小工作温度: - 20 C
安装风格: SMD/SMT
封装 / 箱体: QFN-12
工作电源电压: 3.3 V
工作电源电流: 300 uA
封装: Reel
封装: Cut Tape
工厂包装数量: 1000
电源电压-最大: 3.6 V
电源电压-最小: 2.7 V
零件号别名: ML8511AFCZ05BL
GY-8511紫外线传感器模块GY-ML8511 模拟量输出UV Sensor Breakou
说明:ML8511突破是一个易于使用的紫外线传感器。MP8511紫外线(紫外线)传感器的工作原理是输出一个与检测到的紫外线数量相关的模拟信号。这种突破可以非常方便地创建设备,警告用户晒伤或检测紫外线指数,因为它与天气条件有关。
此传感器可最有效地检测280-390牛米的光线。这被归为UVB(燃烧射线)光谱和大部分UVA(晒黑射线)光谱的一部分。它输出的模拟电压与测量的紫外线强度(mW/cm~2)成线性关系。如果你的微控制器可以做一个模拟到数字的信号转换,那么你可以检测紫外线的水平!
冲电气(OKI)推出内建运算放大器的紫外线(UV)传感器IC——ML8511。该产品运用绝缘上覆硅(SOI)-CMOS,为该公司首款模拟电压输出、无滤光器的UV传感器。ML8511可与UV光量成正比输出模拟电压。由于可以输出电压,因此可以直接连接内建MCU的A/D数字/模拟转换器,无需光电转换电路。而且使用小型、薄型表面封装方式,适合于便携式设备用途。
该模块采用了通用的ML8511 UV传感器原件,可以用来检测室内或室外的紫外线密度。通过将光电流转化成电压的原理来检测UV强度,同时非常适合被被外部电路所采用。该模块还具备省电模式可达0.1uA,适合在智能可穿戴和手机等设备上使用。
应用
紫外线等级监视器
环境监测仪、气象站
DIY紫外线互动装置
技术规格
工作电压:3.3V - 5V
通信接口:Gravity Analog(PH2.0-3P,模拟电压输出1V ~ 2.8VDC)
敏感波长:UV-A(320-400nm),UV-B(280-320nm)
工作温度:-20~70°C
模块尺寸:30 x 22mm
紫外线(Ultraviolet,UV)
是电磁波谱中波长为400nm~10nm辐射的总称,不能引起人们的视觉。它是频率比蓝紫光高的不可见光。英语中,前缀ultra-意为意为“高于,超越”。
1801年,德国物理学家里特发现:在日光光谱的紫端外侧一段能够使含有溴化银的照相底片感光,从而发现了紫外线的存在。紫外线是由原子的外层电子受到激发后产生的。自然界的主要紫外线光源是太阳,太阳光透过大气层时波长短于 290nm 的紫外线为大气层中的臭氧吸收掉。
紫外线是阳光中波长为400nm~10nm(纳米)的光线。英语为ultraviolet(缩写为UV),前缀ultra-意为“高于,超越”。太阳光谱上,紫外线的频率高于可见光线。可以分为UVA(紫外线A,波长400nm~320nm,低频长波)、UVB(波长320nm~280nm,中频中波)、UVC(波长280nm~100nm,高频短波)、EUV(100nm~10nm,超高频)4种。其中,UVA的致癌性最强,晒红及晒伤作用是UVB的1000倍。UVC则一般会被臭氧层阻隔。IR是红外线(infrared),可造成晒红、微血管扩张、皮肤炎,并促进紫外线的致癌性。紫外线照射会让皮肤产生大量自由基,导致细胞膜的过氧化反应,使黑色素细胞产生更多的黑色素,并往上分布到表皮角质层,造成黑色斑点。紫外线可以说是造成皮肤皱纹、老化、松弛及黑斑的最大元凶。
紫外线照射人体时,能促进人体合成维生素D,以防止患佝偻病,经常让小孩晒晒太阳就是这个道理。紫外线还具有杀菌作用,医院里的病房就利用紫外线消毒。但过强的紫外线会伤害人体,应注意防护。
紫外线指数
是指当太阳在天空中的位置最高时(一般是在中午前后,即从上午十时至下午三时的时间段里),到达地球表面的太阳光线中的紫外线辐射对人体皮肤的可能损伤程度。紫外线指数变化范围用0-15的数字来表示,通常,夜间的紫外线指数为0,热带、高原地区、晴天时的紫外线指数为15。当紫外线指数愈高时,表示紫外线辐射对人体皮肤的红斑损伤程度愈加剧,同样地,紫外线指数愈高,在愈短的时间里对皮肤的伤害也愈大。
紫外线指数由两部分组成,一部分是测量得到的不同波长的太阳紫外线强度,另一部分是医学试验得到的不同类型皮肤经紫外线照射后出现红斑反映所需要的紫外线剂量,把这两部分用数学方法组合处理后再按规定的标准转换成数字就形成了向公众发布的紫外线指数。因此紫外线指数可以理解为,到达地面的太阳紫外线强度以及人类裸露皮肤的影响程度,紫外线指数的数字越大,对皮肤造成的损害越大。医学试验证明,以皮肤变红为标准,紫外线对皮肤的伤害,不仅和紫外线强度有关,还和皮肤类型以及日晒时间有关,所以在紫外线指数的实际应用中,我们不仅需要知道不同紫外线指数的具体含义,还需要知道更多的防晒知识。
紫外线指数等级(Grade of UV Index)
分为一级~五级,分级方法见附表
一级:0,1,2 最弱<5100~180不需要采取防护措施;若长期在户外,建议涂擦SPF在8-12之间的防晒护肤品。
二级:3,4 弱 5~1060~100可以适当采取一些防护措施,涂擦SPF在12-15之间、PA+的防晒护肤品。
三级:5,6 中等 10~1530~60外出时戴好遮阳帽、太阳镜和太阳伞等;涂擦SPF高于15、PA+的防晒护肤品。
四级:7,8,9 强 15~3020~40避免在10点至14点暴露于日光下.外出时戴好遮阳帽、太阳镜和太阳伞等,涂擦SPF20左右、PA++的防晒护肤品。
五级:10和大于10 很强 >=30小于20尽可能不在室外活动,必须外出时,要采取各种有效的防护措施。
+
GY-8511紫外线传感器模块电原理图
Arduino实验开源代码
/* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验一百四十三:ML8511紫外线传感器模块 模拟量输出UV Sensor Breakou 接线 ML8511 arduino uno VCC----------------------VCC OUT----------------------A0 GND----------------------GND 实验之一:串口显示ML8511紫外线传感器数值 */ int ReadUVintensityPin = A0; //Output from the sensor void setup() { pinMode(ReadUVintensityPin, INPUT); Serial.begin(9600); //open serial port, set the baud rate to 9600 bps Serial.println("Starting up..."); } void loop() { int uvLevel = averageAnalogRead(ReadUVintensityPin); float outputVoltage = 5.0 * uvLevel/1024; float uvIntensity = mapfloat(outputVoltage, 0.99, 2.9, 0.0, 15.0); Serial.print("UVAnalogOutput: "); Serial.print(uvLevel); Serial.print(" OutputVoltage: "); Serial.print(outputVoltage); Serial.print(" UV Intensity: "); Serial.print(uvIntensity); Serial.print(" mW/cm^2"); Serial.println(); delay(100); } //Takes an average of readings on a given pin //Returns the average int averageAnalogRead(int pinToRead) { byte numberOfReadings = 8; unsigned int runningValue = 0; for(int x = 0 ; x < numberOfReadings ; x++) runningValue += analogRead(pinToRead); runningValue /= numberOfReadings; return(runningValue); } //The Arduino Map function but for floats float mapfloat(float x, float in_min, float in_max, float out_min, float out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }
GY-8511紫外线传感器模块测试室内紫外线情况,串口显示
GY-8511紫外线传感器模块实际测试实验场景图
GY-8511紫外线传感器模块接线示意图
上午测量的室内紫外线情况(前面是昨晚测量的)
Arduino实验开源代码之二
/* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验一百四十三:ML8511紫外线传感器模块 模拟量输出UV Sensor Breakou 实验接线 ML8511 / Arduino 3.3V = 3.3V OUT = A0 GND = GND EN = 3.3V Arduino 3.3V = Arduino A1 测试之二:串口显示ML8511紫外线传感器数值(带3.3V基准校准) */ //Hardware pin definitions int UVOUT = A0; //Output from the sensor int REF_3V3 = A1; //3.3V power on the Arduino board void setup(){ Serial.begin(9600); pinMode(UVOUT, INPUT); pinMode(REF_3V3, INPUT); Serial.println("MP8511 example"); } void loop(){ int uvLevel = averageAnalogRead(UVOUT); int refLevel = averageAnalogRead(REF_3V3); //Use the 3.3V power pin as a reference to get a very accurate output value from sensor float outputVoltage = 3.3 / refLevel * uvLevel; float uvIntensity = mapfloat(outputVoltage, 0.99, 2.9, 0.0, 15.0); Serial.print("MP8511 output: "); Serial.print(uvLevel); Serial.print(" MP8511 voltage: "); Serial.print(outputVoltage); Serial.print(" UV Intensity (mW/cm^2): "); Serial.print(uvIntensity); Serial.println(); delay(100); } //Takes an average of readings on a given pin //Returns the average int averageAnalogRead(int pinToRead) { byte numberOfReadings = 8; unsigned int runningValue = 0; for (int x = 0 ; x < numberOfReadings ; x++) runningValue += analogRead(pinToRead); runningValue /= numberOfReadings; return (runningValue); } //The Arduino Map function but for floats //From: http://forum.arduino.cc/index.php?topic=3922.0 float mapfloat(float x, float in_min, float in_max, float out_min, float out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }
实验串口返回情况
ML8511分支板连接到Arduino的接线
ML8511 / Arduino的
3.3V = 3.3V
输出= A0
地=地
EN = 3.3V
Arduino 3.3V = Arduino A1
最后两个连接有些不同。将分线上的EN引脚连接到3.3V以启用设备。还要将Arduino的3.3V引脚连接到Arduino模拟引脚1。
这里使用了一个巧妙的技巧。模数转换完全依靠VCC。我们假设这是5.0V,但如果该板由USB供电,则可能高达5.25V或低至4.75V。由于这个未知的窗口,这使得Arduino上的ADC相当不准确。为了解决这个问题,我们使用了非常准确的板载3.3V参考电压(准确度在1%以内)。因此,通过在3.3V引脚上进行模数转换(将其连接到A1),然后将该读数与传感器的读数进行比较,无论VIN是多少,我们都可以推断出真实的读数(如只要高于3.4V)。
例如,我们知道Arduino上的ADC在读取VCC时将输出1023。如果从连接到3.3V的连接中读取669,那么Arduino的电压是多少?这是一个简单的比例!
VCC / 1023 = 3.3V / 669
求解VCC,我们得到5.05V。如果您有数字万用表,可以在Arduino上验证5V引脚。
既然我们确切地知道什么是VCC,我们就可以对UV电压做一个更精确的ADC:
UV_Voltage / uvLevel = 3.3 / refLevel
uvLevel这就是我们从OUT图钉中读取的内容。refLevel这就是我们在3.3V引脚上读取的内容。解决UV_Voltage,我们可以获得准确的读数。
ML8511紫外线传感器
实验开源仿真编程(linkboy V4.2)
实验串口绘图器返回情况
Arduino实验场景图