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 Ambiental do Arduino

Componentes e suprimentos

Arduino MKR1000
× 1
MikroE Environment click
× 1

Ferramentas e máquinas necessárias

Cabos de ligação fêmea / fêmea Adafruit

Aplicativos e serviços online

Arduino IDE
WolkAbout IoT Platform

Sobre este projeto





Introdução


Tínhamos alguns sensores de clique de ambiente à mão, então decidimos conectá-los ao Arduino MKR1000 e visualizá-los na plataforma WolkAbout IoT. A ideia era fazer uma medição a cada minuto e publicar os resultados uma vez a cada 15 minutos. Se a publicação das leituras do sensor falhar (devido a uma rede ocupada ou algum outro problema), os resultados devem ser mantidos na memória Flash do dispositivo. Com um potencial máximo de 96 gravações por dia, minimizamos as chances de colocar a memória Flash em um estado errado (o Arduino garante 10.000 ciclos de gravação).





Configuração de hardware


O sensor de clique do ambiente é conectado aos pinos de comunicação I2C (ou seja, 11 e 12 no MKR1000), Vcc e aterramento.





Configuração de software


Usamos algumas bibliotecas para tornar este projeto possível, todas as quais podem ser instaladas a partir do gerenciador de biblioteca do IDE do Arduino ou baixando arquivos .zip dos repositórios GitHub listados nos anexos e, em seguida, adicionando-os ao IDE do Arduino. As bibliotecas necessárias são:
  • WiFi101
  • Driver de sensor unificado Adafruit
  • Biblioteca Adafruit BME680
  • RTCZero
  • FlashStorage
  • WolkConnect

Assim que todas as bibliotecas necessárias estiverem instaladas, vá em frente e copie o conteúdo de Monitoramento de ambiente esboço dos anexos no IDE do Arduino.

Ele implementa uma estrutura de buffer circular e a usa para armazenar os resultados da medição. Também há uma implementação de como armazenar essa estrutura na memória Flash usando a biblioteca FlashStorage. A leitura cronometrada e a publicação dos dados são realizadas usando a biblioteca RTCZero. Inicialmente, depois de conectar-se ao WiFi, enviamos um ping para WolkAbout IoT Platform para obter a época atual que será alimentada na biblioteca RTC para que as leituras do sensor possam ser devidamente registradas no tempo.

Uma interrupção de alarme muda os sinalizadores para tarefas que precisam ser feitas (ler e publicar) e o resto do trabalho é tratado na função de loop. Aqui verificamos se precisamos ler ou publicar. Para um consumo mínimo de energia, o WiFi está configurado para estar em um modo de baixo consumo de energia, assim como o MKR1000. O sensor no clique de ambiente vai para baixo consumo de energia automaticamente até que uma leitura seja solicitada.

As alterações que devem ser feitas no esboço incluem a inserção de credenciais de WiFi nas linhas 33 e 34:
  const char * ssid ="<* YOUR SSID *>"; 
const char * wifi_pass ="<* YOUR WIFI PASSWORD *>";

bem como inserir as credenciais do dispositivo da plataforma WolkAbout IoT.

Para obter essas credenciais, você precisa primeiro criar um dispositivo usando um tipo de dispositivo.

O tipo de dispositivo para este projeto, Environment click-deviceType.json, está disponível nos anexos do projeto, portanto, crie uma cópia dele. Faça login ou crie sua conta na WolkAbout IoT Platform e abra o Dispositivo Gestão aplicativo.

Selecione o Dispositivo Tipo Gestão guia e pressione + assine e selecione Upload opção, navegando para sua cópia local do tipo de dispositivo.

Agora que um tipo de dispositivo está disponível, você pode criar um dispositivo a partir dele clicando em Criar dispositivo .

Aqui, você precisa dar um nome ao seu dispositivo, definir o Tipo de conectividade para MQTT e marque a caixa de seleção para Criar padrão Semântica (necessário para criar widgets em seu painel posteriormente).

Pressione Salvar e o formulário com as credenciais do dispositivo será exibido. Armazene essas informações como quiser e, em seguida, insira-as em seu esboço no Arduino IDE:
  const char * device_key ="device_key"; 
const char * device_password ="device_password";

Agora você pode ir em frente, verificar e enviar este esboço para o seu quadro, mas ainda precisa criar uma maneira de exibir os dados do sensor recebidos.

Para exibir esses dados, mude para Visualização e monitoramento seção WolkAbout IoT Platform e crie um novo painel pressionando + Adicionar painel e inserir um nome para o painel e definir o escopo para qualquer que seja o nome do dispositivo. Então você pode começar a adicionar widgets ao seu painel pressionando Adicionar widget.

Selecione Tendências

e selecione Temperatura do seu dispositivo.

Repita o processo para Pressão e Umidade . Crie outro widget do tipo Leitura, selecione Altitude e criar outro widget de cartão para Gás Resistência . Você pode reorganizar os widgets como quiser.

Depois de adicionar widgets para toda a leitura individual do sensor que você espera receber do seu dispositivo, o painel a seguir estará pronto para receber os dados do seu dispositivo.

Portanto, vá em frente e implante o dispositivo no ambiente que você escolheu e monitore as condições remotamente.





Conclusão


Ao conectar o Arduino MKR1000 e o Environment Click à plataforma WolkAbout IoT, você criou uma maneira com eficiência energética de relatar as condições ambientais do local que deseja monitorar remotamente. Esta solução pode ser estendida por meio do uso do mecanismo de regras da WolkAbout IoT Platform, que permite receber diferentes tipos de notificações se um determinado valor ultrapassar um limite definido.

Para obter mais informações sobre o mecanismo de regras e outros recursos da plataforma WolkAbout IoT, você pode visitar nossa página de Guias do usuário.

Código

  • Esboço de monitoramento do ambiente
  • Ambiente click-deviceType.json
Esboço de monitoramento do ambiente Arduino
Importe este esboço para o IDE do Arduino e edite as credenciais de WiFi e as credenciais do dispositivo
 #include  #include  #include  #include  #include  #include  #include  #include "WolkConn.h" #include "MQTTClient.h" / * Número de outbound_message_t para armazenar * / # define STORAGE_SIZE 32 # define SEALEVELPRESSURE_HPA (1013.25) / * Buffer circular para armazenar mensagens de saída para persistir * / typedef struct {boolean valid; outbound_message_t outbound_messages [STORAGE_SIZE]; cabeça uint32_t; uint32_t tail; booleano vazio; boolean full;} Mensagens; dados de mensagens estáticas; / * Detalhes de conexão * / const char * ssid ="ssid"; const char * wifi_pass ="wifi_pass"; const char * device_key ="device_key"; const char * device_password ="device_password "; const char * hostname =" api-demo.wolkabout.com "; int portno =1883; WiFiClient espClient; PubSubClient client (espClient); / * WolkConnect-Arduino Connector context * / static wolk_ctx_t wolk; / * Init flash storage * / FlashStorage (flash_store, Messages); / * Comunicação do sensor Init i2c * / Adafruit_BME680 bme; RTCZero rtc; bool read; / * Ler o sensor a cada minuto. Se você alterar este parâmetro, certifique-se de que ele seja <60 * / const byte readEvery =1; bool publish; / * Publique a cada 10 minutos. Se você alterar este parâmetro, certifique-se de que é <60 * / const byte publishEvery =10; byte publishMin; / * Armazenamento Flash e implementação de persistência personalizada * / void _flash_store () {data.valid =true; flash_store.write (data);} void boost_pointer (uint32_t * ponteiro) {if ((* ponteiro) ==(STORAGE_SIZE - 1)) {(* ponteiro) =0; } else {(* ponteiro) ++; }} void _init () {data =flash_store.read (); if (data.valid ==false) {data.head =0; data.tail =0; data.empty =true; data.full =false; }} bool _push (outbound_message_t * outbound_message) {if (data.full) {boost_pointer (&data.head); } memcpy (&data.outbound_messages [data.tail], outbound_message, sizeof (outbound_message_t)); aumentar_pointer (&data.tail); data.empty =false; data.full =(data.tail ==data.head); return true;} bool _peek (outbound_message_t * outbound_message) {memcpy (outbound_message, &data.outbound_messages [data.head], sizeof (outbound_message_t)); return true;} bool _pop (outbound_message_t * outbound_message) {memcpy (outbound_message, &data.outbound_messages [data.head], sizeof (outbound_message_t)); aumentar_pointer (&data.head); data.full =false; data.empty =(data.tail ==data.head); return true;} bool _is_empty () {return data.empty;} void init_wifi () {if (WiFi.status ()! =WL_CONNECTED) {while (WiFi.begin (ssid, wifi_pass)! =WL_CONNECTED) {delay (1000 ); }}} void setup_wifi () {delay (10); if (WiFi.status ()! =WL_CONNECTED) {int numAttempts =0; while (WiFi.begin (ssid, wifi_pass)! =WL_CONNECTED) {numAttempts ++; if (numAttempts ==10) {Serial.println ("Não foi possível acessar o WiFi!"); pausa; } atraso (1000); }}} void setup () {pinMode (LED_BUILTIN, OUTPUT); digitalWrite (LED_BUILTIN, LOW); / * Inicializa a estrutura circular do buffer * / _init (); init_wifi (); wolk_init (&wolk, NULL, NULL, NULL, NULL, device_key, device_password, &client, hostname, portno, PROTOCOL_JSON_SINGLE, NULL, NULL); wolk_init_custom_persistence (&wolk, _push, _peek, _pop, _is_empty); / * O LED integrado acenderá se algo der errado * / if (! Bme.begin ()) {digitalWrite (LED_BUILTIN, HIGH); } / * Sensor init * / bme.setTemperatureOversampling (BME680_OS_8X); bme.setHumidityOversampling (BME680_OS_2X); bme.setPressureOversampling (BME680_OS_4X); bme.setIIRFilterSize (BME680_FILTER_SIZE_3); bme.setGasHeater (320, 150); // 320 * C para atraso de 150 ms (200); ler =verdadeiro; publicar =verdadeiro; / * Obtém a época atual do servidor * / wolk_connect (&wolk); atraso (100); wolk_update_epoch (&wolk); while (! (wolk.pong_received)) {wolk_process (&wolk); digitalWrite (LED_BUILTIN, HIGH); atraso (1000); } digitalWrite (LED_BUILTIN, LOW); wolk_disconnect (&wolk); rtc.begin (); rtc.setEpoch (wolk.epoch_time); rtc.setAlarmTime (rtc.getHours (), (rtc.getMinutes () + readEvery)% 60, rtc.getSeconds ()); rtc.enableAlarm (rtc.MATCH_MMSS); rtc.attachInterrupt (alarmMatch); publishMin =(rtc.getMinutes () + publishEvery)% 60; WiFi.lowPowerMode ();} void loop () {/ * A fim de manter a rotina de interrupção o mais curta possível, a rotina apenas define as tarefas a serem feitas read =true significa que a leitura do sensor deve ser feita publish =true significa que o as leituras devem ser publicadas na plataforma ou persistidas no flash se a conexão não estiver disponível * / if (read) {read =false; if (! bme.performReading ()) {digitalWrite (LED_BUILTIN, HIGH); } wolk_add_numeric_sensor_reading (&wolk, "T", bme.temperature, rtc.getEpoch ()); wolk_add_numeric_sensor_reading (&wolk, "H", bme.humidity, rtc.getEpoch ()); wolk_add_numeric_sensor_reading (&wolk, "P", bme.pressure / 100.0, rtc.getEpoch ()); wolk_add_numeric_sensor_reading (&wolk, "GR", bme.gas_resistance, rtc.getEpoch ()); wolk_add_numeric_sensor_reading (&wolk, "A", bme.readAltitude (SEALEVELPRESSURE_HPA), rtc.getEpoch ()); / * definir novo alarme * / int alarmMin =(rtc.getMinutes () + readEvery)% 60; rtc.setAlarmMinutes (alarmMin); atraso (100); } se (publicar) {publicar =falso; setup_wifi (); wolk_connect (&wolk); if (! wolk.is_connected) {_flash_store (); } atraso (100); if (wolk_publish (&wolk) ==W_TRUE) {_flash_store (); } / * definir nova hora de publicação * / publishMin =(rtc.getMinutes () + publishEvery)% 60; atraso (100); wolk_disconnect (&wolk); atraso (100); } atraso (100); } / * Rotina de interrupção temporizada * / void alarmMatch () {read =true; if (publishMin ==rtc.getMinutes ()) {publicar =verdadeiro; }} 
Ambiente click-deviceType.json JSON
Tipo de dispositivo que é usado para criar um dispositivo na plataforma WolkAbout IoT
 [{"name":"Environment click", "description":"Tipo de dispositivo para o sensor BME680 na placa MikroElektronika Environment Click", "guid":" def68ff6-63c5-4f9c-a066-bcc944b7bd2d "," deviceType ":" STANDARD "," protocol ":" JSON "," customizationType ":null," firmwareUpdateType ":null," feeds ":[{" name ":" Temperatura "," descrição ":nulo," referência ":" T "," unidade ":{" nome ":" CELSIUS "," guid ":" 7c805d10-a879-11e9-83cd-0a0027000005 "}}, {" nome ":" Umidade "," descrição ":nulo," referência ":" H "," unidade ":{" nome ":" UMIDADE_PERCENT "," guid ":" 7c8080a3-a879-11e9-83cd-0a0027000005 "} }, {"nome":"Pressão", "descrição":nulo, "referência":"P", "unidade":{"nome":"MILLIBAR", "guid":"7c807980-a879-11e9-83cd -0a0027000005 "}}, {" name ":" Gas Resistance "," description ":null," reference ":" GR "," unit ":{" name ":" OHM "," guid ":" 7c805890- a879-11e9-83cd-0a0027000005 "}}, {" nome ":" Altitude "," descrição ":nulo," referenc e ":" A "," unidade ":{" nome ":" MEDIDOR "," guid ":" 7c805a59-a879-11e9-83cd-0a0027000005 "}}]," atuadores ":[]," alarmes ":[], "configs":[], "atributos":[{"name":"CONNECTIVITY_TYPE", "dataType":"ENUM", "validationRegex":"^ (MQTT | HTTP) $", "options":["MQTT", "HTTP"], "defaultValue":"MQTT", "required":true, "readOnly":true}, {"name":"FIRMWARE_UPDATE_ENABLED", "dataType":"BOOLEAN", "validationRegex ":" ^ (true | false) $ "," options ":null," defaultValue ":null," required ":false," readOnly ":true}, {" name ":" FIRMWARE_VERSION "," dataType ":"STRING", "validationRegex":null, "options":null, "defaultValue":null, "required":false, "readOnly":true}, {"name":"FILE_DIRECT_DOWNLOAD_ENABLED", "dataType":"BOOLEAN "," validationRegex ":" ^ (true | false) $ "," options ":null," defaultValue ":null," obrigatório ":false," readOnly ":true}, {" name ":" FILE_URL_DOWNLOAD_ENABLED ", "dataType":"BOOLEAN", "validationRegex":"^ (true | false) $", "options":null, "defaultValue":null, "obrigatório":false, " readOnly ":true}]}] 
Monitoramento do ambiente WolkAbout
Este repositório contém o esboço do Arduino usado neste projetohttps://github.com/Wolkabout/Wolk-Arduino-Environment-Monitoring
Arduino WiFi 101 Shield
Biblioteca Wifi para o Arduino WiFi 101 Shieldhttps://github.com/arduino-libraries/WiFi101
Driver de sensor unificado Adafruit
Biblioteca de sensores unificada necessária para todos os sensoreshttps://github.com/adafruit/Adafruit_Sensor
Biblioteca Adafruit BME680
Biblioteca usada para o Ambiente, clique para obter leituras do sensorhttps://github.com/adafruit/Adafruit_BME680
Biblioteca RTC para Arduino
Biblioteca RTC para placas baseadas em SAMD21 https://github.com/arduino-libraries/RTCZero
Biblioteca FlashStorage para Arduino
Uma maneira conveniente de armazenar dados na memória Flash no ATSAMD21https://github.com/cmaglie/FlashStorage
WolkConnect-Arduino
Biblioteca Arduino que fornece conectividade fácil para WolkAbout IoT Platform.https://github.com/Wolkabout/WolkConnect-Arduino

Esquemas


Processo de manufatura

  1. Arduino Spybot
  2. Monitoramento de CO2 com Sensor K30
  3. FlickMote
  4. TV B-Gone caseiro
  5. Relógio mestre
  6. Encontre-me
  7. Arduino Power
  8. Tech-TicTacToe
  9. Arduino Quadruped
  10. Porta de monitoramento de temperatura sem contato