В данной статье мы рассмотрим подключение ультрафиолетового (УФ) датчика ML8511 к плате ESP32 для измерения интенсивности ультрафиолетового света в мВт/см^2. УФ-излучение или ультрафиолетовое излучение происходит в диапазоне длин волн от 10 нм до 400 нм в электромагнитном спектре. Поэтому для получения эффективного выходного сигнала в соответствии с УФ-светом датчик GY/ML8511 от компании lapis semiconductor очень помогает. УФ-датчик ML8511 лучше обнаруживает свет 280 нм – 390 нм, эта длина волны классифицируется как часть спектра лучей UVB-обжигания и большая часть спектра лучей UVA-загара.
Датчик ML8511 очень прост в использовании. Он выдает аналоговое напряжение, линейно связанное с измеренной интенсивностью УФ-излучения (мВт/см2). Если ваш микроконтроллер может выполнять преобразование аналогового напряжения в цифровой вид, то вы можете определять уровень УФ-излучения с помощью данного датчика. Он имеет низкий ток питания 300 мкА и низкий ток в режиме ожидания 0,1 А. Он поставляется с небольшим и тонким корпусом для поверхностного монтажа (4,0 мм x 3,7 мм x 0,73 мм (0,16″ x 0,15″ x 0,03″), 12-контактный керамический QFN).
Необходимые компоненты
- Модуль ESP32 (купить на AliExpress).
- ЖК дисплей 16x2 с модулем I2C (купить на AliExpress).
- УФ-датчик ML8511 (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
УФ-датчик ML8511
Обзор
Датчик УФ ML8511 — это простой в использовании датчик ультрафиолетового света. Датчик УФ (ультрафиолетового) ML8511 работает, выдавая аналоговый сигнал в зависимости от количества обнаруженного УФ-света. Он может быть очень полезен при создании устройств, которые предупреждают пользователя о солнечных ожогах или определяют УФ-индекс в зависимости от погодных условий.
Этот датчик наиболее эффективно обнаруживает свет в диапазоне 280-390 нм. Он классифицируется как часть спектра UVB (лучи ожогов) и большая часть спектра UVA (лучи загара). Он выдает аналоговое напряжение, которое линейно связано с измеренной интенсивностью УФ-излучения (мВт/см2) . Если ваш микроконтроллер может выполнять аналого-цифровое преобразование сигнала, то вы можете определять уровень УФ-излучения!
Блок-схема
УФ-датчик ML8511 имеет фотодиод, чувствительный к УФ-А и УФ-В. Он также имеет внутренний встроенный операционный усилитель, который преобразует фототок в выходное напряжение в зависимости от интенсивности УФ-излучения.
Выход всегда в форме аналогового напряжения. Через выход напряжения легко взаимодействовать с внешними микроконтроллерами и АЦП.
Характеристики УФ-излучения
Характеристики построены между выходным напряжением датчика и интенсивностью УФ-излучения (мВт/см²) при постоянном питании VDD. Кривые разных цветов отображают работу датчика в разных диапазонах температур.
Схема проекта
Принципиальная схема подключения УФ-датчика ML8511 к плате ESP32 приведена на следующем рисунке. Также в схеме присутствует ЖК-дисплеем с модулем I2C, который питается от 5 В, а его GND подключен к GND ESP32. Выводы SCL и SDA ЖК-дисплея I2C подключены к GPIO22 и GPIO21 ESP32.
Датчик УФ имеет 5 контактов: Vin, 3V3, GND, OUT, EN. Некоторые разновидности датчика не имеют контакта Vin, который также не используется. Контакты EN и 3V3 подключены к контакту 3,3 В ESP32. Тот же контакт 3V3 подключен к аналоговому контакту GPIO4, который используется в качестве опорного напряжения. Контакт out подключен к GPIO ESP32, а GND датчика - к GND ESP32.
Это соединение для ML8511 довольно сложное. Аналого-цифровые преобразования полностью зависят от VCC. Мы предполагаем, что это 5,0 В, но если плата питается от USB, это может быть как 5,25 В, так и 4,75 В. Из-за этого неизвестного окна это делает АЦП на ESP32 достаточно неточным. Чтобы исправить это, мы используем очень точный встроенный опорный сигнал 3,3 В (с точностью в пределах 1%). Поэтому, выполняя аналого-цифровое преобразование на выводе 3,3 В (подключив его к GPIO4), а затем сравнивая это показание с показанием с датчика, мы можем экстраполировать реалистичное показание, независимо от того, какой VIN (при условии, что он выше 3,4 В).
Исходный код программы
Исходный код программы для подключения УФ-датчика ML8511 к плате ESP32 приведен ниже. Скопируйте его и загрузите его на плату ESP32.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
#include <Wire.h> #include <LiquidCrystal_I2C.h> // Set the LCD address to 0x27 for a 16 chars and 2 line display LiquidCrystal_I2C lcd(0x27, 16, 2); int UVOUT = 15; //Output from the sensor int REF_3V3 = 4; //3.3V power on the ESP32 board void setup() { // initialize the LCD lcd.begin(21,22); // sda=21, scl=22 lcd.backlight(); pinMode(UVOUT, INPUT); pinMode(REF_3V3, INPUT); } //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); } 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; } 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.8, 0.0, 15.0); //Convert the voltage to a UV intensity level Serial.print("output: "); Serial.print(refLevel); Serial.print("ML8511 output: "); Serial.print(uvLevel); Serial.print(" / ML8511 voltage: "); Serial.print(outputVoltage); Serial.print(" / UV Intensity (mW/cm^2): "); Serial.print(uvIntensity); lcd.clear(); lcd.print("UV Ray Intensity"); lcd.setCursor(0, 1); lcd.print(uvIntensity); lcd.print(" mW/cm^2"); Serial.println(); delay(200); } |
После загрузки кода вы сможете увидеть на экране ЖК дисплея значение УФ-индекса при воздействии солнечного света.
Объяснение работы кода
1 |
UV_Voltage / uvLevel = 3.3 / refLevel |
uvLevel — это то, что мы считываем с вывода OUT. refLevel — это то, что мы считываем с вывода 3,3 В. Решая для UV_Voltage, мы можем получить точное показание.
1 2 3 4 |
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; } |
Сопоставление UV_Voltage с интенсивностью простое. Любой УФ-свет начинается с 1 В с максимумом 15 мВт/см2 около 2,8 В. В ESP32 есть встроенная функция map(), но map() не работает для float, поэтому мы запрограммировали простую функцию mapFloat() .
Следующая строка преобразует напряжение, считываемое с датчика, в интенсивность мВт/см2.
1 |
float uvIntensity = mapfloat(outputVoltage, 0.99, 2.8, 0.0, 15.0); |