Sistem de monitorizare remote a presiunii, temperaturii și nivelului de CO2

Introducere

Proiectul realizat măsoară presiunea atmosferică, temperatura aerului și nivelul de CO2 în vederea evaluării calității unui spațiu de birouri. Ideea de la care am pornit a fost necesitatea monitorizării atmosferei în vederea reglării automate eficiente a sistemelor de aerisire. Sunt colectate date despre parametrii de mediu care pot influența negativ confortul, productivitatea și sănătatea angajaților întru-un mediu variabil (valorile depind și de etaj, număr de angajați etc.). Transmiterea rezultatelor se face folosind portul serial, respectiv WIFI. Pe ecranul LCD se pot urmări valorile citite de unul din senzori în momentul curent, comutând între senzori cu ajutorul unui buton. De asemenea, datele sunt prezentate sub forma a trei grafice pe un server web, pentru a putea analiza evoluția lor în timp.

Descriere generală

Montajul este alcătuit dintr-o plăcuță ESP32-C3-DEVKITM-1, la care se conectează folosind bus-ul I2C un sensor Senseair Sunrise 006-0-0007 pentru măsurarea nivelului de CO2 din aer (valoare masurată în ppm), un senzor BMP180 Bosch pentru măsurarea presiunii atmosferice și a temperaturii, respectiv 3 LED-uri de culori diferite (+ o rezistență de 1kΩ pentru fiecare LED). În funcție de intervalul în care este plasată valoarea citită de la senzorul de CO2 se va aprinde LED-ul corespunzător (verde: < 700, 700 < galben < 1000, roșu: > 1000). Ventilatorul este pornit daca nivelul de CO2 este mai mare de 700 ppm, respectiv oprit dupa ce pragul nu mai este atins. Din datele citite de la senzorul BMP180 se poate calcula și altitudinea. Toate datele sunt transmise si pe UART către PC, putând urmări în consola atât valorile cât și statusul returnat (success/fail). Firmware-ul încărcat pe plăcuță pornește un server web, astfel, putând fi accesată pagina web corespunzătoare afișând datele citite pe două grafice: un grafic cu valorile temperaturii și ale presiunii citite de senzorul BMP180, respectiv un grafic al nivelului de CO2 măsurat cu senzorul Sunrise. Aceleasi date sunt afisate si pe LCD-ul graphic

schema.jpg

Hardware Design

Comentariu Descriere Identificator Amprentă LibRef Cantitate
Cap Pol2 Condensator Polarizat (Axial) C1, C4, C6 POLAR0.8 Cap Pol2 3
Cap Condensator C2, C3, C5 RAD-0.3 Cap 3
1N4148 Diodă Schottky D1 SMB D Schottky 1
VERDE LED Verde D10 LED-0 LED0 1
GALBEN LED Galben D11 LED-0 LED0 1
ROSU LED Roșu D12 LED-0 LED0 1
4311 Modul Display LCD Grafic RGB TFT - Color, IPS (In-Plane Switching) SPI 2 (50.80mm) 320 x 240 LCD_1 MODULE_4311 4311 1
Motor Motor, Tip General M1 RB5-10.5 Motor 1
2N3904 Tranzistor NPN uz general Q1 TO-92A 2N3904 1
Res1 Rezistor R1, R2, R3, R4, R5, R6 AXIAL-0.3 Res1 6
ESP32-C3-DEVKITM-1 Placă de dezvoltare WiFi (802.11) (engineering sample only) ESP32-C3, cu ESP32-C3-MINI-1, 4 MB Flash, cu pini U1 XCVR_ESP32-C3-DEVKITM-1 ESP32-C3-DEVKITM-1 1
BMP180 Senzor de presiune 4.35PSI ~ 15.95PSI (30kPa ~ 110kPa) Absolut - 16 ~ 19 b 7-VLGA U2 BMP180 BMP180 1
Sunrise 006-0-0002 Senzor de Dioxid de Carbon (CO2) U3 XDCR_006-0-0002 006-0-0002 1

Schema electrica

Diagrame de semnal

Senzor BMP180 Bosch

Senzor Senseair Sunrise 006-0-0007

Software Design

Descrierea codului aplicaţiei (firmware):

  • mediu de dezvoltare: Arduino IDE
  • librării şi surse 3rd-party:
    • Arduino_GFX_Library: afisez valorile citite de senzori pe LCD
    • ESPAsyncWebServer: implementarea serverului web pentru a plota datele citite de la senzori pe grafice
    • Adafruit_BMP085: comunic cu senzorul BMP180 pentru a citi temperatura și presiunea
    • LittleFS: lightweight filessytem pentru pagina html
    • WiFi: conectare client la access point
  • algoritmi şi structuri implementate:
    • Temporizare non-blocantă - millis():
      • UPDATE_INTERVAL_SECS (15s) pentru senzori
      • SCREEN_UPDATE_INTERVAL_SECS (1s) pentru afișaj
    • Detecție apasare buton pentru schimbarea afisajului
    • Control LED-uri, respectiv ventilator in functie de nivelul de CO2:
      • < 700ppm: LED verde activ, ventilator oprit
      • 700-1000ppm: LED galben activ, ventilator pornit
      • > 1000ppm: LED roșu activ, ventilator pornit
    • Calibrarea senzorului Sunrise CO2 (modificarea bitului de control (0x02) - algoritmul ABC)
    • Calculul altitudinii folosind formula barometrică din presiunea măsurată
  • surse şi funcţii implementate:
    • Scurta descriere a functiilor din repository:
      • setup(): inițializarea urmatoarelor module: pini, comunicație I2C cu senzorii, comunicație SPI cu display ST7789, conectivitate WiFi, start server web
      • read_sensor_measurements(SUNRISE_ADDR): citirea nivelului de CO2 de la senzorul Senseair Sunrise 006-0-0007
      • bmp_update(): citirea valorii temperaturii si presiunii de la senzorul BMP180 Bosch
      • lcd_update(gfx, displayNr): afisarea valorilor instantanee citite pe LCD, schimbarea senzorului a carui valoare este printata prin apasarea butonului Boot (pin BTN_PIN) de pe placa ESP32-C3-DEVKITM-1
      • setABC(SUNRISE_ADDR, enable):funcție de autocalibrare a senzorului CO2 pentru citirea unor valori < 400 ppm
      • _wakeup(target): asigură că senzorul CO2 este pregătit pentru comunicație
      • reInitI2C(): configurează pinii și frecvența pentru interfața I2C
      • connectWifi(gfx): stabilirea conexiunii WiFi cu feedback vizual pe ecran
      • bucla main subsistem Arduino - loop(): aprinderea/stingerea celor 3 LED-uri (LED_GREEN, LED_YELLOW, LED_RED), respectiv pornirea/oprirea ventilatorului (FAN_CTRL) în funcție de nivelul de CO2, verificare buton apasat, citire senzori dupa timeout-ul definit, actualizare LCD la apasarea butonului sau actualizarea valorii citite de la senzori
      • serverul web asincron care incarca pagina HTML ce afișeaza celor 3 grafice cu date de CO2, presiune și temperatură, respectiv furnizează API-uri pentru valorile senzorilor

Code snippets

- utilizare algoritm ABC pentru valorile sub 400 ppm

    uint8_t meterControl = Wire.read();
    if (enable) {
      Serial.println("Enabling ABC...");
      meterControl &= (uint8_t)~0x02U;
    } else {
      Serial.println("Disabling ABC...");
      meterControl |= 0x02U;
    }

- citire valoare CO2

    byteHi = Wire.read();
    byteLo = Wire.read();
    co2Val = ((int16_t)(int8_t)byteHi << 8) | (uint16_t)byteLo;

- citire valoare temperatura, presiune, altitudine

    bmpTemperature = bmp.readTemperature(); 
    bmpPressure = bmp.readPressure();
    bmpRealAltitude = bmp.readAltitude(101500);
    

Rezultate Obţinute

  • Sistemul masoara corect temperatura, presiunea si concentratia de CO2, fara intarzieri in afisarea valorilor.
  • Graficele web ofera o vizualizare clara a evolutiei parametrilor in timp.
  • LED-urile semnalizeaza in timp real modificarile relevante pentru calitatea aerului, in functie de nivelul de CO2.
  • Ventilatorul se activează automat atunci cand concentratia depașeste 700 ppm si se oprește cand revine in intervalul optim.
  • Afisajul LCD permite comutarea intre valorile senzorilor, oferind o interfata simpla pentru utilizatori.

Demo

Concluzii

  • Am construit un sistem funcțional care oferă informații utile în timp real despre calitatea aerului.
  • Acesta are impact în viața de zi cu zi si aplicabilitate diversa.
  • Poate fi extins ușor pentru a permite salvarea datelor.

Download

Bibliografie/Resurse

pm/prj2025/mdinica/ariana_maria.lazar.txt · Last modified: 2025/05/30 01:30 by ariana_maria.lazar
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0