DIY Air Quality Meter
In this Instructable, I’m going to show you how to build a compact air quality monitor using the PMS7003 particulate matter sensor and the SHT41 temperature and humidity sensor. This device measures PM1.0, PM2.5, PM10, along with ambient temperature and humidity, giving a clear picture of the air you’re breathing every day.
The design and UI of this project are inspired by the Fallout game series. In the world of Fallout, a Pip-Boy or a Geiger counter is essential for survival. In the real world, we might not be dodging radiation, but the air we breathe filled with invisible dust, smoke, and pollutants is just as important to track. So let’s get started!
Supplies
For this project 3 main components are ESP32-S3 development board with GC9A01 round display, PMS7003 and SHT41.
1) ESP32-S3 development board with GC9A01 round display - 1
2) PMS7003 Sensor - 1
3) SHT41 Sensor - 1
4) 1.27mm 2x40 Pin Male Double Row Header Strip - 1
5) M2 8mm screw - 2
6) M3 8mm CSK Allen screw - 4
7) Wires
8) Heat shrink tubes
9) 3D Printing PLA filament
10) Chrome spray paint (optional)
Designing the Case
For this project, I designed the enclosure using Tinkercad. I chose Tinkercad because it’s easy to learn, works directly in the browser, and makes it simple to modify and share designs. It’s perfect for quick prototyping, especially if you don’t want to dive into complex CAD software.
You can find the enclosure design for this project here:
Feel free to remix or customize the design to match your own style or hardware setup.
3D Printing and Preparation
Once I was happy with the design in Tinkercad, it was time to bring it into the physical world. I exported the STL files and printed the enclosure using standard settings, keeping everything simple and easy to replicate. After the print was finished, I carefully removed the supports using a needle-nose plier.
Painting
To give the enclosure a retro, Fallout-style look, I painted the top cover using chrome spray paint. This was actually my first time using chrome paint, so there was a bit of trial and learning involved.
One important thing I learned is that the surface needs to be perfectly clean and smooth before painting. Even a tiny bit of dust or an uneven spot can ruin the finish, so take your time with sanding and cleaning before spraying. Also its a fingerprint magnet!
After painting, the final result didn’t look like a mirror chrome finish, but it ended up looking more like brushed aluminum, which honestly worked really well with the overall design and gave it a nice feel.
Assembly
This development board doesn’t have any mounting holes, so to secure it inside the case, I used two small 3D-printed square supports to hold the display in place.
The board fits perfectly inside the 3D-printed enclosure, but there’s one important thing to watch out for. The top edge of the PCB has a small mouse-bite left over from manufacturing. You’ll need to file or sand this down, otherwise the board won’t sit properly inside the case.
Once everything was aligned and sitting flat, I secured the board in place using M2 screws.
Mounting the Sensors
With the display secured, it’s time to install the "nose" of our device the PMS7003 and SHT41 sensors. I used double-sided tape to secure both sensors. Before attaching the SHT41 sensor, I first soldered wires to it.
Wiring
The next step is wiring everything together. The connections are fairly simple.
SHT41 → ESP32 (3.3V Sensor)
3.3V → 3.3V
GND → GND
SDA → GPIO 15
SCL → GPIO 14
PMS7003 → ESP32 (5V Sensor)
5V → 5V
GND → GND
RX → GPIO 37
TX → GPIO 38
One important thing to note is that the SHT41 runs on 3.3V, while the PMS7003 requires 5V, so make sure the power connections are correct. Refer to the circuit diagram and pinout images provided to avoid mistakes.
To connect the sensors, I used 1.27 mm header strips. These headers aren’t really meant for soldering wires directly, so it can be a bit tricky. After soldering all the connections, I added heat shrink tubing for insulation and reinforced everything with a bit of hot glue.
Final Assembly
To finish the assembly, I placed the top cover onto the enclosure and secured it using four M3 countersunk (CSK) Allen screws.
Programming
The next step is programming the ESP32. I’m using the Arduino IDE for this project.
I’m assuming you already have ESP32 support installed in your Arduino IDE. If not, you’ll need to add the ESP32 Board Manager URL and install the ESP32 package using the Boards Manager. (There are plenty of guides online if this is your first time setting up ESP32 with Arduino.)
Installing Required Libraries
Next, install the following libraries using the Arduino Library Manager:
TFT_eSPI.h – for the round display
Adafruit_SHT4x.h – for the SHT41 temperature and humidity sensor
PMS.h – PMS7003 library by Mariusz Kacki
All of these libraries can be installed directly from the Library Manager, so no manual downloads are needed.
Display Configuration (Important)
Before uploading the code, we need to configure the display settings in the TFT_eSPI library.
Navigate to: Documents > Arduino > libraries > TFT_eSPI > User_Setup.h
Open the User_Setup.h file and uncomment the following lines:
#define GC9A01_DRIVER
#define TFT_WIDTH 240
#define TFT_HEIGHT 240
#define TFT_MOSI 11 // May be labeled as SDA on some display boards
#define TFT_SCLK 10
#define TFT_CS 9
#define TFT_DC 8
#define TFT_RST 12
#define TFT_BL 40 // Backlight pin
Make sure all other display driver definitions are commented out to avoid conflicts.
Uploading the Code
Now, copy my project code into the Arduino IDE.
From the Tools menu, select:
Board: ESP32S3 Dev Module
Port: Select the correct COM port
And set the following options:
Flash Size: 16MB (128Mb)
Partition Scheme: 16M Flash (3MB APP / 9MB FATFS)
PSRAM: QSPI PSRAM
Once everything is set, click Upload and wait for the code to flash successfully.
The Final Look & Testing
With everything assembled and programmed, the project is now complete.
I designed the UI with a Fallout-inspired theme, giving it that retro-futuristic PIP BOY vibe. On startup, the PMS7003 sensor needs about 30 seconds to warm up before it provides stable readings. During this time, the display shows a 30-second progress bar, so you know the device is getting ready.
Once the warm-up is complete, the screen displays five key parameters:
PM1.0
PM2.5
PM10
Temperature
Humidity
The result is a compact, portable air quality monitor that’s both functional and fun to look at.