HOWTO: NukeMeter – Measuring UV-C Light Intensity

akiba 2020-03-26

After building the NukeBox, I wanted a way to measure real values for the light intensity. Theoretical models are nice, but since the stakes are so high, I wanted to see how much theory deviated from reality. What I needed was a sensor that would allow me to quantify the actual light intensity and compare it with the theoretical values calculated in the previous post. After doing some research, I picked up a cheap little module with a UV photodiode on it. These modules normally go for $2.50, although I paid a bit extra to get it fast from Amazon Prime. So let’s get to it…


NukeMeter is a device that allows you to measure the intensity of UV-C light put out by standard germicidal bulbs. It relies on a low-cost sensor and some open source hardware and software. For the prototype in this HOWTO, total cost in materials is ~$2.50 for the sensor module and around $3 for the Arduino-compatible board if you get them off eBay.

The Theory

A photodiode generates current when it’s exposed to light. A common example of it is a solar panel. This particular photodiode, the GUVA-S12SD,  is sensitive to light from 240 nm to 370 nm. This takes it through the complete UV-A to UV-C ultraviolet bands. The specific wavelength of light we’re interested in is 254 nm which is the output wavelength of the UV-C bulbs.

To measure the intensity, we’re going to rely on a specific property of these bulbs, which is over 95% of their UV light output is in the 254 nm wavelength. The typical emission spectrum for low pressure mercury bulbs, the standard germicidal bulbs, look like this:

Source: Link

Because most of the light is at a particular wavelength within the UV bands, we won’t need to play around with light filters or do any specific tricks to get the light intensity. We can assume that almost all the light is UV-C at 254 nm and just add a derating factor of something like 2-5% from the calculated value.

Now we need to jump into the datasheet for the photodiode since it holds key information we’ll need to calculate the light intensity. One of the important parameters to take note of is the active area of the photodiode. This is the portion that is excitable by UV light and will generate current. If we take the power hitting the diode and divide by the active area, that will give us the light intensity in mW/cm^2.

Another important figure in the datasheet is the responsivity curve. This describes how responsive the photodiode is to different wavelengths of UV light. The responsivity at 260 nm (~254 nm) is approximately 0.04 A/W (amps per watt). This relationship means that if we can measure the output current of the photodiode, we can get the total power of incoming UV light on it which should be almost all at 254 nm. Once we have the total power, we just need to divide by the active area and that will give the intensity at that point:

Intensity = (Total power) / (Active Area)

Now that we have our strategy sorted for getting the intensity, the next challenge is to get the photodiode to spit out the current. Once we have the value for the diode current, we can convert that to the intensity based on what was just discussed. Typical photodiode currents are extremely small, usually measured on the order of nano-amperes or billionths of an ampere. To measure currents this small, we (electronics people) usually use a mechanism called a transimpedance amplifier.

A transimpedance amplifier is just an op-amp in a specific configuration. It usually uses a huge feedback resistor that provides what’s called transimpedance gain, or essentially converts a very small current into a measurable voltage. Luckily, the cheapie UV photodiode module comes with a transimpedance amplifier. Here is the schematic circuit diagram for the module courtesy of Proto Supplies:

If you want the gory details, here’s a rough play-by-play. Otherwise, you might want to skip the next two paragraphs. The photosensor is exposed to UV-light and puts out a current, say 100 nA. The 10 megaohm (10M) resistor converts that current to 1V. The 3.3k and 1k resistor divider means that the voltage at pin 1 of the op-amp will be at 4.3V. At this point, we’re actually pretty good. Unfortunately the designer of the module fed the output to a second amplifier stage with a gain of 6. That would put the final output voltage at over 25V which is not possible with a 5V supply. That just means the output voltage would saturate at 5V and we wouldn’t be able to get any information from that value. Needless to say, this module was designed for measuring very weak UV light, i.e. outdoor sunlight. We’ll have to do a bit of surgery on the module if we want to use it to measure the UV-C germicidal lamps at fairly close range.

Luckily the modifications aren’t too bad. We mainly just need to nullify the second amplifier’s gain. That means the voltage at the output of the first op-amp will be the same voltage we measure at the output of the second. In other words, we want it to have a gain of 1. To do this we need to remove the 1k resistor and change the 5.1k resistor to 0 ohms. In this configuration, the second op-amp is in a follower configuration or follows the input. There are very useful purposes for follower circuits, but not really in this case. I’m just trying to avoid cutting the circuit board directly.

Now that the modifications are done, we’ve finished our game plan for measuring the intensity of UV-C light. It consists of the following:

  • Place sensor in location we want to measure the intensity.
  • Assuming the light is turned on, measure voltage at output.
  • Convert the voltage to current using the following formula:

(Current from diode) = (Ouptut Voltage) / (Voltage Gain * Transimpedance Gain) 

where Voltage Gain = 4.3 (due to the resistor divider) and transimpedance gain is 10^7.

  • Convert the current to total incident power on diode

(Total Power) = (Current from diode) / (Responsivity at 260 nm)

Where Responsivity at 260 nm is found from the datasheet to be 0.04 A/W.

  • Finally divide the total power by the excitable active area of the diode to get intensity. You’ll also have to fiddle around with the units a bit to get the intensity in mW/cm^2, too.

Intensity = (Total Power) / (Active Area)

where the active area is 0.076 mm^2 or 0.00076 cm^2.

Yay! We can now measure the intensity of the UV-C lights.

The Build

Here’s a shot of the photodiode module mounted on a breadboard. Incidentally, this is the Hackerfarm FredBoard, a board we designed for teaching Arduino workshops at Hackerfarm.

Some modifications will be necessary on the sensor module board. If you don’t feel comfortable with soldering and removing/placing surface mount components, I highly recommend contacting a local hackerspace and inquiring about getting some help.

Now that the sensor board is modified, we can mount it in our test fixture and measure the UV-C light intensity. But first….SAFETY!!!

Cover up all exposed skin and wear protective UV-blocking eyewear.

I started off by taping the sensor to my bench which will be my test fixture. In this experiment, I’m only using the Arduino to provide a 5V supply to the sensor module. I’m manually reading the voltage output using a multimeter.

I then turned on the UV-C light and covered the sensor. I also made sure the sensor was placed directly underneath the light bulb in the center.

The voltage coming from the sensor was 1.5869V according to my benchtop multimeter. This corresponds to a whopping 37 nA or 37 billionths of an ampere.

Going through the calculations we outlined above, this gives us an incident power of 1.21 mW/cm^2. From the previous NukeBox post, we calculated 1.364 mW/cm^2. So the actual intensity seems to correlate with the theoretical model pretty well.

Now that I’m able to measure the intensity of the UV-C bulbs, I decided to automate it. I connected the output of the sensor module to the “Analog 0” (A0) pin of the Arduino. I then wrote some Arduino code to automatically capture and calculate the UV-C light intensity.

You can find the software at the hackerfarm github repo here.

This allowed me to do some interesting things. I first wanted to check how the light intensity of the UV-C bulbs varied with time. I heard that they needed a specific warmup time so I thought I’d try and see for myself.

I kept the lamp off for a few minutes. This was also a good time to take a break and go out for a walk. When I returned, I turned the lamp on and recorded the intensity values. You can see that the lamp does need a specific warmup time. One minute gets you around 80% of the way there and by 5 minutes, you’ve pretty much stabilized.

I also decided to check the intensity variance along the axis of the lamp bulb. The ideal intensity model assumes the lamp is uniformly radiating and an infinitely long bulb. I wanted to check how much reality deviates from the ideal model.

I was surprised to find that there was very significant deviation in the light intensity depending on the location along the bulb axis. The two ends of the bulb were the weakest radiators whereas the center of the bulb was unsurprisingly the strongest. This means that the intensity variation would need to be taken into account when using the lamp as a sterilizer.


I think there’s a lot that can be improved with NukeMeter. One of the most obvious improvements would be to calibrate it against a known reference. This could be a calibrated UV-C sensor or with a known source and known intensity a distance X away from it. If anyone knows a lab that can help us with calibration, that would be amazing!

I also think that it could be packaged up in an easy-to-use fashion so that non-electronics professionals would be able to use it out of the box.

I’ll probably be adding more to NukekBox and NukeMeter so stay tuned.

Stay safe everyone and lots of love and admiration from HackerFarm 🙂


  1. Hi looks like a cool project. Can you post the diagram or pinouts for connecting the sensor to the arduino?

  2. Hi. The pinouts are actually quite simple. The (+) pin on the sensor goes to 5V, (-) pin goes to GND, and the signal pin goes to Analog Pin 0 (A0). With that, you should be up and running on the code.

  3. Great info. I’ve recently purchased a couple of T8 UV linears and was trying to determine an easy way to quantify the output, short of $200 for a pack of one-time-use sensors. At the minimum I can see uncalibrated dosage with this; ideally, I hope to connect a relay to initiate the lamps, and include an integration loop to shut off the lamps after a predetermined dosage.

  4. Thank you for your post. I built a UVC chamber to sterilize PPE at our emergency department. I would love to quantify how much UVC light is actually reaching the masks using your method. It looks like you replaced the chip labeled 512 (resistor?) with a 00 resistor? I was thinking of a piece of wire. I am having trouble finding the 1K resistor to remove. I think it is the chip to the right of the 512 one but can’t tell from your photo. It looks like it is still there. Can you please clarify? Thanks again.

  5. Hi Todd. Yes, you can short the 512 (5.1k) resistor with a piece of wire. The 1k resistor that was removed was the one immediately to the right of the 5.1k resistor, also. If you have doubts, feel free to send me a pic of your module and I can confirm. I sent you an email. Also the pic of the module in this post still hsa all of its original components and has not been modified yet. Hope that helps!

  6. Posting the exchange via email for other people to reference:
    Todd: “Thank you for the clarification. I removed the 5.1 and covered it with a solder blob. Connecting my multimeter to signal and ground I get 64mV at best. I am using a 25w UV-c off of AliExpress. Is there anyway to tell if the values are correct vs the bulb isn’t that good ? Perhaps I shouldn’t cover the 5.1 with a solder blob. It is very hard to see. ”

    Akiba: “> If you move it closer to the light source it should get much stronger. You should be able to see the output increase. If you don’t, it’s possible there’s an issue somewhere. The voltage I get with a 10W bulb at 7 cm is around 1.8V. This correlates to around 1.5 mW/cm^2.”

    Todd: “Thank you again so much. I didn’t realize I had to power the sensor with 5V. Once I did it I got 4.94V consistently. With the light off I got 10mV from ambient fluorescent light in the room. With direct application of the 25W bulb I got the 4.94 which correlates to 3.78mW/cm2. Assuming the variables are the same as in your example this would explain why my 25 watt bulb puts out almost exactly 2.5x the intensity of your 10W bulb. I did not see a variation along the length of the tube nor did I notice much warm up variation. Pretty much hit 4.94V right away and dropped off as soon as I move the light away. I was probably 8cm away.

    Thanks again. I will research the links to see what the appropriate time to expose masks to for germicidal activity. This is huge. Thank you so much.

    Akiba: “So happy to hear you got it working 🙂
    Also we are trying to aggregate links about UVGI sterilization at the Hyjeia site. Hopefully it saves you some time:
    Good luck and keep us posted on how it goes!

    Akiba: Yay!

  7. Hi, great posts in here, I’m not techy to say the least but I’m trying to build a UV-C and Ozone machine for sterilising masks.
    Can anyone advise if there are stand alone UV-C Dosimeters with multiple sensors or has anyone build some in the UK?
    I’m in the construction industry and the UK Gov has let us continue working but with the 2m social distancing in place.
    We have good policing with a 1 to 7 ration of supervision but want the lads to use FFP3 masks.
    I have masks and filters but the suppliers have rightfully diverted manufacture to the healthcare. I would like to be able to help the NHS and my construction projects by building this machine. Before this Epidemic even got crazy I bought some 15W UV-C bulbs (Ozram HNS15W G3 T8) and an ozone generator.

    I was considering using my hog roast machine which has an attachment with racks for doing around 50 chickens (Neve used) and mounting the bulbs in an array on the lid to overlap and not have low emission areas. More bulbs on the bottom with Mirrors on the sides and bottom with the ozone generator located near the plug hole. (Will probably need to flip the masks from time to time or just use a glass panel inside instead of the racks)

    Any thoughts appreciated
    The roasting machine is stainless steel and should be a good containment vessel.

  8. Hi. You can calculate the theoretical minimum time with the following:
    Intensity = Power / (2*PI*r*L)
    where r = distance from light and L = length of bulb.

    Dosage = Intensity * time = (Power * time) / (2*PI*r*L)
    Using the following values for your bulb:
    Power (UV-C) = 5W = 5000 mW
    L = 43 cm
    Dosage (for influenza) = 10 mWs/cm^2

    You get the following relationship:
    time = 0.54* r
    If you put the masks at r=10cm, then the MINIMUM time would be 5.4 seconds to inactivate influenza to 99.9% assuming uniform power radiation. In reality, it won’t be uniform so people irradiate masks for around 10-15 minutes.
    Also there are UV-C meters available via ebay.
    Hope this helps.

  9. Reposting email thread:

    Hi Akiba,
    I am attempting to create the NukeMeter you wrote about. I got the sensor, modified it, connected it to an Arduino board. I uploaded your code to it and then when I look at the “Serial Monitor”, all I’m seeing is gibberish. Here’s a link to what I’m seeing. Any tips on what I’m doing wrong? Sorry if it’s something basic. This is my first time using an Arduino board.

    In Serial Monitor, your baudrate is set to the incorrect speed. Since I am initializing the serial port to 57600 bps, the baudrate in the Serial Monitor needs to also match. It’s currently set to 9600 bps from the screenshot. Can you please set this to 57600 bps and try that out?

    It works! I feel like an idiot but don’t care. Thank you so much! I’ll be making NukeBox’s for my family and friends now with a higher sense of confidence that they’ll work. Thanks for the tutorial and if you ever setup a donation page or a “” page, let me know!

    I’m happy it’s working. Good luck with your UV box and I’m so happy that you will be making more for your family and others. Please keep us posted on how that goes. In the future, we may set up a donation page to allow us to buy calibration equipment for the UV research so will let you know.
    In the meantime, stay safe and take care.

  10. Reposting email thread:
    Hi Hackerfarm,
    I am a nurse in one of the COVID Referral Centers here in the Philippines and I recieved donations of UVC lamps and we are looking forward to turn it to sterilization boxes. I need some help in computing the right dimensions for the placement of bulb, right size for the box and the exposure time to kill the virus. Here are the specifics of the UVC lamps I recieved: Philips TUV 25W T5 4P-SE, 25w ballast. I hope you can help us. If you need more information, you can send me an email in the address provided.

    In the NukeBox article, it explains how to calculate the theoretical intensity and dosage. I would recommend using the following numbers:
    r = 10 cm, ie: mask is 10 cm from light
    L = 50 cm, ie: Philips TUV 25W T5 is 50 cm long P = 8000 mW, from datasheet, UV-C power is 8W or 8000 mW D = 10 mWs/cm^2, this is for influenza virus. SARS (original) is around 5 mWs/cm^2

    If you put all of these together, the MINIMUM dosage time is around 4 seconds for 99.9% inactivation. Most places do around 10x to 100x this dosage and would leave the masks inside for around 10-15 minutes. This is mainly to be safe.

    If your masks are a different distance from the light, using the other parameters above, the MINIMUM dosage time would be:
    time = r / 2.55

    I would still recommend 10-15 minutes exposure though to be safe.
    Hope that helps.

    Were trying to use 4 UV lamps so we can accomodate to light all sides of the items. For now were looking to using it to everyday items of nurses such as phones, keys, ballpens, self inking stamps etc. Then maybe eventually and I hope not when stocks of PPEs run out, N95s. Basically we think that 4 bulbs are a lot stronger than a single bulb, do you think we can make the area for items bigger? What do you think? Attached is the rough draft Im in progress of making. I just started it an hour ago when lamps arrived.

    Yes, I hope you don’t have to reuse the PPE. Ha ha ha.
    If use more bulbs, you can sterilize faster. Best case is to use a UV dosimeter to quantitatively see dosage and calculate sterilize time. Otherwise without, I’d use the theoretical calculations and then multiply by something like 10 to 100.

  11. Hi Akiba, I’m recently developing some UVC LED lights. Please let me know where I can buy this NukeMeter

  12. Hi, you can actually buy the sensor module and reproduce what I’ve done. It’s using the GUVA-S12SD sensor so if you search for that on Amazon, eBay, or ecommerce site in your locale, you can probably find something.We are also working with open hardware manufacturers to make dosimeters available but that might take some time.

  13. Thanks a lot ~ I don’t know how to work with Arduino board >_< so I may have to buy one in the open market.
    I'll keep my eye on your projects to see references. Thanks anyway.

Post a new comment