Measuring Airborne Soot Particles (Low Cost Absorption Photometer)



Introduction: Measuring Airborne Soot Particles (Low Cost Absorption Photometer)

About: Joshua 1:9 Have I not commanded you? Be strong and courageous. Do not be afraid; do not be discouraged, for the Lord your God will be with you wherever you go.

Hello everybody. My Name is Joshua. I am a student at the FHNW ( in
Switzerland and present you my final project, which I developed at the Institute for Sensors and Electronics in the Aerosol Technology Group ( For my bachelor thesis, I developed an inexpensive soot particle measuring device (Absorption Photometer) that costs only a fraction of the usual expensive devices with similar functionality. This project is now about to be published, so if you want to measure the air pollution (or at least part of it) in your area, you can start now 😊

Complete documentation (only available in German) with detailed descriptions is enclosed in the appendix. The scientific references are also given there. And you will find some German Words in the provided pictures, but I am sure you will still get the meaning.

Step 1: Information on Soot (Black Carbon)

Picture 1:

First, I would like to give you some information about what soot, also called black carbon (BC), actually is and why it is important to measure the soot content in the air. (If you want to read a bit more about black carbon, I can recommend the wikipedia article or for general information this site:

The air pollutant soot describes carbon-containing particles in the ambient air. Atmospheric soot particles are mostly created by burning biomass and diesel fuel (you will likely be able to measure higher concentrations near a street or industrial area).

Since soot particles are very small (≤ 2.5 µm in aerodynamic diameter), they can get through the alveoli of the lungs directly into the bloodstream and from there to secondary target organs (e.g. the kidneys), where they may cause cancer. (Diesel soot was classified as carcinogenic by the WHO in 2012, as announced by the Swiss government

Soot also affects our climate by absorbing sunlight and thus warming the atmosphere. In addition, it can also affect the reflectivity of the ground. For example, soot particles from combustion processes settle on snow and ice surfaces, where they absorb sunlight, heat up and thus lead to melting.

According to calculations, black carbon alone has been responsible for a warming in the Arctic of 0.5 - 1.4 ° C since 1890.

A reduction in soot pollution is therefore both highly relevant in terms of human health / mortality and is also of great importance in connection with climate protection.

Global trend analyses show that soot concentrations in our atmosphere are increasing. Especially in urban areas (megacities in Africa, Asia and China), today's soot concentrations can reach alarmingly high values (several 10s of µg / m3), which directly and massively impair the quality of life of the residents.

How high is the concentration around you? This device will help you find out. 😉

Step 2: Measurement Principle

Black carbon is an extremely important component of fine particulate matter (PM10 or PM2.5). There are many inexpensive PM sensors available on the market that measure the particulate mass concentration by means of the light scattering of the particles. These methods are limited by physical constraints to a minimum detectable particle diameter of about 300 nm. Most BC particles are much smaller than 300 nm and therefore cannot be measured with these PM sensors.

So, how can we specifically measure the soot concentration in the ambient air? Short answer: Since BC is extremely black, we use its light absorption ability for its detection. For this, here is a brief insight into physics, where I list a few formulas and roughly try to explain them, but we will only really use the last one, or if you need my Excel template for the calculation, you don't have to calculate anything anymore, just enter the values you used.

According to Beer-Lambert's formula (Formula 1), a light intensity Io decreases over a distance L depending on the extinction b(ext) (what is made up of the scattering b(s) and absorption b(abs) Formula 2) properties of the particles in the air. To put it roughly: the more it gets absorbed or scattered, the less light I gets measured.

This decrease can also be called attenuation ATN (a measure for the “darkening” caused by the accumulated soot particles), so it results in Formula 3.

If you know the emitted light intensity and measure the light intensity at a certain distant point, you can use it to calculate the attenuation. Beer-Lambert's formula must be changed for Formula 4.

Step 3: Simplified Measurement Principle

But we don't measure directly over a distance in the air, rather we suck a volume of air through a filter and assume that all particles are deposited in the filter. If we want to calculate the attenuation coefficient now, we need to transform the formula into formula 5.

A is the area of the filter spot through which the air is sucked. The air flow flow is generated by a pump and should be known or regulated. The change in the attenuation ΔATN/Δt over time is calculated from one measuring point to the next. In order to calculate the soot concentration in the last step, the constant C , which results from the multiple scattering of the filter, and the MAC (Mass Absorption Coefficient) must be known (it should be noted that the scattering of the soot particles in the filter can be neglected). Then ultimately this is the formula that is used is Formula 6.

Step 4: List of Materials (and Explaining the Filter)

Now that we had enough theory, let's start building! For this we need the following material, whereby each component can be replaced by a similar one. In this list, the required screws, hoses, coin cell battery, air connections and the distribution board are not noted, you can just take what you have lying around, but make sure that the measuring chamber always stays air-tight and nothing goes up in flames 😉

- Controller: Arduino Uno

- RGB led: KY-016

- Photodetector: TSL2561 (Grove Digital Light Sensor)

- LCD: hd44780 with I2C

- Vacuum pump: 12V, >2lpm

- Critical Nozzle: Ruby orifice, nylon tube, or something that limits the airflow to around 2-3 lpm

- Measuring chamber: Black, 3D print

- Housing: Yellow, 3D print

- complete SD-Shield: Adafruit Data Logger Shield, 3V Lithium coin cell battery, 32MB...32GB SD-Card

- Filter: Toilet paper (folded to 16-layers)

- PG Fitting (2x): SKINTOP STR-M 12X1,5

- Power Supply: 12V, external supply

- Screws, washers and nuts: many (M2.5/M3)

- Seal: Silicone Tube and Rubber Seal (from bicycle tube)

The aim of the project was to develop the cheapest possible device, which is why you usually see AliExpress as a possible provider. However, the delivery times are sometimes very long, and those who want the project to be finished sooner should perhaps get the material locally. And as mentioned: you can actually replace any component with a similar one that you already have, but depending on the component you replace you will probably have to adapt the Arduino code that I have included here.

The powerful vacuum pump and the critical nozzle are in the list if you want a defined air flow. This makes measuring a little easier, but costs more. You can do very well without a nozzle and you can use a weaker pump, I'll show you later how you can still determine the air flow.

It is important to limit the air flow to around 2 lpm to prevent damage to the filter.


I just want to explain in short terms, why we use toilet paper as filter and how well it can be used. As mentioned, I wanted to pursue the low-cost idea, and the commonly used filters (such as quartz fiber) are just more expensive and less available for hobbyists than normal two-layer toilet paper (made of 100% cellulose). By using toilet paper, almost everyone has access to a filter no matter where they are.

Still I had to verify its filtration performance. A CPC (Condensation Particle Counter) test I’ve made (see diagram) shows the filter efficiency of folded toilet paper (16 layers on top of each other). It filters just enough for our needs, so over 75% of the particles, which have a diameter of up to 800 nm, are deposited on it. With a lower filter efficiency, the measurement result would be too far away from reality. If more layers of paper were used as filters, the filter efficiency would increase, but the penetrating light values would decrease, which leads to a lower measurement accuracy.

Step 5: List of Software

You should also have the following programs installed on your PC, but of course you can also use your own alternatives here:

- Arduino IDE (v1.8.7)

- Ultimaker Cura (v4.3.0)

- Microsoft Excel (if you want to use my template to calculate the soot concentration)

- Optional: Siemens NX 12 or similar (if you don't take over my measuring chamber, but designed something of your own)

- Optional: Excel-Converter (Software developed by my friend, loads the text-files in the right format into Excel and calculates the Attenuation and Black Carbon concentrations and generates the plots, after you pressed cntrl+alt+shift+f9)

You should as well download and save these libraries in the Libraries folder of the Arduino IDE storage location. (for example: D:/Arduino/Libraries/)

I am sorry not to point out the developers of the libraries. But hopefully their address should be found in the"readme.txt" of theirfolder.

Step 6: Wiring and Electrical Construction

When the material is ready, the software installed and the libraries included, the construction of the low-cost Absorption Photometer (APM) can begin.

As a first step it would be advisable to check the functionality of the components and the program and the wiring with a simple test setup. For this, the Arduino sketch must be loaded onto the Arduino Uno via the Arduino IDE.

The components are connected to the Arduino according to the connection table (as seen in the scheme). The Adafruit Data Logger Shield can already be plugged onto the Arduino with a coin cell and a SD card. It offers exactly the same connection options as the Arduino Uno, to which the components must then be connected.

Attention, here in the wiring I have not drawn in the series resistors of the RGB, as these are already soldered on the KY-016. But if you use your own RGB, don't forget the necessary series resistors😉

(Take the resistance value from the data sheet)

If the components are functional and correctly wired and the sketch has been successfully loaded onto the Arduino, the welcome text should appear on the LCD. The measuring cycle then begins, with the RGB led changing color at defined time intervals. The light values should be displayed on the LCD (similar to the picture with the display).

After the first tests it can be seen that the light intensity decreases quadratically with the distance between the light source and the detector. From this we conclude that the distance between the RGB and the detector should be as small as possible. If the light values are too weak even at a very short distance, a stronger RGB should be used, although the Arduino's limited output current (20mA per pin) may require an electronic extension of the structure.

The Photodetector has a digital range from 0…65’535. The higher the measured light values, the better the measurement resolution. So, I can recommend aiming for light values of several thousand (if not even several ten thousand)

Step 7: Construction of the Measuring Chamber

3D Print Files: measuring_chamber.rar

Rubber Seal dimensions: seals_measuring_chamber.rar

If the light values are sufficiently strong and the associated geometry of the measuring chamber (space for light source, detector, distances and filter space) has been defined, the construction or (if the provided measuring chamber is used) the 3D printing can be started directly. Since the measuring chamber must be airtight, a fill level of 100% in the 3D printer settings is recommended. It should be noted that the printing process can take several hours (even more than 1 day). After printing, threads must also be turned into the holes provided, depending on the air connections and cable glands used.

The difficult parts of the measuring chamber are to construct the smallest possible distance between the light source and the photodetector, a filter holder and an entirely airtight construction. In order to meet the last requirement, an elastic rubber seal (e.g. from a bicycle tube) is cut out and inserted into the covers, a silicone compound can be used for the cable and air connections.

As a result, you should (if you take over my files) receive this measuring chamber, but without the screws on the top. Sorry, in the course of the project the design has changed again and again and therefore you can sometimes see different chambers in the pictures. ☹

In the latest version of the measuring chamber, the RGB is glued to the existing knobs in the upper half of the measuring chamber and the photodetector in the lower half.

For the air connections you have to drill one M5 thread into the existing side-holes on each of both halves of the measuring chamber and for both PG screw connections you have to drill M12 threads. A connector for the hose has to be screwed into both halves. This must ideally have a rubber seal and also be completely sealed with a little silicone.

The two threads of the PG screw connections where the cables are passed through should also be smeared with a little silicone and tightened firmly. When the cables are passed through and the screw connection is tightened, you can also smear a little silicone on the seal so that the measuring chamber is as tight as possible.

Step 8: Using the Data Logger

Now the implementation of data logging begins. For this (if not already done) the Adafruit Data Logger Shield is plugged onto the Arduino Uno. The LED and the photodetector can be coupled to the same pins on the shield as on the Arduino Uno (as seen two steps before). The assignment of the pins of the shield (depending on the version you use) must be observed. For this reason check out:

When connecting for the first time or after removing the button battery, it is always important to update the current date. This is done by adding in the sketch at line 157 (perhaps changed)

//{RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));}

the comment characters // in front of {RTC.adjust (DateTime (F (__ DATE__), F (__ TIME__)));} are removed and the program is loaded onto the Arduino. Then the line can be commented out again and the program can be reloaded onto the Arduino. It is advisable to update the date from time to time, even if the battery has not been removed, as there may be a time discrepancy on the logger shield due to inaccuracies in the real time clock (RTC).

When the complete sketch has been transferred to the Arduino, a new text file is automatically created on the SD card at the beginning of each measurement (as soon as the Arduino is connected to a voltage source) with the name of the creation date (according to the European standard yyyymmdd )

On lines 40-42 (perhaps changed) the constants for the measurement are specified.

#define Zeit 6 // duration in seconds per color

#define Mittlungszeit 1 // Averaging time in minutes

#define lpm 1.4 // Specify air flow in liters per minute

The defined time interval indicates how many seconds per color is measured. With 6 seconds per color, an entire cycle would take 30 seconds (the first ‘color’ is a turned off LED and this measured light intensity is subtracted from the others in order to compensate for disturbances, but normally its zero). The averaging time and the air flow are used for the eBC concentration displayed on the LCD but have nothing to do with the data in the text file or the evaluation in Excel.

The generated text file should look similar to the picture.

All measuring cycles are added to the file as a new line. If the measurement is interrupted, the Arduino creates a new file, or (if it is still the same creation date) adds the data (again with the header) to the existing file.

I found the instructions on how to use the data logger in this video on YouTube

Step 9: Build and Assemble the Housing - Distribution Board

3D Print Files housing: housing.rar

complete device dimensions: complete_construction.rar

When all material has been tested and ready for use, it is advisable to construct a housing for the measurement setup in which the pump, the Arduino Uno and the measurement chamber can be mounted. Space for a power supply must also be taken into account. A power supply unit could be built into the housing, which supplies the required voltage for the components (e.g. 12V), which is not the case in this project. I’ve built a small distribution board and use an external power supply, but care for right polarity, if you use your own board.

There should still be two holes in the housing for air intake and exhaust. A section of the appropriate size must be calculated for the LCD (exact dimensions can be found in the stp file).In order to plan the dimensions of the housing, I can recommend that you look for the components you are using on and only construct the most necessary ones yourself.

To put the whole measuring device together, we need to keep in mind that the whole structure is a bit narrow, so we need to start with the lower parts:

The first one we have to install is the distributor board, otherwise it won't be easy to get to its screws afterwards. It has a matching cutout in the housing into which we insert the connector. From the underside, we now put the screws through the housing and the circuit board, where we fasten the board with a nut. Make sure that you have already tightened the cables in the clamps.

Step 10: Build and Assemble the Housing - LCD

Next, we attach the LCD in the cutout on the housing. For this we need 4 screws with nuts and washers. Make sure that you don't install the display upside down, but that the text is displayed the right way around.

Step 11: Build and Assemble the Housing - Measuring Chamber Lower Half

Next, we now attach the underside of the measuring chamber. That should be pretty easy. We put the locknuts in the bottom of the case and tighten the screws from the top. Make sure that the cover of the measuring chamber is tightened with the appropriate seal beforehand.

Step 12: Build and Assemble the Housing - Measuring Chamber Upper Half

Now we put the upper half of the measuring chamber on top of the lower. The two rubber seals with a filter in between must first be inserted through the screws. The lock nuts, which have to be placed in the lower half of the measuring chamber, are quite difficult to position. Either you glue them into the fit beforehand, or you now have a pretty tricky task ahead of you. But don't worry, anything is possible for whoever believes. (And the next version of the case will fix this problem.) Here, too, make sure that the cover of the upper measuring chamber with the appropriate rubber seal is tightly tightened.

Step 13: Build and Assemble the Housing - Arduino

The Arduino with the data logger shield is easier to assemble. You only need 3 screws with washers and nuts. If you want to take out the SD card later, you have to loosen these screws again. Try to plug the power plug into the Arduino before assembly. The other cables should also be able to be connected correctly afterwards.

Step 14: Build and Assemble the Housing - Vacuumpump

Finally, we attach the pump. If you want, you can try to dampen the pump a bit as it vibrates.
Now we connect the pump inlet to the lower measuring chamber with a hose. The connection of the upper measuring chamber and the output of the pump are led to the outside through the two housing openings with a hose.

Step 15: Build and Assemble the Housing - Design

Give your measuring device a cool logo and color it in. Then it is ready for use. Let's go!

Step 16: First Measurements and Determination of the Air Flow

With the complete measurement setup, the first measurements of the soot concentration in the air can now be carried out. To do this, however, the air flow must be known, which requires additional calibration if no critical nozzle or air flow control / measurement has been installed.

The simple determination of the air flow without a calibrated air flow meter can be carried out as follows. You need:

- Low cost APM

- 5dl PET bottle (transparent)

- Small basin with a soap solution

- stopwatch

- Silicone for sealing

- Scissors

First, the bottom of the PET bottle must be cut off with scissors. A small hole is made in the lid of the PET bottle with scissors and the suction hose of the low-cost APM is inserted a finger's breadth. The hose and the lid are sealed with silicone.

A little water (5 mm high) with enough soap is put into the basin so that a few soap bubbles can easily form on the surface. Now the low-cost APM must be switched on and the stopwatch must be ready. The inside of the bottle should be moistened with the soap solution beforehand so that the soap bubble does not burst during the calibration. The bottle must now be dipped briefly into the soap solution at the end of the cut base and then pulled up again. This step may have to be repeated several times until a soap bubble forms over the entire cross section of the bottle, which is slowly sucked up the bottle wall. As soon as a bubble forms, the stopwatch must be started and the time taken for the soap bubble to run through the entire bottle. When this has happened, the air flow is known, as the (bottle) volume can be divided by the time required and converted into liters per minute.

If the soot content in the environment is then measured, it is advisable to collect data over several hours. Depending on the material used, the low-cost APM is not particularly precise, therefore it requires longer averaging times in order to increase the measurement accuracy. If a more accurate soot measuring device is available, it would also be advantageous to carry out a reference measurement and to calibrate the low-cost APM by adjusting the constants in the Arduino code and the excel template I’ve provided.

Step 17: Use of the Data

The last step is to evaluate the data. With the software and Excel template (both in the appendix), the measured values can be easily imported from the text file into Microsoft Excel.

The necessary components of the software are the template, the Java code and an executing file "run.cmd", which must be activated by the user to start the conversion. You can select the text file with the collected raw data by pressing the "Choose File" button and then adjust the air flow used in liters per minute and the time base (time per measurement cycle) of the data storage in seconds. In the reading process, all data is extracted and converted into the appropriate format. As soon as the file has been completely loaded, the path is displayed under "Selected File:".

The second step is to press the “Convert to xlsx” button. The process that is now triggered first creates a copy of the template file Vorlage_V0.xlsx, which is then filled with the corresponding cached data. The data are read in first, but only after pressing «ctrl + alt + shift + f9» the calculations are carried out and the graphics are filled with measuring points.

It is important, at least with the first version of the software, that the template is not moved out of the folder and that the imported text file is saved in the format "date / time, dark current, light value red, light value green, light value blue, light value white".

This version can only be used on Windows. In addition, Java Version 8 or higher must be installed and the JVM 64-bit used.

The insert positions are “hard-coded” in the program, which means that after adapting the template, the source code must also be adapted. As is customary in the industry, the program was developed on Java (jre1.8.0_211) with the IDE IntelliJ.

The template automatically calculates the soot concentration in nanograms per cubic meter [ng/m3] for the desired averaging time, which can also be adjusted. There are even four different blocks available for different averaging times so that the time resolutions can be compared with each other.

Further parameters such as MAC values, spot size and time interval can all be adjusted in the newly created Excel sheet (see Picture).

The results of the entire first block and the concentrations of the light value ‘White’ in the second block are automatically displayed in a point diagram (soot concentrations over time). The graphics can be supplemented with further measured values in the usual Excel manner.

The desired knowledge for the user can then be obtained from the soot concentration curves shown. For example, maximum and minimum values can be read off it can be concluded from the increase / decrease over time about the utilization of daily traffic or industry (at what time are more cars on the road or machines in operation).

Step 18: Attenuation As a Limit Value

With the low-cost APM there is no automatic filter change, as is the case with Aethalometer AE33[1], which is used as a reference device for this measurement. This leads to a limitation of the measurement time, since the filter becomes darker and darker and additional soot no longer increases this darkening, but only thickens the layer.

If the filter is fully loaded, additional soot is no longer measurable.

In order to observe this effect, I analysed an example with measurement data that were recorded from 07/20/2020 to 07/27/2020 with the low-cost APM in a measuring station of the Health and Environment Department Zurich[2] near the Wiedikon train station (

The aim of the analysis is to determine an increasing inaccuracy of the measurement data (compared to the reference instrument AE33) and to define a suitable limit value for the attenuation, so that when this ATN is reached, a message appears on the LCD that a filter change should be carried out. (Not yet implemented)

Attenuation achieved

At the beginning of the measurement, when the filter is still unloaded, high light values are measured.

During the measurement, the light values decrease and the attenuation increases. Only a few percent of the original light intensity are measured.

The first values of the unloaded filter (as Io) and those of the fully loaded filter (as I) are now inserted into the Beer-Lambert formula to calculate the attenuation.

The following maximum values result are calculated:

Red: 3.87 = 387%

Green: 4.36 = 436%

Blue: 4.33 = 433%

White: 4.15 = 415%

We compare our results with the maximum values of the AE33, which are used to trigger a filter change:

Blue: 105%

Green: 90%

Red1: 75%

Red2: 70%

(The red wavelength of the APM lies between the two red ones of the AE33, that's why I have listed both)

The low-cost APM in Zurich reached the attenuation values of the AE33 after around 20 hours. Nevertheless, the measurements were carried out for a week with the same filter.

From the daily mean values (table) it can be concluded that the measurement accuracy decreases with increased attenuation .

The increase in the measurement error can aswell be clearly seen in the diagram, where the deviation between the low-cost APM and the AE33 increases over time with the same wavelength (470 nm / blue).

While the two curves are initially close to each other, over time there is a greater drift in the measurements of the low-cost APM, which makes the measurements less and less useful. From July 24th (4 days measurement time) the data can no longer be used.

From these measurements it can be concluded that the filter cannot be used indefinitely. The attenuation limit values of the AE33 (approximately at 100%) can be adopted for the low-cost APM, so that when this ATN is reached, a message appears on the LCD that a filter change should be carried out. (Not yet implemented)



Step 19: Analysis of the Data in Comparison With the AE33

Finally, an example of what we can exactly read from the measurement data. Therefore we consider a comparison measurement of the low-cost APM with the AE33, which took place on February 21, 2020 at the ISE in Brugg / Windisch (near a main road). With an averaging time of 15 minutes each, the comparison in the diagram is produced

First of all, the negative readings of the low-cost APM are of course nonsensical values and are due to instrumental noise.

Nevertheless, based on these measurements, some interesting conclusions can be drawn. Relatively low soot concentrations (<300 ng / m3 with the exception of a few peaks) are present between 00:00 and 06:00. At 06:00, the concentration increases for the AE33 and the low-cost APM and remains at a slightly higher level (> 500 ng / m3 with the exception of a few peaks) for the next few hours. This increased concentration is attributed to the morning traffic slowly picking up on the main road nearby.

Concentrations stay low in the afternoon until they rise sharply before 6:00 p.m. The reason for this will be the evening traffic, which is in Brugg mostly accompanied by traffic jams.

The traffic load can be estimated from this data and possible measures can be taken, for example enforcing a traffic reduction.

Step 20: Concluding Remarks

The Low-cost APM can measure ambient soot concentration with a detection limit of 70 ng/m3 (at its best wavelength ‘blue’) with a time resolution of 3600 seconds for a price of <120.00 Euro.

Thanks to everyone who is interested in this project, if you have any further questions, please read the documentation or write to me.

Be the First to Share


    • Pets Challenge

      Pets Challenge
    • Backyard Contest

      Backyard Contest
    • Fandom Contest

      Fandom Contest