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

MyRiver

Componentes e suprimentos

Arduino MKR1000
× 1
Sensor de nível de água
× 1
Sensor Ph
× 1
LED (genérico)
Branco, se possível
× 1
Resistor 221 ohm
× 2
Resistor de foto
× 1
Fios de jumpers (genérico)
× 1

Ferramentas e máquinas necessárias

Ferro de soldar (genérico)
Hacksaw

Aplicativos e serviços online

Arduino Web Editor
Sigfox
Wia

Sobre este projeto





Visão geral


Um rio ou lago pode ser uma grande fonte de diversão e relaxamento. Mas se o rio ficar sujo e contaminado, toda a diversão vai embora. Muitas pessoas dependem da água do rio para alimentar o gado e não têm dinheiro para dar água suja aos animais.

Imagine morar bem próximo a um rio (se não morar), você não gostaria de acordar no meio da noite com sua casa inundada por causa do rio. Ou, se o seu vizinho decidir despejar um pouco de gasolina no rio, você não gostaria que seus animais adoecessem.

O MyRiver resolve todos esses problemas, pode operar em áreas isoladas graças ao Sigfox para que todos tenham acesso ao dispositivo. O dispositivo irá ler o pH da água, seu nível de poluição usando um método inovador e seu nível de água. Você poderá monitorar o rio ao vivo em seu telefone ou computador em qualquer lugar graças ao Wia. Desta forma, você pode saber se há um problema com o stream e permite que você aja antes que seja tarde demais. Irá notificá-lo imediatamente se houver um problema com o rio.

Vídeo

Imagem





Funcionalidade


O dispositivo é baseado no Arduino MKR FOX, ele é projetado para uso remoto, o usuário pode colocar o dispositivo em um rio ou lago e monitorá-lo de qualquer lugar. Graças ao modo de baixa energia do SAM D, o dispositivo pode funcionar por um longo período de tempo com baterias 2AA.

O aparelho faz leituras a cada 30 minutos, entrando em hibernação em seguida, o período de hibernação pode ser zerado, embora o tempo mínimo de hibernação deva ser de 20 minutos.

O MKR FOX lê o pH do rio usando um sensor de pH, ele também obtém seu nível de água, usando um sensor de nível de água, e detecta se está poluído por substâncias insolúveis ao acender um LED em um fotorresistor, se a leitura do fotorresistor é baixo, significa que uma substância sólida (óleo, gasolina, mercúrio, etc.) está presente no rio. O dispositivo então envia todos os dados para o Sigfox, onde são retransmitidos para o Wia, processados ​​e visualizados. O usuário é notificado sobre o estado do rio. Abaixo está uma imagem da visão geral da funcionalidade.

O buffer será enviado ao Sigfox codificado como HEX, o Sigfox retransmitirá os dados para o Wia, os dados passarão por um fluxo, os dados serão convertidos de volta para string e, em seguida, para os valores do sensor. Eles serão então processados ​​e o usuário será notificado se os valores estiverem fora dos limites.

Abaixo está outra imagem que ilustra a visão geral do código do projeto, descrita abaixo.
  • Sensores de leitura irá ler o pH, nível de água e valores do sensor fotorresistor e armazená-los em variáveis.
  • Buffer de formato irá mesclar todos os valores em um buffer de 12 bytes que pode ser enviado ao Sigfox.
  • Analisar dados irá analisar o buffer para Sigfox.

O MKR FOX só pode enviar 12 bytes através do Sigfox, isso significa que todos os valores do sensor devem ser combinados nos 12 bytes, o valor bruto máximo de cada sensor é 1024 (já que são todos analógicos), então cada sensor representa um terço do buffer (4 bytes). O Arduino deve mesclar os valores e adicionar zeros ao início de cada valor até que o valor tenha 4 bytes. A imagem abaixo ilustra esse processo.

O Arduino recebe os valores do sensor como inteiros, ele então converte os inteiros em strings e adiciona zeros ao início de cada valor até que tenha 4 bytes, por exemplo, se o valor do fotorresistor for 620, um zero será adicionado, 0 620. Mas se o sensor de nível de água for igual a 24, dois zeros são adicionados, 00 24. O dispositivo então mescla os valores em um buffer de 12 bytes e envia os dados para o SigFox.





O dispositivo em ação


Abaixo estão algumas fotos mostrando as funcionalidades do projeto, para uma melhor visualização das mesmas, consulte o vídeo acima.





Benefícios


O usuário operando isto projeto irá benefício em:
  • Monitorando facilmente o nível de água, ph e nível de poluição de um rio de qualquer lugar a qualquer hora
  • Receber uma notificação se o rio estiver poluído por substâncias solúveis ou insolúveis ou se estiver inundando
  • Facilidade de uso e montagem
  • Funciona em qualquer país coberto pelo Sigfox





Construindo o projeto


Etapa 1:Aparelho necessário

Este projeto requer que todos os componentes sejam soldados juntos, não há muitas coisas além dos sensores. A lista de materiais está indicada abaixo.
  • 1, Arduino MKR FOX 1200
  • 1, sensor de pH
  • 1, sensor de nível de água
  • 1, fotorresistor
  • 1, LED branco
  • 2, resistores (220Ω)
  • Fios de jumpers

Etapa 2:Conectando o circuito

O diagrama de circuito do projeto pode ser um pouco confuso, pois os componentes não são colocados em uma placa de ensaio, se você tiver alguma dificuldade com isso, tente baixar o arquivo Fritzing abaixo e mover os fios em seu computador.
  • Visão geral do circuito

As imagens abaixo ilustram como o circuito deve ficar quando concluído.
  • Preparando o MKR FOX

As imagens abaixo irão guiá-lo através da conexão da caixa da bateria e da antena ao MKR FOX. Observe que a caixa da bateria deve ser conectada após os sensores serem conectados. Outra fiação e configuração podem ser encontradas em construção do projeto / Final.

Etapa 3:Reconhecendo o Código

Existem 3 partes principais no código:
  • Ler sensores
  • Buffer de formato
  • Analisar dados

Essas seções são explicadas a seguir.
  • Ler sensores
  struct GetValue // Estruturas criadas para facilitar os loops {int riverLevel () // obtém o nível do rio {const int val =analogRead (A2); if (proDebug) {Serial.print ("Nível do rio"); Serial.println (val); } return val; } int riverPh () // obtém o ph do rio {const int val =(analogRead (A1) / 5 * 3.3); if (proDebug) {Serial.print ("River Ph"); Serial.println (val); } return val; } int riverPol () // obtém o nível de poluição do rio {const int val =analogRead (A3); if (proDebug) {Serial.print ("Poluição do Rio"); Serial.println (val); } return val; }};  

A estrutura acima contém loops que lêem cada valor do sensor, há um loop separado para cada valor.
  • Formatar buffer
  String de dados (int nível, int ph, int pol) // mescla os valores do sensor no buffer {int values ​​[3] ={level, ph, pol}; String newValues; for (int i =0; i <3; i ++) // percorrerá todos os valores, adicionando 0s ao início {if (values ​​[i] <10) {newValues ​​+ ="000"; Serial.println ("Opção 1"); } else if (valores [i] <100) {newValues ​​+ ="00"; Serial.println ("Opção 2"); } else if (values ​​[i] <1000) {newValues ​​+ ="0"; Serial.println ("Opção 3"); } senão {}; novosValores + =valores [i]; Serial.print ("Executar"); Serial.print (i); Serial.print ("/ 3"); Serial.println (newValues); } return newValues; }  

O loop acima capta os 3 valores do sensor e os coloca em uma matriz. Em seguida, ele faz um loop por cada valor, adicionando zeros ao início de cada valor até que o valor tenha 4 bytes de tamanho; em seguida, adiciona cada valor a uma string que é então retornada.
  • Analisar dados
  void parseData (String data) // enviar buffer para SigFox {SigFox.beginPacket (); SigFox.print (dados); ret int =SigFox.endPacket (); }  

Esta seção recebe a string para analisar e, em seguida, envia o valor para Sigfox.

Etapa 4:Configurando a integração Wia Sigfox

Esta etapa ilustrará como configurar o Wia para receber mensagens do Sigfox, Wia é uma plataforma IoT profissional que permite ao usuário visualizar dados usando widgets na web ou no aplicativo móvel, também permite ao usuário criar um código de bloco chamado um fluxo, que permite ao usuário processar os dados. Os dados são representados por um evento.

Para começar, certifique-se de ter uma conta Sigfox e uma conta Wia. Baixe também o aplicativo Wia no iOS ou Android para permitir que você receba notificações. As imagens abaixo ilustram a conexão entre Sigfox e Wia.
  • Defina o Tipo para Uplink de dados
  • Defina o canal para URL
  • Não há necessidade de preencher a Configuração de carga útil personalizada
  • Defina o URL Padrão para "https://api.wia.io/v1/events"
  • Defina o HTTPMethod para POST
  • Crie um cabeçalho chamado Authorization com o valor Bearer (este valor será editado mais tarde)
  • Defina ContentType para application / json
  • Copie o código deste link no corpo do webhook.
  • Por fim, clique em OK e pronto.

Etapa 5:Configurando o fluxo Wia

Esta seção levará um pouco mais de tempo para ser concluída, o fluxo irá converter os dados recebidos de HEX em String, irá então analisar a string nos 3 valores do sensor e então convertê-los em inteiros, irá então converter o valor da poluição do rio e nível do rio para um descritor Alto ou Ok e o valor de ph bruto para o valor de ph real, ele então notificará o usuário se o valor estiver fora dos limites.

O guia a seguir ilustrará esse processo passo a passo. Você será instruído a inserir certos trechos de código nas Funções Wia, esses trechos de código são inseridos abaixo, basta copiar e colar o código na função. Os dados a incluir nos emails também estão inseridos abaixo, trabalhe com eles como com as funções.

Funções Wia
  • processPayload
  if (input.body) {output.body.name ="valor"; output.body.data =toByteArrayStr (input.body.data.sigfoxData);} função toByteArrayStr (sigfoxData) {let result =Buffer (sigfoxData, 'hex'); retornar result.toString ('utf8');}  
  • processPollution
  if (input.body.data) {let data =input.body.data; if (dados =="POLLUTED") {output.body.name ="waterLevel"; output.body.data =data; } else {while (1); }}  
  • processPh
  let minVal =6.5; let maxVal =8.5; if (input.body.data) {let data =input.body.data; if (dados> maxVal || dados  
  • processLevel
  if (input.body.data) {let data =input.body.data; if (data =="HIGH") {output.body.name ="waterLevel"; output.body.data =data; } else {while (1); }}  
  • riverPollution
  let minVal =200; let maxVal =0; if (input.body.data.sigfoxData) {let data =input.body.data.sigfoxData; deixe processadoData =toByteArrayStr (dados); deixe newData =cutString (processingData); output.body.name ="waterPollution"; output.body.data =processData (newData);} função toByteArrayStr (sigfoxData) {let result =Buffer (sigfoxData, 'hex'); return result.toString ('utf8');} função cutString (data) {let newVal =data [8]; newVal + =dados [9]; newVal + =dados [10]; newVal + =dados [11]; deixe finalVal =parseInt (newVal); retorna finalVal;} função processData (dados) {if (dados  
  • riverPh
  let minVal =300; let maxVal =600; if (input.body.data.sigfoxData) {let data =input.body.data.sigfoxData; deixe processadoData =toByteArrayStr (dados); deixe newData =cutString (processingData); deixe finalVal =(newData / 73,1428571); deixe valueToSend =finalVal.toFixed (2); output.body.name ="waterPh"; output.body.data =valueToSend;} função toByteArrayStr (sigfoxData) {let result =Buffer (sigfoxData, 'hex'); return result.toString ('utf8');} função cutString (data) {let newVal =data [4]; newVal + =dados [5]; newVal + =dados [6]; newVal + =dados [7]; deixe finalVal =parseInt (newVal); return newVal;}  
  • riverLevel
  let minVal =0; let maxVal =200; if (input.body.data.sigfoxData) {let data =input.body.data.sigfoxData; deixe processadoData =toByteArrayStr (dados); deixe newData =cutString (processingData); output.body.name ="waterLevel"; output.body.data =processData (newData);} função cutString (data) {let newVal =data [0]; newVal + =dados [1]; newVal + =dados [2]; newVal + =dados [3]; deixe finalVal =parseInt (newVal); return finalVal;} função toByteArrayStr (sigfoxData) {let result =Buffer (sigfoxData, 'hex'); return result.toString ('utf8');} função processData (data) {if (data> maxVal) {return "HIGH"; } else {return "OK"; }}  

Emails Wia
  • riverPollutionEmail
  Automatic Messaging SystemDataWarning - o dispositivo myWater $ {trigger.source.device.id} detectou um problema no stream.Warning - A água está poluída por substâncias insolúveis.InformationDevice $ {trigger.source.device.id} Raw Dados $ {input.body.data}  
  • riverPhEmail
  Aviso de dados do sistema de mensagens automáticas - o dispositivo myWater $ {trigger.source.device.id} detectou um problema no fluxo. Aviso - Ph da água não é apropriado. A água está contaminada.InformationDevice $ {trigger.source.device.id} Dados brutos $ {input.body.data}  
  • riverLevelEmail
  Automatic Messaging SystemDataWarning - o dispositivo myWater $ {trigger.source.device.id} detectou um problema no riacho.Warning - O nível da água está muito alto, o rio pode estar inundando.InformationDevice $ {trigger.source.device .id} Dados brutos $ {input.body.data}  

Configurando as Variáveis ​​

Quando os dados são recebidos pelo Wia, eles devem ser processados, se os dados estiverem entre um valor mínimo e máximo, o valor é seguro, os limites do sensor de pH e nível de água foram definidos, mas o usuário deve definir manualmente o fotorresistor limite, um teste deve ser feito para determinar esse valor, as etapas abaixo irão instruí-lo sobre como fazer isso.
  void setup () {pinMode (1, OUTPUT); Serial.begin (9600); while (! Serial) {}; digitalWrite (1, HIGH);} void loop () {const int val =analogRead (A3); Serial.println (val); atraso (5000);}  

Há outra variável que o usuário deve definir, proDebug , se estiver habilitado, o Arduino requer conexão via USB a um computador e o Serial Monitor deve estar aberto, o Arduino imprime no Serial Monitor neste modo, é ideal para solução de problemas. O padrão do proDebug é false para operar no campo.

Bibliotecas
  • Sigfox - copyright (c) 2016 Arduino LLC GNU Lesser General Public License esta biblioteca é de domínio público
  • ArduinoLowPower (c) 2016 Arduino LLC GNU Lesser General Public License esta biblioteca é de domínio público

Final

A última etapa é conectar seu Arduino a um PC / Mac e fazer o upload do sketch, certifique-se de que a caixa da bateria está conectada ao Arduino e o circuito está ok. As próximas etapas irão guiá-lo por fazer um gabinete para o projeto.

Decidi fazer o meu invólucro a partir de uma garrafa d'água, acho que é uma forma ótima e ecológica de abraçar o projeto. O aparelho se parece com a foto abaixo.

Se gostou da ideia do gabinete, você pode percorrer as imagens abaixo, ilustrando como foi feito o gabinete, fique à vontade para fazer você mesmo.

The last thing to do is place the device in the river. To do this, go to the river you wish to implement MyRiver on during High Tide , this is essential to ensure that the device is not alerting that the river is flooding when it is actually just the tide.

Place some tape on the top of the water bottle to prevent water from seeping into the bottle and destroying everything.

We went to a local, dirty river to test the project out, all the alarms went off correctly.

When placing the probe in the water, ensure that the water is at the bottom of the water level sensor but is covering the photoresistor entirely. Secure the project to the shore using tape or a hammer and screws, and it should look like this (or better).





Antecedentes


Relaxing in your house, looking out the window at the once beautiful and delightful river rushing in front of you. But instead of the beautiful fresh river, you see a green slimy one, you might want to move house in that case.

And if the river decides to flood into your house in the middle of the night while you are sleeping, you will certainly decide to move.

I thought of these problems and how to solve them all in one device, and I came up with MyRiver.

If you are in the city and living beside a river, it will warn you in time if the river decides to ruin your day in any way or if your neighbour is dumping oil in the river. Or if you are on a farm, MyRiver will warn you that the river is dirty before you give the water to your animals, and will give you time to bring the animals in before the river floods.

But just reading the pH of the river was not enough, as insoluble substances like mercury or other metals do not effect the Ph of the water. So we came up with a new method to detect those substances, unique to this project, a photoresistor reading the amount of light from an LED penetrating the water. This way any water impurity can be detected.


Código

MyRiver
The Full Code

Esquemas

schematics_lXO5SiusZO.fzz

Processo de manufatura

  1. O que é um sensor de O2?
  2. Sensor de temperatura Raspberry Pi
  3. Sensor de emoção / EEG
  4. Dispositivo de medição de pressão de fluxo de ar com sensor analógico
  5. Sensor DHT11 com LEDs e um alto-falante Piezo
  6. UnifiedWater v1
  7. 3D RGB Arduclock
  8. Sensor de obstáculo simples com Arduino
  9. Joystick Game
  10. Encontre-me