Escolar Documentos
Profissional Documentos
Cultura Documentos
FACULDADE DE TECNOLOGIA – FT
DEPARTAMENTO DE ENGENHARIA ELÉTRICA E
COMPUTAÇÃO
Manaus – 2021
Ficha Catalográfica
____________________________________________________
Prof. Dr. Celso Barbosa Carvalho – ORIENTADOR
_____________________________________________________
Prof. Dr. Thiago Brito Bezerra – Membro
_____________________________________________________
Prof. Dr. Frederico da Silva Pinagé – Membro
Manaus – 2021
Agradecimentos
A Deus, primeiramente, pela saúde e por me ajudar a ultrapassar todos os
obstáculos encontrados ao longo do curso e principalmente nesses dois últimos
anos pandêmicos. Aos meus pais por sempre me apoiarem e nunca deixarem
falta nada me permitindo ter maior foco nos estudos.
E finalmente aos meus amigos Jones Castro, Rafael Furtado, Luiz Felipe,
Yasmim Torres e Karmen Adjeran por toda a parceria durante esses anos de
graduação e por ter contribuído diretamente na realização deste projeto.
Resumo
Foi desenvolvido neste trabalho de pesquisa, um sistema de hardware e software
que utiliza sensores sem fio e de baixo custo para monitorar alguns poluentes no
ar e variáveis como a temperatura, a umidade do ar e as coordenadas
geográficas com objetivo de monitorar a qualidade do ar de um determinado
local. Para isso, foi utilizada a tecnologia LoRa com alcance médio de 5km nas
zonas urbanas e 10km nas zonas rurais. O sistema desenvolvido conta com uma
plataforma para Internet of Things (IoT) Web na qual é configurado um
dashboard que recebe em tempo real aas variáveis que estão sendo
monitoradas e as exibe de forma intuitiva para o usuário. Foram realizados testes
em diferentes pontos da cidade para validar as medições do sistema
desenvolvido. As medições obtidas foram confrontadas com os padrões da
organização mundial da saúde para levantar os possíveis riscos sobre a saúde
da poluição do ar nos locais escolhidos. A viabilidade do sistema desenvolvido
comprova a possibilidade de ter estações móveis de monitoramento da
qualidade do ar, com baixo custo para um monitoramento a grande escala no
futuro.
------------------------------------------------------------------------------------------------------- 54
------------------------------------------------------------------------------------------------------- 55
mestrinho) ----------------------------------------------------------------------------------------- 55
------------------------------------------------------------------------------------------------------- 56
------------------------------------------------------------------------------------------------------- 59
Lista de abreviaturas e siglas
LoRa Long Range
SS Spread Spectrum
FW Firmware
CR Code Rate
SF Spread Factor
BW Band Width
Introdução ........................................................................................................ 13
1.2. Motivação........................................................................................... 15
2. Objetivos .................................................................................................... 16
4.7. Dashboard........................................................................................... 47
6. Conclusão ................................................................................................ 68
Referências ..................................................................................................... 69
Anexos ............................................................................................................. 72
13
Introdução
1
IEMA: Instituto Estadual de Meio Ambiente
14
Dos 27 estados brasileiros, apenas Bahia, Minas Gerais, Espírito Santo, Rio de
Janeiro, São Paulo, Goiás, Paraná, Rio Grande do sul e o Distrito Federal
possuem estações de monitoramento da qualidade do Ar. Na falta de
informações a respeito da poluição, fica difícil tomar medidas para reduzir os
poluentes no ar. Segundo as estimativas da Organização Mundial da Saúde
(OMS), ocorrem 7 milhões de mortes prematuras ao ano em função da poluição
no mundo, um equivalente de 800 mortes por hora. A maioria dos brasileiros não
conhece a qualidade do ar que respira e nem sequer dos poluentes que podem
existir no ar. As principais fontes de poluição do ar são, as fontes industriais e as
fontes ligadas à mobilidade urbana, isto é, o transporte motorizado (INCA2,
2018). O monitoramento da qualidade do ar no Brasil é uma atribuição de cada
estado e depende do orçamento público (Ferreira, 2019). Uma vez que os
estados brasileiros não têm realizado investimentos para monitorar da qualidade
do ar, a problemática que se pretende minimizar com a pesquisa deste TCC,
está relacionada com a falta de ações para monitoramento da qualidade do ar
2
INCA: Instituto Nacional de Câncer
15
1.2. Motivação
2. Objetivos
Este trabalho tem como objetivo geral propor, desenvolver e testar um sistema
de hardware e software para monitoramento da qualidade do ar baseado em
uma plataforma Web para IoT, usando o microcontrolador ESP32 e a tecnologia
de rede LoRa.
3. Fundamentação Teórica
Nesta seção serão apresentados os poluentes monitorados e os recursos
usados para realizar o sensoriamento. Os recursos utilizados podem ser
classificados em três categorias:
• A tecnologia de Rede;
• Os recursos de hardware;
17
• Os recursos de software.
Com:
N4 – Muito
121 – 200 >150 – 250 >75 – 125 >160 – 200
Ruim
N5 –
>200 >250 >125 >200
Péssima
22
3
Grupos sensíveis: Crianças, idosos e pessoas que apresentam alguma doença/deficiência respiratória.
23
4
Link Budget: O link budget é o cálculo final de potência em todo o percurso entre TX e RX, levando em
consideração a potência de transmissão, as diversas perdas da estação base até o usuário para o alcance
prático de uma célula.
25
5
QoS do inglês Quality of service é a discrição da performance no usuário dos serviços como redes de
computadores, computação em nuvem e telefonia
26
da rede não são direcionados para um gateway específico, mas para vários
gateways ao mesmo tempo. Cada gateway encaminha um pacote recebido do
nó final para o servidor de rede localizado na nuvem. O servidor de rede é
responsável por redirecionar o pacote para os servidores de aplicação como
ilustra a figura 2.
Parâmetros LoRaWAN
Modulação SS Chirp
Largura de banda Rx 125 KHz
Taxa de dados 290bps – 50Kbps
Quantidade máxima de mensagens por dia Ilimitada
potência máxima de saída 20dBm
Link Budget 154 dB
Vida útil da bateria – 2000mAh 105 meses
Eficiência energética Muito alta
Imunidade a interferências Muito alta
Coexistência Sim
Segurança Sim
Mobilidade/ localização Sim
Parâmetros Valores
Versão Rev1
WiFi Sim
Bluetooth Sim
Memória 4MB Flash;
Antena Sim (antena 3D)
Voltagem de funcionamento LoRa 1.8 a 3.7v
Corrente de transmissão 120mA
Frequência de operação 915MHz
Potência de transmissão 20dBm
Erro de frequência +/- 15KHz
Interface SPI
Parâmetros Valores
Chip LM393
31
O PMS7003 mede as partículas com diâmetro de 0.3; 0.5; 1.0; 2.5; 5.0 e 10 µm
por 0.1 litro (dm3) e tem como saída as concentrações de MP1, MP2.5 e MP10
32
em µg/m3 (tabela 7). Existe várias gerações do sensor PMS sendo o PMS1003
o modelo da primeira geração e o PMS7003 o modelo mais recente. As gerações
dos sensores PMS variam nas dimensões, sendo os modelos mais antigos os
maiores e os recentes os menores. As especificações da interface não diferem
muito, entretanto, o PMS5003 e o PMS7003 emitem telegramas de dados de 32
bytes. A empresa responsável por desenvolver os sensores PMS é a plantower
e ela tem sede na china.
O PMS7003 é simples de conectar via USB TTL. A saída serial é de 9600 baud
(1 bit de parada) e as saídas são telegramas de dados binários (números inteiros
de dados de 32 bits/16 bits). O sensor pode operar em modo ativo (funcionando)
e passivo. O módulo pode ser colocado para hibernar, por exemplo usando o
pino 3V3 e um resistor de 10K. O sensor tem um ventilador integrado (5 VCC).
Ligado, o sensor estará no estado ativo (ventilador LIGADO). Há um pino de
reinicialização (3V3 alto com resistor de 10K).
A figura 7 mostra o sensor DHT22 utilizado. Ele possui quatro pinos, da esquerda
para direita são eles o VCC (varia de 3.3V a 5V), o pino de dados, o pino NC
(Not Connected) e o GND.
Parâmetros Valores
Precisão na umidade ± 2% RH
Tempo de resposta 2s
Alimentação 3,5 V a 5 V
Parâmetros Valor
Tensão de entrada 6.5 a 12V DC
Tensão de saída 3.3 V e 5V
Corrente máxima de saída 700mA
Dimensões 53mm x 31mm
4.2.1. DHT22
O DHT22 foi alimentado por uma tensão de 3.3V. Dos quatro pinos do DHT22,
apenas os pinos VCC, DATA e GND foram usados na conexão com a ESP32.
Não foi necessário usar o pino NULL na configuração utilizada. A tabela 10
apresenta o mapa dos pinos do DHT22.
Pino Função
1 VCC - Alimentação
2 DATA - Sinal
3 NULL
4 GND
Visto que o pino NULL não foi utilizado, para evitar que ocorra o fenômeno de
estado flutuante6, um resistor de 10kΩ foi utilizado como resistor de pull-up. O
resistor de pull-up assegura que o pino DATA vai estar em estado alto e
6
O estado flutuante ocorre quando não se pode prever se a leitura de um pino configurado como
entrada será Vcc ou GND
39
4.2.2. MQ131
7
Função da biblioteca <MQ131.h> para realizar medições em baixas concentrações. A medição em alta
concentrações é feita com a função HIGH_CONCENTRATION.
40
MQ131
Resistor de
pull-up
ESP32
4.2.3. PMS7003
N° Pino Função
Pino 1 VCC Alimentação 5V
Pino 2 VCC Alimentação 5V
Pino 3 GND Terra
Pino 4 GND Terra
Pino 5 Reset Módulo reset do sinal/
TTL nível 3.3V, reset
baixo
Pino 6 NC Not Connected
Pino 7 RX Pino de recebimento da
porta serial/TTL nível
3.3V
Pino 8 NC Not Connected
Pino 9 TX Pino de envio da porta
serial/TTL nível 3.3V
Pino 10 SET TTL nível 3.3V
Dos 10 pinos, apenas três foram usados para conectar o PMS7003 à ESP32, os
pinos VCC, GND e o pino TX para o envio das informações para a ESP32. O
PMS7003 pode realizar leituras no modo ativo ou no modo passivo. A diferença
de um modo para o outro é que no modo ativo assim que o sensor é ligado, ele
começa a realizar as leituras em contrapartida no modo passivo mesmo após
ligar o sensor, é preciso fazer uma requisição no código para realizar uma leitura.
Em outras palavras no modo passivo é possível programar estados de leituras e
42
de não leituras para o sensor, são os modos “read” e “sleep”. Como a intenção
nesse trabalho é realizar medidas contínuas, as leituras do PMS7003 foram
realizadas no modo ativo usando a biblioteca “PMS.h”. A função implementada
para o sensor PMS7003 tem como saída três variáveis cada uma contendo
respectivamente as concentrações em µg/m3 de PM1.0, PM2.5 e PM10.
4.3.1. Bibliotecas
O cadastro da ESP32 na PROIOT foi um dos pontos focais do projeto, uma vez
que todos os parâmetros para estabelecer a comunicação entre ESP32 e
PROIOT são configurados nesse passo e são sincronizados com o código
implementado no arduino (Abdel Chabi, 2021). A figura 13 mostra algumas
configurações importantes da ESP32 como a classe do dispositivo, a ativação
de segurança e as chaves que são lidos no código para conectar a ESP32 e
PROIOT.
• static const PROGMEM u1_t NWKSKEY [16] = {0xC8, 0x25, 0x67, 0x24, 0x60,
0x14, 0x2B, 0x95, 0x5E, 0x9A, 0xF1, 0xE3, 0xF8, 0xF7, 0x3C, 0x17};
46
• static const u1_t PROGMEM APPSKEY [16] = {0x79, 0x58, 0xDF, 0xA3,
0x74, 0x13, 0xE9, 0x18, 0xEE, 0x41, 0x89, 0x72, 0x31, 0xAB, 0xC3,
0x1F}.
• static const u4_t DEVADDR = 0xe93c3292
4.5.2. O payload
8
Alias: O alias é o apelido da variável e precisa ser igual ao nome da variável na declaração do payload
enviado para a plataforma.
47
É possível notar que os nomes das variáveis são iguais aos nomes dos alias
declarados na plataforma.
4.7. Dashboard
9
Widget: Os widgets são janelas que exibem um ou vários valores de uma ou várias variáveis, o
conjunto dos widgets formando o dashboard.
48
5. Testes e Resultados
5.1. Testes de funcionalidade
DHT22
PMS7003
MQ131
Usando o software google Earth foi possível estimar a distância em linha reta
entre o ponto da medição e o gateway. Neste primeiro caso, como bem ilustra a
figura 30, a distância entre dispositivo e gateway é de aproximadamente 4.5 km
Por fim a figura 33 apresenta um dos gateways utilizados nas medições outdoor
no complexo viário Gilberto mestrinho
59
A partir da análise dos logs de uplinks para cada um dos três cenários descritos
acima foi possível extrair os valores de RSSI e SNR para avaliar a qualidade da
rede. O RSSI do inglês Received Signal Strength Indicator representa a
qualidade relativa do sinal que vai ser recebido pelo dispositivo desenvolvido.
Isto é, o valor do RSSI indica o nível de potência que está sendo recebido após
todas as possíveis perdas do meio. O RSSI é medido em decibel (dB) com
valores que variam de -120 a 0 e quanto maior o valor, melhor a qualidade do
sinal. Assim como o RSSI o SNR vem do inglês Signal to Noise Ratio e como o
próprio nome se auto justifica é o quociente entre o nível de potência do sinal
desejado e o nível de potência do ruído. O SNR é medido em dB e quanto maior
o valor medido, melhor a qualidade do sinal.
A tabela 12 traz os valores de RSSI e SNR de três uplinks para três ensaios de
medições diferentes. Para o mesmo ponto de medição e inclusive para várias
sessões de transmissão do mesmo gateway há variações constantes do sinal
recebido. Essas variações são conhecidas como flutuações do sinal em
telecomunicações. Dos três uplinks da tabela, o uplink do teste outdoor no
Gilberto mestrinho tem a melhor qualidade do sinal uma vez que possui os
maiores valores de RSSI e SNR.
Distância
Coordenadas do Dispositivo Frequência
Testes Canal RSSI (dB) SNR (dB)
Gateway para (Mhz)
gateway(km)
Teste Lat: -3.140356
indoor Lng-59.9944472 4.5 0 -97 10.5 915.2
Teste Lat: -
outdoor 3.10839009284 Lng
ufam :-59.9912910461 2 7 -114 2.2 916.6
Teste Lat: -
outdoor 3.078929901123
Gilberto Lng: -
mestrinho 59.9857711791 1.54 3 -95 7.2 915.8
𝒄 (𝒎/𝒔)
λ(m) = 𝒇(𝑯𝒛)
• Teste indoor
3x108 (𝑚/𝑠)
λ(m) = 915.2𝑥106(𝐻𝑧) = 0.3278 m
Com:
• Índice do ozônio
40−0
IQAr = 0 + × (47 − 0) = 18.8
100−0
• Índice do MP2.5
80−41
IQAr = 41 + 50−25 × (36 − 25) = 58.16
• Índice do MP10
80−41
IQAr = 41 + 100−50 × (93 − 50) = 74.54
64
• Índice do Ozônio
40−0
IQAr = 0 + 100−0 × (58 − 0) = 23.2
• Índice do MP2.5
80−41
IQAr = 41 + 50−25 × (45 − 25) = 72.2
• Índice do MP10
80−41
IQAr = 41 + 100−50 × (70 − 50) = 56.6
• Índice do Ozônio
66
120−81
IQAr = 81 + × (132 − 130) = 83.6
160−130
• Índice do MP2.5
120−81
IQAr = 81 + × (54 − 50) = 87.24
75−50
• Índice do MP10
120−81
IQAr = 81 + × (127 − 100) = 102.06
150−100
67
6. Conclusão
Referências
A. F. Chabi, Jones P. Castro, Jean B. Guimarães, Rafael Santos., "A IoT System for
Vehicle Tracking using Long Range Wide Area Network," 2021 IEEE International
Conference on Consumer Electronics-Taiwan (ICCE-TW), 2021, pp. 1-2, doi:
10.1109/ICCE-TW52618.2021.9603034.
C. H. Kok, M. A. M. Azlan and S. E. Ong. IoT based Low Cost Distributed Air
Quality Monitoring System for Big Data Collection. 10th IEEE International
Conference on Control System, Computing and Engineering (ICCSCE). p. 7—
10, 2020.
Miranda, R.M., Andrade, M.F., Fornaro, A., Astofolo, R., Afonso de Andre, P.,
Saldiva, P.H. Urban air Pollution: a representative survey of PM2.5 mass
concentration in six Brazilian cities. Air quality, Atmosphere et Health, vol.55,
n.1, pp. 63 -77, 2012.
S. McGrath et al. IoT Personal Air Quality Monitor. 31st Irish Signals and
Systems Conference (ISSC). p. 1—4, 2020.
Sarun Duangsuwan . A study of air pollution smart sensors LPWAN via NB-
IoT for Thailand smart cities 4.0, IEEE 10th International Conference on
Knowledge and Smart Technology (KST), p. 206 - 209, 2019.
T. W. Ayele and R. Mehta. Air pollution monitoring and prediction using IoT.
Second International Conference on Inventive Communication and
Computational Technologies (ICICCT), IEEE, p. 1741—1745, 2018.
Ubiratan de Paula S., Marcos Abdo A., Alfésio L. F. B., Rafael F. M., José
Eduardo D. C., Mário T., José M. C. Poluição do ar ambiental: efeitos
respiratórios. Jornal Brasileiro de Pneumologia, vol.47, n.1, 2021.
71
WHO. WHO Air quality guidelines for particulate matter, ozone, nitrogen
dioxide and sulfur dioxide. Global update 2005. Genebra: WHO, 2006.
Anexos
Anexo A : Código comunicação LoraWAN com ESP32 usando ABP(Autor:
Pedro Bertoleti)
/* Definições gerais */
#define BAUDRATE_SERIAL_DEBUG 115200
#define RADIO_RESET_PORT 14
#define RADIO_MOSI_PORT 27
#define RADIO_MISO_PORT 19
#define RADIO_SCLK_PORT 5
#define RADIO_NSS_PORT 18
#define RADIO_DIO_0_PORT 26
#define RADIO_DIO_1_PORT 35
#define RADIO_DIO_2_PORT 34
73
#define payloadSize 34
#define pinLDR 2
#define pinDHT11 13
#define SensorPin 37 //Sensor de chuva
/* Constantes do LoraWAN */
/* - Chaves (network e application keys) */
static const PROGMEM u1_t NWKSKEY[16] = { }; //coloque aqui sua
network session key
static const u1_t PROGMEM APPSKEY[16] = { }; //coloque aqui sua
application session key
/* - Device Address */
static const u4_t DEVADDR = ;
static osjob_t sendjob; //objeto para job de envio de dados via ABP
/* Callbacks para uso cpm OTAA apenas (por este projeto usar ABP, isso,
eles
* estão vazios) */
void os_getArtEui (u1_t* buf)
{
/* Não utilizado neste projeto */
}
switch(ev)
{
75
case EV_SCAN_TIMEOUT:
//Serial.println(F("EV_SCAN_TIMEOUT"));
break;
case EV_BEACON_FOUND:
//Serial.println(F("EV_BEACON_FOUND"));
break;
case EV_BEACON_MISSED:
//Serial.println(F("EV_BEACON_MISSED"));
break;
case EV_BEACON_TRACKED:
//Serial.println(F("EV_BEACON_TRACKED"));
break;
case EV_JOINING:
LMIC_setLinkCheckMode(1);
LMIC_setAdrMode(1);
//LMIC_startJoining();
//Serial.println(F("EV_JOINING"));
break;
case EV_JOINED:
//Serial.println(F("EV_JOINED"));
break;
case EV_JOIN_FAILED:
//Serial.println(F("EV_JOIN_FAILED"));
break;
case EV_REJOIN_FAILED:
//Serial.println(F("EV_REJOIN_FAILED"));
break;
case EV_TXCOMPLETE:
//Serial.println (millis());
// Serial.println(F("EV_TXCOMPLETE (incluindo espera pelas
janelas de recepção)"));
76
os_setTimedCallback(&sendjob,
os_getTime()+sec2osticks(TX_INTERVAL), do_send);
break;
case EV_LOST_TSYNC:
//Serial.println(F("EV_LOST_TSYNC"));
break;
case EV_RESET:
//Serial.println(F("EV_RESET"));
break;
case EV_RXCOMPLETE:
//Serial.println(F("EV_RXCOMPLETE"));
break;
case EV_LINK_DEAD:
//Serial.println(F("EV_LINK_DEAD"));
break;
case EV_LINK_ALIVE:
//Serial.println(F("EV_LINK_ALIVE"));
break;
case EV_TXSTART:
//Serial.println(F("EV_TXSTART"));
//Serial.println (millis());
//Serial.println(LMIC.freq);
break;
default:
//Serial.print(F("Evento desconhecido: "));
//Serial.println((unsigned) ev);
break;
}
}
78
//saleSize
DHT.read11(pinDHT11);
//String mydata_str = "";
static uint8_t mydata[payloadSize];
char mydata_str[payloadSize]={0};
// Montando o JSON
DynamicJsonDocument json(JSON_OBJECT_SIZE(4));
json["H"] = sensorValue;
json["T"] = (int)DHT.temperature;
json["U"] = (int)DHT.humidity;
json["L"] = ldrValue;
}
else if ((sensorValue >= 0)&&(sensorValue < 10)) {
saleSize = saleSize + 3;
}
serializeJson(json, mydata_str);
//Serial.print(F("JSON:"));
//Serial.println(mydata_str);
//Serial.print(F("JSON Payload Size:"));
//Serial.println(payloadSize-saleSize);
Heltec.display -> clear();
Heltec.display -> drawString(0,0, (String) os_getTime());
Heltec.display -> drawString(0,10, mydata_str);
Heltec.display -> display();
void setup()
{
uint8_t appskey[sizeof(APPSKEY)];
uint8_t nwkskey[sizeof(NWKSKEY)];
int b;
LMIC_setAdrMode(0);
LMIC_setLinkCheckMode(0);
82
void loop()
{
os_runloop_once();
}
void setup() {
Serial.begin(115200);
Serial.println("Calibration parameters");
Serial.print("R0 = ");
83
Serial.print(MQ131.getR0());
Serial.println(" Ohms");
Serial.print("Time to heat = ");
Serial.print(MQ131.getTimeToRead());
Serial.println(" s");
}
void loop() {
Serial.println("Sampling...");
MQ131.sample();
Serial.print("Concentration O3 : ");
Serial.print(MQ131.getO3(PPM));
Serial.println(" ppm");
Serial.print("Concentration O3 : ");
Serial.print(MQ131.getO3(PPB));
Serial.println(" ppb");
Serial.print("Concentration O3 : ");
Serial.print(MQ131.getO3(MG_M3));
Serial.println(" mg/m3");
Serial.print("Concentration O3 : ");
Serial.print(MQ131.getO3(UG_M3));
Serial.println(" ug/m3");
delay(60000);
}
#include "PMS.h"
84
PMS pms(Serial);
PMS::DATA data;
void setup()
{
Serial.begin(9600); // GPIO1, GPIO3 (TX/RX pin on ESP-12E
Development Board)
Serial1.begin(9600); // GPIO2 (D4 pin on ESP-12E Development Board)
}
void loop()
{
if (pms.read(data))
{
Serial1.print("PM 1.0 (ug/m3): ");
Serial1.println(data.PM_AE_UG_1_0);
Serial1.println();
}
}