UltraV:портативный измеритель УФ-индекса
Компоненты и расходные материалы
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Об этом проекте
Не имея возможности подвергаться воздействию солнца из-за дерматологической проблемы, я использовал время, которое я бы провел на пляже, чтобы построить измеритель ультрафиолетовых лучей. UltraV.
Он построен на Arduino Nano rev3 с УФ-датчиком, преобразователем постоянного / постоянного тока для повышения напряжения батареи 3 В и небольшим OLED-дисплеем. Моей главной целью было сделать его портативным, чтобы я мог легко узнать УФ-индекс в любой момент и в любом месте.
Шаг 1. Детали и компоненты
- Микроконтроллер Arduino Nano rev.3
- УФ-датчик ML8511
- 128 × 64 OLED-дисплей (SSD1306)
- Повышающий DC-DC для MT3608
- Батарея CR2
- Держатель батареи CR2
- Переключить
- Корпус
Шаг 2. Датчик
ML8511 (Lapis Semiconductors) - это УФ-датчик, который подходит для измерения интенсивности УФ-излучения в помещении или на открытом воздухе. ML8511 оснащен внутренним усилителем, который преобразует фототок в напряжение в зависимости от интенсивности УФ-излучения. Эта уникальная функция предлагает простой интерфейс для внешних цепей, таких как АЦП. В режиме пониженного энергопотребления типичный ток в режиме ожидания составляет 0,1 мкА, что продлевает срок службы батареи.
Особенности:
- Фотодиод, чувствительный к УФ-А и УФ-В.
- Встроенный операционный усилитель
- Аналоговый выход напряжения
- Низкий ток питания (300 мкА, тип.) и малый ток в режиме ожидания (0,1 мкА, тип.)
- Маленький и тонкий корпус для поверхностного монтажа (4,0 мм x 3,7 мм x 0,73 мм, 12-контактный керамический QFN)
К сожалению, мне не удалось найти какой-либо УФ-прозрачный материал для защиты датчика. Любой вид прозрачной крышки, которую я тестировал (пластик, стекло и т. Д.), Ослаблял УФ-измерение. Лучшим выбором кажется кварцевое стекло из плавленого кварца, но я не нашел его по разумной цене, поэтому решил оставить датчик вне коробки, на открытом воздухе.
Шаг 3. Операции
Чтобы измерить, просто включите устройство и наведите его на солнце на несколько секунд, удерживая его в соответствии с направлением солнечных лучей. Затем наблюдайте за дисплеем:индекс слева всегда показывает мгновенное измерение (по одному каждые 200 мс), а показание справа - это максимальное значение, полученное во время этого сеанса:это то, что вам нужно.
В нижней левой части дисплея также отображается эквивалентная номенклатура ВОЗ (НИЗКИЙ, Умеренный, ВЫСОКИЙ, ОЧЕНЬ ВЫСОКИЙ, ЭКСТРЕМАЛЬНЫЙ) для измеренного УФ-индекса.
Шаг 4. Напряжение батареи и показания
Выбираю батарею CR2, за ее размер и емкость (800 мАч). Я использовал UltraV все лето, и батарея по-прежнему показывает 2,8 В, так что я вполне доволен выбором. Во время работы схема потребляет около 100 мА, но измерение показаний занимает не более нескольких секунд. Поскольку номинальное напряжение батареи составляет 3 В, я добавил повышающий преобразователь постоянного тока в постоянный, чтобы довести напряжение до 9 вольт, и подключил его к выводу Vin.
Для того, чтобы на дисплее отображалось напряжение аккумулятора, я использовал аналоговый вход (A2). Аналоговые входы Arduino можно использовать для измерения постоянного напряжения от 0 до 5 В, но этот метод требует калибровки. Для калибровки вам понадобится мультиметр. Сначала включите в схему последний аккумулятор (CR2) и не используйте питание USB от компьютера; Измерьте 5 В на Arduino от регулятора (находится на выводе Arduino 5V):это напряжение используется для опорного напряжения АЦП Arduino по умолчанию. Теперь поместите измеренное значение в эскиз следующим образом (предположим, я прочитал 5.023):
Voltage =((длинная) сумма / (длинная) NUM_SAMPLES * 5023) / 1024,0;
В эскизе я беру измерение напряжения как среднее значение по 10 отсчетам.
Шаг 5:Схема и подключения
Шаг 6. Программное обеспечение
Для дисплея я использовал U8g2lib, который является очень гибким и мощным для такого типа OLED-дисплеев, обеспечивая широкий выбор шрифтов и хорошие функции позиционирования.
Что касается считывания напряжения с ML8511, я использовал опорный вывод 3,3 В Arduino (с точностью до 1%) в качестве основы для преобразователя АЦП. Таким образом, выполнив аналого-цифровое преобразование на выводе 3,3 В (подключив его к A1), а затем сравнив это показание с показанием датчика, мы можем экстраполировать реальное показание, независимо от того, какой VIN ( пока оно выше 3,4 В).
int uvLevel =averageAnalogRead (UVOUT); int refLevel =averageAnalogRead (REF_3V3); float outputVoltage =3.3 / refLevel * uvLevel;
Загрузите полный код по следующей ссылке.
UltraV_OLED.ino.zip
Шаг 7. Корпус
После нескольких (неудачных) тестов по вырезанию прямоугольного окна дисплея вручную на коммерческой пластиковой коробке я решил спроектировать для него свой собственный. Итак, с помощью приложения САПР я разработал коробку и, чтобы сделать ее как можно меньше, я установил батарею CR2 снаружи на задней стороне (с держателем батареи, приклеенным к самой коробке).
Загрузите файл STL для корпуса корпуса по следующей ссылке.
UltraV.stl.zip
Шаг 8:Возможные улучшения в будущем
- использовать УФ-спектрометр для измерения фактических значений УФ-индекса в реальном времени в различных условиях (УФ-спектрометры очень дороги);
- Одновременная запись вывода ML8511 с микроконтроллером Arduino;
- Напишите алгоритм, связывающий выходные данные ML8511 с фактическим значением UVI в реальном времени в широком диапазоне атмосферных условий.
Шаг 9. Галерея изображений
Шаг 10:Кредиты
- Карлос Ортс:https://create.arduino.cc/projecthub/McOrts/mobil ...
- Форум Arduino:http://forum.arduino.cc/index.php?topic=3922.0
- Запуск электроники:https://startingelectronics.org/articles/arduino / ...
- U8g2lib:https://github.com/olikraus/u8g2/wiki/u8g2referen ...
- Всемирная организация здравоохранения, УФ-индекс:http://www.who.int/uv/intersunprogramme/activitie ...
Код
- UltraV
UltraV C / C ++
Код/ * Fabio Marzocca @ 2018 Аналого-цифровое преобразование полностью зависит от VCC. Мы предполагаем, что это 5 В, но если плата питается от USB, это может быть как 5,25 В, так и 4,75 В:http://en.wikipedia.org/wiki/USB#Power Из-за этого неизвестного окна появляется АЦП в большинстве случаев довольно неточен. Чтобы исправить это, мы используем очень точное встроенное опорное напряжение 3,3 В (с точностью до 1%). Таким образом, подключив АЦП к выводу 3,3 В (A1), а затем сравнив его с показаниями датчика, мы можем экстраполировать реальные показания независимо от того, какой VIN (при условии, что он выше 3,4 В) .v. 2.0.0 - июль 2018 г. - перенесен с ЖК-дисплея 16x2 на OLEDv. 2.0.1 - сентябрь 2018 г. - изменена функция чтения батареи * / # include#include #include U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2 (U8G2_R0, / * clock =* / SCL, / * data =* / SDA, / * сброс =* / U8X8_PIN_NONE); // Все платы без сброса дисплея # define FIRST_ROW_Y 16 # define FIRST_ROW_X 16 #define BOX_H 38 // Аппаратные определения контактовconst int UVOUT =A0; // Вывод датчика const int REF_3V3 =A1; // Питание 3.3V на плате Arduinoconst int VBATT =A2; // Напряжение батареи плавное maxUV =0; // Макс. УФ-индекс readvoid setup () {pinMode (UVOUT, INPUT); pinMode (REF_3V3, ВХОД); pinMode (VBATT, ВХОД); u8g2.begin ();} недействительный цикл () {u8g2.firstPage (); сделать {int uvLevel =averageAnalogRead (UVOUT); int refLevel =averageAnalogRead (REF_3V3); // Используйте вывод питания 3,3 В в качестве эталона, чтобы получить очень точное выходное значение от датчика с плавающей запятой outputVoltage =3.3 / refLevel * uvLevel; float uvIntensity =mapfloat (outputVoltage, 0,99, 2,6, 0,0, 15,0); // Преобразование напряжения в уровень интенсивности УФ-излучения readBattery (); если (maxUV =0) &&(категория <3)) {strcpy (strCat, "LOW"); } иначе, если ((категория> =3) &&(категория <6)) {strcpy (strCat, "УМЕРЕННЫЙ"); } иначе, если ((категория> =6) &&(категория <8)) {strcpy (strCat, "ВЫСОКИЙ!"); } иначе, если ((категория> =8) &&(категория <10)) {strcpy (strCat, "ОЧЕНЬ ВЫСОКИЙ!"); } иначе, если (категория> =11) {strcpy (strCat, «ЭКСТРЕМАЛЬНЫЙ!»); } u8g2.setCursor (0,64); u8g2.print (strCat); } // Получает среднее значение для данного вывода // Возвращает среднее значение averageAnalogRead (int pinToRead) {byte numberOfReadings =16; беззнаковое int runningValue =0; для (int x =0; x
Производственный процесс
- Делитель напряжения
- Картофельная батарея
- Что такое метр?
- Мультиметры
- Конструкция батареи
- Что такое переносной аппарат для точечной сварки?
- Портативная КИМ – стационарная или портативная?
- Понимание аккумуляторов, используемых в автомобилях
- Различные способы проверки генератора
- 7 признаков плохого или неисправного генератора