UnifiedWater v1
Componentes e suprimentos
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Ferramentas e máquinas necessárias
|
Aplicativos e serviços online
| ||||
| ||||
| ||||
|
Sobre este projeto
Visão geral
Rios. Essencial para nossa sobrevivência, comércio e assim por diante. Grandes esforços foram feitos na última década para reduzir a poluição dos corpos d'água do mundo. Os rios são a fonte da poluição, pois as pessoas não vão ao mar para despejar seu lixo. Eles jogam nos rios.
Esses rios então se derramam no mar, o oceano e então a escova de dentes que uma vez foi jogada em um rio atravessa o mundo e pousa do outro lado dele.
Em um mundo que tenta combater a poluição, os dados são cruciais. Deve ser fácil para empresas e negócios colaborarem em um projeto global para reduzir a poluição da água. É aqui que entra a UnifiedWater.
Um dispositivo barato e escalável que pode facilmente coletar e analisar esses dados, tão necessários para saber o quão poluído está um rio. A WaterAid vem em 2 modos, um que caberia em empresas e outro para indivíduos.
Vários dispositivos podem funcionar juntos, colocados em diferentes pontos de um riacho ou em diferentes corpos d'água. Esses dispositivos coletam dados em um intervalo de tempo enviando-os ao mesmo banco de dados. Isso permite que a empresa verifique o status do rio ou lago que está sendo monitorado com o clique de um botão.
Uma versão portátil do dispositivo também está disponível. Nesta versão, o indivíduo pode carregar o aparelho com ele e, quando deseja colher uma amostra de água, pressiona um botão do aparelho e o coloca na água por 30 segundos. Os dados estarão então disponíveis em um painel online.
Ao coletar a temperatura, o pH e a umidade da água, bem como a temperatura e a umidade atmosféricas, o WaterAid vem com todos os sensores de que você precisa para monitorar a poluição do rio.
Vídeo
Imagens
Funcionalidade
A WaterAid permite que o usuário, uma empresa ou um indivíduo colete dados com segurança e precisão e visualize todos esses dados em um só lugar, graças à nuvem da Soracom. O projeto é composto por um front end e um backend.
Frente Fim
O front end do projeto é o dispositivo físico usado para coletar os dados e enviá-los para a nuvem. O dispositivo pode ser configurado no modo 1 ou 2. No modo 1, o dispositivo registra um conjunto de dados com o toque de um botão, útil para o monitoramento ocasional de um corpo d'água. O Modo 2 configura o dispositivo para fazer leituras em um intervalo de tempo definido e enviar esses dados para a nuvem.
Um MKR GSM é usado para o front-end, pois é fácil de usar e confiável. Ele também pode acessar a Soracom por meio de GSM. Abaixo estão as etapas executadas pelo dispositivo ao coletar dados.
Bateria
O dispositivo pode ser alimentado de várias maneiras. Ele pode ser alimentado por uma bateria LiPo através da porta fornecida no dispositivo, por um banco de energia ou conectando uma bateria através da porta VIN no dispositivo.
A vida útil do dispositivo depende muito da energia da bateria. O dispositivo entra no modo de espera entre as leituras para conservar o máximo de energia possível.
LED Anel
O dispositivo também está equipado com um anel de LED. Isso fornece ao usuário um feedback sobre o que o dispositivo está fazendo no momento. Existem 3 modos em que o anel pode estar.
- Multicor indica que o dispositivo está configurando ou processando dados
- Vermelho intermitente um aviso, geralmente significando que o dispositivo deve ser colocado na água, embora também possa indicar um erro
- Azul progressivo ou verde indica que o dispositivo está atualmente colhendo uma amostra e deve ser colocado na água.
Coletando uma amostra
Todos os sensores do dispositivo devem ser colocados na água quando o dispositivo estiver colhendo uma amostra. Um atraso de 6 segundos é colocado antes que a amostra seja coletada para aquecer os sensores. Para melhores resultados, os sensores devem ser submersos durante o aquecimento.
Análise de dados
Os dados devem ser enviados à Soracom na forma de uma string JSON. Isso dá um valor a todas as chaves usadas. Os dados serão fáceis de interpretar pelo back-end. Abaixo está um exemplo de uma carga que seria enviada.
{
"Latitude":53.3474617,
"Longitude":- 6,2514529,
"waterpH":7,30,
"turvação da água":94,
"waterTemp":12,10,
"atmoTemp":14,50,
"atmoHum":82,
"deviceID":1,
"deviceName":"device1",
"época":1559392636,
"modo":2
}
O Back-end
O back-end do projeto se refere à Soracom. Os dados são coletados e visualizados no back-end dos painéis. Esses painéis são criados usando Soracom Lagoon.
O Painel
O painel resume todos os dados coletados do dispositivo. Ele representa os locais de onde os dados foram coletados em um mapa, a cor varia de acordo com o quão poluída a água está. Os dados são então representados em gráficos de linha abaixo deles e, em seguida, são totalmente somados em uma tabela.
O usuário também receberá alertas por e-mail caso o valor do pH ou turbidez da água estejam anormais. Abaixo estão algumas imagens do painel.
Escalabilidade
O dispositivo pode ser facilmente escalonável e todos os dados podem ser coletados e ilustrados no mesmo painel. Vários dispositivos podem transmitir dados para o Soracom e ter os dados visualizados no painel.
O preço do dispositivo e a extrema facilidade de construção e programação tornam mais fácil o uso de uma frota de dispositivos. Esses dispositivos também podem ser facilmente registrados na Soracom usando ferramentas como Soracom Krypton.
Cada empresa ou indivíduo terá seu painel personalizado onde serão visualizados os dados coletados por seus dispositivos. Esperançosamente, as pessoas poderão colaborar no mesmo painel e compartilhar seus dados umas com as outras em um futuro próximo.
Benefícios
O indivíduo ou empresa que utiliza este produto terá benefícios em:
- Custos de operação reduzidos, pois o dispositivo é muito autossuficiente.
- Facilmente escalonável, o dispositivo pode funcionar facilmente sozinho ou em uma frota de dezenas de outras pessoas.
- Coleta de dados rápida, permitindo que os dados sejam enviados para a nuvem e visualizados em tempo real.
- Fácil visualização, os dados podem ser visualizados em qualquer lugar e a qualquer momento usando o painel online.
Construindo o projeto
Etapa 1:Aparelho necessário
Este projeto requer muitos sensores que irão monitorar uma série de parâmetros relacionados à água e à atmosfera inseridos. Abaixo está uma lista de todos os materiais necessários.
- 1, Arduino MKR GSM
- 1, 16 LEDs RGB LED anel
- 1, módulo de temperatura e umidade GY-21
- 1, sensor de turbidez
- 1, sensor de temperatura à prova d'água
- 1, sensor de pH e módulo
- 1, botão de pressão
- 1, resistor (220Ω)
- Fios de jumpers
Etapa 2:Conectando o circuito
Os componentes devem ser soldados juntos. Para facilitar a compreensão dos esquemas, um breadboard foi usado. os esquemas estão abaixo.
Preparando o MKR GSM
Depois que os sensores forem soldados ao dispositivo, o cartão SIM, a antena GSM e a bateria devem ser conectados ao dispositivo. Estou alimentando a placa com 2 baterias AA através da porta VIN. As etapas estão abaixo.
Etapa 3:Reconhecendo o Código
Existem 4 seções principais para o código do projeto.
- Colete dados do sensor
- Obtenha a hora e a data
- Dados do processo
- Enviar dados
Todas essas seções são descritas e detalhadas a seguir.
Colete dados do sensor
Serial.println ("Obtendo Amostra");
Serial.println ("________________________________________");
Serial.println ("Obtendo Amostra");
Serial.println ("OK - Aquecendo");
atraso (6000); // atraso para calibração do sensor
colourLED (50);
Serial.println ("OK - Coletando Amostra");
Serial.print ("");
para (int i =0; i <16; i ++)
{
if (modo ==1)
{
strip.setPixelColor (i, strip.Color (0, 255, 0 ));
strip.show ();
}
else
{
strip.setPixelColor (i, strip.Color (0, 0, 255));
strip.show ();
}
// vai tirar várias amostras de água - sensores não tão precisos
waterTurbidity + =getWaterTurbidity ();
waterPh + =getWaterPh ();
if (i> 14)
{
// pegar uma única amostra para sensores de alta precisão
waterTemperature =getWaterTemp ();
atmoTemperature =getAtmoTemp ();
atmoHumidity =getAtmoHumidity ();
}
Serial.print (".");
atraso (500);
}
Serial .println ("");
Serial.println ("Sucesso - Amostras obtidas");
for (int i =0; i <=16; i ++)
{
strip.setPixelColor (i, strip.Color (0, 0, 0));
strip.show ();
delay (30);
}
Serial.println ("________________________________________");
Serial.println ("");
atraso (500);
A seção do código acima começa esperando 6 segundos para que os sensores sejam calibrados na água. O dispositivo então faz um loop por 16 vezes, um novo LED acende o anel a cada loop.
Os dados dos sensores com valores flutuantes são coletados 16 vezes e, em seguida, a média é encontrada. Os sensores de alta precisão são lidos no último loop.
Obter data e hora
void getCredentials ()
{
Serial.println ("[1/2] Hora");
Serial.println ("OK - Obtendo hora do RTC");
currentEpoch =processTime ();
colourLED (50);
Serial.println ("[2/2] Geolocalização");
Serial.println ("OK - Obtendo Geolocalização de GPRS ");
while (! GetLocation ());
Serial.print (" Sucesso - Geolocalização é "); Serial.print (latitude, 7); Serial.print (","); Serial.println (longitude, 7);
colourLED (50);
}
bool getLocation ()
{
if (location.available ( ))
{
latitude =location.latitude ();
longitude =location.longitude ();
atraso (500);
retornar verdadeiro;
}
else
{
atraso (500);
retornar falso;
}
}
O primeiro loop lida com as credenciais. A hora é extraída do RTC integrado, pois foi sincronizada com a rede GSM na configuração. A geolocalização é extraída do GPRS.
Processar Dados
void processData ()
{
Serial.println ("OK - Como obter a média de pH e turbidez da água");
waterPh =(waterPh / 16);
waterTurbidity =(waterTurbidity / 16);
Serial.println ("OK - Dumping Data to Serial");
Serial.println ("");
Serial.print ("[ Água] pH "); Serial.println (waterPh);
Serial.print ("[Água] Turbidez"); Serial.println (turvação da água);
Serial.print ("Temperatura [da água]"); Serial.println (waterTemperature);
Serial.print ("[Atmo] Temperature"); Serial.println (atmoTemperature);
Serial.print ("[Atmo] Umidade"); Serial.println (atmoHumidity);
Serial.println ("");
Serial.println ("Success - Data Processed");
colourLED (50);
}
String makeLine ()
{
Serial.println ("OK - Fazendo String");
String dataReturned; dataReturned + ="{"; dataReturned + ="\ n";
dataReturned + ="\" Latitude \ ":" + String (latitude, 7); dataReturned + =", \ n";
dataReturned + ="\" Longitude \ ":" + String (longitude, 7); dataReturned + =", \ n";
dataReturned + ="\" waterpH \ ":" + String (waterPh); dataReturned + =", \ n";
dataReturned + ="\" waterTurbidity \ ":" + String (waterTurbidity); dataReturned + =", \ n";
dataReturned + ="\" waterTemp \ ":" + String (waterTemperature); dataReturned + =", \ n";
dataReturned + ="\" atmoTemp \ ":" + String (atmoTemperature); dataReturned + =", \ n";
dataReturned + ="\" atmoHum \ ":" + String (atmoHumidity); dataReturned + =", \ n";
dataReturned + ="\" deviceID \ ":" + String (deviceID); dataReturned + =", \ n";
dataReturned + ="\" deviceName \ ":"; dataReturned + =String ("\" "); dataReturned + =String (deviceName); dataReturned + =String (" \ ""); dataReturned + =", \ n";
dataReturned + ="\" epoch \ ":" + String (currentEpoch); dataReturned + =", \ n";
dataReturned + ="\" modo \ ":" + String (modo); dataReturned + ="\ n";
dataReturned + ="}";
Serial.println ("OK - os dados estão abaixo");
Serial.println ("");
Serial.println (dataReturned);
Serial.println ("");
Serial.println ("Sucesso - String está pronta");
colourLED (50);
return dataReturned;
}
processData ()
obtém a média dos dados coletados dos sensores que tendem a flutuar e, em seguida, despeja todos os dados no Monitor Serial. makeLine ()
compila todos os dados na string JSON que é enviada à Soracom. Todos os valores são analisados em um buffer JSON pronto para serem enviados ao back-end. Enviar dados
void parseData (String dataToSend)
{
Serial.println ("OK - Configurando Conexão");
if (client.connect (url, 80))
{
Serial.println ("OK - Conexão estabelecida, análise de dados");
client.println ("POST / HTTP / 1.1");
client.println ("Host :harvest.soracom.io ");
client.println (" User-Agent:Arduino / 1.0 ");
client.println (" Connection:close ");
client.print ("Content-Length:");
client.println (dataToSend.length ());
client.println ("");
client.println (dataToSend);
Serial.println ("OK - Data Parsed");
}
Serial.println ("OK - Obtendo resposta");
Serial.println ("");
while (1)
{
if (client.available ())
{
char c =client.read ();
Serial.print (c);
}
if (! client.connected ())
{
break;
}
}
Serial.println ("Sucesso - Os dados são analisados ");
}
Por fim, os dados são enviados para a Soracom. O dispositivo estabeleceu uma conexão com o servidor e, em seguida, prepara as credenciais. Os dados são então enviados ao servidor e a resposta é impressa no Monitor Serial.
O dispositivo então entra em hibernação até que um gatilho o acorde, repetindo as etapas novamente.
Etapa 4:Configuração das variáveis
Existem certas variáveis que devem ser editadas antes que o projeto possa ser usado. Eles estão listados abaixo. As instruções sobre como configurá-los também estão abaixo.
-
modo
o modo do dispositivo dita se ele tira amostras periodicamente ou se tira amostras com a ação de um botão. Se esta variável for definida como 1, o dispositivo precisará ser acionado por meio de um botão. Se o modo for definido como 2, o dispositivo fará amostras periodicamente. -
deviceID e deviceName
essas são variáveis personalizadas que são usadas para identificar o dispositivo se um conjunto de dispositivos estiver sendo usado. Cada dispositivo usado deve receber um ID e nome exclusivos para que possam ser facilmente identificados. -
sleepTime
armazena a quantidade de tempo que o dispositivo dorme entre as leituras, é definido como 5 segundos no código que é apropriado para teste, mas deve ser alterado ao usá-lo em campo. Uma amostra pode ser coletada em intervalos de 15 minutos. -
proDebug
é usado durante a depuração, é definido como falso no código, mas se o monitor serial for necessário durante a depuração, ele deve ser definido como verdadeiro. Observe que o dispositivo ainda imprimirá para o serial, mesmo se a depuração estiver desativada. Se a depuração estiver ativada, o dispositivo não será executado a menos que o monitor serial esteja ativado.
Etapa 5:Upload do código
Antes de configurar o back-end, os dados devem ser enviados a ele.
Para fazer isso, conecte seu MKR GSM ao computador e carregue o código para o dispositivo, certifique-se de que o modo do dispositivo está definido como 1 para esta configuração. Após o upload do código, coloque todos os sensores na água.
Agora pressione o botão no dispositivo e aguarde os dados serem coletados e enviados. Repita algumas vezes para preencher o Soracom Air.
Etapa 6:Configurando Soracom
This step is split into 2 sections, the first will cover creating an account with Soracom and registering your SIM while the other will cover setting up Soracom Harvest to collect the data from Air. If you already have an account with Soracom, skip the first section.
Section 1:Creating an Account
Section 2:Groupsand Harvest
Step 7:Setting Up Lagoon
The last thing to set up on Soracom is Lagoon, this is the tool that we will use to visualise our data and create email alerts if the data is not good. Follow the steps below.
Calibration Problems
The turbidity and pH sensors have to be calibrated to be used precisely, you might find that when running the code, the turbidity might by 105% or the pH of water 3. In this case, the sensors have to be calibrated. A quick guide into calibrating them is below.
- pH Sensor The pH sensor can be calibrated using the potentiometers on the module, place the probe in still bottled water of pH 7 and wait for 5 minutes, now develop a code that prints the pH from the sensor to the serial monitor. Twist the potentiometer until the pH is 7.
- Turbidity Sensor The turbidity sensor is not very precise and so a relative percentage, compared to pure water is taken. To refine the value of pure water, if your readings exceed 100% turbidity, you will need to place the turbidity sensor in pure water and develop a code that prints the voltage on the analog pin of the pH sensor to the serial monitor. A variable named
calibration
is found insensors.h
, change the value of that variable to the voltage received when the probe was placed in pure water.
Libraries
- ArduinoLowPower (c) 2016 Arduino LLC GNU Lesser General Public Licence this library is in the public domain
- Adafruit_Neopixel (c) Phil Burges Lesser General Public Licence this library is in the public domain
- MKRGSM (c) 2016 Arduino AG GNU Lesser General Public Licence this library is in the public domain
- Wire (c) 2006 Nicholas Zambetti GNU Lesser General Public Licence this library is in the public domain
- OneWire (c) 2007 Jim Studt GNU General Public Licence this library is in the public domain
- DallasTemperature GNU General Public Licence this library is in the public domain
- RTCZero (c) 2015 Arduino LLC GNU Lesser General Public Licence this library is in the public domain
Final
Finally, I got an enclosure done for the project that could be easily portable but be fixed to collect samples both in mode 1 and 2. Steps are below.
Finally, ensure that the mode is set accordingly and start using the device on the field. Check out your local river or lake and see how clean it is. Play around with the dashboard and see what other widgets it has.
Background
Today, data is the new currency and collecting it easily and efficiently is key to a better environment. By measuring the pollution of rivers and lakes collectively, we can raise awareness that the waters are getting dirtier and something has to be done.
I was thinking of an idea for the Soracom contest and I felt like I had to make something beneficial for the environment, the idea of people and companies working together on collective dashboards to visualise the status of rivers and lakes globally inspired me to take this project on.
What will you do to stop water pollution? Because action has to be taken today, and tomorrow is a day too late.
Código
Código
The repo for the projecthttps://github.com/Andrei-Florian/UnifiedWater-v1Esquemas
schematics_e7TRP6KJKI.fzzProcesso de manufatura
- O que é um sensor de O2?
- Sensor de movimento usando Raspberry Pi
- Sensor de umidade do solo Raspberry Pi
- Teste o sensor DS18B20
- Sensor de temperatura Raspberry Pi
- Telemetria do Sensor 2.0.1
- Sensor de emoção / EEG
- Windows 10 IoT Core no Raspberry Pi 2 - Dados do sensor Adafruit
- MyRiver
- Arduino Cloud Sensor Tower