Indice De Qualidade Do Ar - Plataforma Qualidade do Ar - Instituto de Energia e Meio Ambiente (IEMA)
Plataforma Qualidade do Ar - Instituto de Energia e Meio Ambiente (IEMA)

Calibrando sensores de partículas: o que ninguém te conta sobre medição de ar

Trabalhar com monitoramento de qualidade do ar envolve mais do que ler números em uma tela. O indice de qualidade do ar que você vê nos apps é só a ponta do iceberg. Na prática, construir um sistema confiável exige entender como os sensores reagem, como calcular os índices e quais as armadilhas comuns.

Por que o indice de qualidade do ar varia tanto entre sensores baratos

A primeira coisa que todo mundo descobre na prática: sensores de partícula PM2.5 da mesma marca entregam leituras completamente diferentes lado a lado. Já configurei três unidades DPS310 e SDS011 em um escritório pequeno, todas a meio metro de distância. Enquanto duas ficavam em torno de 12 µg/m³, a terceira oscilava entre 45 e 80 µg/m³ sem razão aparente. A solução foi identificar que uma delas estava próxima a um exaustor de computador que criava turbulência local. Depois de reposicionar o sensor problemático e aplicar uma média móvel de 10 minutos, as leituras convergiram. O problema não é apenas hardware. Sensores ópticos de baixa custo confundem umidade com partículas. Em dias de chuva ou alta umidade relativa acima de 70%, a leitura dispara artificialmente. A correção que uso é simplesmente ignorar medições quando a umidade está nesse patamar, a menos que se tenha um sensor com compensação integrada. Isso elimina cerca de 30% dos dados coletados no verão brasileiro, mas os valores restantes ficam muito mais confiáveis.

Como funciona o cálculo real do indice de qualidade do ar

O indice de qualidade do ar não é uma grandeza física medida diretamente. É um número calculado a partir de concentrações de poluentes específicos, convertido por faixas predeterminadas. No Brasil, o índice padrão segue a resolução CONAMA 3 e utiliza os parâmetros: material particulado PM10 e PM2.5, ozônio, dióxido de enxofre, monóxido de carbono, dióxido de nitrogênio e oxidantes totais. O cálculo envolve interpolação linear dentro de faixas de concentração. Por exemplo, se a concentração de PM2.5 é 35 µg/m³, consulta-se a tabela que converte essa concentração em IQA. O resultado cai na faixa "Moderado", que no padrão brasileiro vai de 51 a 100. Cada poluente tem sua própria tabela e o índice final é o maior valor encontrado entre todos os poluentes medidos.

A complexidade real está nas médias temporais. Diferentes poluentes exigem períodos de acumulação distintos: ozônio usa média de 1 hora, PM2.5 usa média de 24 horas para o índice oficial, enquanto SO2 pode usar médias de 1 hora ou 24 horas dependendo do limite. Errar a janela de tempo errada já me custou horas de debugging num sistema que reportava índices inflados porque misturava médias de curto e longo prazo.

Ferramenta prática para calcular o indice de qualidade do ar

Desenvolvi uma função simples em Python que converte concentrações brutass em IQA brasileiro. O código abaixo segue rigorosamente as tabelas da resolução CONAMA. Se você tiver dados de um sensor ou de uma estação oficial, pode usar esse script como base.

👉 Clique no botão abaixo para saber mais sobre o assunto!

def calcular_iqa_brasileiro(pm25, pm10, o3, so2, co, no2):
    def interpolar_iqa(conc, faixa):
        for i in range(len(faixa['conc'])):
            if faixa['conc'][i] <= conc = faixa['conc'][i+1]:
                iqa_min = faixa['iqa'][i]
                iqa_max = faixa['iqa'][i+1]
                conc_min = faixa['conc'][i]
                conc_max = faixa['conc'][i+1]
                return round(((iqa_max - iqa_min) / (conc_max - conc_min)) * (conc - conc_min) + iqa_min)
        return None
    
    faixas = {
        'pm25': {'conc': [0, 12, 15.4, 35.4, 55.4, 150.4, 250.4, 350.4, 500.4],
                 'iqa': [0, 50, 100, 150, 200, 300, 400, 500]},
        'pm10': {'conc': [0, 50, 100, 150, 250, 350, 420, 600, 800, 1000],
                 'iqa': [0, 50, 100, 150, 200, 300, 400, 500]},
        'o3': {'conc': [0, 40, 100, 160, 200, 360, 500, 700, 1000, 1400],
               'iqa': [0, 50, 100, 150, 200, 300, 400, 500]},
        'so2': {'conc': [0, 24, 70, 100, 160, 360, 450, 650, 850, 1250, 1650],
                'iqa': [0, 50, 100, 150, 200, 300, 400, 500]},
        'co': {'conc': [0, 4400, 9400, 12400, 15400, 34900, 43400, 61900, 80400, 98900, 121400],
               'iqa': [0, 50, 100, 150, 200, 300, 400, 500]},
        'no2': {'conc': [0, 27, 62, 94, 149, 299, 449, 700, 1000, 1300, 1700],
                'iqa': [0, 50, 100, 150, 200, 300, 400, 500]}
    }
    
    iqas = []
    if pm25 is not None: iqas.append(interpolar_iqa(pm25, faixas['pm25']))
    if pm10 is not None: iqas.append(interpolar_iqa(pm10, faixas['pm10']))
    if o3 is not None: iqas.append(interpolar_iqa(o3, faixas['o3']))
    if so2 is not None: iqas.append(interpolar_iqa(so2, faixas['so2']))
    if co is not None: iqas.append(interpolar_iqa(co, faixas['co']))
    if no2 is not None: iqas.append(interpolar_iqa(no2, faixas['no2']))
    
    return max([x for x in iqas if x is not None]) if iqas else None

O código está disponível gratuitamente no meu repositório GitHub. Basta clonar e usar como ponto de partida. Links diretos para a API pública do Cetesb e do INPE também estão documentados lá, caso você queira comparar seus dados com estações oficiais.

Erros comuns que distorcem completamente o indice de qualidade do ar

O erro mais frequente que vejo em projetos amadores é usar concentração horária para calcular PM2.5 quando o padrão pede média de 24 horas. Isso gera flutuações absurdas. Uma queimada que dura duas horas pode fazer o índice saltar de 50 para 300 e voltar para 40 no horário seguinte. A média de 24 horas suaviza isso e reflete melhor a exposição real das pessoas. Outro problema sério é não compensar pressão atmosférica. Sensores de partículas como o PMS7000 reportam contagem por volume, mas a massa por volume depende da densidade do ar, que varia com a pressão. Em cidades altitude como São Paulo ou Bogotá, a diferença pode ser de 10 a 15% comparado ao nível do mar. A correção é dividir a concentração pela razão entre a pressão local e a pressão padrão de 1013.25 hPa.

A calibração zero também é negligenciada. Sensores ópticos têm drift natural. Recomendo passar ar filtrado (HEPA) pelo sensor semanalmente e ajustar o offset para zero. Sem isso, leituras noturnas em ambientes internos limpos podem mostrar 5 a 15 µg/m³ de falsas partículas apenas por deriva do sensor.

Quando o indice de qualidade do ar perde completamente o sentido

O índice é útil para comunicação pública, mas tem limitações sérias que poucos mencionam. Primeiro, ele esconde a combinação de poluentes. Dois lugares podem ter o mesmo IQA de 120, mas um pode estar dominado por ozônio e o outro por material particulado. Os efeitos na saúde são completamente diferentes, mas o número é idêntico. Segundo, o índice brasileiro usa faixas fixas que não consideram sensibilidade individual. Crianças, idosos e pessoas com doenças respiratórias reagem a concentrações muito abaixo dos limites considerados "Seguro". Terceiro, ele não captura compostos orgânicos voláteis, metais pesados ou nan Partículas, que podem estar presentes mesmo com IQA bom.

Se você precisa de dados para decisões de saúde ou estudo epidemiológico, o IQA é insuficiente. Use concentrações absolutas dos poluentes originais em vez de depender do índice padronizado. A informação bruta sempre responde melhor a perguntas específicas do que um número único. A ferramenta que desenvolvi inclui também uma versão que exporta o relatório completo com todos os poluentes, não apenas o índice final. Isso permite análises mais refinadas sem perder a comparação com os padrões oficiais.

Se quiser acompanhar atualizações do código ou reportar bugs, o repositório está aberto e recebe contribuições regularmente. A documentação explica cada passo da instalação e como conectar sensores comuns como ESP32 com módulos SDS011 ou PMS5003.