2025-PRJ-023-ST_023-ST_023
Tento projekt je kompletné riešenie na meranie kvality ovzdušia pomocou syntézy mikrontroléra a senzorov.
2025-PRJ-023-ST_023-ST_023-Air quality monitor
Projekt rieši meranie kvality ovzdušia pomocou mikrokontroléra ESP32 a senzorov AHTX0 a ENS160, pričom údaje o teplote, vlhkosti, TVOC, eCO₂ a odvodenom AQI sú zobrazované na OLED displeji a odosielané na server. Server ich ukladá do databázy a poskytuje responzívne webové rozhranie na sledovanie aktuálnych hodnôt aj historických trendov. Prínosom je dostupné, cenovo efektívne riešenie pre monitoring kvality vzduchu s možnosťou vzdialeného prístupu k dátam.
Zvýšená koncentrácia CO₂ a TVOC v interiéroch znižuje komfort, zdravie a produktivitu, pričom dostupné riešenia sú drahé alebo komplikované.
Vyvinúť cenovo dostupné zariadenie na meranie kvality ovzdušia s lokálnym displejom a vzdialeným prístupom cez webové rozhranie.
Domácnosti, kancelárie, školy, malé firmy – všetci, ktorí potrebujú sledovať kvalitu vzduchu v uzavretých priestoroch.
Dostupnosť: nízke náklady, jednoduchá inštalácia
Prehľadnosť: OLED displej + webová aplikácia
Výkon a pamäť ESP32
Stabilita Wi-Fi pripojenia
Presnosť senzorov závislá od kalibrácie
Monitorovanie kvality vzduchu v domácnosti
Riadenie ventilácie v kancelárii podľa CO₂
ESP32 so senzormi (I²C) vykresľuje merania na displej a zároveň ich posiela cez Wi‑Fi v JSON formáte na REST server, ktorý ich validuje, ukladá do SQLite a sprístupňuje ich vo webovom dashboarde.
Cieľom projektu je vytvoriť zariadenie na monitorovanie kvality ovzdušia, ktoré bude cenovo dostupné, jednoduché na inštaláciu a poskytne používateľovi prehľadné dáta v reálnom čase aj historické trendy. Riešenie musí byť vhodné pre domáce aj kancelárske prostredie.
| Stĺpec | Typ | Popis |
|---|---|---|
| id | INTEGER | Primárny kľúč |
| serial_number | TEXT | Jedinečný identifikátor zariadenia |
| Stĺpec | Typ | Popis |
|---|---|---|
| id | INTEGER | Primárny kľúč |
| user_id | INTEGER | FK na users.id |
| temperature | REAL | Teplota v °C |
| humidity | REAL | Relatívna vlhkosť v % |
| aqi | INTEGER | Index kvality vzduchu |
| co2 | REAL | eCO₂ v ppm |
| tvoc | REAL | TVOC |
| timestamp | INTEGER | Unix čas merania |
// Reading the sensor data
void readSensorData(unsigned long currentMillis) {
// --- Read AHT21 ---
sensors_event_t hmd, temp;
aht.getEvent(&hmd, &temp);
float temperature = temp.temperature;
float humidity = hmd.relative_humidity;
// --- Print AHT21 results ---
Serial.print("Temp: "); Serial.print(temperature); Serial.print(" °C, ");
Serial.print("Humidity: "); Serial.print(humidity); Serial.println(" %");
// --- Read ENS160 ---
int aqi; // air quality index (1-5)
int co2; // estimated CO2 (ppm)
int tvoc; // total VOC [Volatile Organic Compounds] (ppb)
if( ens.checkDataStatus() ) {
aqi = ens.getAQI();
co2 = ens.getECO2();
tvoc = ens.getTVOC();
// --- Print ENS160 results ---
Serial.print("Air Quality Index (1-5): "); Serial.print(aqi); Serial.print(", ");
Serial.print("eCO2: "); Serial.print(co2); Serial.print(" ppm, ");
Serial.print("TVOC: "); Serial.print(tvoc); Serial.println(" ppb");
}
else {
Serial.print("Failed to read air quality data!");
}
// Displaying message to display
displayMessage(
"Temperature: " + String(temperature) + "C\nHumidity: " + String(humidity) +
"%\nAQI: " + String(aqi) + "index\nCO2: " + String(co2) +
"ppm\nTVOC: " + String(tvoc) + "mg/m3"
);
// Every 5 minutes also send to server
if (currentMillis - lastSendTime >= SEND_INTERVAL) {
Serial.println("Sending sensor data to server...");
lastSendTime = currentMillis;
sendDataToServer(temperature, humidity, aqi, co2, tvoc);
}
}
@app.route('/send-data/', methods=['POST'])
def receive_data():
"""Receive data endpoint."""
try:
# If no JSON is provided
request_json = request.json
if not request_json:
return fill_json_response(status=STATUS_OK, error="No JSON provided")
# Convert JSON to dictionary
request_dict = dict(request_json)
# Validate JSON schema
valid, missing_key = validate_received_data_schema(data=request_dict)
if not valid:
return fill_json_response(status=STATUS_BAD, error=f"Missing key: {missing_key}")
# Save to database
write_data(data=request_dict)
# Return success
return fill_json_response(status=STATUS_ADD, error=None)
# Handle errors
except (ValueError, RuntimeError) as error:
print("Error:", error)
return fill_json_response(status=STATUS_ERROR, error="Internal server error")
Server je hostovaný na platforme Azure.
Nechali sme na internáte bežať senzor 8 dní. 4 dni bol senzor bez krytu, 4 dni v krabičke.
Krabička nedodáva senzoru dostatočnú výmenu vzduchu. Zariadenie sa prehrieva a skresľuje výsledky. Taktiež skresľuje aj častice v ovzduší a oxid uhličitý kvôli slabej výmene vzduchu.
Používateľ zapojí senzor (micro-usb). Senzor sa sám naštartuje a vypisuje na obrazovku jeho stav. Automaticky začína merať a pri prístupe na wifi aj zasielať dáta na server.
Ak používateľ chce, aby sa zariadenie pripojilo na sieť, tak musí zdieľať pripojenie s určitými podmienkami. Meno siete musí byť “Hotspot” a heslo “smvit12345”. Pre finálny produkt by bol použitý sofistikovanejší prístup ako pre POC.
Všetko beží v poriadku. Zariadenie meria a úšpešne zasiela dáta na server.
Zariadenie signalizuje, že sa mu nepodarilo pripojiť na WiFi. Zariadenie ďalej funguje a meria, ale nezasiela dáta na server.
Zariadenie signalizuje, že je na WiFi pripojené, ale nevie dopytovať server (výpadok buď servera alebo lokálnej siete WiFi). Zariadenie ďalej funguje a meria, ale nezasiela dáta na server.
V pôvodnom návrhu projektu Air Quality Monitor sa počítalo s kompletnou implementáciou merania kvality ovzdušia, prenosu dát na server a vizualizácie v prehľadnom webovom rozhraní. Zariadenie malo byť umiestnené v kompaktnom drevenom púzdre, ktoré zabezpečí ochranu elektroniky a jednoduchú manipuláciu.
Všetky plánované funkcie boli implementované:
Pre ďalšiu verziu projektu boli identifikované možnosti vylepšenia:
Sofistikovanejšie Wi-Fi pripájanie (konfigurácia cez webový portál alebo mobilnú aplikáciu).
Lepšie uchopenie hardvéru v krabičke (presne vybudované drážky pre ESP32 a senzory, aby boli pevne uchytené a odolné voči pohybu).
Optimalizovaný prietok vzduchu (ventilačné otvory alebo mriežky, aby sa zabránilo skresleniu meraní spôsobenému uzavretým priestorom).
Implementácia týchto vylepšení by zvýšila presnosť meraní, mechanickú stabilitu a profesionálny vzhľad zariadenia.
Nasledujúce obrázky zobrazujú proces porovnávania a zlúčenia modelov v nástroji Lemontree, ktorý sa používa na správu verzovania modelov vytvorených v Enterprise Architect (EA). Lemontree umožňuje identifikovať rozdiely medzi dvoma verziami modelu, vizualizovať zmeny a vykonať ich zlúčenie.