极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

12
返回列表 发新帖
楼主: eagler8

【Arduino】168种传感器系列实验(154)---ML8511紫外线传感器

[复制链接]
 楼主| 发表于 2020-12-25 19:24:09 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-25 19:27:02 | 显示全部楼层
GY-8511紫外线传感器模块电原理图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-25 19:29:46 | 显示全部楼层


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-25 20:06:01 | 显示全部楼层
  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
  3.   实验一百五十四:ML8511紫外线传感器模块  模拟量输出UV Sensor Breakou
  4.   接线
  5.   ML8511             arduino uno
  6.   VCC----------------------VCC
  7.   OUT----------------------A0
  8.   GND----------------------GND
  9.   实验之一:串口显示ML8511紫外线传感器数值
  10. */

  11. int ReadUVintensityPin = A0; //Output from the sensor

  12.     void setup()
  13.     {
  14.       pinMode(ReadUVintensityPin, INPUT);
  15.       Serial.begin(9600); //open serial port, set the baud rate to 9600 bps
  16.       Serial.println("Starting up...");
  17.     }

  18.     void loop()
  19.     {
  20.       int uvLevel = averageAnalogRead(ReadUVintensityPin);

  21.       float outputVoltage = 5.0 * uvLevel/1024;
  22.       float uvIntensity = mapfloat(outputVoltage, 0.99, 2.9, 0.0, 15.0);

  23.       Serial.print("UVAnalogOutput: ");
  24.       Serial.print(uvLevel);

  25.       Serial.print(" OutputVoltage: ");
  26.       Serial.print(outputVoltage);

  27.       Serial.print(" UV Intensity: ");
  28.       Serial.print(uvIntensity);
  29.       Serial.print(" mW/cm^2");

  30.       Serial.println();
  31.       delay(100);
  32.     }

  33.     //Takes an average of readings on a given pin
  34.     //Returns the average
  35.     int averageAnalogRead(int pinToRead)
  36.     {
  37.       byte numberOfReadings = 8;
  38.       unsigned int runningValue = 0;

  39.       for(int x = 0 ; x < numberOfReadings ; x++)
  40.         runningValue += analogRead(pinToRead);
  41.       runningValue /= numberOfReadings;

  42.       return(runningValue);

  43.     }

  44.     //The Arduino Map function but for floats
  45.     float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)
  46.     {
  47.       return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
  48.     }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-25 20:09:36 | 显示全部楼层
GY-8511紫外线传感器模块测试室内紫外线情况,串口显示

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-25 20:15:57 | 显示全部楼层
GY-8511紫外线传感器模块实际测试实验场景图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-25 20:20:41 | 显示全部楼层
GY-8511紫外线传感器模块接线示意图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-26 10:50:27 | 显示全部楼层
上午测量的室内紫外线情况(前面是昨晚测量的)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-26 11:17:26 | 显示全部楼层
  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
  3.   实验一百五十四:ML8511紫外线传感器模块  模拟量输出UV Sensor Breakou

  4.   实验接线
  5.   ML8511 / Arduino
  6.   3.3V = 3.3V
  7.   OUT = A0
  8.   GND = GND
  9.   EN = 3.3V
  10.   Arduino 3.3V = Arduino A1

  11.   实验之二:串口显示ML8511紫外线传感器数值(带3.3V基准校准)
  12. */

  13. //Hardware pin definitions
  14. int UVOUT = A0; //Output from the sensor
  15. int REF_3V3 = A1; //3.3V power on the Arduino board

  16. void setup()
  17. {
  18.   Serial.begin(9600);

  19.   pinMode(UVOUT, INPUT);
  20.   pinMode(REF_3V3, INPUT);

  21.   Serial.println("MP8511 example");
  22. }

  23. void loop()
  24. {
  25.   int uvLevel = averageAnalogRead(UVOUT);
  26.   int refLevel = averageAnalogRead(REF_3V3);

  27.   //Use the 3.3V power pin as a reference to get a very accurate output value from sensor
  28.   float outputVoltage = 3.3 / refLevel * uvLevel;

  29.   float uvIntensity = mapfloat(outputVoltage, 0.99, 2.9, 0.0, 15.0);

  30.   Serial.print("MP8511 output: ");
  31.   Serial.print(uvLevel);

  32.   Serial.print(" MP8511 voltage: ");
  33.   Serial.print(outputVoltage);

  34.   Serial.print(" UV Intensity (mW/cm^2): ");
  35.   Serial.print(uvIntensity);

  36.   Serial.println();

  37.   delay(100);
  38. }

  39. //Takes an average of readings on a given pin
  40. //Returns the average
  41. int averageAnalogRead(int pinToRead)
  42. {
  43.   byte numberOfReadings = 8;
  44.   unsigned int runningValue = 0;

  45.   for (int x = 0 ; x < numberOfReadings ; x++)
  46.     runningValue += analogRead(pinToRead);
  47.   runningValue /= numberOfReadings;

  48.   return (runningValue);
  49. }

  50. //The Arduino Map function but for floats
  51. //From: http://forum.arduino.cc/index.php?topic=3922.0
  52. float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)
  53. {
  54.   return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
  55. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-26 11:26:33 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-26 11:34:12 | 显示全部楼层
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,我们可以获得准确的读数。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 14:21 , Processed in 0.041579 second(s), 15 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表