Two ways to build Air360
You can assemble the device with the Air360 shield board or wire sensors directly to the ESP32-S3. The shield reduces wiring mistakes; direct wiring is useful for prototypes, debugging, and custom enclosures.
Build with the shield board
The shield breaks power and signal lines out to labeled connectors. This is the primary user path for repeatable builds.
- Order the board from Gerber files or from the OSHWLab project.
- Check the board revision against this guide before soldering.
- After assembly, sensors connect to the labeled shield connectors.
Wire directly to ESP32-S3
Connect sensors to GPIOs directly using the table below. This path requires careful power, ground, and shared-bus wiring.
- For multiple I2C devices, use a branched I2C bus or a dedicated hub.
- Search for "I2C hub" on AliExpress, Amazon, or similar marketplaces.
- All signal lines must be compatible with ESP32-S3 3.3 V logic.
- UART1 is shared by GPS and the cellular modem by default, so use separate UART ports if both are installed.
Option 1: build with the shield board
The shield board sits on top of the ESP32-S3 and breaks power, I2C, UART, and auxiliary lines out to connectors. These are the baseline parts needed to assemble the board.
| Component | Qty | Use | Search keywords |
|---|---|---|---|
| DS1023-1x22S21, 1x22 female socket header, 2.54 mm pitch | 2 pcs | Headers for mounting the shield board onto the ESP32-S3. | DS1023-1x22S21 female header 2.54mm |
| Single row male 2.54 mm breakable pin header | 1 strip or as needed | Male pin headers for auxiliary pins and jumpers. | 2.54mm single row breakable male pin header |
| DC-005, 5.5x2.1 mm PCB-mount DC barrel jack | 1 pc | DC power input on the shield board. | DC-005 5.5x2.1mm PCB mount DC power jack |
| JST ZH 1.5 mm, 4-pin / 5-pin connector set | as needed | Optional cable connectors for SPS30 and SCD30. | JST ZH 1.5mm 4 pin 5 pin connector housing crimp terminal |
| KF301-5.0-2P, 2-pin 5.0 mm screw terminal block | 1 pc if INA219 is used | Screw terminal for the INA219 power measurement path. | KF301-5.0-2P 2 pin 5.0mm screw terminal block |
| 0 Ω resistor / 0R jumper | 1 pc if INA219 is not used | Jumper in place of the INA219 path when current sensing is not installed. | 0 ohm resistor 0R jumper |
Option 2: direct wiring to ESP32-S3
The table below follows the current firmware defaults. Some UART and GPIO sensors can be reassigned in the device web UI, but these values are the best starting point for a first build.
- I2C: all I2C sensors share SDA=GPIO8 and SCL=GPIO9.
- GPIO and analog sensors use one of GPIO4, GPIO5, or GPIO6.
| Sensor | Interface | ESP32-S3 pins | Note |
|---|---|---|---|
| I2C | SDA=GPIO8, SCL=GPIO9 | Use one shared I2C bus for multiple modules; sensor addresses must not conflict. |
| UART2 by default, 9600 baud | RX=GPIO16, TX=GPIO15; UART1 RX=GPIO18, TX=GPIO17 is selectable | Sensor TX goes to ESP32-S3 RX; sensor RX goes to ESP32-S3 TX. |
| UART1 by default, 9600 baud | RX=GPIO18, TX=GPIO17; UART2 RX=GPIO16, TX=GPIO15 is selectable | UART1 conflicts with the SIM7600E default pins. |
| GPIO | GPIO4, GPIO5, or GPIO6 | Select one available pin in the sensor settings. |
| GPIO | P1/yellow signal to GPIO4 by default; GPIO5 or GPIO6 selectable | Requires 3.3 V-safe signal level shifting. |
| UART1, 115200 baud | RX=GPIO18, TX=GPIO17, PWRKEY=GPIO12, SLEEP/DTR=GPIO21 | RESET is not wired by default; do not use GPS on UART1 at the same time. |
Choose your sensors
Pick one or more sensors based on what you want to monitor. Sensors can be combined freely; values go to the Air360 API, and compatible values also go to Sensor.Community.
| Sensor | Measures | Why you'd want it |
|---|---|---|
| Climate | ||
| BME280 | Temperature, humidity, pressure | Compact all-in-one climate sensor; good for indoor and outdoor baseline monitoring. |
| BME680 | Temperature, humidity, pressure, gas resistance (VOC) | Same as BME280 with a gas sensor that estimates indoor air quality and volatile organic compounds. |
| BMP390 | Pressure, temperature | Precise barometer: it measures pressure and temperature, but not humidity. Choose it when pressure accuracy matters most. |
| AHT30 | Temperature, humidity | Accurate and low-cost; a reliable upgrade over DHT22 with I2C connectivity. |
| SHT3X | Temperature, humidity | High-accuracy sensor; more consistent than AHT30 across wide temperature ranges. |
| SHT4X | Temperature, humidity | Improved successor to SHT3X with higher accuracy in humid environments. |
| HTU2X | Temperature, humidity | Budget option; lower accuracy than SHT series but widely available. |
| DHT11 | Temperature, humidity | Entry-level sensor with limited range (0–50 °C, 20–90 %RH); suitable for learning or quick tests. |
| DHT22 | Temperature, humidity | Better range and accuracy than DHT11; common first sensor for prototypes. |
| DS18B20 | Temperature | Waterproof probe; designed for outdoor, soil, or liquid temperature measurement. |
| Particulate matter | ||
| SPS30 | PM1.0, PM2.5, PM4.0, PM10, particle count, typical particle size | Most complete PM sensor in the lineup; recommended for outdoor air quality stations. |
| SDS011 | PM2.5, PM10 | Affordable laser sensor; popular for city and roadside air monitoring. |
| PMSX003 (PMS5003 / PMS7003) | PM1.0, PM2.5, PM10, particle count bins | Widely available compact sensor; good balance of cost and data completeness. |
| PPD42NS | Particle count (coarse) | Basic optical sensor; lower accuracy; GPIO-based, no shared bus required. |
| CO₂ and gas | ||
| SCD30 | CO₂, temperature, humidity | NDIR CO₂ sensor; accurate and stable; recommended for ventilation and indoor air quality monitoring. |
| MH-Z19B | CO₂ | NDIR CO₂ via UART; compact and common for home automation projects. |
| Light | ||
| VEML7700 | Illuminance (lux) | Measures ambient light level; useful for daylight tracking or controlling light-dependent devices. |
| OPT3001 | Illuminance (lux) | Alternative to VEML7700 with a slightly different spectral response; same use cases. |
| Power monitoring | ||
| INA219 | DC current, voltage, power | Monitors the device's own power consumption; useful for solar-powered or battery-backed setups. |
GPS — location tagging
A GPS module (any NMEA-compatible receiver via UART) adds geographic coordinates to every measurement batch. Use it for fixed outdoor stations where you want precise coordinates attached to each reading, or for mobile setups mounted on a vehicle or carried as a portable unit.
Cellular modem — connectivity without Wi-Fi
A cellular modem lets the device upload data over a SIM card with no Wi-Fi required. Supported models: SIM7600 (default), SIM7070, SIM7000, BG96, EC20, SIM800, and Generic (any AT-command modem via esp-modem). This is the right choice for rooftop stations, remote field installations, or any location where a stable Wi-Fi connection is not available.
Flashing the device
The easiest way to start is to flash the ready-made merged full.bin image with the browser-based ESP Flash tool. After first boot, the device starts a Wi-Fi setup access point.
Download full.bin
Open Air360 releases and download the current full.bin. This is the complete merged image for first-time flashing.
Flash via USB
Open espflash.app, connect the ESP32-S3 by USB, select the serial port and the full.bin file, then start flashing. Wait for the process to finish.
First boot — setup AP
The device reboots. The LED turns pink — it is in setup AP mode. Connect your phone or laptop to the air360 Wi-Fi network (password: air360password).
Configure Wi-Fi
A setup page opens automatically after connecting to the AP. Select your Wi-Fi network from the list, enter the password, and tap Save.
Verify connection
The device reboots and joins your network. Green LED = connected. Pink LED = connection failed — check the password and try again.
Open the device
Go to http://air360.local or http://192.168.4.1 in your browser to configure sensors and upload backends.
LED indicator reference
| Color | Meaning |
|---|---|
| Blue | Booting. |
| Pink | Setup AP mode — no Wi-Fi configured, or connection to Wi-Fi failed. |
| Green | Connected to Wi-Fi (station mode). |
| Red | Fatal boot error — check serial logs. |
Device web interface
After the device joins your Wi-Fi network, open http://air360.local or the device IP in a browser. The interface has four sections.
Overview
A read-only dashboard showing device health, network mode, IP address, uptime, and current time. Sensor readings and backend upload results — last status and upload time — are listed here. This is the first page to check when something does not look right.
Device
Network and device settings: Wi-Fi credentials, device name, static IP, cellular modem (APN, modem type, credentials), BLE advertising, and Wi-Fi power save. The firmware update card at the bottom of this page lets you upload a new .bin file directly from the browser without USB access.
Sensors
Add, configure, and remove sensors. For each sensor you choose the model, poll interval, and connection (I2C address, UART port, or GPIO pin). Current state and latest readings are shown on the sensor card. In most cases changes apply immediately without a reboot.
Backends
Configure where measurements are uploaded: Air360, Sensor.Community, openSenseMap, InfluxDB, or Custom Upload. Each service is enabled or disabled independently. The same page sets the upload interval and shows the last upload result for every service.
Sensor.Community: the device's Sensor ID is shown on this page. Register it at devices.sensor.community/sensors to link the device to your Sensor.Community account and start seeing measurements on the map.
Air360 API: air360.ru does not require registration. The device authenticates with an Upload secret — generate it on first setup and save it somewhere safe. If you reflash the device, reuse the same secret so your measurement history stays linked to the device.
Air360 API: device coordinates are required before uploads begin. Use the map picker or enter latitude and longitude manually. Adding altitude above sea level is optional but recommended — it improves atmospheric pressure accuracy for stations at elevation.
Where your measurements go
The device can send the same measurements to several services at once. Turn on the ones you want in the device web interface: each service has its own upload interval, and if one of them is temporarily unavailable, the others keep working.
Air360
The project's own service. It accepts readings from every sensor, and your station shows up on the Air360 map right away.
- No account required: during setup the device creates a secret key. Save it — if you reflash the device, the same key keeps your measurement history.
- Set the device coordinates before uploads start. Altitude above sea level is optional, but it makes pressure readings more accurate.
Sensor.Community
A worldwide network of volunteer air quality stations. Your readings join a public map that anyone can use.
- Works with BME280, BME680, BMP390, DHT11/22, HTU2X, SHT3X, SHT4X, DS18B20, SCD30, GPS, SPS30, SDS011 and PMSX003. Readings from other sensors are not sent.
- Register the sensor number that the device shows you, and your station will appear on their map.
openSenseMap
An open platform for environmental data. There is no fixed list of measurements: you choose what your station publishes.
- You can publish anything you add to your senseBox, including CO2, light level and GPS coordinates.
- The device fetches the sensor list from your senseBox and fills in the settings for you, so there is nothing to match up by hand.
InfluxDB
A database for time-series data. Pick it if you want to keep the readings on your own machine and build charts in Grafana.
- You provide the server address; a login and password are optional.
- Readings from every sensor are sent, with nothing left out.
Custom Upload
Sends the same data to any address you enter, so you can collect the readings on a server of your own.
- No login is added: protect the address yourself.
- Readings from every sensor are sent, with nothing left out.
Detailed documentation
For web UI setup, sensors, backend uploads, diagnostics, and OTA, use the full firmware user guide.
Enclosure: Stevenson screen
For outdoor installation, you can 3D-print a Stevenson-screen-style enclosure. It shields the device from direct sun and rain while keeping airflow around the sensors.
Powering the device
Air360 runs on 5 V. Choose whichever supply suits your installation.
Mains power (5 V adapter)
Connect any 5 V USB power adapter. Two connection points are available depending on your build.
- Via the USB-C port on the ESP32-S3 — works for both direct-wiring and shield builds.
- Via the DC-005 barrel jack (5.5 × 2.1 mm) on the shield board.
Solar panel with MPPT charger
For off-grid and outdoor deployments. The setup uses a custom MPPT module based on the CN3722 that charges a battery from a solar panel and supplies regulated 5 V to the device via power-path switching — the device stays on at night and on overcast days.
- 3D-printable solar panel mount and MPPT module enclosure are on Printables — assembly instructions and a link to the PCB are on the same page.
- Read the full CN3722 article before sourcing components — values depend on your battery chemistry and cell count.
Sensor.Community compatibility
Air360 firmware keeps backward compatibility with Sensor.Community: the device can still upload to the legacy Sensor.Community endpoint using the same short device ID registered on devices.sensor.community. Air360 API is broader and accepts every current sensor type.
| Sensor / group | Sensor.Community | Air360 API |
|---|---|---|
| BME280, BME680 | Yes: temperature, humidity, pressure; gas resistance is skipped | Yes: all sensor values in a typed JSON batch |
| BMP390 | Yes: temperature and pressure | Yes |
| DHT11, DHT22, HTU2X, SHT3X, SHT4X | Yes: temperature and humidity | Yes: all sensor values |
| DS18B20 | Yes: temperature | Yes |
| SCD30 | Yes: temperature, humidity, CO2 | Yes |
| SPS30 | Yes: PM1.0, PM2.5, PM4.0, PM10, number concentration bins, typical particle size | Yes |
| SDS011 | Yes: PM2.5 and PM10 | Yes |
| PMSX003 | Partial: PM1.0, PM2.5, PM10; particle-count bins are skipped | Yes: PM and particle-count values |
| GPS (NMEA) | Partial: latitude, longitude, altitude; satellites/speed/course/HDOP are skipped | Yes: all GPS values |
| AHT30, VEML7700, OPT3001, PPD42NS, INA219, MH-Z19B | No: the Sensor.Community adapter skips these types | Yes: all values pass through without sensor-type filtering |