smvit-air-sensor

06-Implementation

Príprava hardvéru

Pred samotnou implementáciou bolo potrebné zabezpečiť všetky komponenty projektu. Hardvér bol doručený v samostatných balíkoch, čo umožnilo jednoduchú kontrolu a prípravu na montáž.

balík
Obr.: Kompletný balík s hardvérom obsahujúci ESP32, senzory, káble a doplnky potrebné na realizáciu projektu.
balík mikrokontroléra
Obr.: Balík s mikrokontrolérom ESP32 DevKit – hlavný riadiaci prvok projektu, ktorý zabezpečuje komunikáciu so senzormi, spracovanie dát a pripojenie na Wi-Fi.
balík senzora
Obr.: Balík obsahujúci senzor ENS160 (TVOC, eCO₂, AQI) a AHT21 (teplota, vlhkosť). Tieto senzory sú základom pre meranie kvality ovzdušia.

Kód senzora

Ďalej si prejdeme úsek kódu, ktorý je zodpovedný za hlavnú funkcionalitu riešenia:

Úryvok kódu

// 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);
  }
}

Detailný popis kódu


Kód servera

Server je hostovaný na platforme Azure.

Serverová časť prijíma dáta od ESP32 cez HTTP POST a:

Úryvok kódu

@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")

Detailný popis kódu


Zapojenie hardvéru a prototypovanie

Po rozbalení komponentov nasledovalo zapojenie ESP32 a senzorov na testovacom stole. Prepojenie bolo realizované cez I²C zbernicu, pričom sa použili Dupont káble. Tento krok bol dôležitý na overenie funkčnosti senzorov a komunikácie s mikrokontrolérom.

zapojený mikrokontrolér
Obr.: Zapojený ESP32 DevKit s napájaním cez USB. Mikrokontrolér je pripravený na komunikáciu so senzormi a odosielanie dát na server.
zapojený senzor
Obr.: Zapojený senzor ENS160+AHT21 cez I²C zbernicu. Testovanie prebiehalo na otvorenom stole pred vložením do púzdra.

Vloženie hardvéru do krabičky z dreva

Po úspešnom testovaní bol hardvér vložený do drevenej krabičky, ktorá bola navrhnutá tak, aby:

box 1
Obr.: Otvor na vzduch – zabezpečuje správny prietok vzduchu cez senzory, čím sa minimalizuje skreslenie meraní.
box 2
Obr.: Otvor na displej – umožňuje používateľovi sledovať aktuálne hodnoty priamo na OLED displeji.
box 3
Obr.: Otvor na napájanie – prístup k USB konektoru pre napájanie ESP32.

Navigation: ⬆️ SDLC · ⬅️ Projekt