Last Updated May 28, 2026
Urban environmental risk becomes more visible when cities can measure it. A Raspberry Pi urban air quality and heat island monitor makes it possible to observe particulate pollution, temperature, humidity, pressure, and atmospheric conditions at neighborhood scale. These observations support SDG 11: Sustainable Cities and Communities and SDG 13: Climate Action by helping communities understand how pollution and heat vary across the built environment.
Cities concentrate population, infrastructure, transportation, housing, public services, and economic activity. They also concentrate environmental stress. Urban areas frequently experience higher temperatures than surrounding regions, increased exposure to particulate pollution, and microclimates shaped by buildings, roads, traffic, vegetation, industrial activity, water bodies, zoning, land use, and infrastructure investment.
This project demonstrates how to build a Raspberry Pi urban monitoring station that measures environmental conditions relevant to both air quality and urban heat island analysis. While simple, the design reflects a broader principle of sustainable infrastructure: distributed observation improves environmental intelligence only when the data is validated, contextualized, and interpreted responsibly. When urban conditions become visible through data, planning, policy, community awareness, and environmental justice work can become more precise.
The project should not be treated as a certified regulatory air-quality station, official weather station, public-health warning system, or climate attribution tool. Its purpose is educational and methodological: to show how low-cost sensing, edge computing, local storage, and environmental analytics can help build the measurement layer needed for healthier, cooler, more resilient cities.
Main Library
Publications
Project Series
Raspberry Pi Projects
Related Topic
Environmental Monitoring
Related Topic
Aerosol Loading
Related Topic
Climate Boundary

This project also connects to broader site areas, including Environmental Monitoring Systems, Intelligent Infrastructure Systems, Atmospheric Aerosol Loading and Regional Planetary Risk, Climate Change as a Planetary Boundary, Sustainable Development Goals Within Planetary Boundaries, and Planetary Boundaries. In that wider context, this Raspberry Pi monitor is not only a maker project. It is a small prototype of the distributed sensing and urban data infrastructure needed for healthier, more resilient cities.
Abstract
This project presents a prototype Raspberry Pi urban air quality and heat island monitor built around edge computing, environmental sensing, local time-series storage, and optional cloud integration. The system combines atmospheric sensing from a BME280 sensor with particulate monitoring from a PMS5003 in order to capture local environmental conditions relevant to air quality, heat exposure, and urban heat island analysis.
From an engineering perspective, the build demonstrates a compact urban observation node capable of sensing, logging, analyzing, and exporting environmental data. From a sustainability perspective, it shows how distributed low-cost monitoring can support more resilient cities by making urban heat and pollution patterns visible at neighborhood scale.
The system is intentionally limited. It is not a certified weather station, not a regulatory air-quality monitor, not a public-health warning system, and not a complete urban climate research network. Its value is educational, methodological, and civic: it shows how urban environmental risk can be observed more locally while emphasizing validation, siting, calibration, uncertainty, and responsible interpretation.
SDG Alignment: Sustainable Cities, Climate Action, Health, Infrastructure, and Environmental Inequality
This project aligns most directly with SDG 11: Sustainable Cities and Communities and SDG 13: Climate Action. It supports sustainable cities by improving local environmental visibility around heat, air pollution, and neighborhood-scale risk. It supports climate action by enabling low-cost observation systems that help identify heat anomalies, pollution spikes, and changing urban environmental conditions.
The project also relates to SDG 3: Good Health and Well-Being, SDG 9: Industry, Innovation and Infrastructure, and SDG 10: Reduced Inequalities. Air pollution and heat exposure affect public health; distributed sensing is part of environmental data infrastructure; and exposure burdens are often unevenly distributed across neighborhoods.
| Sustainable Development Goal | How the Project Relates | Project-Level Mechanism |
|---|---|---|
| SDG 11: Sustainable Cities and Communities | Supports urban resilience, neighborhood environmental monitoring, heat exposure awareness, and more localized planning evidence. | Temperature, humidity, pressure, and particulate matter sensing at urban sites. |
| SDG 13: Climate Action | Relates to local climate adaptation, heat island analysis, climate-risk awareness, and community-scale environmental observation. | Local thermal monitoring, regional temperature comparison, anomaly detection, and trend analysis. |
| SDG 3: Good Health and Well-Being | Connects to public-health awareness because heat and particulate pollution affect respiratory, cardiovascular, and heat-stress risks. | Screening-level environmental readings that can support education and prompt professional investigation when needed. |
| SDG 9: Industry, Innovation and Infrastructure | Demonstrates distributed sensing, edge computing, local storage, dashboarding, and resilient urban environmental data infrastructure. | Raspberry Pi node using I2C, UART, SQLite logging, local analytics, and optional cloud export. |
| SDG 10: Reduced Inequalities | Relates to environmental inequality because pollution, heat, shade, traffic, industry, and green space are unevenly distributed. | Neighborhood-scale monitoring that can help reveal differences hidden by citywide averages. |
The strongest SDG connection is SDG 11. Cities need environmental data that is fine-grained enough to support planning, public-space design, transportation decisions, shade investments, cooling strategies, green infrastructure, school safety, and infrastructure adaptation. A small Raspberry Pi monitoring node cannot determine city policy by itself, but it can demonstrate the measurement architecture that better urban resilience requires.
The connection to SDG 13 comes through climate adaptation. Urban heat islands intensify climate-related heat exposure, especially during heat waves. Local monitoring can help identify where built environments amplify heat stress and where mitigation strategies may be most needed.
The connection to SDG 3 must be framed carefully. PM2.5 and heat exposure have public-health relevance, but a prototype monitor does not provide medical advice, official exposure assessment, or public-health warnings. It can support environmental literacy, screening, and local observation while pointing users toward validated sources for consequential decisions.
The connection to SDG 10 is especially important for morally serious urban monitoring. Environmental burdens are often shaped by unequal infrastructure, housing, zoning, industrial siting, traffic exposure, tree canopy, and public investment. Distributed sensing can help make unequal exposure more visible, but the data must be interpreted with community context rather than treated as a purely technical problem.
Because the Sustainable Development Goals are broad public frameworks, it is important not to overclaim. This project is not a regulatory network, not an official climate service, and not a substitute for public agencies or professional environmental assessment. Its contribution is narrower and still valuable: it teaches the architecture of urban environmental observation and shows how local sensing can support more informed civic questions.
Connections to Other Site Areas
This Raspberry Pi urban air quality monitor belongs to a wider body of work on monitoring systems, climate adaptation, and intelligent infrastructure. It connects directly to Environmental Monitoring Systems, where air sensors, field data, telemetry, and environmental datasets become tools for understanding public-health and ecological conditions.
It also connects to Intelligent Infrastructure Systems. Cities increasingly need infrastructure that can sense conditions, store observations, detect anomalies, and support decisions about transport, zoning, building systems, public health, and neighborhood resilience.
At the planetary-boundary level, this project relates to Atmospheric Aerosol Loading and Regional Planetary Risk. Particulate pollution is not only a local air-quality concern. It also intersects with atmospheric chemistry, visibility, cloud processes, regional climate effects, and human health.
The project also connects to Climate Change as a Planetary Boundary because urban heat, fossil-fuel-dependent transport systems, building energy use, and combustion-related particulate pollution are closely linked to climate and infrastructure systems.
Why a Raspberry Pi Urban Air Quality Monitor Matters
Urban environmental conditions vary dramatically across short distances. A single city can contain cooler and hotter neighborhoods, cleaner and more polluted corridors, shaded and unshaded schools, high-traffic and low-traffic blocks, well-treed and hard-surfaced districts, and very different levels of exposure to climate stress.
Large monitoring stations remain essential, but they are often too sparse to capture local variation at high spatial resolution. A Raspberry Pi-based monitoring node matters because it provides an affordable way to expand environmental visibility into neighborhoods, schools, streetscapes, libraries, rooftops, community centers, and experimental urban research zones.
This kind of system helps translate abstract environmental concern into measurable local evidence. It does not replace certified monitoring networks, but it can help communities ask better questions: where is air quality worse, when do heat spikes occur, how do streetscapes differ, and which sites may need further professional investigation?
The project also teaches that cities are environmental systems. Streets, trees, buildings, vehicles, asphalt, transit corridors, industrial sites, waterways, wind patterns, and housing conditions shape exposure. A monitoring node makes those interactions more visible, but interpretation still requires planning knowledge, public-health context, and local lived experience.
Urban Climate and the Heat Island Effect
One of the most widely studied urban environmental phenomena is the urban heat island effect. Cities often experience higher temperatures than nearby rural or less built-up areas because built infrastructure absorbs, stores, and releases heat differently from vegetated landscapes.
Several factors contribute to urban heat islands:
- dark surfaces such as asphalt absorbing solar radiation
- reduced vegetation and reduced evaporative cooling
- dense building structures that trap heat and reduce airflow
- waste heat from vehicles, buildings, and industrial activity
- limited shade and high impervious surface cover
- urban geometry that changes wind, radiation, and nighttime cooling
During extreme heat events, urban heat islands can increase health risks, worsen outdoor working conditions, raise cooling demand, strain electricity systems, and make some neighborhoods substantially more dangerous than others. Monitoring temperature differences across neighborhoods can help identify areas where mitigation strategies such as tree planting, shade infrastructure, reflective roofing, cool pavement, cooling centers, or building retrofits may be most effective.
A Raspberry Pi monitor can help observe local heat patterns, but careful siting is essential. A sensor in direct sunlight, near a wall, above asphalt, inside a sealed enclosure, or near waste heat may measure a very specific microenvironment rather than general ambient air temperature. That may still be useful, but the interpretation must match the placement.
Air Pollution and Urban Environmental Health
Urban air quality is another major environmental concern. Particulate pollution, especially fine particles known as PM2.5, is associated with respiratory and cardiovascular risk and is often unevenly distributed across urban space.
Sources of urban particulate pollution include:
- vehicle emissions and brake or tire wear
- industrial activity
- construction dust
- heating systems and combustion sources
- wildfire smoke and regional transport
- secondary atmospheric reactions
- resuspended road dust and localized activity
Monitoring PM2.5 concentrations allows environmental researchers, educators, communities, and city planners to observe pollution variation, identify potential hotspots, compare sites, and evaluate whether further investigation is needed. Low-cost sensors should be interpreted carefully, but they can make otherwise invisible environmental risk more tangible.
PM sensors such as the PMS5003 are useful for trend detection and educational monitoring, but they are affected by airflow, humidity, particle composition, sensor aging, local placement, and calibration. Their readings should be compared with reference monitors where possible and should not be treated as regulatory measurements.
Distributed Urban Monitoring Systems
Traditional air-quality stations operated by governments provide highly accurate data but are often limited in number because of cost, maintenance, siting requirements, and regulatory standards.
Distributed sensing systems using embedded computing platforms can complement these networks by expanding spatial coverage. Low-cost monitoring stations deployed across neighborhoods can provide:
- higher spatial resolution environmental data
- community-level climate observations
- experimental platforms for urban climate research
- localized evidence for planning and adaptation
- educational tools for schools, libraries, and civic science programs
- early screening of possible pollution or heat-exposure hotspots
The goal is not to turn low-cost sensors into regulatory instruments. The goal is to create a more layered environmental data ecosystem where official monitoring, scientific research, and community-scale observation can reinforce one another.
Distributed monitoring also raises governance questions. Who maintains the devices? Who owns the data? Who interprets anomalies? Who has access to site-level information? Who benefits from the data, and who may be burdened by new forms of surveillance? Responsible urban sensing requires attention to those civic and ethical questions alongside technical implementation.
System Requirements
An urban air quality and heat island monitor becomes useful only when its requirements are explicit. The system must collect environmental readings, preserve metadata, store observations reliably, remain maintainable, and avoid presenting prototype data as official public-health or regulatory information.
| Requirement | Design Target | Reason |
|---|---|---|
| Atmospheric sensing | Measure temperature, humidity, and pressure using a BME280 or similar sensor | Supports heat island, microclimate, and local environmental condition analysis |
| Particulate sensing | Measure PM1.0, PM2.5, and PM10 using a PMS5003 or similar sensor | Provides screening-level particulate pollution observations |
| Reliable timekeeping | Store UTC timestamps with each observation | Environmental monitoring depends on time-series records |
| Local storage | Use CSV, SQLite, or another local storage layer | Preserves data even when network access is unavailable |
| Metadata capture | Record sensor ID, location ID, units, placement notes, and quality flags | Supports interpretation, comparison, and later analysis |
| Validation workflow | Compare readings against reference devices, public datasets, or colocated sensors where possible | Prevents overconfidence in unvalidated low-cost data |
| Responsible interpretation | Label outputs as prototype monitoring data | Clarifies that the system is not a regulatory or public-health instrument |
These requirements make the project more than a sensor demo. They turn it into a small urban environmental data infrastructure node with a defined measurement purpose, a realistic scope, and a clearer relationship to urban sustainability.
Bill of Materials
- Raspberry Pi 4, Raspberry Pi 5, or Raspberry Pi Zero 2 W
- BME280 environmental sensor for temperature, humidity, and pressure
- PMS5003 particulate matter sensor for PM1.0, PM2.5, and PM10
- MicroSD storage with adequate endurance for logging
- stable power supply
- Wi-Fi, Ethernet, or optional LoRa communication module
- weather-resistant ventilated enclosure
- airflow-aware particulate sensor housing
- radiation shield or shaded mounting for temperature measurement
- mounting hardware for indoor, rooftop, classroom, or sheltered outdoor placement
These components allow the system to capture both atmospheric conditions and particulate pollution levels using a single edge node. For outdoor or semi-outdoor deployments, enclosure design, airflow, weather protection, and sensor placement are as important as the electronics themselves.
Engineering Specifications
| Parameter | Reference Design |
|---|---|
| Compute platform | Raspberry Pi 4, Raspberry Pi 5, or Raspberry Pi Zero 2 W |
| Primary atmospheric sensor | BME280 for temperature, humidity, and pressure |
| Air quality sensor | PMS5003 for PM1.0, PM2.5, and PM10 |
| Interfaces | I2C for BME280, UART for PMS5003 |
| Storage options | CSV, SQLite, InfluxDB, or external database export |
| Output options | Console, local database, dashboard, optional cloud export |
| Analytics options | Heat-island comparison, rolling averages, anomaly detection, threshold flags |
| Deployment mode | Urban edge monitoring node |
| Target scope | Educational, prototype, and experimental urban observation |
The reference design is modular. The BME280 and PMS5003 provide a useful starting point, but the same Raspberry Pi architecture can be expanded with noise sensors, rainfall gauges, wind sensors, weather APIs, satellite-data comparison, or neighborhood dashboards.
System Architecture
The Raspberry Pi functions as the central processing node of the monitoring station.
Environmental Sensors → I2C / UART Interface → Raspberry Pi → Local Database → Visualization Dashboard → Optional Cloud Integration
This architecture allows the monitoring system to operate independently while still supporting integration with external data platforms. It also makes the system useful for edge analytics, anomaly detection, and local resilience experiments.
At a systems level, the monitor can be understood as five layers:
- Sensing layer: BME280 atmospheric readings and PMS5003 particulate measurements.
- Acquisition layer: I2C and UART interfaces on the Raspberry Pi.
- Storage layer: CSV files, SQLite databases, or time-series databases.
- Analytics layer: heat-island comparison, rolling averages, anomaly detection, and quality flags.
- Communication layer: local dashboards, API export, or cloud integration.
This architecture also connects the project to the larger Raspberry Pi environmental monitoring series. The same pattern — sensors, edge computing, storage, analytics, dashboarding, and responsible interpretation — appears in climate data hubs, smart irrigation, biodiversity camera traps, water-quality networks, solar microgrid monitors, early warning systems, and flood-monitoring nodes.
Measurement Principle: Urban Air, Heat, and Exposure as Time-Series Data
The monitoring station collects environmental signals from a particular urban site. The BME280 measures local temperature, humidity, and pressure. The PMS5003 estimates particulate concentration by drawing air through an optical sensing chamber and estimating particle concentrations from scattered light.
These measurements are useful because urban environmental conditions are not uniform. A shaded park may be cooler than a paved parking lot. A street canyon may retain heat longer than an open waterfront. A school near a busy road may experience particulate patterns different from a school several blocks away. A rooftop sensor may behave differently from a sidewalk-level sensor.
A single reading is limited. A time series is more useful. Repeated readings make it possible to observe diurnal cycles, rush-hour patterns, heat buildup, smoke episodes, weather transitions, ventilation changes, sensor drift, and persistent differences between monitoring sites.
The measurement principle is therefore not simply “measure air quality.” It is: collect time-stamped environmental signals from a documented urban location, preserve metadata, compare readings with baselines or reference data, and interpret the results in relation to built form, traffic, land use, weather, and community context.
Mathematical Lens: From Sensor Readings to Urban Environmental Insight
The Raspberry Pi urban monitor can be understood as a time-series and exposure-analysis system. It converts sensor readings into structured observations that can be averaged, compared, flagged, and interpreted.
\Delta T_{\mathrm{urban}} = T_{\mathrm{local}} – T_{\mathrm{reference}}
\]
Interpretation: The local urban heat signal can be approximated by comparing site temperature with a regional or reference temperature.
This does not prove a formal urban heat island effect by itself. It simply provides a first diagnostic comparison that can identify sites worthy of closer analysis.
\bar{x}_t=\frac{1}{n}\sum_{i=t-n+1}^{t}x_i
\]
Interpretation: A rolling average smooths short-term sensor noise and helps reveal recent environmental trends.
Rolling averages are useful for temperature, humidity, pressure, and particulate matter because urban readings can fluctuate quickly because of traffic, wind, sensor noise, and microclimate effects.
z_t=\frac{x_t-\mu}{\sigma}
\]
Interpretation: A standard score compares a current reading with a baseline mean \(\mu\) and standard deviation \(\sigma\).
A standard score can help identify pollution spikes or heat events that are unusual relative to the station’s recent history. It does not identify the cause of the event.
E = \sum_{t=1}^{T} C_t \Delta t
\]
Interpretation: A simple cumulative exposure proxy can sum pollutant concentration \(C_t\) over time intervals \(\Delta t\).
This kind of cumulative metric helps distinguish a brief spike from sustained exposure. A short PM2.5 burst and a full day of elevated particulate matter may have very different meanings.
R_t =
\begin{cases}
\text{review}, & PM_{2.5,t} > T_{\mathrm{PM}} \\
\text{observe}, & PM_{2.5,t} \leq T_{\mathrm{PM}}
\end{cases}
\]
Interpretation: A threshold rule can flag particulate readings for review while avoiding claims that the prototype has made an official air-quality determination.
The mathematical lens shows why the Raspberry Pi is useful. It can do more than read sensors. It can calculate rolling baselines, compare local and regional temperatures, flag unusual PM2.5 readings, summarize daily patterns, and support dashboards that make urban environmental conditions easier to interpret.
Connecting the Environmental Sensors
BME280 Sensor: I2C
- VCC → Raspberry Pi 3.3V
- GND → Raspberry Pi Ground
- SDA → GPIO 2
- SCL → GPIO 3
PMS5003 Air Quality Sensor: UART
- VCC → Raspberry Pi 5V
- GND → Raspberry Pi Ground
- TX → Raspberry Pi RX, GPIO15
- RX → Raspberry Pi TX, GPIO14
Use stable power and confirm sensor voltage requirements before deployment, especially when combining multiple sensors inside a compact enclosure. The PMS5003 includes an internal fan, so airflow and power stability both affect data quality.
On Raspberry Pi OS, enable I2C and serial communication before running the scripts. I2C and serial hardware can usually be configured through raspi-config:
sudo raspi-config
# Interface Options → I2C → Enable
# Interface Options → Serial Port → Disable login shell, enable serial hardware
Because the PMS5003 uses a serial connection, make sure the Raspberry Pi serial console is not occupying the same UART. If the sensor produces no data, check UART configuration, wire orientation, baud rate, and whether the sensor fan is running.
Software Environment and Dependencies
The project uses Python because the Raspberry Pi ecosystem has strong support for environmental sensors, serial communication, data logging, analytics libraries, web requests, and dashboards.
A typical setup includes:
sudo apt update
sudo apt install -y python3-pip python3-venv i2c-tools sqlite3
python3 -m venv .venv
source .venv/bin/activate
pip install adafruit-circuitpython-bme280 adafruit-blinka pyserial requests numpy scikit-learn pandas
For production-like prototypes, avoid running long-term scripts manually from an open terminal. A later version can use systemd, cron, Docker, or a process supervisor. First, however, run the scripts interactively so wiring, library, and sensor errors remain visible during testing.
Because environmental observations may accumulate quickly, plan storage early. SQLite databases, CSV logs, dashboards, and error logs should be rotated, backed up, or archived so that storage limits do not silently interrupt monitoring.
Python Code for Reading Environmental Data
The following Python example reads temperature, humidity, and pressure from a BME280 sensor. It uses a small data class and reusable functions so the same readings can later be logged, analyzed, or displayed in a dashboard.
"""
Raspberry Pi Urban Air Quality Monitor
BME280 Environmental Sensor Reader
Reads:
- temperature in degrees Celsius
- relative humidity in percent
- atmospheric pressure in hectopascals
This script is intended for educational and prototype urban monitoring.
Validate readings before interpreting environmental conditions.
"""
import time
from dataclasses import dataclass
import board
import busio
import adafruit_bme280
@dataclass
class EnvironmentalReading:
"""Structured container for one BME280 environmental observation."""
temperature_c: float
humidity_percent: float
pressure_hpa: float
def initialize_bme280() -> adafruit_bme280.Adafruit_BME280_I2C:
"""Initialize the BME280 sensor over the Raspberry Pi I2C bus."""
i2c = busio.I2C(board.SCL, board.SDA)
sensor = adafruit_bme280.Adafruit_BME280_I2C(i2c)
return sensor
def read_environment(sensor: adafruit_bme280.Adafruit_BME280_I2C) -> EnvironmentalReading:
"""Read one environmental observation from the BME280 sensor."""
return EnvironmentalReading(
temperature_c=sensor.temperature,
humidity_percent=sensor.humidity,
pressure_hpa=sensor.pressure,
)
def print_environment(reading: EnvironmentalReading) -> None:
"""Print a formatted environmental reading."""
print(
f"Temperature: {reading.temperature_c:.2f} C | "
f"Humidity: {reading.humidity_percent:.2f}% | "
f"Pressure: {reading.pressure_hpa:.2f} hPa"
)
def main() -> None:
"""Run a simple monitoring loop."""
sensor = initialize_bme280()
print("Raspberry Pi Urban Environmental Monitor")
print("Reading BME280 temperature, humidity, and pressure...")
print("----------------------------------------------------")
while True:
try:
reading = read_environment(sensor)
print_environment(reading)
except Exception as exc:
print(f"BME280 read error: {exc}")
time.sleep(10)
if __name__ == "__main__":
main()
This script verifies the atmospheric sensing layer before the project adds particulate readings, logging, heat-island comparison, anomaly detection, or dashboards.
Reading PM2.5 Air Quality Data
The following example parses particulate-matter values from the PMS5003 serial data stream. It includes basic frame validation, readable structure, and comments for extension.
"""
PMS5003 Particulate Matter Reader
Reads PM1.0, PM2.5, and PM10 values from a PMS5003-style sensor over UART.
Notes:
- Low-cost optical particulate sensors are useful for trends and comparisons.
- They are not certified regulatory instruments.
- Airflow, humidity, sensor aging, and particle composition affect readings.
"""
from dataclasses import dataclass
from typing import Optional
import serial
@dataclass
class ParticulateReading:
"""Structured container for particulate matter readings."""
pm1_ug_m3: int
pm25_ug_m3: int
pm10_ug_m3: int
def initialize_serial(port: str = "/dev/serial0", baudrate: int = 9600) -> serial.Serial:
"""Open the UART connection used by the PMS5003 sensor."""
return serial.Serial(port, baudrate=baudrate, timeout=2)
def read_pm_data(ser: serial.Serial) -> Optional[ParticulateReading]:
"""
Read one PMS5003 data frame.
PMS5003 frames are 32 bytes and commonly begin with:
0x42 0x4D
This function checks the header and reconstructs PM values from byte pairs.
"""
data = ser.read(32)
if len(data) < 32:
return None
if data[0] != 0x42 or data[1] != 0x4D:
return None
# These byte positions correspond to common PMS5003 atmospheric values.
pm1 = data[10] * 256 + data[11]
pm25 = data[12] * 256 + data[13]
pm10 = data[14] * 256 + data[15]
return ParticulateReading(
pm1_ug_m3=pm1,
pm25_ug_m3=pm25,
pm10_ug_m3=pm10,
)
if __name__ == "__main__":
serial_connection = initialize_serial()
while True:
reading = read_pm_data(serial_connection)
if reading is None:
print("Waiting for valid PMS5003 frame...")
continue
print(
f"PM1.0: {reading.pm1_ug_m3} ug/m3 | "
f"PM2.5: {reading.pm25_ug_m3} ug/m3 | "
f"PM10: {reading.pm10_ug_m3} ug/m3"
)
Low-cost particulate sensors are most useful when readings are compared over time, compared across sites, and interpreted alongside humidity, airflow, weather, and reference data. They are not a substitute for certified regulatory monitors.
Storing Environmental Observations
Urban monitoring systems generate time-series datasets. A lightweight database such as SQLite allows sensor observations to be stored and queried efficiently.
"""
SQLite Logger for Urban Environmental Observations
Stores temperature, humidity, pressure, and particulate readings in SQLite.
This creates a local time-series dataset for later analysis in Python, R,
SQL, or dashboard tools.
"""
import sqlite3
from datetime import datetime, timezone
from pathlib import Path
DATABASE_PATH = Path("urban_environment.db")
def create_connection(db_path: Path = DATABASE_PATH) -> sqlite3.Connection:
"""Create a SQLite connection."""
return sqlite3.connect(db_path)
def initialize_database(conn: sqlite3.Connection) -> None:
"""Create the air_quality table if it does not already exist."""
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS air_quality (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp_utc TEXT NOT NULL,
temperature_c REAL NOT NULL,
humidity_percent REAL NOT NULL,
pressure_hpa REAL NOT NULL,
pm1_ug_m3 REAL,
pm25_ug_m3 REAL,
pm10_ug_m3 REAL,
sensor_id TEXT DEFAULT 'urban_node_01',
location_id TEXT DEFAULT 'prototype_site',
quality_flag TEXT DEFAULT 'unchecked',
notes TEXT DEFAULT ''
)
""")
conn.commit()
def log_data(
conn: sqlite3.Connection,
temperature_c: float,
humidity_percent: float,
pressure_hpa: float,
pm1_ug_m3: float | None,
pm25_ug_m3: float | None,
pm10_ug_m3: float | None,
sensor_id: str = "urban_node_01",
location_id: str = "prototype_site",
quality_flag: str = "unchecked",
notes: str = "",
) -> None:
"""Insert one environmental observation into the database."""
cursor = conn.cursor()
timestamp_utc = datetime.now(timezone.utc).isoformat()
cursor.execute("""
INSERT INTO air_quality (
timestamp_utc,
temperature_c,
humidity_percent,
pressure_hpa,
pm1_ug_m3,
pm25_ug_m3,
pm10_ug_m3,
sensor_id,
location_id,
quality_flag,
notes
)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
""", (
timestamp_utc,
temperature_c,
humidity_percent,
pressure_hpa,
pm1_ug_m3,
pm25_ug_m3,
pm10_ug_m3,
sensor_id,
location_id,
quality_flag,
notes,
))
conn.commit()
if __name__ == "__main__":
conn = create_connection()
initialize_database(conn)
# Example row. Replace these values with live BME280 and PMS5003 readings.
log_data(
conn=conn,
temperature_c=31.4,
humidity_percent=54.2,
pressure_hpa=1008.9,
pm1_ug_m3=6,
pm25_ug_m3=14,
pm10_ug_m3=21,
quality_flag="demo",
notes="example observation",
)
conn.close()
Over time this dataset becomes a structured environmental record that can be analyzed using Python, R, SQL, or visualization tools. Quality flags and notes are included because environmental data without context becomes difficult to trust later.
Urban Environmental Data Model
A monitoring station becomes more useful when each observation is recorded in a consistent data model. Urban environmental readings should not be stored as isolated numbers without location, units, sensor identity, quality status, and field context.
| Field | Example | Purpose |
|---|---|---|
| timestamp_utc | 2026-05-28T09:15:00Z | Creates a consistent time reference for analysis |
| location_id | school_roof_01 | Identifies the monitoring site |
| sensor_id | pms5003_a | Links readings to specific hardware |
| temperature_c | 31.4 | Local temperature reading |
| humidity_percent | 54.2 | Relative humidity context |
| pm25_ug_m3 | 14 | Estimated PM2.5 concentration |
| quality_flag | valid | Marks readings as valid, suspect, missing, demo, or calibration-needed |
| placement_note | shaded, ventilated, 2m above ground | Documents site conditions affecting interpretation |
| maintenance_note | sensor inlet cleaned | Preserves maintenance history |
Consistent metadata allows a simple Raspberry Pi project to become a reusable urban environmental dataset. It also supports later dashboarding, neighborhood comparison, field validation, and quality-control workflows.
Detecting Urban Heat Island Signals
One way to identify possible urban heat island effects is by comparing local sensor readings with nearby regional temperature observations. This does not prove causality, but it can help identify sites where local conditions are consistently warmer than a regional reference.
"""
Urban Heat Island Comparison Example
Compares a local Raspberry Pi temperature reading with a regional reference
temperature from Open-Meteo.
This is a simple diagnostic heuristic, not a formal heat-island study.
"""
import requests
def get_regional_temperature(latitude: float, longitude: float) -> float:
"""
Retrieve current regional temperature from Open-Meteo.
Use coordinates near the monitoring area but representative of broader
regional conditions.
"""
url = "https://api.open-meteo.com/v1/forecast"
params = {
"latitude": latitude,
"longitude": longitude,
"current_weather": True,
}
response = requests.get(url, params=params, timeout=20)
response.raise_for_status()
data = response.json()
return data["current_weather"]["temperature"]
def classify_heat_difference(
local_temperature_c: float,
regional_temperature_c: float,
threshold_c: float = 3.0,
) -> dict:
"""
Compare local and regional temperatures.
A positive difference above threshold suggests a possible local heat signal
worth investigating.
"""
difference_c = local_temperature_c - regional_temperature_c
return {
"local_temperature_c": local_temperature_c,
"regional_temperature_c": regional_temperature_c,
"difference_c": difference_c,
"possible_heat_island_signal": difference_c >= threshold_c,
}
if __name__ == "__main__":
# Example coordinates near St. Louis, Missouri.
regional_temp = get_regional_temperature(latitude=38.6, longitude=-90.2)
# Replace with live BME280 reading from the monitoring station.
local_temp = 34.2
result = classify_heat_difference(local_temp, regional_temp)
print(result)
If local temperatures are consistently several degrees higher than nearby regional observations, the monitoring station may be detecting a local heat signal that deserves further analysis.
That interpretation depends on siting. A device mounted above asphalt in direct sun may show high readings because of exposure and enclosure effects. A shaded, ventilated sensor mounted at a consistent height provides a more useful comparison for ambient heat. Both readings can be meaningful, but they answer different questions.
Integrating Global and Regional Climate Data
Local monitoring stations become more valuable when their observations can be compared with broader climate datasets.
Examples of widely used climate and environmental data sources include:
- NASA Earthdata
- NOAA National Centers for Environmental Information
- Copernicus Climate Data Store
- World Meteorological Organization
Combining local sensor observations with these datasets allows the monitoring system to place neighborhood-scale conditions within a broader climate context. Local sensors show what is happening at a specific site; regional and global datasets help interpret whether those conditions reflect a local anomaly, a regional heat event, or a larger atmospheric pattern.
Local and regional data will not always match. That mismatch may be exactly what matters. A neighborhood-scale sensor may reveal a microclimate or pollution corridor that regional data smooths away. The analytical task is to understand the difference, not to erase it.
AI and Environmental Analytics
Environmental monitoring systems can incorporate lightweight anomaly-detection models capable of identifying unusual pollution events or thermal spikes. These methods should be treated as screening tools, not as explanations.
"""
Simple PM2.5 Anomaly Detection Example
Uses IsolationForest to flag unusual PM2.5 readings.
This is a prototype analytics example. It should be validated with real
monitoring data before being used for environmental interpretation.
"""
import numpy as np
from sklearn.ensemble import IsolationForest
def detect_pm25_anomaly(pm25_history: list[float], current_pm25: float) -> bool:
"""
Fit an IsolationForest model to recent PM2.5 history and classify the
current reading as normal or anomalous.
"""
if len(pm25_history) < 20:
# Not enough history for a meaningful model.
return False
data = np.array(pm25_history).reshape(-1, 1)
model = IsolationForest(
contamination=0.01,
random_state=42,
)
model.fit(data)
prediction = model.predict([[current_pm25]])
# IsolationForest returns -1 for anomaly and 1 for normal.
return prediction[0] == -1
if __name__ == "__main__":
example_history = [
8, 9, 10, 12, 11, 13, 10, 9, 8, 12,
14, 13, 11, 10, 9, 12, 13, 11, 10, 9,
12, 14, 13, 11, 10
]
current_value = 65
if detect_pm25_anomaly(example_history, current_value):
print("Air quality anomaly detected.")
else:
print("PM2.5 reading appears within recent historical range.")
Running lightweight anomaly detection at the edge allows monitoring nodes to flag pollution spikes or unusual urban stress conditions without requiring constant cloud analysis. The key is careful interpretation: anomaly detection can highlight unusual readings, but it does not automatically explain their cause.
For public-facing dashboards, anomaly labels should be conservative. A phrase such as “review recommended” is safer and more accurate than “dangerous pollution event” unless the system is validated and connected to official thresholds and guidance.
Edge Computing and Distributed Urban Intelligence
Sending all sensor data to centralized cloud servers can become inefficient as monitoring networks grow. Edge computing allows environmental monitoring devices to perform preliminary analysis locally.
A Raspberry Pi monitoring node can process sensor data, detect anomalies, summarize conditions, and transmit only relevant information to remote systems. This architecture supports distributed environmental intelligence across multiple monitoring stations deployed throughout a city.
In practical terms, edge computing can support:
- local buffering during network outages
- near-real-time alerts for pollution or heat spikes
- reduced cloud bandwidth and storage requirements
- neighborhood dashboards
- privacy-aware community monitoring systems
- local quality checks before data export
The same edge-computing pattern can support other urban systems, including stormwater sensing, transit corridor monitoring, building-energy observations, schoolyard heat studies, and distributed climate adaptation tools.
GitHub Repository
The article body includes the core implementation logic so the build remains readable. The full repository expands the project into a reproducible prototype package, including Python monitoring scripts, sensor setup documentation, SQLite logging examples, deployment notes, example environmental datasets, heat-island diagnostics, and climate API integration scaffolding.
Complete Code Repository
The full code distribution for this project, including Python monitoring scripts, sensor setup documentation, SQLite logging examples, deployment notes, example environmental datasets, heat-island diagnostics, and climate API integration scaffolding, is available on GitHub.
The repository contains the complete prototype build materials:
- Python monitoring scripts
- sensor setup documentation
- SQLite logging examples
- deployment notes
- example environmental datasets
- climate API integration examples
Repository Structure
raspberry-pi-urban-air-quality-monitor/
README.md
LICENSE
requirements.txt
src/
read_environment.py
read_pm_data.py
log_environment.py
heat_island_check.py
anomaly_detection.py
climate_api_example.py
docs/
setup_guide.md
deployment_notes.md
sensor_notes.md
data_model.md
data/
example_urban_environment_data.csv
hardware/
Engineers can clone the repository, fork the design, or download the complete project using GitHub’s Download ZIP feature. All materials are released under the MIT License to support reuse in research, education, civic technology, and prototype engineering work.
Engineering Notes
A few technical considerations are especially important in this build:
- Sensor enclosure design: protection must not compromise airflow or thermal realism.
- Interface stability: mixed I2C and UART systems require careful wiring and power discipline.
- Local persistence: robust local logging matters when network connectivity is intermittent.
- Data comparability: neighborhood-scale observations are most useful when timestamps, units, and location metadata are consistent.
- Urban deployment reality: power, vandalism, weather, siting, airflow, and maintenance all affect system usefulness.
- Sensor interpretation: low-cost particulate sensors can show trends, but they should not be treated as regulatory instruments.
- Equity context: monitoring should help reveal environmental burdens without shifting responsibility away from institutions.
These factors make the project more than a sensor demonstration. It becomes a prototype urban environmental data infrastructure node.
Deployment Scope and Data-Quality Considerations
This prototype is designed for educational, experimental, and early-stage urban monitoring. It should not be treated as a certified weather station, regulatory air-quality monitor, official public-health instrument, or emergency alert system.
Data quality depends on sensor placement, enclosure design, airflow, shading, humidity exposure, power stability, calibration, and maintenance. A sensor placed in direct sunlight may report heat exposure rather than ambient air temperature. A particulate sensor near a roadway may represent traffic exposure rather than neighborhood background conditions. A sensor inside a poorly ventilated box may measure enclosure conditions rather than outdoor air.
These constraints do not make the system unhelpful. They define the appropriate scope of interpretation: local observation, trend detection, educational monitoring, prototype analytics, environmental awareness, and community-scale environmental investigation.
Responsible data-quality practice also requires labeling uncertainty. Public-facing outputs should distinguish raw readings, validated readings, suspect readings, missing data, sensor errors, and model-based flags. A clean dashboard can be misleading if it hides uncertainty behind polished visuals.
Failure Modes and Practical Risks
A useful urban monitoring article should explain not only how the station works, but how it can fail. Urban environmental systems often fail through siting problems, enclosure effects, sensor limitations, data gaps, and overinterpretation.
- Direct sunlight bias: temperature readings may reflect solar heating of the device rather than ambient air.
- Poor airflow: sealed or poorly ventilated enclosures can distort heat and particulate readings.
- Humidity interference: moisture can affect particulate sensor readings and electronics reliability.
- Roadside bias: traffic-adjacent sensors may reflect near-road exposure rather than neighborhood background conditions.
- UART parsing failure: PMS5003 data may fail if serial settings, wiring, or frame validation are incorrect.
- Power instability: weak power can cause reboots, missing observations, corrupted files, or sensor dropouts.
- Sensor aging: optical particle sensors may drift or become contaminated over time.
- Clock errors: incorrect system time can corrupt time-series interpretation.
- False authority: dashboards may make prototype data appear official or regulatory.
- Environmental misinterpretation: a local anomaly may be mistaken for a citywide condition without comparison data.
These risks do not make the project unusable. They make validation, siting, documentation, and responsible interpretation essential. A monitoring station should include a plan for checking sensor behavior, inspecting logs, reviewing anomalies, and documenting changes to hardware or placement.
Validation and Testing
To bring this project closer to engineering-grade documentation, validation should include:
- verify I2C communication with the BME280
- confirm UART parsing from the PMS5003
- check that temperature, humidity, pressure, and PM values remain plausible under known conditions
- compare temperature and humidity readings against a nearby reference device
- compare particulate readings with nearby public monitors or colocated reference instruments where available
- test local logging over repeated intervals
- verify external API connectivity where regional comparisons are used
- run extended trials to assess uptime and storage integrity
- document sensor placement, enclosure conditions, and local site context
- evaluate how readings change across shaded, exposed, traffic-adjacent, and vegetated sites
If the system behaves inconsistently, the issue may come from wiring, enclosure design, power instability, serial parsing, sensor placement, humidity effects, or library configuration rather than from the environmental monitoring concept itself.
Example Validation Record
| Test | Expected Result | Observed Result | Likely Issue | Action |
|---|---|---|---|---|
| BME280 I2C scan | Sensor appears at expected address | Device visible | None | Proceed to reading test |
| PMS5003 UART frame | Valid data frame parsed | Intermittent invalid frames | Serial configuration or wiring issue | Check UART settings and connector stability |
| Shaded temperature comparison | Close to reference thermometer | Pi reading 2°C high | Board heat or enclosure effect | Move sensor away from Pi and improve ventilation |
| PM colocated test | Pattern similar to public reference station | Peaks align but values differ | Low-cost sensor bias | Use trend interpretation and apply correction cautiously |
| Extended logging | No missing records over 24 hours | Gaps after reboot | Power or service restart issue | Improve power and use systemd restart behavior |
Validation records like this help separate environmental signals from engineering artifacts. That distinction is essential if the system will be used in civic, educational, or community monitoring contexts.
Suggested Performance Metrics
For a more rigorous evaluation, the hub can be assessed using several simple metrics:
- sensor stability: consistency of repeated readings under unchanged conditions
- logging reliability: whether observations are stored without loss over long runs
- uptime: how consistently the station continues operating without intervention
- data completeness: whether the expected number of observations is captured over time
- anomaly usefulness: whether flagged events correspond to real environmental changes
- placement sensitivity: how readings change when the station is moved between streets, rooftops, shaded areas, and indoor environments
- reference agreement: how prototype readings compare with reference monitors or trusted local observations
- maintenance burden: how often the system requires inspection, rebooting, sensor cleaning, or storage cleanup
- dashboard clarity: whether users understand uncertainty, prototype status, and interpretation limits
Even simple tracking of these metrics improves the project’s value as an experimental urban monitoring platform. The goal is not only to produce readings, but to produce readings that are documented, usable, and honest about their limitations.
Field Deployment, Siting, Enclosure, Power, and Maintenance
Urban field deployment introduces challenges that do not appear during bench testing. Devices may face rain, dust, vandalism, power interruptions, heat, insects, cable movement, signal loss, and maintenance access problems.
Responsible deployment should address:
- weather-resistant but ventilated enclosure design
- radiation shielding or shaded placement for temperature sensors
- airflow path for the PMS5003 sensor inlet and outlet
- stable power supply and safe cable routing
- protection from water intrusion, dust buildup, insects, and physical damage
- maintenance access for cleaning and inspection
- consistent mounting height and site documentation
- database backup, log rotation, and storage monitoring
- restart behavior after power loss
- clear labeling if deployed in public or semi-public space
Siting should match the monitoring question. A roadside monitor, a schoolyard monitor, a rooftop monitor, and a shaded park monitor may all produce valid readings, but they represent different exposure contexts. The location should be documented so the data does not appear more general than it is.
Maintenance is part of the measurement system. A sensor clogged with dust, overheated in an enclosure, or left with a failing power supply may still produce numbers, but those numbers may no longer represent the environment accurately.
Urban Environmental Monitoring and Sustainable Cities
Projects like this illustrate how accessible computing platforms can support environmental observation systems that contribute to sustainable urban development.
While small monitoring stations cannot replace professional air-quality networks, they can complement them by expanding observation into new locations. In the context of SDG 11 and SDG 13, distributed monitoring systems help communities better understand environmental conditions and respond to emerging climate risks.
Urban monitoring is especially important where exposure is uneven. Heat, traffic pollution, industrial activity, tree canopy loss, and impervious surface cover are not distributed equally across cities. Distributed sensing can help make those differences more visible and support more targeted planning, adaptation, and public engagement.
Ultimately, sustainable cities depend not only on policy and infrastructure, but also on the systems used to observe, measure, and interpret environmental change. Better data does not automatically create justice, but it can make environmental burdens harder to ignore and easier to investigate.
Responsible Deployment
This prototype is appropriate for classrooms, makerspaces, civic technology labs, community science, urban resilience education, and early-stage monitoring experiments. It should not be used as a certified regulatory station, official public-health warning device, emergency alert system, or final basis for legal or medical decisions.
Responsible deployment means matching the system to the consequence of error. A classroom project can tolerate rough readings and occasional gaps. A city policy decision, public-health claim, or environmental justice complaint requires stronger validation, documentation, reference comparison, and institutional accountability.
A responsible version should include clear labeling of prototype status, sensor placement documentation, data-quality flags, maintenance logs, calibration notes, uncertainty language, and a plan for escalating serious concerns to appropriate public agencies or professionals.
Community monitoring should empower communities rather than shifting responsibility onto them. Data can support questions, evidence, and advocacy, but institutions remain responsible for addressing environmental harm.
Reproducibility
All code, documentation, and supporting build materials necessary to reproduce the prototype are included in the project repository. The design intentionally relies on widely available Raspberry Pi hardware, open-source Python libraries, and commonly available sensors so that it can be rebuilt in classrooms, labs, makerspaces, community monitoring projects, or independent urban research settings.
The system is intended as a reference implementation rather than a certified regulatory station. Engineers adapting it for longer-term deployment should validate power stability, enclosure durability, data retention, sensor maintenance, siting conditions, airflow, and metadata practices under real urban operating conditions.
For the rest of this project series, reproducibility should mean more than making code available. Each article should include a clear bill of materials, setup instructions, validation notes, data model, known failure modes, test procedure, responsible-use framing, and realistic statement of appropriate scope.
Conclusion
Building a Raspberry Pi urban air quality and heat island monitor demonstrates how edge computing and embedded sensing can support climate and pollution monitoring at local scales. By combining atmospheric sensors, particulate monitoring, local storage, and optional climate-data integration, the system creates a flexible platform for urban environmental observation.
Although compact, the design illustrates a broader sustainability principle: urban resilience depends on environmental visibility. When local conditions can be measured clearly and compared across neighborhoods, communities are better positioned to respond to both pollution and heat-related risk.
For classrooms, makerspaces, community monitoring projects, civic technology labs, and early-stage urban resilience work, this Raspberry Pi monitor provides a practical foundation for understanding how environmental data systems can make cities more observable, responsive, and sustainable.
The deeper lesson is not simply that a Raspberry Pi can read temperature and PM2.5 sensors. The deeper lesson is that urban environmental intelligence requires measurement infrastructure: good siting, clean data, metadata, validation, maintenance, responsible interpretation, and civic accountability. When those layers are treated seriously, even a small prototype can demonstrate the logic of healthier and more climate-resilient cities.
Related Articles and Site Areas
- Raspberry Pi Sustainability Engineering Series
- Raspberry Pi Environmental Data Hub for Climate Monitoring
- Smart Irrigation with Raspberry Pi
- Environmental Monitoring Systems
- Intelligent Infrastructure Systems
- Atmospheric Aerosol Loading and Regional Planetary Risk
- Climate Change as a Planetary Boundary
- Sustainable Development Goals Within Planetary Boundaries
- Planetary Boundaries
Further Reading
- Adafruit (n.d.) Adafruit BME280 Humidity, Barometric Pressure, and Temperature Sensor Breakout. Available at: https://learn.adafruit.com/adafruit-bme280-humidity-barometric-pressure-temperature-sensor-breakout
- Adafruit (n.d.) PM2.5 Air Quality Sensor and Breadboard Adapter Kit. Available at: https://learn.adafruit.com/pm25-air-quality-sensor
- European Environment Agency (n.d.) Air Pollution. Available at: https://www.eea.europa.eu/en/topics/in-depth/air-pollution
- NASA Earthdata (n.d.) Earthdata. Available at: https://www.earthdata.nasa.gov/
- NOAA National Centers for Environmental Information (n.d.) Climate Data Online. Available at: https://www.ncei.noaa.gov/cdo-web/
- Raspberry Pi Foundation (n.d.) Raspberry Pi Documentation. Available at: https://www.raspberrypi.com/documentation/
- United Nations (n.d.) Sustainable Development Goal 11: Sustainable Cities and Communities. Available at: https://sdgs.un.org/goals/goal11
- United Nations (n.d.) Sustainable Development Goal 13: Climate Action. Available at: https://sdgs.un.org/goals/goal13
- U.S. Environmental Protection Agency (n.d.) Air Sensor Toolbox. Available at: https://www.epa.gov/air-sensor-toolbox
- World Health Organization (n.d.) Ambient Air Pollution. Available at: https://www.who.int/health-topics/air-pollution
References
- Adafruit (n.d.) Adafruit BME280 Humidity, Barometric Pressure, and Temperature Sensor Breakout. Available at: https://learn.adafruit.com/adafruit-bme280-humidity-barometric-pressure-temperature-sensor-breakout
- Adafruit (n.d.) PM2.5 Air Quality Sensor and Breadboard Adapter Kit. Available at: https://learn.adafruit.com/pm25-air-quality-sensor
- European Environment Agency (n.d.) Air Pollution. Available at: https://www.eea.europa.eu/en/topics/in-depth/air-pollution
- NASA Earthdata (n.d.) Earthdata. Available at: https://www.earthdata.nasa.gov/
- NOAA National Centers for Environmental Information (n.d.) Climate Data Online. Available at: https://www.ncei.noaa.gov/cdo-web/
- Raspberry Pi Foundation (n.d.) Raspberry Pi Documentation. Available at: https://www.raspberrypi.com/documentation/
- United Nations (n.d.) The 17 Sustainable Development Goals. Available at: https://sdgs.un.org/goals
- United Nations (n.d.) Sustainable Development Goal 3: Good Health and Well-Being. Available at: https://sdgs.un.org/goals/goal3
- United Nations (n.d.) Sustainable Development Goal 9: Industry, Innovation and Infrastructure. Available at: https://sdgs.un.org/goals/goal9
- United Nations (n.d.) Sustainable Development Goal 10: Reduced Inequalities. Available at: https://sdgs.un.org/goals/goal10
- United Nations (n.d.) Sustainable Development Goal 11: Sustainable Cities and Communities. Available at: https://sdgs.un.org/goals/goal11
- United Nations (n.d.) Sustainable Development Goal 13: Climate Action. Available at: https://sdgs.un.org/goals/goal13
- U.S. Environmental Protection Agency (n.d.) Air Sensor Toolbox. Available at: https://www.epa.gov/air-sensor-toolbox
- World Health Organization (n.d.) Ambient Air Pollution. Available at: https://www.who.int/health-topics/air-pollution
