Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Monitoramento da qualidade do ar da cidade inteligente com base em LoRa

Componentes e suprimentos

Arduino UNO
× 1
Escudo básico visto V2
× 1
NodeMCU ESP8266 Breakout Board
× 1
Sensor de sonoridade visto
× 1
Seeed Grove - Sensor de qualidade do ar v1.3
× 1
Seeed Grove - Sensor de Temperatura e Umidade (DHT11)
× 1
Módulo Reyax LoRa
× 1
Painel solar pequeno visto 80x100mm 1W
× 1
Vi LiPo Rider Pro
× 1
Bateria recarregável, 3,7 V
× 1

Ferramentas e máquinas necessárias

Impressora 3D (genérica)

Aplicativos e serviços online

Arduino IDE
Grandeza
Grandeur Canvas

Sobre este projeto





Cidade inteligente e qualidade do ar


O Banco Mundial define uma cidade inteligente como aquela que é uma cidade com uso intensivo de tecnologia. Isso significa serviços públicos altamente eficientes.

Uma das características fundamentais das cidades inteligentes é fornecer um ambiente sustentável. Para um meio ambiente sustentável, é necessário monitorar as condições ambientais para identificar as fontes de poluição e mitigá-las. Nesse contexto, milhares de sensores de qualidade do ar são colocados para fornecer informações em tempo real ao governo e aos cidadãos. Esses dados podem ser transformados em informações úteis, permitindo-nos tomar melhores decisões - seja no planejamento do transporte, seja na melhor rota a pé para chegar ao trabalho.

O sensor de qualidade do ar se encaixa bem com a visão da cidade inteligente - fornecendo informações sobre uma cidade que não estavam disponíveis, permitindo que as pessoas tomem decisões que podem melhorar a qualidade de suas vidas.





Problema e solução


O aumento do nível de poluição do ar nas grandes cidades tornou-se uma grande preocupação devido ao risco que representa para a saúde humana. Nesse contexto, a tecnologia tem se tornado uma ferramenta muito útil no monitoramento da contaminação e na possível mitigação de seu impacto. Em particular, existem diferentes propostas usando o paradigma da Internet das Coisas (IoT), que usa sensores interconectados para medir diferentes poluentes. Uma rede de nós sensores de monitoramento da qualidade do ar de baixo custo pode ser implantada para monitorar a qualidade do ar e os parâmetros meteorológicos. Assim, por meio da detecção de fontes de poluição, a cidade pode tomar medidas corretivas e melhorar sua saúde ambiental. Instalando sistemas de detecção de desastres como inundações e soluções de monitoramento de chuva em seu entorno. os cidadãos podem ser avisados ​​com antecedência em caso de um evento catastrófico. É possível derivar uma visão holística, permitindo que as autoridades tomem decisões sobre infraestrutura baseada em dados e planejamento de políticas.





O plano do projeto


Neste projeto, vamos monitorar alguns parâmetros ambientais mais importantes, como ruído, temperatura, umidade e qualidade do ar. Ele transmite dados em tempo real por meio do protocolo de comunicação sem fio para uma plataforma de nuvem. O equipamento funciona totalmente com energia solar com bateria de reserva. Os dados do aparelho são acessíveis em um painel que visualiza e analisa os dados nos formatos desejados.

Para monitorar a qualidade do ar da cidade inteligente, você deve colocar nós sensores em locais diferentes. Em termos de consumo de energia e custo, não é uma boa ideia conectar cada nó sensor individualmente à nuvem. Em vez disso, é uma boa ideia coletar dados de todos os nós sensores de uma pequena área e publicar todos os dados na nuvem a partir de um único gateway. O LoRa pode nos dar essa vantagem e é por isso que escolhi o LoRa para o meu projeto.

Para o serviço de nuvem, estou usando Grandeur para meu projeto. Grandeur é uma plataforma IoT comparativamente nova e amigável, onde podemos armazenar nossos dados e visualizá-los criando widgets gráficos usando o método de arrastar e soltar. Eles também fornecem Arduino, JavaScript e Python SDK com código de exemplo. Assim, pode-se conectar facilmente com seu serviço usando Arduino, NodeMCU e Raspberry Pi.

A melhor maneira de alimentar um nó sensor é usar um painel solar. Como os nós sensores são colocados em um local remoto diferente, nem sempre é possível trocar a bateria ou fornecer energia de uma rede elétrica. Estou fornecendo energia para a nota do meu sensor usando o painel solar e a bateria de íons de lítio.





Fazendo o Nó Sensor


Desejo monitorar a qualidade do ar, nível de ruído, temperatura e umidade. Então, usei o sensor de qualidade do ar Grove, o sensor de ruído Grove e o sensor Grove DHT11 de temperatura e umidade. Uma coisa boa sobre os sensores Grove é que você pode conectar todos os sensores Grove ao Arduino usando a blindagem de base Grove sem nenhuma solda.

Para alimentar o circuito, usei painel solar Grove de 1W e bateria de íon-lítio. Para carregar a bateria usando o painel solar, usei o carregador solar Seeed LiPo Rider Pro que tem um conversor boost de 5V embutido. Portanto, podemos facilmente executar o Arduino usando a saída do LiPo Rider.

A maioria dos componentes usados ​​aqui estão disponíveis em Seeedstudio.com. A imagem a seguir mostra uma conexão de teste plug-and-play para todos os componentes do nó do sensor.

Para transmitir os dados do sensor para o gateway IoT, usei o transceptor Reyax LoRa. A imagem a seguir mostra o Módulo Reyax RYLR998 Lora com o diagrama de pinos.

Preparando o Reyax RYLR998 LoRa Engine para se conectar ao Arduino Base Shield

O RYLR998 tem saída de 5 pinos machos e não é compatível com a base de blindagem Grove. Para conectá-lo ao Grove Shield, soldei um cabo Grove em uma perfboard com um conector fêmea de 5 pinos. A conexão do circuito é a seguinte:

O módulo RYLR998 LoRa pode operar com segurança até 3,6V. O pino Arduino TX produz uma saída de 5 V que não é segura para o LoRa. Então, usei um divisor de tensão para obter 3,4 V do pino TX do Arduino. Por outro lado, o pino do Arduino RX funciona perfeitamente na lógica 3.3V. Então, eu conectei o pino TX do LoRa ao pino RX do Arduino diretamente. Para operação normal, o pino RST do LoRa deve estar no estado alto.

Agora, o módulo LoRa acima pode ser facilmente conectado à blindagem da base usando o seguinte circuito conversor.

Mas antes de conectar o Módulo à blindagem da base, certifique-se de que o botão liga / desliga da blindagem da base esteja na posição de 3,3 V conforme a imagem abaixo.

Depois de conectar o módulo LoRa à base de blindagem, podemos testar enviando o comando AT para o módulo do Arduino.



Comunicação usando o transceptor RYLR896 LoRa

Para estabelecer comunicação entre dois módulos LoRa, eles devem ser capazes de se encontrar por meio de um endereço. O esquema de endereçamento do ecossistema LoRa depende um pouco dos módulos e da implementação. Simplesmente falando, o módulo nos permite definir uma id de rede e um endereço. Módulos na mesma rede (mesma id de rede) podem se comunicar entre si. Cada módulo deve ter um id (endereço) exclusivo dentro de uma rede. Se um módulo tiver um endereço 0, esse módulo é capaz de receber dados de todos os dispositivos da rede.

Cada módulo vem com uma frequência padrão, id de rede e endereço, mas você pode precisar alterar o valor padrão. A identificação de rede padrão para o módulo acima é 18 e o endereço é 0.

Não precisamos mudar nada neste momento para nosso projeto de demonstração. Mas se você quiser alterar qualquer parâmetro, verifique a folha de dados para obter os detalhes dos comandos AT.

Para enviar uma mensagem (OLÁ RECEPTOR!), Basta enviar o comando “AT + ENVIAR =0, 15, OLÁ RECEPTOR!” na conexão serial do módulo. O primeiro valor de parâmetro '0' é o endereço do módulo receptor. O próximo valor '15' é o número de caracteres / bytes a serem enviados. O terceiro valor do parâmetro é a mensagem a ser enviada:‘HELLO RECEIVER!’ (15 caracteres).

Código para Nó Sensor

O código a seguir foi desenvolvido para o nó do sensor coletar todos os dados do sensor e transmiti-los ao gateway IoT.
  #include "AirQuality.h" // biblioteca de qualidade do ar do bosque 
#include "Arduino.h"
#include "DHT.h"

# definir DHTPIN 4 // qual pino digital sensor DHT conectado a
#define DHTTYPE DHT11 // modelo do sensor DHT11

DHT dht (DHTPIN, DHTTYPE);

AirQuality airqualitysensor;
int current_quality =-1;

const int sampleWindow =50; // Amostra da largura da janela em mS (50 mS =20 Hz)
amostra int não assinada;
ruído flutuante;
temp flutuante, úmido;
int airQuality;

// ---------------------------------------------- ----------------------------------------------
// CONFIGURAÇÃO
// ----------------------------------------- -------------------------------------------------- -
configuração vazia ()
{

Serial.begin (115200); // Serial para lora
airqualitysensor.init (14);
dht.begin ();

}

// ----- -------------------------------------------------- -------------------------------------
// LOOP PRINCIPAL
/ / ------------------------------------------------- -------------------------------------------

void loop ()
{
ruído =calcule_sound_in_db ();
airQuality =calcule_air_quality ();
calcule_temp_humid ();

String temperatura =String (temp);
Umidade da corda =Corda (úmido);
Som da corda =Corda (ruído);
Ar da corda =Corda (airQuality);

Valores da corda =String (temperatura) + "," + String (umidade) + "," + String (som) + "," + String (ar);
String cmd ="AT + SEND =0," + String (valores. comprimento ()) + "," + valores; // AT + SEND =
, ,
Serial.println (cmd); // enviado para lora

delay (15000);
}

// esta função calcula o nível de som em dB
float calcular_sound_in_db () {
início longo sem sinalMillis =millis (); // Início da janela de amostra
float peakToPeak =0; // nível pico a pico

unsigned int signalMax =0; // valor mínimo
unsigned int signalMin =1024; // valor máximo

// coletar dados para 50 ms
while (millis () - startMillis {
sample =analogRead (A1); // obtém a leitura do microfone
if (amostra <1024) // lança leituras falsas
{
if (amostra> signalMax)
{
signalMax =amostra; // salvar apenas os níveis máximos
}
else if (amostra {
signalMin =amostra; // salvar apenas os níveis mínimos
}
}
}
peakToPeak =signalMax - signalMin; // max - min =amplitude pico-pico
//Serial.println(peakToPeak); // escrever decibéis calibrados
float db =map (peakToPeak, 0,1000,48,120); // calibrar para deciBels
//Serial.print(db); // escrever decibéis calibrados
//Serial.println ("dB"); // escrever unidades
return db;
}

int calcule_air_quality () {
current_quality =airqualitysensor.slope ();
/ *
if (current_quality> =0) // se um dado válido retornado.
{
if (current_quality ==0)
Serial.println ("Alta poluição! Força sinal ativo");
else if (current_quality ==1)
Serial.println ("Alta poluição!");
else if (current_quality ==2)
Serial.println ("Baixa poluição ! ");
else if (current_quality ==3)
Serial.println (" Fresh air ");
}
* /
return current_quality;
}

void Calcule_temp_humid () {
// A leitura da temperatura ou umidade leva cerca de 250 milissegundos!
// As leituras do sensor também podem ser de até 2 segundos 'antigas' ( é um sensor muito lento)
float h =dht.readHumidity ();
// Lê a temperatura como Celsius (o padrão)
float t =dht.readTemperature ();

// Verifique se alguma leitura falhou e saia mais cedo (para tentar novamente).
if (isnan (h) || isnan (t)) {
//Serial.println("Falha ao ler do sensor DHT! ");
return;
}

temp =t;
úmido =h;
/ *
Serial.print ("Umidade:");
Serial.print (h);
Serial.print ("% \ t");
Serial.print ("Temperatura:");
Serial.print (t);
Serial.print ("* C");
* /
}

// interromper a rotina de serviço do sensor de qualidade do ar
ISR (TIMER1_OVF_vect)
{
if (airqualitysensor.counter ==61) // definir 2 segundos como uma tarefa detectada
{

airqualitysensor.last_vol =airqualitysensor.first_vol;
airqualitysensor.first_vol =analogRead (A0);
airqualitysensor.counter =0;
airqualitysensor.timer_index =1;
PORTB =PORTB ^ 0x20;
}
else
{
airqualitysensor.counter ++;
}
}

O código envia os dados do sensor a cada 15 segundos. Altere o tempo de acordo com sua necessidade.





Upload e teste


Agora conecte todos os sensores, carregue o código acima e teste no monitor serial. O arquivo fonte está anexado na seção de código.





Colocando componentes dentro da caixa


Agora vamos colocar todos os sensores e bateria dentro da caixa. Primeiro, imprima em 3D os dois arquivos STL anexados na seção de anexos. As imagens impressas se parecem com a imagem a seguir.

A caixa completa terá a seguinte aparência. Você pode exigir algum envio com base na qualidade de sua impressora.

Depois de preparar a caixa, primeiro coloque o painel solar na parte superior da caixa. Os fios de conexão dentro da caixa através do orifício superior.

Em seguida, coloque o Arduino com a blindagem da base conectada primeiro com um pouco de gule quente ou fita dupla-face. Coloque os outros sensores um a um e fixe-os em um local fixo usando um pouco de cola quente.

Coloque a bateria e o lipo rider pro e, finalmente, adicione o módulo LoRa.

O Nó do sensor está pronto para ser implantado.





Configurando Grandeur


Grandeur fornece um serviço de back-end para dispositivo IoT onde um par de usuário de dispositivo virtual é criado. O modelo do dispositivo é descrito na criação como um objeto JSON contendo várias variáveis ​​(temperatura, umidade, nível de ruído, qualidade do ar em nosso caso) que podem ser lidos e gravados. Grandeur Canvas é um aplicativo da web que pode ser usado para visualizar o estado do dispositivo de dispositivos emparelhados usando widgets gráficos.

Para usar o Grandeur, temos que fazer nossa conta e fazer algumas configurações importantes na plataforma. Confira o site deles https://grandeur.dev/ para entrar no jogo.

1. Após fazer o login na conta root, crie um novo projeto :

2. Crie uma nova conta de usuário em Adicionar conta opção na guia Página inicial ou na guia contas. Mais tarde, entraremos em nosso aplicativo com o e-mail e a senha que criamos agora. Este é outro recurso interessante do Grandeur: vários usuários podem usar seu aplicativo fazendo login com seus e-mails e senhas . Cada usuário pode emparelhar seus próprios dispositivos e o dispositivo emparelhado por um usuário torna-se indisponível para outros. A autenticação é construída no centro do Grandeur. A criação do usuário é ilustrada abaixo:

3. Agora crie um novo dispositivo por meio da guia de dispositivos. Esta operação gera um novo ID de dispositivo exclusivo que usaremos ao escrever o código para nosso hardware e este ID de dispositivo é necessário para conectar ao Grandure usando API. A criação de um dispositivo também gera um accessToken. Não se esqueça de copiá-lo, ele será utilizado no código do hardware e não estará acessível após fechar a caixa de diálogo . Você deve adicionar um modelo de dispositivo antes de adicionar um dispositivo usando o seguinte procedimento. Um modelo de dispositivo é usado para descrever quais variáveis ​​podem ser comunicadas por / para o dispositivo.

A partir dos modelos, clique em Adicionar e dê um nome de modelo. No Schema coloque todas as variáveis ​​(4 no nosso caso) no formato JSON. Mantenha o valor 0 neste momento. Essas variáveis ​​serão atualizadas automaticamente quando enviarmos dados de nosso nó de dispositivo.
  {"temp":0, "humid":0, "air":0, "noise":0}  

Após colocar o esquema, clique em Adicionar.

Após adicionar o modelo do dispositivo, clique na opção Adicionar de Dispositivos e selecione o modelo que você acabou de criar para vincular o modelo ao dispositivo.



Dê um ID de dispositivo e clique para registrar.

Copie o token de acesso e ele será utilizado no código do hardware e não estará acessível após fechar a caixa de diálogo.

O dispositivo foi criado com sucesso e anote também o DEVICE ID. Também será necessário para a codificação.



Um usuário não pode interagir com um dispositivo a menos que esteja emparelhado com ele. Existem duas maneiras de emparelhar seu dispositivo :1) usando o Cloud Dashboard ou 2) por meio do aplicativo da web usando pairDevice () função da API do dispositivo. Esta segunda forma tem um significado muito forte se você olhar para ela do ponto de vista da produção. Como se agora você pudesse enviar seus produtos de hardware, seus usuários podem entrar no seu aplicativo e declarar a propriedade de um hardware emparelhando-o. Veja como você pode emparelhar seu dispositivo com um usuário usando o Cloud Dashboard:

Para fazer o emparelhamento do dispositivo, clique em Emparelhar e escolha uma conta. Você está pronto para ir para a próxima etapa.



4. Vamos criar uma tela agora.

No menu esquerdo do painel, clique na tela ou vá para https://canvas.grandeur.tech. Se esta é sua primeira visita ao Canvas, um Autorizar botão aparecerá. A autorização dá ao Canvas acesso aos usuários e dispositivos do seu projeto. Clicar no botão "Autorizar" o redirecionará de volta ao painel Grandeur, onde será solicitado que você escolha o projeto ao qual deseja que o Canvas se vincule.

Escolha um widget de gráfico e clique nele. O menu Configurar aparecerá e então clique para configurar para dar um título ao gráfico e definir a variável cujo valor você deseja mostrar neste gráfico.

Clique para salvar.

Seguindo o mesmo procedimento, adicione 4 widgets de gráfico para as 4 variáveis.

Depois de conectar o Canvas ao seu projeto, você verá uma tela de login. Você precisa fazer login aqui como um usuário de seu projeto criado anteriormente, para o qual você precisa criar uma conta de usuário em seu projeto. Você pode fazer isso visitando a página de contas do painel. Em seguida, você pode fazer login no Canvas usando as credenciais deste novo usuário.





Preparando o IoT LoRa Gateway


In a simple way, an IoT Gateway is like home or office network router or gateway that connects sensors, IoT modules, and smart devices to the cloud. Such a gateway facilitates communication between your devices, maintains security, and provides an admin interface where you can perform basic functions.

A true IoT gateway contains communication technologies connecting end-devices (sensors, actuators, or more complex devices) and backend platforms (data, device, and subscriber management) to the gateway. It has a computing platform allowing pre-installed or user-defined applications to manage data (for routing and computing at the edge), devices, security, communication, and other aspects of the gateway.

Raspberry Pi can be a good option for a gateway with lots of flexibility but to keep it simple I am using Node MCU as a gateway for this project. Node MCU will receive the data from the LoRa module using UART. Then using Arduino SDK we will upload the data to the Grandeur cloud platform.






Firmware for the Gateway


The following code was developed for the gateway using Arduino SDK provided by Grandeur cloud. Data is received in string form from the LoRa using the UART port. Then the received data is processed to separate the individual variable from the comma-separated string value. The values are then sent to Grandeur using WiFi. The following function was used to separate the variables.
void process_received_data(){

start_pos =inputString.indexOf(start_val);
end_pos =inputString.indexOf(end_val);
String data_string =inputString.substring(start_pos+1, end_pos-1);
//Serial.println(data_string);
//identifying commas inn the string
int firstCommaIndex =data_string.indexOf(',');
int secondCommaIndex =data_string.indexOf(',', firstCommaIndex+1);
int thirdCommaIndex =data_string.indexOf(',', secondCommaIndex+1);
//seperating comma seperated value from the data string
String temperature =data_string.substring(0, firstCommaIndex);
String humidity =data_string.substring(firstCommaIndex+1, secondCommaIndex);
String noise_level =data_string.substring(secondCommaIndex+1, thirdCommaIndex);
String air_auality =data_string.substring(thirdCommaIndex+1);

//Serial.println(temperature);
//Serial.println(humidity);
//Serial.println(noise);
//Serial.println(air_auality);

temp =temperature.toFloat();
humid =humidity.toFloat();
noise =noise_level.toFloat();
air =air_auality.toFloat();

Serial.println(temp);
Serial.println(humid);
Serial.println(noise);
Serial.println(air);

inputString ="";
stringComplete =false;
}

The complete code is attached in the code section.





Data Visualization





Code

  • Code for Sensor Node
  • Code for Gateway
Code for Sensor NodeArduino
This code is for the sensor device that collects sensors data and sent the data to the IoT gateway using LoRa.
#include "AirQuality.h" //grove air quality library#include "Arduino.h"#include "DHT.h"#define DHTPIN 4 // what digital pin DHT sensor connected to#define DHTTYPE DHT11 // model of the sensor DHT11 DHT dht(DHTPIN, DHTTYPE);AirQuality airqualitysensor;int current_quality =-1;const int sampleWindow =50; // Sample window width in mS (50 mS =20Hz)unsigned int sample;float noise;float temp, humid;int airQuality; //-------------------------------------------------------------------------------------------- // SETUP //--------------------------------------------------------------------------------------------void setup() { Serial.begin(115200); //Serial for lora airqualitysensor.init(14); dht.begin();} //--------------------------------------------------------------------------------------------// MAIN LOOP//-------------------------------------------------------------------------------------------- void loop() { noise =calculate_sound_in_db(); airQuality =calculate_air_quality(); calculate_temp_humid(); String temperature =String(temp); String humidity =String(humid); String sound =String(noise); String air =String(airQuality); String values =String(temperature)+","+ String(humidity)+","+ String(sound)+","+ String(air); String cmd ="AT+SEND=0,"+String(values.length())+","+values; //AT+SEND=
,, Serial.println(cmd); //sent to lora delay(15000);}//this function calculate sound level in dBfloat calculate_sound_in_db(){ unsigned long startMillis=millis(); // Start of sample window float peakToPeak =0; // peak-to-peak level unsigned int signalMax =0; //minimum value unsigned int signalMin =1024; //maximum value // collect data for 50 mS while (millis() - startMillis signalMax) { signalMax =sample; // save just the max levels } else if (sample =0)// if a valid data returned. { if (current_quality==0) Serial.println("High pollution! Force signal active"); else if (current_quality==1) Serial.println("High pollution!"); else if (current_quality==2) Serial.println("Low pollution!"); else if (current_quality ==3) Serial.println("Fresh air"); } */ return current_quality;}void calculate_temp_humid(){ // Reading temperature or humidity takes about 250 milliseconds! // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) float h =dht.readHumidity(); // Read temperature as Celsius (the default) float t =dht.readTemperature(); // Check if any reads failed and exit early (to try again). if (isnan(h) || isnan(t)) { //Serial.println("Failed to read from DHT sensor!"); return; } temp =t; humid =h; /* Serial.print("Humidity:"); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature:"); Serial.print(t); Serial.print(" *C "); */}//interrupt service routine for air quality sensorISR(TIMER1_OVF_vect){ if(airqualitysensor.counter==61)//set 2 seconds as a detected duty { airqualitysensor.last_vol=airqualitysensor.first_vol; airqualitysensor.first_vol=analogRead(A0); airqualitysensor.counter=0; airqualitysensor.timer_index=1; PORTB=PORTB^0x20; } else { airqualitysensor.counter++; }}
Code for GatewayArduino
Receives data from the sensor nodes, process the data and sends to Grandeur cloud
/* Including the SDK and WiFi library */#include #include #include SoftwareSerial LORA(D7, D8);/* Configurations */String deviceID ="your device id";String apiKey ="your api key";String token ="your device token";/* WiFi credentials */String ssid ="your wifi ssid";String password ="your wifi password";/* Create variable to hold project and device */Grandeur::Project project;Grandeur::Project::Device device;/* Variable to keep track of connection state and time */int connected =0;uint32_t lastUpdate =0;String inputString =""; // a string to hold incoming databoolean stringComplete =false; // whether the string is complete//:and % was set from the transmitter node for the eage of data separationchar start_val =':';char end_val ='%';int start_pos =0;int end_pos =0;float temp =0;float humid =0;float air =0;float noise =0;/* Function to check device's connection status */void onConnection(bool status) { switch(status) { case CONNECTED:Serial.println("Device is connected to the cloud."); /* Record connection state and time */ connected =1; lastUpdate =millis(); return; case DISCONNECTED:Serial.println("Device is disconnected from the cloud."); connected =0; return; }}/* Function to connect to WiFi */void connectWiFi() { /* Set mode to station */ WiFi.mode(WIFI_STA); /* Connect using the ssid and password */ WiFi.begin(ssid, password); /* Block till the WiFi is connected */ while (WiFi.status() !=WL_CONNECTED) { delay(500); Serial.print("."); } /* Print message */ Serial.println(""); Serial.println("WiFi connected"); /* And IP address */ Serial.println(WiFi.localIP());}/* Function to confirm that data has been updated */void dataCallback(const char* code, Var res) { /* If the update was recorded successfully */ if(code =="DEVICE-DATA-UPDATED") { //Serial.println("Updated DATA"); /* Get data */ double temp_data =(double) res["update"]["temp"]; double humid_data =(double) res["update"]["humid"]; double noise_data =(double) res["update"]["noise"]; double air_data =(double) res["update"]["air"]; /* Print */ Serial.printf("Temperature:%f Humidity:%f Noise Level:%f Air Quality:%f\n", temp_data, humid_data, noise_data, air_data); return; } /* If the summary could not be updated. */ Serial.println("Failed to Update DATA"); return;}/* Function to send updated current and power readings */void sendUpdate() { Var data; //JSON data format set in Grandeur:{"temp":0, "humid":0, "air":0, "noise":0} data["temp"] =temp; data["humid"] =humid; data["noise"] =noise; data["air"] =air; /* Record update */ //device.data().set("", data, dataCallback); //send JSON device.data().set("temp", temp, dataCallback); device.data().set("humid", humid, dataCallback); device.data().set("noise", noise, dataCallback); device.data().set("air", air, dataCallback); //delay(2000);}void setup() { /* Begin the serial */ Serial.begin(9600); LORA.begin(115200); inputString.reserve(200); /* Connect to WiFi */ connectWiFi(); /* Initializes the global object "grandeur" with your configurations. */ project =grandeur.init(apiKey, token); /* Get reference to device */ device =project.device(deviceID); /* Sets connection state update handler */ project.onConnection(onConnection);}void loop() { serialEvent(); project.loop(WiFi.status() ==WL_CONNECTED); /* Send update to server */ if (stringComplete) { process_received_data(); if (connected) sendUpdate(); }}void serialEvent() { while (LORA.available()) { // get the new byte:char inChar =(char)LORA.read(); // if the incoming character is a newline, set a flag // so the main loop can do something about it:if (inChar =='\n') { stringComplete =true; } else // add it to the inputString:inputString +=inChar; }}void process_received_data(){ start_pos =inputString.indexOf(start_val); end_pos =inputString.indexOf(end_val); String data_string =inputString.substring(start_pos+1, end_pos-1); //Serial.println(data_string); //identifying commas inn the string int firstCommaIndex =data_string.indexOf(','); int secondCommaIndex =data_string.indexOf(',', firstCommaIndex+1); int thirdCommaIndex =data_string.indexOf(',', secondCommaIndex+1); //seperating comma seperated value from the data string String temperature =data_string.substring(0, firstCommaIndex); String humidity =data_string.substring(firstCommaIndex+1, secondCommaIndex); String noise_level =data_string.substring(secondCommaIndex+1, thirdCommaIndex); String air_auality =data_string.substring(thirdCommaIndex+1); //Serial.println(temperature); //Serial.println(humidity); //Serial.println(noise); //Serial.println(air_auality); temp =temperature.toFloat(); humid =humidity.toFloat(); noise =noise_level.toFloat(); air =air_auality.toFloat(); Serial.println(temp); Serial.println(humid); Serial.println(noise); Serial.println(air); inputString =""; stringComplete =false; }

Custom parts and enclosures

Schematics


Processo de manufatura

  1. As tecnologias de sensores avançados permitem o monitoramento personalizado da qualidade do ar
  2. O sensor de qualidade do ar incorpora recursos de IA
  3. A plataforma do sensor de qualidade do ar ganha IA incorporada
  4. Como medir a qualidade do ar em OpenSensors
  5. Detector de poluição do ar
  6. Sensor de qualidade do ar de hélio
  7. Melhorar o monitoramento da poluição do ar com sensores IoT
  8. Benefícios do sistema de monitoramento da qualidade do ar ambiente baseado em IoT
  9. Aplicações de Sistemas de Monitoramento da Qualidade do Ar Infundido de IoT Industrial
  10. Sensor de qualidade do ar à base de carbono