eagler8 发表于 2020-12-25 19:24:09

eagler8 发表于 2020-12-25 19:27:02

GY-8511紫外线传感器模块电原理图

eagler8 发表于 2020-12-25 19:29:46



eagler8 发表于 2020-12-25 20:06:01

/*
【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;
    }

eagler8 发表于 2020-12-25 20:09:36

GY-8511紫外线传感器模块测试室内紫外线情况,串口显示

eagler8 发表于 2020-12-25 20:15:57

GY-8511紫外线传感器模块实际测试实验场景图

eagler8 发表于 2020-12-25 20:20:41

GY-8511紫外线传感器模块接线示意图

eagler8 发表于 2020-12-26 10:50:27

上午测量的室内紫外线情况(前面是昨晚测量的)

eagler8 发表于 2020-12-26 11:17:26

/*
【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;
}

eagler8 发表于 2020-12-26 11:26:33

eagler8 发表于 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,我们可以获得准确的读数。

页: 1 [2]
查看完整版本: 【Arduino】168种传感器系列实验(154)---ML8511紫外线传感器