sensor.community airRohr Air Quality Sensor

This hands-on lab guides students through assembling, configuring, and deploying an airRohr connected environmental sensor node designed for citizen science monitoring networks. Students interface an ESP8266 microcontroller with optical dust sensors and atmospheric transducers to measure particulate matter concentrations (PM1.0, PM2.5, and PM10), ambient temperature, relative humidity, and barometric pressure. Through wiring point-to-point interconnects and provisioning firmware, learners examine digital communication interfaces including UART, I2C, and 1-Wire, manage mixed-voltage power distribution between 5 V active sensor loads and 3.3 V CMOS logic, and configure soft-access-point captive portals for network commissioning. In the process, students learn practical Internet of Things fundamentals, embedded web servers, JSON telemetry formatting, and secure Wi-Fi data transmission to global environmental databases.

air quality monitoring particulate matter PM2.5 PM10 Internet of Things IoT environmental sensing ESP8266 NodeMCU microcontrollers embedded systems I2C UART 1-Wire Wi-Fi telemetry citizen science captive portal optical dust sensors

Uploaded by demo on 2026-09-03 · ready · Electronics · Original source ↗

Files: Versions.md · firmware_Readme.md · platformio.ini · readme.md

Readiness checks

  • complete 2026-09-04 00:09 🛡 Cybersecurity: Review before networking · 6 findings 23 searches · 17 pages
    view · PDF

Latest report — 2026-09-04 00:09

Readiness: sensor.community airRohr Air Quality Sensor

Verdict: Ready with caveats · 2026-09-03 · est. parts cost $43–$70 (standard build) Cybersecurity — software & network: Review before networking

This is the cold check for this lab — there is no previous report, so everything below is the baseline the next check will measure drift against. Every part needed for the standard build (a NodeMCU ESP8266 board, one particulate sensor, one temperature/humidity sensor, a micro-USB data cable, a 5 V supply and a strip of jumper wires) can be bought today, and most of the optional sensors are in stock at authorized distributors. Three things keep this off a clean "Ready": the two headline items — the NodeMCU board and the Nova Fitness SDS011 dust sensor — have no authorized distributor at all and come only from retail and marketplace sellers whose prices vary by roughly 1.7×; the legacy BMP180 pressure option is obsolete at every distributor and needs the BME280 substitute the firmware already auto-detects; and the optional Heltec WiFi LoRa 32 V2 board is no longer the version its own vendor sells. None of these blocks the lab.

Action required

Part Problem Recommended action
Bosch BMP180 breakout (legacy pressure option) Obsolete at Bosch and at every reseller; zero distributors with stock (DigiKey 14-week factory lead, Mouser out of stock), ECIA lifecycle risk High Substitute the BME280 breakout, $14.95. The firmware auto-detects it and the snapshot already names BME280/BMP280 as the BMP180's successor. See Substitutes.
Heltec WiFi LoRa 32 V2 (optional ESP32+LoRa target, qty 0) Vendor's product page now sells only the V3 (ESP32-S3 + SX1262); the V2 the firmware environment names is gone Do not plan new builds on this target. The V3 is a different MCU and a different radio — not a substitute. Use the ESP8266 build.
Nova Fitness SDS011 (primary PM sensor) No ECIA-authorized distributor lists it; retail/marketplace only, $20.83–$35.36, with one outlier listing far below the rest Budget about $21–$35 and buy from a seller with a return policy. Order spares — this is the lab's single-source part.
Plantower PMS7003 Only listing at an authorized distributor has stock 7, at $60.07 — 50% more than the whole PMS5003 kit For a Plantower build use the PMS5003 kit, $39.95 instead.
Honeywell HPMA115S0-XXX ECIA lifecycle risk High, and the same part number is listed at $250.28 (Active) and $67.76 (Obsolete) on the same distributor If this option is wanted, order at $67.76 from the Mouser channel (99 in stock); do not pay the $250.28 listing. Do not design a new class set around it.

Cybersecurity — software & network

Review before networking — The firmware ships with no web-interface password and an open setup access point, and neither the firmware nor its Arduino libraries are covered by any advisory database - but every problem found has a documented fix in the device's own configuration panel.

Component Version How known Support status
airrohr-firmware NRZ-2024-134-B5 read from project (airrohr-firmware/Versions.md (fetched/03-Versions.md); NRZ-2024-134-B5 is the newest changelog entry) —
airrohr-update-loader not determined not determined (no version appears in any file fetched this run) —
PlatformIO platform-espressif8266 2.6.2 read from project (airrohr-firmware/platformio.ini line 91: platform_version = espressif8266@2.6.2) —
PlatformIO platform-espressif32 1.11.1 read from project (airrohr-firmware/platformio.ini line 92: platform_version_esp32 = espressif32@1.11.1) —
ESP8266 Arduino Core 2.7.4 inferred (not pinned directly; Versions.md entry NRZ-2024-134-B5 reads 'Go back to Arduino Core 2.7.4', and platformio.ini pins only the platform package) —
paulstoffregen/OneWire 2.3.5 read from project (airrohr-firmware/platformio.ini line 48) —
marcoschwartz/LiquidCrystal_I2C 1.1.4 read from project (airrohr-firmware/platformio.ini line 49) —
adafruit/Adafruit BMP085 Library 1.0.1 read from project (airrohr-firmware/platformio.ini line 50) —
adafruit/Adafruit HTU21DF Library 1.1.2 read from project (airrohr-firmware/platformio.ini line 51) —
adafruit/Adafruit SHT31 Library 2.2.0 read from project (airrohr-firmware/platformio.ini line 52) —
milesburton/DallasTemperature 3.9.1 read from project (airrohr-firmware/platformio.ini line 53) —
sparkfun/SparkFun SCD30 Arduino Library not determined unpinned (airrohr-firmware/platformio.ini line 54 declares the caret range '^1.0.13'; the build resolves whatever is current) —
bblanchon/ArduinoJson 6.18.3 read from project (airrohr-firmware/platformio.ini line 55) —
ThingPulse ESP8266 and ESP32 OLED driver for SSD1306 displays not determined unpinned (airrohr-firmware/platformio.ini line 56 declares the caret range '^4.3.0'; the build resolves whatever is current) —
mikalhart/TinyGPSPlus 1.0.2 read from project (airrohr-firmware/platformio.ini line 57) —
ESP8266 core libraries (Hash, Wire, ESP8266WiFi, DNSServer, ESP8266HTTPClient, ESP8266WebServer, ESP8266mDNS, EspSoftwareSerial) not determined not determined (listed without versions in airrohr-firmware/platformio.ini lines 61-68; supplied by the Arduino core) —
ESP32 core libraries (Wire, WiFi, DNSServer, WiFiClientSecure, HTTPClient, FS, SPIFFS, WebServer, Update, ESPmDNS) not determined not determined (listed without versions in airrohr-firmware/platformio.ini lines 72-81; supplied by the Arduino core) —
Component Finding Severity Fix available?
airrohr-firmware (inbound network services) The device listens on TCP port 80 for configuration, live readings, a debug log stream and a Prometheus /metrics endpoint, plus UDP 53 for captive-portal DNS in AP mode and UDP 5353 for mDNS, and the snapshot records no authentication on any of them by default. posture Mitigation only — keep the sensors on an isolated VLAN or guest segment rather than the main campus network
airrohr-firmware (outbound telemetry) The firmware changelog records the behaviour 'When system time is invalid, disable TLS verification', so if the device's clock has not been set the certificate checks on its uploads to Sensor.Community, Madavi and other endpoints can be skipped. posture Mitigation only — let the device reach an NTP server (UDP 123) so its clock is valid before it starts reporting
airrohr-firmware (setup access point) When the configured Wi-Fi is not reachable the sensor opens its own network named airRohr-[Sensor-ID], and the firmware's own documentation says that network is unencrypted by default, so for roughly ten minutes anyone within radio range can join it and reach the setup page at http://192.168.4.1/. posture Mitigation only — set a WPA2 password for AP mode in the configuration panel, and do first-time setup somewhere not overlooked by the public
airrohr-firmware (web configuration interface) The firmware changelog records 'Change default password for webpage auth to ""', so the built-in web server ships with no password on its configuration page until someone sets one, and anybody who can reach the device on the network can reconfigure it and read the Wi-Fi credentials stored on it. posture Mitigation only — set a web basic-auth user and password in the configuration panel before the device joins a shared network
External Arduino driver libraries dependencies unpinned: 2 of 10 in platformio.ini — the SparkFun SCD30 library (^1.0.13) and the ThingPulse SSD1306 driver (^4.3.0) resolve to whatever version is current when the firmware is built, so two of the libraries compiled into the device have no fixed version anyone can check later. posture Mitigation only — pin versions / use the lockfile
PlatformIO platform-espressif8266 The build pins the ESP8266 toolchain to platform version 2.6.2 while the platform's public release list now starts at 4.2.1, so the compiler, SDK and Arduino core this device is built from are several major versions behind and no advisory database or support calendar covers them. posture Mitigation only — treat the toolchain as frozen and isolate the device; the pin is deliberate (the changelog records reverting to Arduino Core 2.7.4 to fix stalling OTA downloads), so do not simply bump it

What this means for your lab

This sensor is a small web server on wheels. Out of the box it has no password on its configuration page - the project deliberately set the default web password to an empty string - and when it cannot find its configured Wi-Fi it opens its own unencrypted Wi-Fi network for about ten minutes so you can set it up. Anyone else on the same network, or within Wi-Fi range during that setup window, can therefore open the device's page, see its live readings and debug log, change where it sends data, and read the Wi-Fi network name and password you saved into it. That last part is what matters most: if you set it up with a staff or campus Wi-Fi password, that password is sitting on a device with no login. Before you put these on a network, set a password for the web page and a WPA2 password for the setup access point in the configuration panel, and ask campus IT for an isolated or guest network segment for the sensors rather than the main one. Beyond that, the firmware and all ten of its Arduino driver libraries come from ecosystems that publish no vulnerability advisories at all, so nothing here was checked against a security database - that is an honest gap, not a clean bill of health, and it is a good reason to keep these devices off any network that matters.

Not checked

  • airrohr-firmware NRZ-2024-134-B5: vendor/citizen-science firmware: no vulnerability advisory database publishes advisories for it, so the absence of findings is not evidence of safety
  • airrohr-update-loader: no version stated in any file fetched this run
  • External Arduino driver libraries (10 entries in platformio.ini): no centralized vulnerability advisory registry covers the Arduino library ecosystem, so even the eight exactly pinned versions could not be checked against advisories
  • sparkfun/SparkFun SCD30 Arduino Library: caret range ^1.0.13 - no exact version to check
  • ThingPulse ESP8266 and ESP32 OLED driver for SSD1306 displays: caret range ^4.3.0 - no exact version to check
  • ESP8266 and ESP32 bundled core libraries: carry no versions of their own; they ship with the Arduino core, and no advisory database covers them
  • ESP8266 Arduino Core 2.7.4: version inferred from the changelog rather than pinned, and no advisory database or endoflife.date product covers the Espressif Arduino cores
  • espressif8266 2.6.2: support status: endoflife.date has no such product
  • espressif32 1.11.1: support status: endoflife.date has no such product

Parts

Microcontroller development boards

Part Spec/Package Status Stock Price Source
NodeMCU v2 / v3 (ESP8266 ESP-12E/12F) 30-pin DIP module, 5 V in, 3.3 V logic, needs 4 MB flash readily available (retail only) not published $3.44–$10.00 Jameco $10.00, Tri-Tek $9.95, circuitrocks $3.44, SunFounder $4.97, Elecrow $4.10 (shopping)
Wemos / Lolin D32 Pro (ESP32-WROVER) — qty 0, optional 32-pin DIP, 16 MB flash, 8 MB PSRAM readily available (retail only) not published $30.85 PMD Way (shopping); Newegg $32.26
Heltec WiFi LoRa 32 V2 — qty 0, optional 36-pin DIP, ESP32 + SX1276/78, 0.96 in OLED obsolete / superseded at vendor — V3 replacement listed $17.90–$19.90 heltec.org — page now sells V3 only

Particulate matter sensors

Part Spec/Package Status Stock Price Source
Nova Fitness SDS011 (primary) 71×70×23 mm module, 5-pin 2.54 mm, 4.7–5.3 V available, retail/marketplace only not published $20.86 eBay (shopping); range $20.83–$35.36. No ECIA-authorized distributor lists this part.
Plantower PMS5003 (family PMS1003/3003/5003/6003) 50×38×21 mm, 8-pin 1.25 mm — kit adds 2.54 mm adapter + cable readily available in stock $39.95 Adafruit 3686, "PM2.5 Air Quality Sensor and Breadboard Adapter Kit"
Plantower PMS7003 48×37×12 mm, dual-row 10-pin 1.27 mm available, very low stock 7 $60.07 DigiKey — Soldered Electronics 108978, Active
Honeywell HPMA115S0-XXX 43×36×23.7 mm, 8-pin 1.25 mm, 4.9–5.1 V available but overpriced; lifecycle risk High 190 (Active listing) / 24 + Mouser 99 at $67.76 $250.28 Active listing; same MPN $67.76 elsewhere DigiKey (both listings) + ECIA: Mouser 99, DigiKey 24, Sager 19, Powell 13
Sensirion SPS30 40.6×40.6×12.2 mm, ZHR-5, I2C mode, 4.5–5.5 V readily available 3856 $38.99 DigiKey — Sensirion AG, Active
Tera Sensor Next PM enclosed module, UART, 5 V not checked — — Vendor site live and NextPM is a current line, but no price or distributor is published
Piera Systems IPS-7100 enclosed module, UART, 5 V available, expensive 104 $127.51 DigiKey — Piera Systems IPS-7100-1, Active (note the "-1" variant code)

Temperature, humidity and pressure sensors

Part Spec/Package Status Stock Price Source
Aosong DHT22 / AM2302 4-pin 2.54 mm or 3-pin breakout, 3.3–5.5 V readily available as a module 591 $8.90 DigiKey — DFRobot SEN0137 "Gravity DHT22 with 20 cm cable", Active. Seeed Grove $7.38 (152), Gearbox Labs $10.00 (90). No bare Aosong listing exists.
Maxim / ADI DS18B20+ TO-92-3, 3.0–5.5 V, 1-Wire, needs 4.7 kΩ pull-up readily available 5215 $7.35 DigiKey — Active, exact match. Also Rochester 20230 at $3.80 (25-qty break); waterproof probe version $5.25
Bosch BME280 / BMP280 breakout 15×12 mm breakout, 2.54 mm header, I2C, 3V3 rail readily available 2603 $14.95 DigiKey — Adafruit 2652, Active, supply 3V–5V. SparkFun Qwiic 15440 $16.95 (470).
Bosch BMP180 breakout (legacy) 4/5-pin breakout, 1.8–3.6 V, I2C obsolete — no stock anywhere 0 $9.95 (obsolete listing) All listings Obsolete: Bosch BMP180, Adafruit 1603, DFRobot TOY0058, Seeed 101020072. ECIA: zero distributors with stock.
TE HTU21D / Si7021 breakout 4-pin 2.54 mm breakout, 1.5–3.6 V, I2C 0x40 readily available 123 $10.95 DigiKey — Adafruit 1899 HTU21D-F breakout, Active. Bare TE HPP845E031R4 $7.28 (6004) is SMD only.
Sensirion SHT3x (SHT30/31/35) breakout 4/6-pin 2.54 mm breakout, 2.15–5.5 V, I2C 0x44/0x45 readily available in stock $13.95 Adafruit 2857 SHT31-D breakout. DigiKey stocks only bare reel parts (SHT31-DIS-B2.5KS $4.50, 18514).
Sensirion SCD30 (CO2) 35×23×7 mm, 7-pin 2.54 mm, 3.3–5.5 V, I2C readily available 6682 $47.36 DigiKey — Sensirion AG, Active

Optional peripherals

Part Spec/Package Status Stock Price Source
DNMS acoustic noise sensor dedicated board, MEMS mic, I2C/serial not a purchasable part — self-build — — github.com/hbitter/DNMS — firmware and PCB layouts only; needs a Teensy 3.6/4.0 and self-fabricated PCB. Watterott sells the IM72D128 microphone module.
u-blox NEO-6M GPS breakout ~25×35 mm breakout, 2.54 mm, 3.3 V only, 9600 baud available, retail/marketplace only not published $12.45 eBay (shopping); ShillehTek $13.99, Walmart $12.07–$15.91. No authorized distributor listing.
OLED display (SSD1306/SH1106, 128×64, I2C) 4-pin breakout, 2.54 mm, 3.3–5 V readily available in stock $19.95 Adafruit 938, 1.3 in 128×64 SSD1306, I2C default, 3–5 V level shifted
LCD1602 / LCD2004 with PCF8574 I2C backpack HD44780 module + 4-pin backpack, 5 V, addr 0x27/0x3F readily available not published $4.95 Ameridroid (shopping); Micro Center $4.99, PiShop $4.95, Waveshare $6.49

Power, cable and interconnect

Part Spec/Package Status Stock Price Source
USB 2.0 A to Micro-B data cable 1.0–2.0 m, intact D+/D− readily available in stock $2.95 Adafruit 592, 3 ft / 1 m, USB 1.1/2.0 data cable
5 V USB wall adapter, ≥ 1 A 100–240 V AC in, 5 V DC ≥ 1000 mA out readily available in stock $5.95 Adafruit 501, UL listed, 1000 mA, outputs 5.25 V to offset cable drop
Female–female DuPont jumper wires, 2.54 mm 10–20 conductors, 10–20 cm, 24/28 AWG readily available in stock $1.95 Adafruit 1950, 20 × 150 mm, 28 AWG, 0.1 in female both ends

Substitutes

For part Substitute Differences Verified Judgment
Bosch BMP180 breakout (obsolete) Bosch BME280 breakout — Adafruit 2652, $14.95, stock 2603 Supply: BMP180 wants 1.8–3.6 V on the 3V3 rail; the BME280 breakout's supply parameter is 3 V–5 V, which contains the lab's 3.3 V rail. Interface: both I2C on D4 (GPIO2) / D3 (GPIO0). Function: BME280 adds relative humidity on top of pressure and temperature — exceeds the requirement, which is acceptable. Firmware: the snapshot says the firmware auto-detects which sensor is fitted and names BME280/BMP280 as the BMP180's successor. Physical: the build uses no PCB and is point-to-point DuPont-wired, so board outline is not a constraint — but header pin order differs between breakouts and will need rewiring. verified: supply-voltage range against the lab's 3.3 V rail (DigiKey parameters on Adafruit 2652, "3V ~ 5V"), lifecycle/price/stock (DigiKey, Active, $14.95, stock 2603), I2C interface and firmware auto-detection (snapshot), no-PCB build so no footprint constraint (snapshot fabrication section). Not verified: header pin order / pinout — no pinout data for either board is in the evidence, so this is not a rewire-free drop-in. Acceptable
Bosch BMP180 breakout (obsolete) TDK InvenSense ICP-20100 (DigiKey's own suggested substitute) Package 10-LGA against the BMP180's 7-VLGA — a different footprint, and a bare surface-mount die with no breakout in evidence. The substitute record carries no price, no lifecycle status and no stock. Decisive point: the lab drives its pressure sensor through the Adafruit BMP085 library, which has no ICP-20100 support. verified: package/case of both parts (DigiKey parameters — BMP180 7-VLGA, ICP-20100 described 10LGA), library support (snapshot). Not verified: nothing further — the footprint mismatch and absent driver ended the comparison. Rejected
Heltec WiFi LoRa 32 V2 (superseded) Heltec WiFi LoRa 32 V3, $17.90–$19.90 The fetched V3 specification gives master chip ESP32-S3FN8 and LoRa node chip SX1262, where the snapshot specifies the V2 as an ESP32 (ESP-WROOM-32) with an SX1276/SX1278 transceiver. Different MCU and different radio silicon, and the snapshot requires "exactly the Heltec WiFi LoRa 32 V2 platform" for that firmware environment. verified: MCU part and LoRa transceiver part (fetched Heltec V3 specification table) against the V2's MCU and transceiver (snapshot). Not verified: pinout, footprint, and whether the airRohr firmware has any V3 build environment — none of that is in the evidence. Rejected — hard stop

Verify any substitute against its datasheet and its own pinout before ordering; the checks above are only as good as the evidence named in the Verified column.

Other dependencies

  • Firmware source repository — github.com/opendata-stuttgart/sensors-software: live. The listing this run resolved branch master and returned 62 entries under airrohr-firmware/. Note a snapshot discrepancy worth correcting: the snapshot records platformio_script.py as "missing from the repository workspace files", but it is present upstream in airrohr-firmware/ — it is missing from the uploaded lab materials, not from the project.
  • Sensor configuration instructions — Konfiguration der Sensoren wiki: live, fetched successfully.
  • NodeMCU v2/v3 pinout documentation — Pinouts NodeMCU v2, v3 wiki: live, fetched successfully. Last edited 21 February 2017; its substantive content is the warning that on a v3 board the 5 V sensor lead must go to VU, not VIN.
  • Sensor.Community device registration portal — devices.sensor.community: live, still offering self-service sensor configuration plus links to the map and CSV archive.
  • PlatformIO platform-espressif8266 release archive — github.com/platformio/platform-espressif8266/releases: live; the release list now starts at 4.2.1.
  • NodeMCU v3 / SDS011 wiring schematic (nodemcu-v3-schaltplan-sds011.jpg): not checked — a JPEG image, and the page-fetch tool extracts text only.
  • Maxim DS18B20 datasheet (datasheets.maximintegrated.com/en/ds/DS18B20.pdf): not checked — a PDF, and the page-fetch tool extracts text only. Worth an eye next check: Maxim datasheet URLs have been migrating to analog.com.
  • Fabrication: no custom PCB is required. The standard build is point-to-point DuPont wiring of COTS modules inside an enclosure, so there is no board house and no gerber to go stale. Two physical notes carry forward: NodeMCU v2 (0.9 in row pitch) and v3 (1.1 in) are not interchangeable on rigid perfboard or a prototyping shield, and the optional DNMS noise module is the one item that does require self-fabricated PCBs.

Watch list

  • Nova Fitness SDS011 — the lab's headline sensor, single manufacturer, no authorized distribution at all. Every price in this report came from eBay and AliExpress sellers. This is the part most likely to become a problem, and it has no substitute recorded here.
  • Bare Bosch BME280 die — zero stock at every authorized distributor today (DigiKey 0 on a 12-week factory lead, Mouser 0 with 334,609 on order, Future 0; supply-chain risk Med). Breakout boards are plentiful and unaffected, so this does not bite yet — but if the shortage reaches the breakout makers it takes out both the recommended environmental sensor and the BMP180 substitute at once.
  • Honeywell HPMA115S0-XXX — ECIA lifecycle risk High, with the same part number carrying an Obsolete listing alongside the Active one. Expect this option to disappear.
  • Plantower PMS7003 — stock of 7 at the only authorized listing will not survive a class order.
  • NodeMCU boards generally — commodity clones with no manufacturer part number, so there is nothing to track between checks and no listing in evidence confirms the 4 MB flash the firmware's 3 MB SPIFFS layout requires. Confirm flash size at order time.
  • Heltec V2 and Tera Sensor Next PM — one is gone from its vendor's catalogue and the other publishes no price; both are optional, but neither will get easier.
Snapshot What the lab depended on when it was uploaded — the baseline the readiness checks research against.

This lab builds an airRohr environmental monitoring sensor station (originally developed by the Luftdaten.info / Sensor.Community citizen science initiative), which samples ambient particulate matter (PM1.0, PM2.5, PM10), temperature, relative humidity, barometric pressure, acoustic noise, or carbon dioxide, and transmits the resulting telemetry over Wi-Fi to public mapping and visualization platforms. The design relies on modular commercial-off-the-shelf (COTS) microcontroller development boards and peripheral sensor breakout modules connected directly via point-to-point wiring without a custom printed circuit board. The hardware operates on a dual-rail power architecture: a 5.0 V nominal DC input rail supplied via a micro-USB connector (routed directly to the board VU/VIN pin to power 5 V sensors, fans, optical chambers, and display backlights) and a regulated 3.3 V DC logic and supply rail produced by an onboard low-dropout (LDO) regulator powering the microcontroller SoC and 3.3 V digital sensor breakouts.

Bill of Materials

Primary Microcontroller Development Board:

  • Identity: NodeMCU v2 or v3 development board based on the Espressif ESP8266EX Wi-Fi SoC (ESP-12E or ESP-12F module), featuring an onboard USB-to-UART bridge IC (Silicon Labs CP2102 on v2 or WCH CH340G on v3), 4 MB SPI flash memory, reset/flash tactile switches, and an onboard 3.3 V LDO regulator.
  • Quantity: 1
  • Footprint/package: Dual-row 30-pin through-hole DIP module. NodeMCU v2 uses 0.9 inch (22.86 mm) row pitch; NodeMCU v3 uses 1.1 inch (27.94 mm) row pitch.
  • Electrical constraints: Supply voltage 5.0 V DC via micro-USB or VIN pin. Operating logic level is strictly 3.3 V on all GPIO pins. The CPU clock is configured at 160 MHz.
  • Substitution latitude: Must be an ESP8266 board with at least 4 MB flash memory configured with a 3 MB SPIFFS filesystem layout (eagle.flash.4m3m.ld). NodeMCU v2 (Amica) and NodeMCU v3 (Lolin) are both officially supported. ESP-01 modules cannot be substituted due to insufficient flash size and insufficient GPIO breakout.
  • Control operated by students: No. Tactile buttons (RST and FLASH) are set-once during firmware flashing and reset recovery, not operated during normal monitoring.
  • Sourcing plan: retail shopping search: NodeMCU v2 ESP8266 development board CP2102

Secondary / Experimental Microcontroller Development Board (ESP32):

  • Identity: Wemos / Lolin D32 Pro development board based on the Espressif ESP32-WROVER SoC module with 16 MB flash, 8 MB PSRAM, and micro-SD card slot.
  • Quantity: 0 (optional / experimental target defined as DISABLEDenv:lolin_d32_pro_debug in platformio.ini).
  • Footprint/package: Dual-row 32-pin DIP module form-factor with 2.54 mm pitch headers.
  • Electrical constraints: Supply voltage 5.0 V DC via USB or VIN; 3.3 V logic level across all I/O pins.
  • Substitution latitude: Optional experimental target. If building this target, requires an ESP32 board matching the Lolin D32 Pro pinout and memory map.
  • Control operated by students: No.
  • Sourcing plan: retail shopping search: Lolin D32 Pro ESP32

Secondary / Experimental Microcontroller Development Board (ESP32 with LoRa):

  • Identity: Heltec WiFi LoRa 32 V2 development board based on the Espressif ESP32 (ESP-WROOM-32) SoC, Semtech SX1276/SX1278 LoRa transceiver, and integrated 0.96-inch 128x64 OLED display.
  • Quantity: 0 (optional / experimental target defined as DISABLEDenv:heltec_wifi_lora_32_V2 in platformio.ini).
  • Footprint/package: 36-pin DIP module form factor with 2.54 mm pin spacing.
  • Electrical constraints: Supply voltage 5.0 V DC via USB; 3.3 V logic level on all microcontroller pins.
  • Substitution latitude: Must be exactly the Heltec WiFi LoRa 32 V2 platform if building that specific firmware environment.
  • Control operated by students: No.
  • Sourcing plan: retail shopping search: Heltec WiFi LoRa 32 V2

Particulate Matter Sensor (Nova Fitness SDS011):

  • Identity: Nova Fitness SDS011 Laser Dust / Particulate Matter Sensor.
  • Quantity: 1 (primary particulate matter sensor option).
  • Footprint/package: Enclosed module measuring approximately 71 mm x 70 mm x 23 mm with an integrated centrifugal air-intake fan and a 5-pin 2.54 mm pitch interface header.
  • Electrical constraints: Supply voltage 4.7 V to 5.3 V DC (powered from the NodeMCU VU 5V pin); operating current approximately 70 mA during active measurement, peak current 100 mA during fan spin-up, sleep current < 4 mA. UART serial interface operates at 9600 baud 8N1 with 3.3 V logic level compatible with ESP8266 GPIO pins. Pin 1 (TX) connects to NodeMCU D1 (GPIO5, RX); Pin 2 (RX) connects to NodeMCU D2 (GPIO4, TX); Pin 3 connects to GND; Pin 5 connects to VU (5V). Pins 4 and 6 are left unconnected.
  • Substitution latitude: Firmware specifically includes an SDS011 UART protocol driver with automated laser diode cycling and sleep commands. Can be substituted by other supported PM sensors (PMS5003, SPS30, etc.), but requires selecting that model in the firmware configuration web UI.
  • Control operated by students: No.
  • Sourcing plan: distributor lookup: Nova Fitness SDS011

Particulate Matter Sensor Family (Plantower PMS1003 / PMS3003 / PMS5003 / PMS6003):

  • Identity: Plantower PMS5003 (or PMS1003, PMS3003, PMS6003) Laser Particle Concentration Sensor.
  • Quantity: 1 (alternative to SDS011).
  • Footprint/package: Compact enclosed module (PMS5003 is 50 mm x 38 mm x 21 mm) with an 8-pin 1.25 mm pitch connector (typically supplied with a breakout cable to 2.54 mm DuPont pins).
  • Electrical constraints: Supply voltage 4.5 V to 5.5 V DC on Pin 1 (VCC connected to VU 5V); operating current approximately 100 mA; standby current ≤ 200 µA. UART interface at 9600 baud 8N1; Pin 4 (RX) connects to NodeMCU D2 (GPIO4, TX); Pin 5 (TX) connects to NodeMCU D1 (GPIO5, RX); Pin 2 connects to GND. Pins 3 (SET), 6 (RESET), 7, and 8 are unused.
  • Substitution latitude: Any model within the Plantower PMSx003 family is supported by the unified Plantower driver in firmware.
  • Control operated by students: No.
  • Sourcing plan: distributor lookup: PMS5003

Particulate Matter Sensor (Plantower PMS7003):

  • Identity: Plantower PMS7003 Ultra-thin Laser Dust Sensor.
  • Quantity: 1 (alternative to SDS011).
  • Footprint/package: Slim enclosed module (48 mm x 37 mm x 12 mm) with a dual-row 10-pin 1.27 mm pitch male header (requires an adapter PCB or custom ribbon cable to standard 2.54 mm jumper wires).
  • Electrical constraints: Supply voltage 5.0 V DC (Pins 1 and 2 connected to VU 5V); operating current 100 mA. UART interface at 9600 baud 8N1; Pins 3 and 4 connect to GND; Pin 7 (RX) connects to NodeMCU D2 (GPIO4, TX); Pin 9 (TX) connects to NodeMCU D1 (GPIO5, RX). Pins 5, 6, 8, and 10 are unused.
  • Substitution latitude: Firmware contains a dedicated read routine for PMS7003 packet formats.
  • Control operated by students: No.
  • Sourcing plan: distributor lookup: PMS7003

Particulate Matter Sensor (Honeywell HPMA115S0):

  • Identity: Honeywell HPMA115S0-XXX Series Laser Particulate Matter Sensor (e.g., HPMA115S0-001).
  • Quantity: 1 (alternative to SDS011).
  • Footprint/package: Enclosed module measuring 43 mm x 36 mm x 23.7 mm with an 8-pin 1.25 mm pitch receptacle.
  • Electrical constraints: Supply voltage 4.9 V to 5.1 V DC on Pin 2 (5V connected to VU rail); operating current ≤ 80 mA. UART interface at 9600 baud; Pin 6 (TX) connects to NodeMCU D1 (GPIO5, RX); Pin 7 (RX) connects to NodeMCU D2 (GPIO4, TX); Pin 8 connects to GND. Pins 1, 3, 4, and 5 are unused.
  • Substitution latitude: Firmware implements the Honeywell serial command set; requires this specific sensor if Honeywell mode is selected in configuration.
  • Control operated by students: No.
  • Sourcing plan: distributor lookup: HPMA115S0-XXX

Particulate Matter Sensor (Sensirion SPS30):

  • Identity: Sensirion SPS30 Optical Particulate Matter Sensor.
  • Quantity: 1 (alternative to SDS011).
  • Footprint/package: Enclosed module measuring 40.6 mm x 40.6 mm x 12.2 mm with a 5-pin 1.5 mm pitch ZHR-5 connector.
  • Electrical constraints: Supply voltage 4.5 V to 5.5 V DC on Pin 1 (connected to NodeMCU VU / VIN 5V rail); operating current approximately 60 mA (peak up to 80 mA). Interface operates in I2C mode by tying Pin 4 (SEL) to Pin 5 (GND). I2C clock speed forced to 100 kHz. Pin 2 (SDA) connects to NodeMCU D3 (GPIO0); Pin 3 (SCL) connects to NodeMCU D4 (GPIO2). I2C bus pins are 3.3 V logic compatible.
  • Substitution latitude: Requires an SPS30 module with I2C mode capability.
  • Control operated by students: No.
  • Sourcing plan: distributor lookup: SPS30

Particulate Matter Sensor (Tera Sensor Next PM):

  • Identity: Tera Sensor Next PM Optical Particulate Matter Sensor.
  • Quantity: 1 (alternative to SDS011).
  • Footprint/package: Enclosed sensor module with UART header.
  • Electrical constraints: Supply voltage 5.0 V DC (connected to VU); UART serial interface at 3.3 V logic level with TX connected to NodeMCU D1 (GPIO5, RX) and RX connected to NodeMCU D2 (GPIO4, TX).
  • Substitution latitude: Specifically supported by the Next PM firmware module added in revision NRZ-2020-130-B6 / NRZ-2021-134-B4.
  • Control operated by students: No.
  • Sourcing plan: retail shopping search: Tera Sensor Next PM

Particulate Matter Sensor (Piera Systems IPS-7100):

  • Identity: Piera Systems IPS-7100 Intelligent Particle Sensor.
  • Quantity: 1 (alternative to SDS011).
  • Footprint/package: Enclosed module with digital serial header interface.
  • Electrical constraints: Supply voltage 5.0 V DC (connected to VU); UART serial interface at 3.3 V logic level with TX connected to NodeMCU D1 (GPIO5, RX) and RX connected to NodeMCU D2 (GPIO4, TX).
  • Substitution latitude: Supported in firmware starting with release NRZ-2021-134-B4.
  • Control operated by students: No.
  • Sourcing plan: retail shopping search: Piera Systems IPS-7100

Temperature and Relative Humidity Sensor (DHT22 / AM2302):

  • Identity: Aosong DHT22 (also designated AM2302) Digital Temperature and Humidity Sensor.
  • Quantity: 1 (standard temperature/humidity sensor option).
  • Footprint/package: 4-pin single-row through-hole plastic grid casing with 2.54 mm pin pitch (or 3-pin breakout board with integrated surface-mount pull-up resistor).
  • Electrical constraints: Supply voltage 3.3 V to 5.5 V DC; wired to the 3.3 V rail (Pin 1 to NodeMCU 3V3). Data pin (Pin 2) connected to NodeMCU D7 (GPIO13). Operating current 1.0 to 1.5 mA. Single-bus proprietary timing protocol. Pin 3 is NC/unused; Pin 4 connects to GND.
  • Substitution latitude: Sensitive to condensation and UV radiation in outdoor service; firmware documentation recommends substituting with BME280 or SHT3x.
  • Control operated by students: No.
  • Sourcing plan: distributor lookup (representative example — sources give spec only): Aosong DHT22

Digital Temperature Sensor (DS18B20):

  • Identity: Maxim Integrated / Analog Devices DS18B20 1-Wire Digital Thermometer.
  • Quantity: 1 (alternative temperature sensor).
  • Footprint/package: 3-pin TO-92 plastic package or pre-wired waterproof stainless steel probe capsule.
  • Electrical constraints: Supply voltage 3.0 V to 5.5 V DC; Pin 3 (VDD) wired to 3.3 V or 5.0 V (VU rail); Pin 1 connects to GND; Pin 2 (DQ data) connects to NodeMCU D7 (GPIO13). Requires a 4.7 kΩ pull-up resistor between DQ and VDD rail (if using bare sensor rather than a breakout board). Operates on Maxim 1-Wire protocol.
  • Substitution latitude: Any authentic Maxim/Analog Devices DS18B20 or DS18B20+ works. Cannot be used simultaneously on GPIO13 with a DHT22.
  • Control operated by students: No.
  • Sourcing plan: distributor lookup: DS18B20+

Barometric Pressure, Temperature, and Humidity Sensor (Bosch BME280 / BMP280):

  • Identity: Bosch Sensortec BME280 (combined temperature, relative humidity, and barometric pressure sensor) or BMP280 (barometric pressure and temperature only) mounted on a 4-pin or 6-pin breakout board.
  • Quantity: 1 (recommended environmental sensor option).
  • Footprint/package: COTS breakout PCB (typically 15 mm x 12 mm) with a 2.54 mm pitch 4-pin or 6-pin header.
  • Electrical constraints: Supply voltage 1.71 V to 3.6 V DC (must be powered from the NodeMCU 3V3 rail; 5V will destroy an unbuffered bare sensor). Interface is I2C: VCC to 3V3, GND to GND, SCL to NodeMCU D4 (GPIO2), SDA to NodeMCU D3 (GPIO0). I2C addresses are 0x76 or 0x77.
  • Substitution latitude: BME280 provides temperature, humidity, and pressure; BMP280 provides only pressure and temperature. The firmware automatically detects which sensor is connected.
  • Control operated by students: No.
  • Sourcing plan: distributor lookup (representative example — sources give spec only): Bosch Sensortec BME280 breakout

Barometric Pressure and Temperature Sensor (Bosch BMP180):

  • Identity: Bosch Sensortec BMP180 Digital Barometric Pressure Sensor on breakout board.
  • Quantity: 1 (legacy pressure sensor option).
  • Footprint/package: 4-pin or 5-pin COTS breakout board with 2.54 mm pin spacing.
  • Electrical constraints: Supply voltage 1.8 V to 3.6 V DC (wired to NodeMCU 3V3 rail); I2C interface: SCL connects to D4 (GPIO2), SDA connects to D3 (GPIO0), GND to GND.
  • Substitution latitude: Superseded by BMP280 and BME280; supported by the legacy Adafruit BMP085 library dependency.
  • Control operated by students: No.
  • Sourcing plan: retail shopping search: BMP180 breakout board

Relative Humidity and Temperature Sensor (Measurement Specialties HTU21D / Si7021):

  • Identity: Measurement Specialties / TE Connectivity HTU21D (or Silicon Labs Si7021 / Sensirion SHT21 compatible) Digital Relative Humidity and Temperature Sensor breakout.
  • Quantity: 1 (alternative humidity/temperature sensor).
  • Footprint/package: COTS breakout PCB with 4-pin 2.54 mm header.
  • Electrical constraints: Supply voltage 1.5 V to 3.6 V DC (connected to 3V3 rail); I2C interface with SCL to D4 (GPIO2), SDA to D3 (GPIO0), GND to GND. Standard I2C address 0x40.
  • Substitution latitude: Any standard HTU21D or Si7021 breakout board compatible with the Adafruit HTU21DF library.
  • Control operated by students: No.
  • Sourcing plan: distributor lookup: HTU21D

Relative Humidity and Temperature Sensor (Sensirion SHT3x Family):

  • Identity: Sensirion SHT30, SHT31, or SHT35 Digital Humidity and Temperature Sensor breakout module.
  • Quantity: 1 (alternative humidity/temperature sensor).
  • Footprint/package: 4-pin or 6-pin COTS breakout PCB with 2.54 mm header.
  • Electrical constraints: Supply voltage 2.15 V to 5.5 V DC (connected to 3V3 rail); I2C interface with SCL to D4 (GPIO2), SDA to D3 (GPIO0), GND to GND. Standard I2C address 0x44 or 0x45.
  • Substitution latitude: Any Sensirion SHT30, SHT31-DIS, or SHT35-DIS breakout board.
  • Control operated by students: No.
  • Sourcing plan: distributor lookup: SHT31-DIS-B

Carbon Dioxide Sensor (Sensirion SCD30):

  • Identity: Sensirion SCD30 NDIR CO2, Temperature, and Relative Humidity Sensor Module.
  • Quantity: 1 (optional CO2 monitoring extension).
  • Footprint/package: Enclosed module (35 mm x 23 mm x 7 mm) with a 7-pin 2.54 mm pitch header.
  • Electrical constraints: Supply voltage 3.3 V to 5.5 V DC (connected to 3V3 or VU/VIN rail); peak current up to 75 mA during NDIR optical pulsing, average current approximately 19 mA. I2C communication interface: SCL connects to D4 (GPIO2), SDA connects to D3 (GPIO0), GND to GND.
  • Substitution latitude: Must be Sensirion SCD30; the firmware relies specifically on the SparkFun SCD30 library.
  • Control operated by students: No.
  • Sourcing plan: distributor lookup: Sensirion SCD30

Acoustic Noise Sensor (DNMS):

  • Identity: Digital Noise Measurement Sensor (DNMS) modular sound level meter board developed for the Sensor.Community project.
  • Quantity: 1 (optional noise monitoring extension).
  • Footprint/package: Dedicated sensor board module with microphone capsule and I2C / serial interface headers.
  • Electrical constraints: Powered from 3.3 V or 5.0 V rail; connects to NodeMCU via I2C (GPIO0/GPIO2) or serial interface.
  • Substitution latitude: Must conform to the Sensor.Community DNMS hardware protocol and API pin 15 mapping.
  • Control operated by students: No.
  • Sourcing plan: retail shopping search: Sensor Community DNMS noise sensor

Global Positioning System Module (u-blox NEO-6M):

  • Identity: u-blox NEO-6M GPS receiver module breakout board with ceramic patch antenna and onboard EEPROM/battery.
  • Quantity: 1 (optional geolocation extension).
  • Footprint/package: 4-pin or 5-pin COTS breakout PCB (approximately 25 mm x 35 mm) with 2.54 mm header.
  • Electrical constraints: Supply voltage must strictly be 3.3 V DC (connected to NodeMCU 3V3 rail; documentation specifically warns against 5 V). Operating current approximately 50 mA. UART interface at 9600 baud: TX connects to NodeMCU D5 (GPIO14, RX); RX connects to NodeMCU D6 (GPIO12, TX). Note: Documentation includes a warning: "USE AT OWN RISK, in combination with PM sensor the firmware may crash".
  • Substitution latitude: Any u-blox 6 / 7 / 8 series module configured for standard 9600 baud NMEA sentences supported by TinyGPSPlus.
  • Control operated by students: No.
  • Sourcing plan: retail shopping search: u-blox NEO-6M GPS module breakout

OLED Display Module:

  • Identity: 0.96-inch or 1.3-inch monochrome OLED display module (128x64 pixels) driven by an SSD1306 or SH1106 controller IC.
  • Quantity: 1 (optional local display).
  • Footprint/package: 4-pin breakout board with 2.54 mm header.
  • Electrical constraints: Supply voltage 3.3 V to 5.0 V DC (connected to NodeMCU VU 5V or 3V3 rail); current draw 15 mA to 25 mA depending on lit pixels. I2C interface: SCL connects to D4 (GPIO2), SDA connects to D3 (GPIO0), GND to GND.
  • Substitution latitude: Must have either an SSD1306 or SH1106 controller, 128x64 pixel resolution, and an I2C interface.
  • Control operated by students: No.
  • Sourcing plan: retail shopping search: 0.96 inch I2C OLED display 128x64 SSD1306

Alphanumeric LCD Module with I2C Backpack:

  • Identity: LCD1602 (16 characters x 2 lines) or LCD2004 (20 characters x 4 lines) character liquid crystal display module based on Hitachi HD44780 (or compatible) controller, equipped with an NXP PCF8574 I2C 8-bit expander backpack board.
  • Quantity: 1 (optional local display alternative).
  • Footprint/package: Standard LCD module assembly with 4-pin 2.54 mm header on the attached backpack.
  • Electrical constraints: Supply voltage 5.0 V DC (connected to NodeMCU VU pin); operating current 20 mA to 50 mA with LED backlight illuminated. I2C interface: SCL connects to D4 (GPIO2), SDA connects to D3 (GPIO0), GND to GND. Backpack address must be set to 0x27 or 0x3F.
  • Substitution latitude: Any standard HD44780 LCD module with a PCF8574-based I2C adapter.
  • Control operated by students: No. The potentiometer on the backpack is a set-once screwdriver trimmer for display contrast.
  • Sourcing plan: retail shopping search: LCD1602 with I2C backpack PCF8574

USB Interface and Power Cable:

  • Identity: USB 2.0 Type-A male to Micro-B male data and charging cable.
  • Quantity: 1.
  • Footprint/package: Standard molded cable assembly, length 1.0 m to 2.0 m.
  • Electrical constraints: Minimum 24 AWG or 28 AWG power conductors capable of carrying 5.0 V DC at ≥ 1.0 A with minimal voltage drop. Must have intact D+ and D- data conductors to permit firmware flashing and USB serial telemetry streaming at 9600 baud.
  • Substitution latitude: Any standard Micro-USB data cable. Charge-only cables will fail firmware upload and serial telemetry monitoring.
  • Control operated by students: No.
  • Sourcing plan: retail shopping search: Micro-USB data cable 1m

DC Power Supply / USB Wall Adapter:

  • Identity: External AC-to-DC USB power adapter (wall charger).
  • Quantity: 1.
  • Footprint/package: Standard wall-mount AC plug enclosure with female USB Type-A receptacle.
  • Electrical constraints: Input 100 V to 240 V AC, 50/60 Hz; output regulated 5.0 V DC ±5% at ≥ 1.0 A (1000 mA) continuous current to support simultaneous sensor fan operation, Wi-Fi transmit bursts, and optional displays.
  • Substitution latitude: Any stable 5 V USB power adapter rated for 1 A or higher.
  • Control operated by students: No.
  • Sourcing plan: retail shopping search: 5V 1A USB wall power supply

Interconnect Wire Harness:

  • Identity: 2.54 mm pitch Female-to-Female DuPont jumper wires.
  • Quantity: 10 to 20 individual conductors (depending on the number of attached sensors and displays).
  • Footprint/package: Individual insulated wires (typically 10 cm to 20 cm in length) terminated with 2.54 mm (0.1 inch) single-pin female crimp housings on both ends.
  • Electrical constraints: Stranded copper or copper-clad aluminum wire capable of handling 100 mA DC signals and low-voltage logic (3.3 V / 5.0 V).
  • Substitution latitude: Standard commodity jumper wires or custom ribbon cables.
  • Control operated by students: No.
  • Sourcing plan: retail shopping search: female to female DuPont jumper wires 20cm

Software and network dependencies

The airRohr sensor system depends on open-source embedded firmware, cross-compilation toolchains, framework cores, and peripheral device driver libraries managed via PlatformIO.

Firmware and Application Components:

  • airrohr-firmware: Primary application firmware for the Sensor.Community / Luftdaten.info air quality monitor, providing sensor driver polling, captive portal setup, JSON serialization, and multi-API reporting. Version: latest documented release is NRZ-2024-134-B5; stated in documentation (in Versions.md). Check plan: not checkable: citizen-science open source repository without vendor CVE database.
  • airrohr-update-loader: Two-stage transitional bootloader stored in SPIFFS flash to execute over-the-air (OTA) updates on devices configured with 1M/3M flash splits without exceeding the 512 kB sketch partition limit. Version: not stated. Check plan: not checkable: unpinned version.

Platform Toolchains and Hardware Frameworks:

  • PlatformIO platform-espressif8266: Toolchain and deployment framework package for ESP8266 microcontrollers. Version: 2.6.2 (reflecting Arduino Core 2.7.4); pinned in platformio.ini (line 82, platform_version = espressif8266@2.6.2). Check plan: support-status lookup: PlatformIO platform-espressif8266 2.6.2.
  • PlatformIO platform-espressif32: Toolchain and deployment framework package for ESP32 microcontrollers. Version: 1.11.1 (using Arduino Core 1.0.4); pinned in platformio.ini (line 83, platform_version_esp32 = espressif32@1.11.1). Check plan: support-status lookup: PlatformIO platform-espressif32 1.11.1.

External Arduino Driver Libraries:

  • paulstoffregen/OneWire: 1-Wire communication bus library for DS18B20 temperature sensors. Version: 2.3.5; pinned in platformio.ini (line 45, paulstoffregen/OneWire@2.3.5). Check plan: not checkable: Arduino library ecosystem has no centralized vulnerability advisory registry.
  • marcoschwartz/LiquidCrystal_I2C: HD44780 character LCD driver via PCF8574 I2C expander. Version: 1.1.4; pinned in platformio.ini (line 46, marcoschwartz/LiquidCrystal_I2C@1.1.4). Check plan: not checkable: Arduino library ecosystem has no centralized vulnerability advisory registry.
  • adafruit/Adafruit BMP085 Library: Sensor driver for Bosch BMP180 / BMP085 pressure sensors. Version: 1.0.1; pinned in platformio.ini (line 47, adafruit/Adafruit BMP085 Library@1.0.1). Check plan: not checkable: Arduino library ecosystem has no centralized vulnerability advisory registry.
  • adafruit/Adafruit HTU21DF Library: Sensor driver for HTU21D relative humidity and temperature sensors. Version: 1.1.2; pinned in platformio.ini (line 48, adafruit/Adafruit HTU21DF Library@1.1.2). Check plan: not checkable: Arduino library ecosystem has no centralized vulnerability advisory registry.
  • adafruit/Adafruit SHT31 Library: Sensor driver for Sensirion SHT3x temperature and humidity sensors. Version: 2.2.0; pinned in platformio.ini (line 49, adafruit/Adafruit SHT31 Library@2.2.0). Check plan: not checkable: Arduino library ecosystem has no centralized vulnerability advisory registry.
  • milesburton/DallasTemperature: Higher-level driver for DS18B20 temperature sensor conversion and precision control. Version: 3.9.1; pinned in platformio.ini (line 50, milesburton/DallasTemperature@3.9.1). Check plan: not checkable: Arduino library ecosystem has no centralized vulnerability advisory registry.
  • sparkfun/SparkFun SCD30 Arduino Library: Driver library for Sensirion SCD30 CO2, temperature, and humidity sensors. Version: ^1.0.13; unpinned upper bound via caret range pinned in platformio.ini (line 51, sparkfun/SparkFun SCD30 Arduino Library @ ^1.0.13). Check plan: not checkable: unpinned caret range in Arduino library ecosystem.
  • bblanchon/ArduinoJson: JSON serialization and deserialization library used for configuration persistence and API payload creation. Version: 6.18.3; pinned in platformio.ini (line 52, bblanchon/ArduinoJson@6.18.3). Check plan: not checkable: Arduino library ecosystem has no centralized vulnerability advisory registry.
  • ThingPulse/ESP8266 and ESP32 OLED driver for SSD1306 displays: Display driver for SSD1306 and SH1106 128x64 OLED modules. Version: ^4.3.0; unpinned upper bound via caret range pinned in platformio.ini (line 53, ThingPulse/ESP8266 and ESP32 OLED driver for SSD1306 displays @ ^4.3.0). Check plan: not checkable: unpinned caret range in Arduino library ecosystem.
  • mikalhart/TinyGPSPlus: NMEA GPS parsing library for u-blox NEO-6M modules. Version: 1.0.2; pinned in platformio.ini (line 54, mikalhart/TinyGPSPlus@1.0.2). Check plan: not checkable: Arduino library ecosystem has no centralized vulnerability advisory registry.

Platform-Bundled Framework Libraries:

  • ESP8266 Core Libraries: Hash, Wire, ESP8266WiFi, DNSServer, ESP8266HTTPClient, ESP8266WebServer, ESP8266mDNS, EspSoftwareSerial. Version: not stated (dynamically provided by Arduino Core 2.7.4). Pinned in platformio.ini (lines 58-66). Check plan: not checkable: bundled with platform framework.
  • ESP32 Core Libraries: Wire, WiFi, DNSServer, WiFiClientSecure, HTTPClient, FS, SPIFFS, WebServer, Update, ESPmDNS. Version: not stated (dynamically provided by Arduino Core 1.0.4). Pinned in platformio.ini (lines 69-79). Check plan: not checkable: bundled with platform framework.
  • PlatformIO Build Helper Script: platformio_script.py; referenced in platformio.ini (line 86, extra_scripts = platformio_script.py), but missing from the repository workspace files. Version: not stated.

Version Pinning Status: External driver libraries are pinned to exact versions in platformio.ini, with the exception of SparkFun SCD30 Arduino Library (^1.0.13) and ThingPulse OLED driver (^4.3.0), which employ unpinned caret ranges allowing minor and patch updates to be pulled at build time. Platform system libraries have no version numbers and track the platform framework core directly.

Manifest Location: The build manifest is platformio.ini located in the root directory of the repository.

Network Exposure:

  • Wi-Fi Interfaces: The device connects as an 802.11b/g/n Station (STA) to a local Wi-Fi router. If a configured Wi-Fi network is not reachable within 20 seconds of power-on, the firmware automatically activates Access Point (AP) mode, creating an open, unencrypted soft-AP network SSID named airRohr-[Sensor-ID] (cited from firmware_Readme.md). The AP mode turns off automatically after approximately 10 minutes.
  • Inbound Services and Open Ports:
    • HTTP Web Server listening on TCP port 80. In AP mode, incoming clients are redirected to the sensor's web configuration interface at http://192.168.4.1/. In STA mode, the interface is accessible at the assigned DHCP IP or via mDNS at http://airrohr-[Sensor-ID].local/. The web server provides device configuration, live telemetry values, a debug log stream, and a Prometheus/OpenMetrics endpoint at /metrics.
    • DNS Server listening on UDP port 53 in AP mode to implement captive portal redirection to 192.168.4.1.
    • Multicast DNS (mDNS) daemon listening on UDP port 5353, advertising the hostname airrohr-[Sensor-ID].local.
  • Default Credentials and Authentication:
    • The initial AP Wi-Fi network is open and unencrypted by default.
    • Web interface authentication default password is set to an empty string ("") by default (cited from Versions.md under NRZ-2020-130-B4: "Change default password for webpage auth to """). Users can optionally configure a WPA2 AP password and web basic auth credentials in the configuration panel.
  • Outbound Network Connections:
    • HTTPS / HTTP POST telemetry reports transmitted to citizen science and database endpoints including Sensor.Community (api.sensor.community), Madavi.de (api-rrd.madavi.de), OpenSenseMap, Feinstaub-App, custom HTTP endpoints, and InfluxDB servers. TLS certificate verification uses the ISRG Root X1 root certificate authority.
    • Network Time Protocol (NTP) queries via UDP port 123 to DHCP-provided NTP servers, local gateway, or public pools.
    • HTTP/HTTPS Over-The-Air (OTA) firmware queries to remote update servers to check for new binary images.

Downloads and External URLs

Fabrication and Physical Assembly

The standard airRohr sensor assembly does not use a custom fabricated PCB. Instead, modular breakout boards and the NodeMCU module are mounted inside an enclosure and point-to-point wired using 2.54 mm female-to-female DuPont jumper wires.

When mounting the NodeMCU board on pre-drilled perfboard or prototyping shields, board width differences must be accounted for: NodeMCU v2 has a narrow row spacing of 0.9 inches (22.86 mm), whereas NodeMCU v3 has a wider row spacing of 1.1 inches (27.94 mm), making them physically incompatible on rigid perfboard layouts without redesign. All signal interconnections (I2C bus, UART serial, 1-Wire) run at 3.3 V CMOS levels, while 5.0 V DC power from the USB rail is distributed to the sensor modules requiring active ventilation fans or optical lasers.