Ultraviolet radiation exposure monitoring with acoustic feedback as a wearable UV sensor solution for blind/visually impaired people.
IntroductionProlonged exposure to ultraviolet (UV) radiation from the sun poses a health risk to the skin and eyes that can lead to premature aging and even cancer.
Individuals with visual impairment may not perceive visual cues like shadows or changes in sunlight intensity. They might not realize when they are exposed to direct sunlight or when UV levels are high. While people usually may get a 'visual impression' of their exposure to intense sunlight, blind people might miss this especially when e.g. cool air, windchill, etc. also prevents the sensation of warmth on exposed skin. Without visual cues, it's harder to assess the need for sun protection and to recognize the importance of sunscreen, hats, or sunglasses.
With this in mind, the idea is to design a prototype of a wearable or portable UV index meter with audible notification for blind people.
The proposed solution implements the prototype of an UV radiation exposure monitoring application to assist in the prevention of diseases caused by over exposition to solar UV radiation. Like a usual UV meter, it measures the current intensity level of ultraviolet radiation and (optionally) displays it together with the corresponding UV index and risk level. Additionally it also gives an audible representation of the UV index as sequence of tones.
Note: The original project has been extended by alternative and enhanced implementations which are described in detail in the following sub-projects:
- Audible UV Index Meter w/ UNIHIKER
- UV Index Meter BLE Beacon (with the nRF52840 DK)
The solution can be build with
- a MCU board, operational power 3.3v - 5.v, at least one available analog pin and two available digital pins, Arduino development environment compatible
- a GUVA-S12D UV sensor board
- a buzzer
- a button
- a (rechargeable) battery
The prototype described here is based on a Seeed Studio Wio Terminal since this device already provides built-in buttons, a built-in buzzer and a TFT display for testing and demonstration purposes.
HardwareSeeed Studio Wio TerminalFor screen readers: The following image shows a Seeed Studio Wio Terminal device. It's a white colored small (72 x 57 x 12 mm) rectangular shaped device with round corners. It features a 2,4" screen (appears black) and a blue 4-way-button on the lower right front corner. In the lower left front corner are outlets for the internal buzzer. On the top are 3 blue buttons. At the bottom and on the right side are two connector ports (Grove port). At the left side is a slide switch to power on / reset the device ...
The Wio Terminal is a SAMD51-based microcontroller with Wireless Connectivity powered by Realtek RTL8720DN that’s compatible with Arduino and MicroPython. Currently, wireless connectivity is only supported by Arduino. It runs at 120MHz (Boost up to 200MHz), 4MB External Flash and 192KB RAM. It supports both Bluetooth and Wi-Fi providing backbone for IoT projects. The Wio Terminal itself is equipped with a 2.4” LCD Screen, onboard IMU(LIS3DHTR), Microphone, Buzzer, microSD card slot, Light sensor, and Infrared Emitter(IR 940nm). On top of that, it also has two multifunctional Grove ports for Grove Ecosystem and 40 Raspberry pi compatible pin GPIO for more add-ons.
Features:
- Highly Integrated Design: MCU, LCD, WIFI, BT, IMU, Microphone, Speaker, microSD Card, Light Sensor, 5-Way Switch, Infrared Emitter (IR 940nm), Crypto-authentication Ready
- Powered by Microchip ATSAMD51P19: ARM Cortex-M4F core running at 120MHz(Boost up to 200MHz) and 4 MB External Flash, 192 KB RAM
- Comprehensive Protocol Support: SPI, I2C, I2S, ADC, DAC, PWM, UART(Serial)
- Powerful Wireless Connectivity (supported only by Arduino) powered by Realtek RTL8720DN: Dual Band 2.4Ghz / 5Ghz Wi-Fi (802.11 a/b/g/n) and BLE / BLE 5.0
- USB OTG Support: USB Host /USB Client
- Grove Ecosystem
- Software Support: Arduino, MicroPython, ArduPy and AT Firmware
For more details see the "Get Started with Wio Terminal" guide.
DFRobot Gravity Analog UV Sensor V2For screen readers: The following image shows a DFRobot Gravity Analog UV Sensor V2 sensor board: A small PCB with the actual sensor on the left side and a 3 pin connector on the right side. It is labeled "UV Sensor V2" ...
The DFRobot Gravity Analog UV Sensor V2 with GUVA-S12SD chip is suitable for detecting the UV radiation in sunlight. It is a UV sensor that uses a UV photodiode to detect the 240-370nm range of light (which covers UVB and most of UVA spectrum). It can detect the UV wavelength of 200-370nm and has a fast response time with linear analog voltage signal output that changes with the intensity of UV light. The output voltage of the module is proportional to the intensity of the UV light detected by the sensor. The sensor is suitable for detecting the UV radiation in sunlight and can be used in UV Index Monitoring, DIY projects, UV-A Lamp Monitoring, Plants growing Environmental monitoring, etc. See the product page and the documentation for more details.
Software / Libraries / ServicesLvGL Graphics Library for Wio TerminalThe LvGL (Light and Versatile Graphics Library) is an open-source graphics library providing everything you need to create embedded GUI with easy-to-use graphical elements, beautiful visual effects and low memory footprint. For instructions on how to use LvGL for Wio Terminal refer to this guide.
Arduino library for the GUVA-S12SD UV sensorThis library simplifies the handling with a GUVA-S12SD analog UV sensor and provides functions to calculate the UV level (mW/m²) and the UV index from the output voltage reading from the sensor.
Additional components- Wires
For implementing this projects the following prerequisites need to be fulfilled:
- All hardware components as listed above are available and at hand.
- The Arduino IDE has been installed and configured for the Wio Terminal as described here.
- All of the libraries listed above have been added to the Arduino IDE (Sketch -> Include Library -> Manage Libraries / Add .ZIP Library)
The Gravity: GUVA-S12SD Analog UV Sensor comes with one Gravity: Analog Sensor Cable for Arduino with a 3 pin JST connector to connect to the sensor and a servo type connector with pins for signal (blue), GND (black) and PWR (red).
This sensor needs to be connected to the MCU Board as follows:
- Signal - blue wire - to A0
- PWR - red wire - to 3.3V / 5.0V
- GND - black wire - to GND
For this prototype the DFRobot Gravity Analog UV Sensor V2 (or another GUVA-S12D) sensor is connected to the Grove configurable A/D port (right Grove port) on the Seeed Studio Wio Terminal:
For screen readers: The following image shows the schematics for connecting the UV sensor to the Wio Terminal as described above ...
For screen readers: The following image shows a photo of the completed setup: The DFRobot Gravity Analog UV Sensor V2 connect to the Seeed Studio Wio Terminal as described above ...
Ultraviolet (UV) "light" is a form of electromagnetic radiation with wavelength from 200 nm to 400 nm, shorter than that of visible light (400 nm to 750 nm), but longer than X-rays. UV radiation is present in sunlight and constitutes about 10% of the total electromagnetic radiation output from the Sun. Short-wave ultraviolet light can damage DNA and sterilize surfaces with which it comes into contact. For humans, suntan and sunburn are familiar effects of exposure of the skin to UV light, along with an increased risk of skin cancer. UV radiation is divided into three bands of wavelength:
- UVA (315-400 nm)
- UVB (280-315 nm)
- UVC (100-280 nm).
Through absorption of the earth's atmosphere in the ozone layer, the UVC spectrum is completely blocked and the solar radiation in the UVB spectrum does barely reach the earth's surface. The less dangerous UVA radiation is far less absorbed by the atmosphere. UVA radiation is less powerful than UVB radiation, but highly penetrating. It can reach the skin and is responsible for photoaging and the onset of different forms of skin cancer
UV radiation intensity is measured in milliwatts per square-meter (mW/m²).
The output voltage of the GUVA-S12D sensor module is proportional to the intensity of the UV light detected by the sensor. The output voltage is:
Vo = 4.3 * Diode-Current-in-uA.
So if the photocurrent is 1uA (9 mW/cm²), the output voltage is 4.3V.
The function GUVA_S12SD::getUvLevel
of the Arduino library for the GUVA-S12SD UV sensor converts the output voltage (mV) reading from the sensor to the corresponding UV level:
* GUVA_S12SD_UV_LEVEL
Function to convert sensor output voltage (mV) to mW/m^2
for a GUVA-S12D based analog UV sensor: "The output voltage is: Vo = 4.3 * Diode-Current-in-uA.
So if the photocurrent is 1uA (9 mW/cm^2), the output voltage is 4.3V."
*/
float GUVA_S12SD::getUvLevel(float mV);
UV Index & RiskIn order to estimate the energy behind UV radiation and the risk level associated with it, the UV Index was established. The UV Index describes the expected daily peak level of the erythemal UV irradiance at ground level (The word 'erythema' means an abnormal redness of the skin, such as is caused by spending too much time in the sun - a sunburn is damage to your skin cells caused by UV radiation).
Its an open-top linear scale - 0 to ≥ 11, giving guideline values for the UV irradiance. The higher the UV Index, the higher the UV irradiance and the faster / the more severe a sunburn can occur when skin is not protected.
The UV Index has been defined by the WHO and is uniform worldwide - e.g., a UV Index of 7 in Europe means exactly the same as the same value in Africa or North America. For more information see the "Global solar UV index : a practical guide" published by the WHO.
For screen readers: The following image shows a diagram with the eleven UV index levels along with the associated risk level mapping as described below, The UV index and risk levels are shown with the associated colors: Green for low risk/safe, yellow for moderate risk, orange and red for high and very high risk and purple for extreme risk ...
The safe UV index depends on the individual’s skin type and the duration of exposure. However, as a general rule,
- an UV index of 2 or lower is considered safe for all skin types
- An UV index of 3 to 5 is considered moderate and requires some protection.
- An UV index of 6 to 7 is considered high and requires protection such as a hat, sunglasses, and sunscreen.
- An UV index of 8 to 10 is considered very high and requires extra protection such as seeking shade during midday hours and wearing protective clothing.
- An UV index of 11 or higher is considered extreme and requires all possible precautions to be taken.
For more information see e.g.,
- WHO - Newsroom - Q&A - Radiation: The ultraviolet (UV) index
- US EPA - Health Effects of UV Radiation
- US EPA - UV Index Scale
The function GUVA_S12SD::getUvIndex
of the Arduino library for the GUVA-S12SD UV sensor converts the output voltage reading from the sensor to the corresponding UV index as shown in the following table:
For screen readers: The following image shows a diagram with the eleven UV index levels mapped to the maximum output voltage for the UV sensor to be expected for this UV index ...
/* GUVA_S12SD_UV_INDEX
Function to convert sensor output voltage (mV) to UV index
for a GUVA-S12D based analog UV sensor based on a conversion table.
See http://www.esp32learning.com/code/esp32-and-guva-s12sd-uv-sensor-example.php
for conversion table ...
*/
float GUVA_S12SD::getUvIndex(float vout);
Measurement PresentationThe measured UV level and the derived UV index / risk level are presented visually and acoustical.
DisplayThe measurement obtained by the UV sensor
- UV irradiance (mW/m²)
- and the estimated UV index are displayed as numerical values.
The derived risk level is displayed as a line meter, changing its background color accordingly matching the colors of the UV Index scale, and the risk category (low, moderate, high, very high and extreme) as text.
For screen readers: The following image shows an example of the display screen as described above ...
For the LVGL based implementation refer to the code file aum_display.cpp
in the repository.
The UV index is presented as a sequence of tones:
One base tone C at the beginning of each sequence followed by
- a number of F tones corresponding to (rounded) UV index levels 1 - 5 or
- a number of A tones corresponding to (rounded) UV index levels 6 - 10 minus 5, following a sequence of five F tones or
- a sequence of five F tone followed by five A tone and one C tone (next octave) for (rounded) UV index levels 11+.
For example, if the UV index is 4 the tone sequence is C,F,F,F,F and if the UV index is 6.7 the tone sequence is C,F,F,F,F,F,A,A
Represented as score the tone sequence looks like shown in the following image:
The following video provides a sample of the tone sequences:
OperationAfter power on the device immediately starts measuring and presenting the result for 5 seconds. Then the operation stops until Button A (third button in the middle on the top of the Wio Terminal) is pressed, which will start measurement and presentation (visual & acoustic) for 10 seconds.
Test & DemoThe device has been tested indoors with an UV lamp:
For screen readers: The following image shows a photo of the device being tested with an UV lamp. The sensor is placed directly in front of the lamp. The screen of the device shows an UV level of 160.1 milliwatts per square-meter, an UV index of 8.6 and a very high risk level (red) ...
For screen readers: The following video shows the device being tested with an UV lamp. The sensor is placed in front of the lamp. The screen of the device shows an UV level of 109.3 milliwatts per square-meter, an UV index of 5.2 and a moderate risk level (yellow) ...
The device has been also tested outdoors on a partly cloudy day at noon. The measured UV index values matched the readings from the nearest (~ 30 km) official measurement station as shown in the UV Indeks app (Apple App Store/Google Play) :
For screen readers: The following video shows the device being tested outdoors. The sensor is placed on table in plain sunlight. The screen of the device shows UV index levels between 3.1 and 3.8 of 5.2 and a moderate risk level (yellow). The index level shown on the "UV Indeks" was 3.4 as measured by the nearest official station ...
Power consumptionPower consumption has been tested with the Nordic Semiconductor Power Profiler Kit II and the Power Profiler app running in the nRF Connect for Desktop framework in source meter mode connected to the Wio Terminal (device under test = DUT) with
- PPK2-VOUT connected to DUT-GPIO Pin 2 (5V)
- PPK2-GND connected to DUT-GPIO Pin 6 (GND)
During measurement & presentation the average power consumption at 5V is 118 mA and the maximum power consumption is 170 mA:
In standby mode the average power consumption at 5V is 64 mA and the maximum power consumption is 72 mA:
The (sub-)project Audible UV Index Meter w/ UNIHIKER shows an alternative implementation of the audible UV meter on a DFRobot UNIHIKER written in Python.
The DFRobot UNIHIKER is a compact and feature-rich single-board computer (SBC) designed to offer a unique experience for users interested in coding and electronics. It comes with a 2.8-inch touchscreen, built-in sensors like a light sensor, accelerometer, gyroscope, and microphone, and offers IoT capabilities.
This device is equipped with a Quad-Core ARM Cortex-A35 CPU, 512MB RAM, and 16GB Flash storage. It runs on Debian OS and supports Wi-Fi and Bluetooth 4.0 connectivity. The UNIHIKER is also capable of communicating with various analog/digital/I2C/UART/SPI sensors and actuators, thanks to its built-in co-processor.
The UNIHIKER primarily supports Python for programming. It comes with a built-in Jupyter Notebook, which is a browser-based programming environment that allows developers to write and execute Python code using a smartphone or tablet. Additionally, the UNIHIKER can be programmed using various text editors and IDEs such as VS Code.
The integrated PinPong control library is also Python-based, enabling developers to directly control the UNIHIKER’s built-in sensors and hundreds of connected sensors and actuators.
For more details see the introduction and documentation at unihiker.com .
DFRobot Gravity Analog UV Sensor V2see above ...
Software / Libraries / ServicesImplementationFor a detailed description of the implementation please see the sub-project Audible UV Index Meter w/ UNIHIKER. The project is implemented as Jupyter notebook which can be copied to the UNIHIKER.
TestThe project UV Index Meter BLE Beacon describes a solution to broadcast the acquired UV index via an Bluetooth Low Energy beacon. The transmitted UV index can be received and displayed by any BLE beacon scanning application on a mobile device:
The solution may be enhanced with these considerations:
1. Location and reading history
An interface with the log of the location, timings, UV index, and other selectable parameters may be provided to allow users to understand the history of his/her UV exposure. This will allow the user to keep track and avoid certain areas or timings that may be harmful.
2. Recommendations for recovery or prevention
Based on the readings obtained and the profile of the user, the design can be enhanced to provide possible prevention and recovery measures when the UV index approaches or exceeds a user-defined threshold.
3. Powering the device
To allow longer usage of the device, it can be designed to be powered by solar energy as an additional power source since it will usually be used outdoors under the sun.
The first two options have been incorporated into an enhanced version of the first alternative implementation (Audible UV Index Meter w/ UNIHIKER):
1. Location and reading history
Location and time data can be obtained by connecting an GPS-capable device to the UNHIKER - e.g., the Blues Notecard Cellular.
The Blues Notecard Cellular mounted on a Notecarrier A board can be simply connected to the UNIHIKER's USB port
and accessed by the Python application via the note-python Python library provided by Blues
If location and and time data are available the measured UV index and UV level are logged together with location and timestamp to a CSV file on the device which can be downloaded later from the UNIHIKER for further processing and visualization (e.g., with Google Maps):
uv_index,uv_level,time,lat,lon
0,0,2024-07-18 14:34:41+00:00,56.69151198205,9.96864314570003
0,0,2024-07-18 14:38:11+00:00,56.69151198205,9.96864314570003
1.72687224669604,41.0232558139535,2024-07-18 14:46:09+00:00,56.69426198205,10.0136431457
4.20477137176938,88.5348837209302,2024-07-18 14:47:11+00:00,56.69426198205,10.0136431457
0.08,0.837209302325581,2024-07-18 14:48:12+00:00,56.69426198205,10.0136431457
0.26,2.72093023255814,2024-07-18 14:49:14+00:00,56.69426198205,10.0136431457
2.57547169811321,57.1395348837209,2024-07-18 14:50:15+00:00,56.69426198205,10.0136431457
1.09251101321586,25.953488372093,2024-07-18 14:51:16+00:00,56.69426198205,10.0136431457
1.54185022026432,36.6279069767442,2024-07-18 14:52:17+00:00,56.69426198205,10.0136431457
2.29245283018868,50.8604651162791,2024-07-18 14:53:23+00:00,56.6941238153833,9.96849810403333
2.39622641509434,53.1627906976744,2024-07-18 14:54:24+00:00,56.6940708153833,9.96841093736667
This feature has been implemented in an enhanced version of the "Audible UV Index Meter w/ UNIHIKER": Enhanced Audible UV Index Meter (UNIHIKER).
2. Recommendations for recovery or prevention
The application can be configured to display information/advice texts associated with the derived risk levels. As default the general advice texts given by the WHO (see the "Global solar UV index : a practical guide", page 8, Figure 2: Recommended sun protection scheme with simple “sound bite” messages) are pre-configured:
[RiskInfoText]
enabled = True
low = NO PROTECTION REQUIRED - You can safely enjoy being outside!
moderate = PROTECTION REQUIRED - Seek shade during midday hours! Slip on a shirt, slop on sunscreen and slap on hat!
high = PROTECTION REQUIRED - Seek shade during midday hours! Slip on a shirt, slop on sunscreen and slap on hat!
very high = EXTRA PROTECTION - Avoid being outside during midday hours! Make sure you seek shade! Shirt, sunscreen and hat are a must!
extreme = EXTRA PROTECTION - Avoid being outside during midday hours! Make sure you seek shade! Shirt, sunscreen and hat are a must!
If an appropriate audio output device can be connected to the UNIHIKER - e.g., a Bluetooth speaker/earphones or a an USB speaker - the application can be configured to use this device to play an audio file (WAV) associated to the determined risk level:
[RiskInfoAudio]
enabled = False
audiofilenameprefix = audio/UV_risk_level_
audiofilenamesuffix = .wav
Additionally an alert threshold for the UV index can be configured to warn the user acoustically when the measured UV index reaches this threshold:
[Alert]
enabled = True
alertuvindex = 7
alertinterval = 60
For details check the code (Jupyter Notebook) in the repository.
3. Powering the device
While powering a portable or wearable device - designed to alert the user to avoid excessive sunlight exposure - with solar energy may be considered impractical or contradictory, it can make sense for a stationary system like the UV Index Meter BLE Beacon described above:
-----
Addenda & ErrataPlease see here ...
Change Log2024-04-06: Project created
2024-04-08: Original project submitted
2024-04-21: Descriptions for images ("For screen readers ...") added
2024-06-11:
Change log added
Alternative implementation and reference to (sub)projectAudible UV Index Meter w/ UNIHIKER
added
2024-06-12:
Alternative implementation and reference to (sub)project
UV Index Meter BLE Beacon
added
2024-07-18:
Added images for alternative implementation II
Added "Enhancements - Ideas & Solutions" section2024-07-21:
Finished "Enhancements - Ideas & Solutions" section
Changed cover image2024-07-22: Added link to
addenda & errata project
2024-07-27: Added demo videos
2024-10-01:
Minor corrections.
Comments