PureAware Senzor Calitate Aer

Referinta Tehnica
Firmware V1.027 Hardware AQS-PureAware-R1.2

1. Arhitectura Sistem

1.1 Diagrama Bloc

  ┌─────────────────────────────────────────────────────────────────┐
  │                     ESP32 (Dual-Core, 240 MHz)                 │
  │                                                                │
  │  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────────┐  │
  │  │  Core 0  │  │  Core 1  │  │  WiFi    │  │  LittleFS    │  │
  │  │ AsyncTCP │  │ main()   │  │ 802.11n  │  │  Filesystem  │  │
  │  │ callbacks│  │ loop()   │  │  2.4 GHz │  │  OTA+Logs    │  │
  │  └──────────┘  └──────────┘  └──────────┘  └──────────────┘  │
  │                                                                │
  │  ┌──────────────────────┐    ┌──────────────────────────────┐  │
  │  │  NVS Preferences     │    │  RAM Buffers                 │  │
  │  │  "config" + "alarm"  │    │  Log: 288 entries (24h)      │  │
  │  │  namespaces          │    │  Pending emails: 6 slots     │  │
  │  └──────────────────────┘    └──────────────────────────────┘  │
  └───┬──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────────┘
      │      │      │      │      │      │      │      │
  ┌───▼──┐┌──▼──┐┌──▼──┐┌──▼──┐┌──▼──┐┌──▼──┐┌──▼──┐┌──▼────────┐
  │I2C-1 ││I2C-2││UART1││UART2││ 22  ││ 23  ││ 13  ││   12      │
  │SEN66 ││MS637││RS485││Nextn││CONFIG││ RUN ││NeoP ││Status LED │
  └──────┘└─────┘└─────┘└─────┘└─────┘└─────┘└─────┘└───────────┘

1.2 Model de Executie

ComponentaContext de ExecutieNote
AsyncTCP (Modbus, MQTT, Zabbix)Task lwIP (Core 0)Callback-uri non-blocante
AsyncWebServer (porturi 80/8080/8081/8082)Task lwIP (Core 0)ESPAsyncWebServer
BACnet/IP UDPBucla principala (Core 1)Socket raw lwIP, poll()
Citire senzor (SEN66)Bucla principala (Core 1)I2C blocant, interval ~5 min
Citire presiune (MS5637)Bucla principala (Core 1)Perioada de esantionare 500ms
Salvare logBucla principala (Core 1)5 min RAM, orar FS
Evaluare alarmeBucla principala (Core 1)Dupa fiecare citire senzor
Scanare butoaneBucla principala (Core 1)CONFIG (GPIO22) / RUN (GPIO23)
WatchdogWDT HardwareTimeout 50 secunde

1.3 Organizare Memorie

PartitieUtilizare
NVSStocare preferinte (namespace-uri config + alarm)
OTA_0 / OTA_1Partitii duale firmware pentru rollback OTA
SPIFFS/LittleFSSistem de fisiere: loguri (day0-day6.csv), baza NTP, firmware temporar
RAMBuffer log (288 × ~48B = ~14 KB), emailuri in asteptare (6 sloturi)

2. Specificatii Senzori

2.1 Sensirion SEN66

ParametruDomeniuPrecizieNote
CO2 (NDIR)0–40.000 ppm±30 ppm + 3%Incalzire: 30s de baza, 3 min precis
PM1.00–1.000 µg/m³±5 µg/m³ + 5%Imprastiere laser
PM2.50–1.000 µg/m³±5 µg/m³ + 5%Imprastiere laser
PM4.00–1.000 µg/m³±25 µg/m³ + 5%Imprastiere laser
PM100–1.000 µg/m³±25 µg/m³ + 5%Imprastiere laser
Indice VOC1–500MOx, procesat algoritmic. 12h conditionare.
Indice NOx1–500MOx, procesat algoritmic. 12h conditionare.
Temperatura−40 la +125 °C±0,4 °CPe cip
Umiditate0–100 %RH±4,5 %RHPe cip

Interfata: Bus I2C 1 — SDA: GPIO 26, SCL: GPIO 25, 100 kHz

2.2 TE Connectivity MS5637

ParametruValoare
TipSenzor de presiune piezorezistiv
Domeniu presiune300–1.200 hPa
Adresa I2C0x76
InterfataBus I2C 2: SDA GPIO 33, SCL GPIO 32, 100 kHz
OSR implicit4096 (~8,22 ms conversie)
Perioada de esantionare500 ms (D1=presiune, D2=temperatura alternativ)

Setari OSR

OSRValoare BitTimp de Conversie
2560x00~0,54 ms
5120x02~1,06 ms
10240x04~2,08 ms
20480x06~4,13 ms
4096 (implicit)0x08~8,22 ms
81920x0A~16,44 ms

Coeficienti de Calibrare PROM

IndexNumeDescriere
C0FACTORYDate fabrica + CRC
C1SENSSensibilitate presiune
C2OFFOffset presiune
C3TCSCoeficient temperatura al sensibilitatii
C4TCOCoeficient temperatura al offset-ului
C5TREFTemperatura de referinta
C6TEMPSENSCoeficient temperatura al temperaturii
C7CRCSuma de control CRC

3. Algoritm de Calcul TVOC

Echivalent TVOC derivat din Indicele VOC folosind Mølhave / WELL Building Standard:

tvocW = (ln(501 - vocIndex) - 6.24) * (-996.94)   [µg/m³]

// Implementare C:
static inline float tvoc_well_from_vi(float vi) {
  if (vi < 1.f) vi = 1.f;
  if (vi > 499.f) vi = 499.f;
  return (logf(501.f - vi) - 6.24f) * (-996.94f);
}
Indice VOCTVOC (µg/m³)Calitate Aer
1–50< 100Excelenta
50–100100–300Buna
100–200300–1.000Moderata
200–3501.000–3.000Slaba
350–5003.000–6.000+Nesanatoasa

4. Referinta GPIO & Hardware

GPIOFunctieDirectieConfigurareNote
13NeoPixel LEDIesireNEO_GRB + 800 kHz1 × WS2812B
22Buton CONFIGIntrareINPUT_PULLUPActiv LOW. Spatele modulului. Declanseaza modul AP + repornire.
23Buton RUNIntrareINPUT_PULLUPActiv LOW. Spatele modulului. Declanseaza modul STA + repornire.
12LED StatusIesireDigitalIndicator general
2RS-485 DE/REIesireDigitalHIGH = activare TX
16Serial1 RXIntrareUARTRS-485, 19200 baud
17Serial1 TXIesireUARTRS-485, 19200 baud
14Serial2 RXIntrareUARTNextion, 115200 baud
27Serial2 TXIesireUARTNextion, 115200 baud
26I2C-1 SDABidirectional100 kHzSEN66
25I2C-1 SCLIesire100 kHzSEN66
33I2C-2 SDABidirectional100 kHzMS5637 @ 0x76
32I2C-2 SCLIesire100 kHzMS5637 @ 0x76

5. Butoane Fizice

Doua butoane amplasate pe spatele (partea de rezerva) carcasei modulului:

ButonGPIOActiuneRezultat
CONFIG22Apasare cand dispozitivul este in modul STA sau OFFLINESalveaza run_mode = 0 (AP) in NVS → repornire → porneste modul AP la 192.168.1.25
RUN23Apasare cand dispozitivul este in modul AP sau OFFLINESalveaza run_mode = 1 (STA) in NVS → repornire → se conecteaza la WiFi configurat

Detalii Mod AP

// Gestionare butoane in checkSerialForCommands():
if (!digitalRead(BUT_Config) && (run_mode != 0)) {
  saveModeAndReboot(WIFI_MODE_AP_CMD);   // salveaza in NVS, apeleaza ESP.restart()
}
if (!digitalRead(BUT_Run) && (run_mode != 1)) {
  saveModeAndReboot(WIFI_MODE_STA_CMD);  // salveaza in NVS, apeleaza ESP.restart()
}

6. Detalii Protocol BACnet/IP

SpecificatieValoare
StandardASHRAE 135-2020, Anexa J
TransportUDP port 47808 (0xBAC0)
SocketSocket raw lwIP (bind pe toate interfetele)
Tipuri BVLCOriginal-Unicast (0x0A), Original-Broadcast (0x0B), Forwarded (0x04)
Dimensiune Buffer1024 bytes Rx / 1024 bytes Tx
SegmentareNesuportata
Max APDU480 bytes
Obiecte1 Device + 11 Analog Input
ProducatorMICRO-ELEMENTS S.R.L.

Proprietati Obiect Device

ProprietateIDValoare
Object_Identifier75Device:instanta
Object_Name77hostname-mac
Vendor_Name121MICRO-ELEMENTS S.R.L.
Firmware_Revision44PureAware_V1.027
System_Status112Operational (0)
Object_List7612 intrari (Device + 11 AI)

Obiecte AI (0–10)

Fiecare AI expune: Object_Identifier(75), Object_Name(77), Object_Type(79), Present_Value(85), Status_Flags(111), Event_State(36), Out_Of_Service(81), Units(117), Reliability(103), Description(28).

7. Detalii Modbus TCP Async

ParametruValoare
BibliotecaModbusTCPAsyncServer (personalizata, bazata pe AsyncTCP)
Port502
Clienti Maximi10 (limita hard), implicit 3
Timeout Inactivitate60.000 ms
Buffer RX300 bytes per client
FC-uri Suportate01, 02, 03, 04, 05, 06, 0F, 10

Detalii Registre de Intrare (FC 04)

AdresaConstantaParametruUnitateScala
0IR_DEVICE_TYPETip DispozitivFix: 1
1IR_VOCIndice VOC1:1
2IR_NOXIndice NOx1:1
3IR_PM1PM1.0µg/m³1:1
4IR_PM25PM2.5µg/m³1:1
5IR_PM4PM4.0µg/m³1:1
6IR_PM10PM10µg/m³1:1
7IR_TEMP_X10Temperatura°C÷ 10
8IR_HUM_X10Umiditate%RH÷ 10
9IR_CO2CO2ppm1:1
10IR_TVOCWTVOC (WELL)µg/m³1:1
11IR_PRESS_X10PresiunehPa÷ 10

8. Protocoale MQTT & Zabbix

MQTT (Async)

FunctionalitateValoare
ClientComplet asincron prin AsyncClient
Format Topic{mtopic}/{mac6}/data
ID ClientPureAware-{mac6}
QoS / Retain0 / Nu
Interval Minim10 secunde
PayloadJSON cu 13 campuri (toate ca stringuri): device_type, name, co2, pm1, pm25, pm4, pm10, voc, nox, tvocw, temp, hum, press, rssi
Port WebSocket8083 (pentru monitorizare browser/aplicatie prin ws://broker:8083/mqtt)
Broker Implicitbroker.emqx.io (public, pentru testare)

Zabbix Sender

FunctionalitateValoare
ProtocolZabbix Sender (JSON peste TCP)
Server Implicitmonitor.microelemente.ro:55051
TimerIndependent de MQTT

9. Motor Email SMTP

FunctionalitateValoare
ModuriSTARTTLS (port 587) si SSL Implicit (port 465)
AutentificareAUTH LOGIN (Base64)
TLSWiFiClientSecure (setInsecure)
Coada Email6 sloturi: 2 per alarma (declansare + rearmare)
Intarziere Reconectare5s dupa reconectare WiFi
LimbiEN, RO, HU, NO, JA

10. Harta Preferinte NVS

Namespace: "config"

CheieTipImplicitDescriere
ssidString"ssid"SSID WiFi
passwordString"password"Parola WiFi
wifi_modeUChar00=AP, 1=STA, 2=OFFLINE
hostnameString"pureaware"Baza hostname mDNS
static_ip_enUChar0Activare IP static
static_ip, static_gw, static_sn, static_dnsString"", "", "255.255.255.0", "8.8.8.8"Configurare IP static
mqtt_enUChar0Activare MQTT
mserver, mport, muser, mpass, mtopic, mintMixt"none", 1883, "none", "none", zhost, 60Configurare MQTT
zbx_enUChar1Activare Zabbix
zserver, zport, zhost, zbx_intMixt"monitor.microelemente.ro", 55051, "PureAware_Default", 60Configurare Zabbix
bacnet_en, bacnet_idUChar/ULong0/0Activare BACnet + Instanta Device
sleep_en, sleep_sh/sm/eh/emUChar0, 22:00-06:00Program repaus WiFi
led_enabledUChar1Activare NeoPixel LED
tdimUInt50Luminozitate ecran (0-100)
langString"en"Limba interfata
mbaddrUChar1Adresa slave Modbus (1-247)
fw_sizeULong0Dimensiune ultima actualizare firmware OTA
cfg_verUChar0Versiune config pentru migrare NVS

Namespace: "alarm"

CheieTipDescriere
email_enUCharActivare globala email
smtp_s/p/tls/u/pw/f/tMixtConfigurare SMTP
aNen, aNpm, aNtr, aNhy, aNdrMixtConfigurare Alarma N (N=0,1,2)

11. Arhitectura Inregistrare Date

struct LogEntry {
  uint32_t ts;                          // Unix timestamp
  float temp, hum, press, co2;
  float pm1, pm25, pm4, pm10;
  float voc, nox, tvocw;
};
LogEntry logBuf[288];  // 288 × 5 min = 24 ore (circular)
NivelDetalii
Buffer RAM288 intrari, intervale de 5 min, circular
Logare fisiereday0.csv–day6.csv, rotatie la miezul noptii, scrieri orare
NTP Nivel 1time() sincronizat prin NTP (precizie maxima)
NTP Nivel 2Baza salvata din /ntp_base.txt (deviatie < 1h)
NTP Nivel 3Alternativa: 2026-01-01 + uptime

12. Motor Alarme

struct AlarmCfg {
  uint8_t enabled, dir;   // dir: 1=peste, 0=sub
  String  param;          // "co2","pm25","voc","temp","hum","press"...
  float   trigger, hyst;  // prag + histerezis banda moarta
  uint8_t state;          // 0=OK, 1=Armat, 2=Declansat
};
AlarmCfg alarms[3];       // 3 alarme independente

// Masina de stari:
//   OK → Armat (valoarea intra in banda moarta)
//      → Declansat (pragul depasit, email trimis)
//      → Rearmat (valoarea revine sub histerezis, email trimis)
//      → OK

Emailuri in asteptare: 2 sloturi per alarma (declansare + rearmare). Trimise la reconectare WiFi cu intarziere de 5s.

13. Arhitectura Server Web

PortTipScopAutentificare
80AsyncWebServerTablou de bord status, API JSON, loguriFara
8080AsyncWebServerConfigurare, import/exportadmin / pureaware
8081AsyncWebServerIncarcare firmware OTAFara
8082AsyncWebServerIncarcare Nextion TFTFara

14. Mecanism Actualizare OTA

MetodaDetalii
ManualIncarcare .bin prin interfata web port 8081
AutomatVerificare HTTPS la fiecare 24h la update.microelemente.ro/firmware.bin
SigurantaIn doua etape: descarcare pe LittleFS mai intai, apoi flash. Comparatie dimensiune pentru a evita re-descarcarea.

15. Numar de Serie & Identificare

CampValoare
Model ProdusPureAQS66
Revizie HardwareAQS-PureAware-R1.2
FirmwarePureAware_V1.027
Data Compilare2026-03-14
Numar de SerieAQS2608-[MAC_HEX]
Hostname<baza>-<mac3bytes> (ex., pureaware-8a0de8)
SSID APPureAware_XXXXXX (6 caractere hex din MAC)
IP AP192.168.1.25 (fix)