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

Plataforma de sensor ambiental de modo múltiplo com MKR1000

Componentes e suprimentos

Arduino MKR1000
× 1
Sensor de raios MOD-1016
× 1
Sensor de gás DFRobot MQ-9
× 1
Sensor de umidade e temperatura Adafruit
× 1
Sensor de pressão / altitude / temperatura Adafruit
× 1
Sensor UV SparkFun ML8511
× 1
chronodot RTC
× 1
SparkFun Photon Weather Shield
× 1
Adafruit neopixels
× 1
Breadboard (genérico)
× 1
Fios de jumpers (genérico)
× 1

Sobre este projeto


Adoro observar o tempo e queria tentar capturá-lo e representá-lo em um gráfico. As estações meteorológicas locais permitem-me ver os detalhes do "agora" e, por vezes, as contagens da hora ou do dia anterior. Eu queria fazer mais e usar um Arduino para o trabalho. Todo mundo começa com Temperatura e Umidade, às vezes Pressão Barométrica, mas eu queria mais! A velocidade do vento e a medição da chuva, cada uma desejava entradas de hardware. Depois de dominar o uso do i2c, encontrei coisas como o AS3935 Lightning Detector! E então a tristeza se instalou ... Eu não tive interrupções de hardware suficientes para fazer o trabalho com seu Arduino básico. Sparkfun tem até uma placa de sensor de clima para o Photon, mas ainda é limitada. Eu teria que escolher e ficar sem alguns dos sensores. :-(

Então eu vi o MKR1000 , e descobri o MELHOR RECURSO, ele tem 8 interrupções de hardware! Agora eu poderia ter tudo!





Escolha de seus sensores


Os sensores vêm em três sabores básicos;
  • Analógico :luz (incluindo IR e UV), direção do vento, gases, células de carga ...
  • I2C :temperatura, umidade, pressão baro, acelerômetro, giroscópio ...
  • interrupções :basculantes de chuva, velocidade do vento, relâmpagos, temporizadores ... (Recursos como serial, PWM, relógios, servos usam interrupções de temporização)

O MKR1000 tem bastante I / O para tudo isso!

OBSERVE QUAL TENSÃO VOCÊ PRECISA PARA SUA E / S em I2C e interrupções! Por exemplo, o MKR1000, o Photon e muitos sabores do Arduino usam E / S de 3,3v em vez de 5v. Se sua CPU e o (s) sensor (es) que você deseja usarem tensões diferentes, você também precisará usar deslocadores de nível entre esses dispositivos.

Todos os sensores que tenho usado são comuns o suficiente, disponíveis na Adafruit, SparkFun, Element-14 e outros, e geralmente custam entre US $ 5-10 (EUA). Sensores de gás geralmente custam $ 10- $ 20. Para o detector de raios (chip AS3935), escolhi o Embedded Adventures MOD-1016, que custa US $ 26 (EUA) para colocar a antena na placa também. Eu também comprei o Sparkfun Photon Weather Shield, já que tenho um Photon, e provavelmente comprarei seus "medidores de tempo" (instrumentos de direção e velocidade do vento). Talvez eu adicione um sensor de umidade do solo, assim que descobrir onde montarei o MKR1000. Alguns sensores não gostam de cabos longos.





Atribua seus sensores aos pinos


Depois de saber quais sensores você deseja, saberá quais tipos de entradas serão necessários. A próxima etapa é decidir quais sensores irão em quais pinos. Começo no papel, mas também adicionarei essa lista como um bloco de comentário no meu código, como um lembrete.

Aqui estão as atribuições de pinos do MKR1000 que fiz para meu deck de sensores.
  • A0 (Estou salvando A0 para o caso de precisar do DAC mais tarde ...)
  • A1 Sensor UV ML8511
  • A2 sensor de luz visível
  • A3 Sensor de temperatura local TMP36
  • A4 Sensor de gás MQ-9
  • A5 sensor de umidade
  • A6 sensor de velocidade do vento?
  • 0 (HW INT) botão de pressão
  • 1 (HW INT) AS Lightning Detector
  • 2 (HW INT) anemômetro de velocidade do vento (interrupção por rotação)
  • 3 (HW INT) Rain Tipper…
  • 4
  • 5
  • 6 (compartilhado com LED integrado)
  • 7 Saída NeoPixel…





Primeiros passos ...


Para os iniciantes, sugiro começar com cada sensor que você vai usar, um de cada vez, e começar carregando o código de exemplo e instalando as bibliotecas necessárias. Lembre-se de alterar o pino do sensor para corresponder à atribuição do pino de sua escolha e salve uma cópia do código de demonstração na pasta do projeto.

Quando você puder executar o código de teste e ler os resultados do Monitor Serial, estará pronto para tentar adicionar outro. E quando você terminar de testar cada sensor, eles agora estão todos conectados e prontos para começar a construir seu esboço maior!

Meus ajustes originais com os sensores incluíam um Reat-Time Clock (RTC) baseado em i2c, para que eu pudesse registrar em um cartão de memória SD. Embora o MKR1000 tenha seu próprio RTC e uma bateria, não consegui fazer com que o relógio marcasse a hora apenas com a bateria, então vou manter o ChronoDot v2.1 i2c RTC também.

Olhando para o breadboard na minha imagem abaixo, você pode ver os vários jumpers em uso. As laranja são para a alimentação de 3,3 V de cada sensor, então só posso conectá-los quando estiver pronto para trabalhar com eles. (É fácil desativar um sensor desconectando o jumper laranja.)





Uma nota sobre bibliotecas


Descobri que algumas das bibliotecas que você pode instalar NÃO funcionam perfeitamente com o MKR1000 e / ou com Arduino.cc IDE versão 1.6.7, e pode ser necessário fazer alguns ajustes, dependendo da idade do seu sensor é. Um exemplo disso são as macros ATOMIC_ * mais antigas na libc AVR mais antiga biblioteca (eles foram descartados no Arduino IDE 1.6.5), e há um grande tópico sobre problemas e soluções sugeridas em um tópico de fórum em Arduino.cc. Fazer algumas das mudanças sugeridas é algo para um hacker intermediário do Arduino, mas provavelmente será intimidante para os hackers mais novos. E, para bibliotecas um pouco mais antigas, o autor original pode não estar por perto para atualizar a biblioteca e eliminar a dependência.

Infelizmente, você geralmente não será capaz de saber quais bibliotecas precisam ser ajustadas antes de comprar seus sensores e testá-los. Nesse ponto, eu recomendo que você olhe as mensagens de erro que aparecem em laranja quando você tenta carregar seu esboço com cuidado, para ver se o problema está em seu código ou em uma biblioteca, antes de começar a alterar seu código. Se estiver na biblioteca, faça uma pesquisa na web por "arduino" e a mensagem de erro. Se você não conseguir encontrar uma solução, tente enviar um e-mail ao autor e informá-los sobre o erro, e talvez eles atualizem a biblioteca.

Comprei fichas individuais, tentando economizar dinheiro. Decidi que, até estar pronto e capaz de fazer minhas próprias placas de circuito (provavelmente usando EagleCAD e OSHPark), é mais fácil comprar módulos de sensor da Adafruit e SparkFun, já que eles são ótimos em manter suas bibliotecas corrigidas.





Um pouco sobre WiFi e criptografia


Também pensei no wi-fi para fazer meu relatório de sensores meteorológicos em um site. Temos até um mecanismo de criptografia no MKR1000, para ajudar a manter nossos dados seguros em trânsito pela Internet! Mas, isso é mais do que serei capaz de fazer neste primeiro projeto. Está na minha lista o que fazer, porque tornar a segurança de dados parte do seu projeto é importante para a Internet das Coisas, mas estou ficando sem tempo para adicionar minha inscrição ao concurso MKR1000. Fique atento à minha "versão 2" deste projeto. Aqui está um diagrama de blocos do módulo SAMD que é o coração da sua placa.

Posso oferecer uma dica para começar a usar o WiFi integrado: Certifique-se de que está usando a versão mais atual da biblioteca WiFi101! Se não o fizer, seu esboço não reconhecerá o módulo wi-fi e seus esboços wi-fi apenas reportarão se houver erro na verificação das chamadas para o módulo wi-fi.) Preciso agradecer a Charif Mahmoudi por apontar isso em seu ótimo tutorial "Getting Started with MKR1000" aqui no Hackster! No momento do meu hack, você poderia encontrar o WiFi101 Githuib aqui.





Dicas para sensores analógicos


A maioria dos módulos de sensor de "saída analógica" produzirá uma saída de tensão analógica simples, que pode ser lida facilmente usando o analogRead do pino do sensor. Mas então você precisa saber o que isso significa. Normalmente, você precisará usar o mapa comando, ou você pode precisar fazer um pouco de matemática. Os elementos resistivos geralmente precisam de alguns circuitos extras. Você pode adicionar um potenciômetro para "fazer o ajuste fino" da voltagem.

Em outros casos, você precisará de equações para transformar a tensão de saída em algo que os humanos entendam. O TMP36 o sensor de temperatura é um exemplo bem documentado disso. Esta parte foi projetada para ser lida em graus Celsius, então você precisa medir a voltagem e fazer algumas contas para obter C e, se quiser Fahrenheit, precisará converter C em F. Ler as planilhas de dados dos componentes explique como a parte funciona, mas você achará mais fácil seguir os passos de outra pessoa à medida que aumenta sua experiência.

No entanto, outros sensores precisam de um amplificador, a fim de tornar as pequenas oscilações de tensão grandes o suficiente para que seu ADC obtenha uma boa faixa de alta a baixa. Esses tipos de sensores (células de carga, umidade, acelerômetro) são onde acho melhor gastar algum dinheiro e comprar um módulo que já tem um amplificador e uma biblioteca para ajudar a entender a faixa de saída.





Dicas para usar dispositivos I2C


I2C às vezes é chamado de "interface de dois fios", porque você precisa de um sinal de clock, bem como de um sinal de dados. (Você só precisa de um fio de dados, porque o "mestre" e o "escravo (s)" se revezam no envio de dados.) Claro, seus sensores I2C também precisarão de um aterramento e um cabo de alimentação também, e isso o cabo de aterramento precisa ser ligado à CPU.

Cada dispositivo I2C terá um endereço hexadecimal no barramento. É melhor evitar o uso de vários dispositivos com o mesmo endereço. (Se quiser ter múltiplos, você precisa gerenciá-los com circuitos extras, a fim de "habilitar" aquele com o qual deseja se comunicar e, em seguida, desabilitá-lo quando terminar, antes de habilitar outro para comunicação.) A documentação deve informar quais endereços um dispositivo pode ter. ( NOTA : Se você tiver dois dispositivos no barramento I2C com o mesmo endereço, e ambos tiverem um pino "Ativar" ou "Desligar", você poderá desativar um enquanto o outro está ativo. No entanto, você não pode simplesmente desligar o pino vdd, uma vez que os sensores podem pegar alguma energia dos pinos SDA e SCL e resultarão em leituras ruins para aquele endereço. A verificação de erros para I2C não é boa o suficiente para detectar / corrigir neste caso. )

As especificações I2C nos dizem que devemos ter um resistor pull-up "forte" tanto no clock quanto nos fios de dados, no sensor que está mais distante do fio. Por causa disso, alguns módulos de sensores já possuem resistores integrados e você pode precisar adicionar apenas alguns jumpers, portanto, certifique-se de ler a documentação do (s) módulo (s).

Além dos "resistores de terminação de barramento", também encontrei uma dica de um hacker há muito tempo, para adicionar um resistor em linha para os cabos de dados (SDA) e de relógio (SCL). Isso melhorou muito a confiabilidade das leituras de dados de alguns sensores. Com o MKR1000, usando sinalização de 3,3 V, estou usando resistores de 220 ohms. Em uma CPU de 5 V, você pode tentar 330 ohm. Veja o esquema abaixo para ver a diferença nas colocações.

O que você fará com os dados?

No momento, estou apenas enviando para o Monitor Serial. Você pode adicionar um LCD. Eu ia adicionar um cartão SD, mas agora que tenho wi-fi integrado, quero fazer o upload dos dados para uma nuvem ... imagine ter alguns desses decks de sensores por perto, sabendo sua latitude e longitude e sendo capaz para triangular um relâmpago comparando as leituras de potência de cada estação para um determinado relâmpago!

AO LADO :29-11-2017; Não consegui fazer com que as interrupções de hardware funcionassem no MKR1000. Estou fazendo anotações e experimentos com sensores para uma turma do 9º ano (idade de 13 a 14 anos), e talvez você ache os esboços interessantes. A classe é construída em torno da placa Adalogger M0 e salva os dados em um cartão SD, e ainda há muitos pinos para um módulo WiFi. http://arduinoclass.pbworks.com

Enquanto trabalhava nos sensores, também localizei o suporte da lâmpada SODERSVIK na IKEA (veja a imagem abaixo). Imagine substituir os LEDs brancos dentro desta lâmpada por 20 Neopixels e adicionar um receptor remoto IR. O vento que sopra pode parecer com nuvens passando, e a cor pode indicar a temperatura. O controle remoto também pode optar por mostrar momentaneamente algumas outras informações, como a mudança de temperatura durante as últimas 12 horas.

O que você deseja monitorar e exibir?

Código

  • Todo o esboço de monitoramento
  • Fazendo uma leitura analógica média
  • scanner de barramento I2C
  • Código de demonstração ML8511
Todo o esboço de monitoramento Arduino
Existem muitos sensores relatando neste esboço, e as bibliotecas estão funcionando bem juntas. No entanto, os métodos clássicos de bloqueio de interrupção em AVR-libc foram removidos nas versões recentes do Arduino IDE, que desativou as bibliotecas para NeoPixel e para o sensor Lightning. Espero que isso seja resolvido em algum momento este ano, mas significa que os deixei de fora do esboço final.
 / * RTC-Weather-Sensors_v6_MKR1000 por Zonker Harris Primavera 2016 * Viva! Uma pequena placa, com mais de 2 interrupções de hardware! * Além de WiFi, * e * criptografia (MUITO necessário para aplicativos IoT!) * * Nota para os hackers mais novos:coloquei MUITOS comentários no meu código, como podem ver. * Quando você clica em upload, * os comentários são IGNORADOS * e não comem memória! * Recomendo que você também adicione muitos comentários ao fazer alterações * e acréscimos, para ajudá-lo a lembrar POR QUE fez o que fazia meses atrás. * Eles também ajudarão aqueles que vierem depois de você, a aprender uma ou duas coisas. * * Agora, as bibliotecas * DO * contam na memória do programa ... * / # include  #include  #include  #include  // Incluindo neopixels como um espaço reservado, mas o vetor de interrupção da biblioteca precisa ser atualizado.// Incluir a biblioteca Adafruit_NeoPixel https://github.com/adafruit/Adafruit_NeoPixel//#include  // const int numLeds =1; // Quantos neopixels na string? usado para definir a biblioteca NeoPixel // Parâmetro 1 =número de pixels na faixa // Parâmetro 2 =número do pino (a maioria são válidos) // Parâmetro 3 =sinalizadores de tipo de pixel, somados conforme necessário:// NEO_RGB Pixels são conectados para RGB bitstream // NEO_GRB Pixels são conectados para GRB bitstream // NEO_KHZ400 400 KHz bitstream (por exemplo, FLORA pixels) // NEO_KHZ800 800 KHz bitstream (por exemplo, faixa de LED de alta densidade) // Adafruit_NeoPixel strip =Adafruit_NeoPixel (numLeds, 6, NEO_GRB + NEO_Z800); / * O driver BMP085_U usa a biblioteca de sensores unificados Adafruit (Adafruit_Sensor), que fornece um 'tipo' comum para dados de sensor e algumas funções auxiliares. (O BMP180 é compatível com esta biblioteca e fornece a mesma saída, mas a biblioteca identificará o BMP180 como um BMP085.) Para usar este driver, você também precisará baixar a biblioteca Adafruit_Sensor e incluí-la em sua pasta de bibliotecas. Você também deve atribuir um ID exclusivo a este sensor para uso com a API do Sensor Adafruit para que possa identificar este sensor específico em qualquer registro de dados, etc. Para atribuir um ID exclusivo, basta fornecer um valor apropriado no construtor abaixo (12345 é usado por padrão neste exemplo). * / Adafruit_BMP085_Unified bmp =Adafruit_BMP085_Unified (10180); / * Este esboço também foi projetado para funcionar com o sensor HTU21D-F da Adafruit ----> https://www.adafruit.com/products/1899 * / Adafruit_HTU21DF htu =Adafruit_HTU21DF (); / * Macetech Chronodot v2.1 Relógio em tempo real (RTC) com bateria ... http://docs.macetech.com/doku.php/chronodot (porque a bateria do meu MKR1000 não parece mantenha o RTC de bordo ativo) Informações da biblioteca Adafruit Real-Time Clock (RTC) https://learn.adafruit.com/adafruit-data-logger-shield/using-the-real-time-clock Analog Devices TMP36 analog sensor de temperatura calibrado. Isso requer alguma matemática https://learn.adafruit.com/tmp36-temperature-sensor http://www.analog.com/media/en/technical-documentation/data-sheets/TMP35_36_37.pdf ML8511 sensor UV ... Este sensor detecta a luz de 280-390 nm de forma mais eficaz. Isso é classificado como parte do espectro de UVB (raios em chamas) e a maior parte do espectro de UVA (raios de bronzeamento). MOD-1016 (AS3935 Lightning Sensor) i2c address 0x03 - AS3935 Lightning Sensor Adafruit tem um anemômetro que fornece uma saída de tensão DC (0,4-2,0v) https://www.adafruit.com/products/1733 http:// www. instructables.com/id/Breezefinder-Citizen-Science-Windpower-Tool/step2/Build-the-housing/ Detector de umidade do solo (sensor YL-69 ou similar) requer entrada analógica ... http://www.instructables.com / id / Arduino-LCD-Soil-Moisture-Sensor / step3 / Connect-umidade-sensor / Minhas conexões MKR1000 (Todos os sensores devem ter sinalização de 3,3 V!) ===========* / int UVOUT =A1; // Saída do MV8511 UV sensorint lightOut =A2; // Saída do sensor de luz visível TEMT6000 tmp36out =A3; // Saída do sensor de temperatura local TMP36 mq9out =A4; // Saída do DFrobot MQ-9 CO / sensor Gs de combustível / * A5 Sensor de Umidade A6 Sensor de velocidade do vento? 0 (HW INT) botão 1 (HW INT) AS Lightning Detector 2 (HW INT) anemômetro de velocidade do vento? (interrupção por rotação) 3 (HW INT) Rain Tipper… 4 5 * / int sounderPin =6; // Saída da sirene piezoelétrica (compartilhada com o LED integrado) // (Você pode usar um jumper para desabilitar a sirene, mas o LED integrado piscará) int neopixelPin =7; // Saída NeoPixel, para visualização usando LEDs baseados em registro de deslocamento / * 11 i2c SDA 12 i2c SCL * / // Variáveis ​​de decalque para o Chronodot i2c RTC ... int addrRTC =(0x68); // RTC i2c addressint seconds; // BCD combinado do RTC (00h) int segundos1; // 0-9int segundos10; // 0-5int minutos; // BCD combinado do RTC (01h) int minutes1; // 0-9int minutes10; // 0-6 horas inteiras; // BCD combinado do RTC (02h) int horas1; // 0-9 horas inteiras10; // 0-2int dia; // 1-7 (03h) data interna; // 01-31 (04h) mês interno; // 01-12 (05h) nos anos; // 0-99; (06h) int a1secs; // (07h) obtém o Alarme 1 segundosint a1mins; // (08h) obtém o alarme 1 minutesint a1hrs; // (09h) obtém o alarme 1 hoursint a1daydate; // (0Ah) obtém o alarme 1 dia e data bitsint a2mins; // (0Bh) obtém o alarme 2 minutosint a2hrs; // (0Ch) obtém o alarme 2 hoursint a2daydate; // (0Dh) obtém os bits do dia e da data do Alarme 2 rtcstatus; // (0Eh) obtém o status RTC bitsint aginginfo; // (0Fh) obter informações de deslocamento de envelhecimento // o que é 10h? Int temprtc; // BCD combinado do RTC (11h) int tempfrtc; // BCD combinado do RTC (12h) / ************************************** ************************************ /// Função de configuração do Arduino (chamada automaticamente na inicialização) / ** *************************************************** *********************** / configuração void (void) {Serial.begin (9600); atraso (1000); Serial.println ("i2c Sensor Deck"); // Lembre-se de configurar seus pinos de entrada e saída! pinMode (UVOUT, INPUT); // o sensor de UV ML8511 pinMode (lightOut, INPUT); // o sensor de luz visível TEMT6000 pinMode (tmp36out, INPUT); // o sensor de temperatura TMP36 da Analog Devices pinMode (sounderPin, OUTPUT); // HIGH fará com que a sirene emita ruído pinMode (neopixelPin, OUTPUT); // Use um resistor de 220 ohms em linha para a faixa / * Inicialize o sensor BMP085 / BMP180 * / if (! Bmp.begin ()) {/ * Houve um problema ao detectar o BMP085 / 180 ... verifique seu conexões * / Serial.print ("Opa, nenhum BMP085 / 180 detectado ... Verifique sua fiação ou ADDR I2C!"); enquanto (1); } / * Exibe algumas informações básicas sobre este sensor, BMP180 reporta como BMP085 * / displaySensorDetails (); / * Inicialize o sensor HTU21D * / if (! Htu.begin ()) {Serial.println ("Não foi possível encontrar o HTU21 Sensor -DF! "); enquanto (1); } // Inicializa o relógio Chronodot RTC // (altere os valores, descomente e carregue para definir a hora e comente novamente) / * segundos =0; minutos =41; horas =20; dia =7; data =3; mês =1; anos =16; initChrono (); * /} loop vazio (vazio) {bip (50, 2); // anuncia o início do loop na sirene // Defina o neopixel para Teal ... // int red =0; verde int =45; int azul =30; //strip.setPixelColor(0, (red, green, blue)); //strip.show();/***************************************** ****************************** // * Puxe o endereço i2c de informações do Chronot 0x68 - DS1307 RTC * // * Informações da placa:http ://docs.macetech.com/doku.php/chronodot * // * Folha de dados do DS3231:http://datasheets.maxim-ic.com/en/ds/DS3231.pdf * // ******* *************************************************** ************* / int temprtc; / * Obtenha um novo carimbo de data / hora * / Wire.beginTransmission (0x68); // 0x68 é o endereço do dispositivo DS3231 Wire.write ((byte) 0); // inicia no registro 0 Wire.endTransmission (); Wire.requestFrom (0x68, 13); // solicitar 19 bytes (é o número de bytes DEC ou HEX?) // (segundos, minutos, horas, dia, data, mês, horas, // a1segs, a1mins, a1hrs // a1secs, a1mins, a1hrs // Envelhecimento deslocamento, número inteiro temporário, fração temporária) enquanto (Wire.available ()) {segundos =Wire.read (); // (00h) obtém segundos minutos =Wire.read (); // (01h) obter minutos horas =Wire.read (); // (02h) obter horas dia =Wire.read (); // (03h) obtém o dia da semana date =Wire.read (); // (04h) obtém a data do mês mês =Wire.read (); // (05h) obtém o mês e o século bit anos =Wire.read (); // (06h) obtém o ano int a1secs =Wire.read (); // (07h) obtém o Alarme 1 segundos int a1mins =Wire.read (); // (08h) obtém o alarme 1 minuto int a1hrs =Wire.read (); // (09h) obtém 1 hora do Alarme int a1daydate =Wire.read (); // (0Ah) obtém os bits de dia e data do Alarme 1 int a2mins =Wire.read (); // (0Bh) obtém o alarme 2 minutos int a2hrs =Wire.read (); // (0Ch) obtém o alarme 2 horas int a2daydate =Wire.read (); // (0Dh) obtém os bits de dia e data do Alarme 2 int rtcstatus =Wire.read (); // (0Eh) obtém bits de status RTC int envelhecimentoinfo =Wire.read (); // (0Fh) obter informações de deslocamento de envelhecimento temprtc =Wire.read (); // (11h) obtém a porção inteira da temp, e assina tempfrtc =Wire.read (); // (12h) obtém a parte fracionária da temperatura // Leia nossos bits e normalize os dados com preenchimento de zero à esquerda // NOTA:O Chronodot não sabe sobre o horário de verão, deveria seu código? segundos10 =((segundos &0b11110000)>> 4); segundos1 =((segundos &0b00001111)); // converter BCD em minutos decimais10 =((minutos &0b11110000)>> 4); minutes1 =(minutos &0b00001111); // converter BCD em horas decimais10 =(((horas &0b00100000)>> 5) * 2 + ((horas &0b00010000)>> 4) * 1); horas1 =(horas &0b00001111); // converte BCD em decimal (assume modo de 24 horas) anos =(anos + 2.000); temprtc =((temprtc &0b01111111) + (((tempfrtc &0b11000000)>> 6) * 0,25)); } get_date (); // Este é um lugar onde você pode adicionar decisões de Dayligh Savings Time para alterar as horas ... Serial.print ("ChronoDot -"); Serial.print (horas10); Serial.print (horas1); Serial.print (":"); Serial.print (minutos10); Serial.print (minutos1); Serial.print (":"); Serial.print (segundos10); Serial.print (segundos1); Serial.print ("20"); Serial.print (anos); Serial.print (""); Serial.print (mês); Serial.print (""); Serial.print (data); Serial.print ("\ t"); Serial.print (temprtc); Serial.println ("C"); atraso (100); // para que a impressão seja concluída, caso o próximo sensor esteja parado / ********************************* ************************************** // * Obter dados BMP180 endereço i2c 0x77 - BMP180 Baro Pres e Temp * // * data:http://www.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf * // ******************** *************************************************** * evento / sensores_event_t; bmp.getEvent (&event); / * Primeiro obtemos a temperatura atual do BMP085 / BMP180 * / float BMPtemperature; bmp.getTemperature (&BMPtemperature); float BMPtempF =(BMPtemperature * 1.8 + 32); Serial.print ("Temp:"); Serial.print (BMPtemperature); Serial.print ("C ("); Serial.print (BMPtempF); Serial.print ("F) \ t"); / * Exibir os resultados (a pressão barométrica é medida em hPa) * / if (event.pressure) {/ * Exibir a pressão atmosférica em hPa * / Serial.print ("BMP180 - Pres:"); Serial.print (event.pressure); Serial.print ("hPa \ t"); / * O cálculo da altitude com precisão razoável requer pressão * * pressão ao nível do mar para sua posição no momento em que os dados são * * convertidos, bem como a temperatura ambiente em graus * * celcius. Se você não tiver esses valores, um valor 'genérico' de * * 1013,25 hPa pode ser usado (definido como SENSORS_PRESSURE_SEALEVELHPA * * em sensores.h), mas isso não é o ideal e fornecerá resultados variáveis ​​* * de um dia para o próximo. * * * * Normalmente, você pode encontrar o valor SLP atual nos sites de meteorologia * * ou em centros de informações ambientais próximos a qualquer aeroporto * * importante. * * * * convert inches-mercury http://www.csgnetwork.com/pressinmbcvt.html * * * Por exemplo, para Paris, França, você pode verificar a pressão média * * atual e o nível do mar em:http:// bit .ly / 16Au8ol * / / * Em seguida, converta a pressão atmosférica e SLP para altitude * / / * Atualize esta próxima linha com o SLP atual para obter melhores resultados * / float seaLevelPressure =SENSORS_PRESSURE_SEALEVELHPA; Serial.print ("Alt:"); Serial.print (bmp.pressureToAltitude (seaLevelPressure, event.pressure)); Serial.println ("m"); atraso (100); // então a impressão será concluída, caso o próximo sensor esteja travado} else {Serial.println ("Erro do sensor"); } / ************************************************ *********************** / * Obter dados HTU21-DF endereço i2c 0x40 - Sensor de umidade e temperatura * / * Em seguida, converter a pressão atmosférica e SLP em altitude * / * Atualize esta próxima linha com o SLP atual para melhores resultados * / * https://learn.adafruit.com/adafruit-htu21d-f-temperature-humidity-sensor/overview/********* *************************************************** *********** / float HTUtemperature =htu.readTemperature (); float HTUtempF =(HTUtemperature * 1.8 + 32); Serial.print ("HTU21-DF - Temp:"); Serial.print (HTUtemperature); Serial.print ("C ("); Serial.print (HTUtempF); Serial.print ("F) \ tHum:"); Serial.print (htu.readHumidity ()); Serial.println ("%"); atraso (100); // para que a impressão seja concluída, caso o próximo sensor esteja parado / ********************************* ************************************* / * Analog Devices venerável sensor de temperatura de precisão TMP36 / * isto requer um um pouco de matemática depois de ler a saída ... / * https://learn.adafruit.com/tmp36-temperature-sensor/using-a-temp-sensor/*************** *************************************************** ****** / // obtendo a leitura de tensão do sensor de temperatura int reading =averageAnalogRead (tmp36out); // 0,0032258064516129 são a unidade DAC para 3,3v float tmp36voltage =0,0032258064516129 * leitura; // imprime a tensão Serial.print ("TMP36 - temp:"); float tmp36temperatureC =(tmp36voltage - 0,5) * 100; // conversão de 10 mv por grau com deslocamento de 500 mV para graus ((tensão - 500mV) vezes 100) Serial.print (tmp36temperatureC); Serial.print ("C \ t"); // agora converter para Fahrenheit float tmp36temperatureF =(tmp36temperatureC * 9.0 / 5.0) + 32.0; Serial.print (tmp36temperatureF); Serial.print ("F, out:"); Serial.print (tmp36voltage); Serial.println ("v"); atraso (100); // para que a impressão seja concluída, caso o próximo sensor esteja parado / ********************************* ************************************** * Vishay TEMT6000 Sensor de luz visível - leitura analógica * https:// www.sparkfun.com/products/8688/***************************************** ******************************** / int vLevel =averageAnalogRead (lightOut); // 0,0032258064516129 is (3,3v (a tensão de referência DAC) \ 1023 * uvLevel) float newVOutVolts =0,0032258064516129 * vLevel; Serial.print ("saída TEMT6000:"); Serial.println (vLevel); atraso (100); // para que a impressão seja concluída, caso o próximo sensor esteja parado / ********************************* ************************************* * Sensor UV ML8511 - leitura analógica * https:// aprenda. sparkfun.com/tutorials/ml8511-uv-sensor-hookup-guide * / ********************************** ************************************** / int uvLevel =averageAnalogRead (UVOUT); // 0,0032258064516129 is (3,3v (a tensão de referência DAC) \ 1023 * uvLevel) float newOutVolts =0,0032258064516129 * uvLevel; // Converte a tensão para um nível de intensidade de UV float uvIntensity =mapfloat (newOutVolts, 0.99, 2.8, 0.0, 15.0); Serial.print ("ML8511 UV out:"); Serial.print (uvLevel); Serial.print(" / UV Intensity (mW/cm^2):"); Serial.println(uvIntensity); atraso (100); // so this will finish printing, in case the next sensor is stalled/********************************************************************** * DFrobot MQ-9 CO/Combustable Gas sensor - analog reading * http://www.dfrobot.com/wiki/index.php/Analog_Gas_Sensor(MQ9)_(SKU:SEN0134) * https://www.pololu.com/category/83/gas-sensors There are many available * But, deciphering what the output levels mean is an exercise for the buyer. :-(/**********************************************************************/ int MQ9volts =analogRead(mq9out); // Read Gas value from the MQ-9 sensor Serial.print("MQ-9 Gas:"); Serial.println(MQ9volts,DEC); delay(100); // so this will finish printing, in case the next sensor is stalled Serial.println(""); delay(3500); // looking to time the loop at about 5 seconds... // End of the main loop...}/**************************************************************************//* The code below are supporting subroutines */**************************************************************************//* Chronodot-related subroutines * * initChrono, set_date, get_date, set_time, get_time, get_temp, * * setHour, SetMinutes, decToBcd, bcdToDec *//**************************************************************************/void initChrono(){ set_time(); set_date();}void set_date(){ Wire.beginTransmission(104); Wire.write(4); Wire.write(decToBcd(day)); Wire.write(decToBcd(date)); Wire.write(decToBcd(mont h)); Wire.write(decToBcd(years)); Wire.endTransmission();}void get_date(){ Wire.beginTransmission(104); Wire.write(3);//set register to 3 (day) Wire.endTransmission(); Wire.requestFrom(104, 4); //get 4 bytes(day,date,month,year); day =bcdToDec(Wire.read()); date =bcdToDec(Wire.read()); month =bcdToDec(Wire.read()); years =bcdToDec(Wire.read());}void set_time(){ Wire.beginTransmission(104); Wire.write((byte)0); Wire.write(decToBcd(seconds)); Wire.write(decToBcd(minutes)); Wire.write(decToBcd(hours)); Wire.endTransmission();}void get_time(){ Wire.beginTransmission(104); Wire.write((byte)0);//set register to 0 Wire.endTransmission(); Wire.requestFrom(104, 3);//get 3 bytes (seconds,minutes,hours); seconds =bcdToDec(Wire.read() &0x7f); minutes =bcdToDec(Wire.read()); hours =bcdToDec(Wire.read() &0x3f);}void get_temp(){ Wire.beginTransmission(104); Wire.write((byte)0); //set register to 0 Wire.endTransmission(); Wire.requestFrom(104, 3);//get 3 bytes (seconds,minutes,hours); seconds =bcdToDec(Wire.read() &0x7f); minutes =bcdToDec(Wire.read()); hours =bcdToDec(Wire.read() &0x3f);}void setHour(){ hours++; if (hours> 23) { hours =0; seconds =0; minutes =0; } set_time();}void setMinutes(){ minutes++; if (minutes> 59) { minutes =0; } seconds =0; set_time();}byte decToBcd(byte val){ return ( (val / 10 * 16) + (val % 10) );}byte bcdToDec(byte val){ return ( (val / 16 * 10) + (val % 16) );}/**************************************************************************//* Displays some basic information on this sensor from the unified sensor API sensor_t type (see Adafruit_Sensor for more information) *//**************************************************************************/void displaySensorDetails(void){ sensor_t sensor;// bmp.getSensor(&sensor); Serial.println("------------------------------------"); Serial.print ("Sensor:"); Serial.println(sensor.name); Serial.print ("Driver Ver:"); Serial.println(sensor.version); Serial.print ("Unique ID:"); Serial.println(sensor.sensor_id); Serial.print ("Max Value:"); Serial.print(sensor.max_value); Serial.println(" hPa"); Serial.print ("Min Value:"); Serial.print(sensor.min_value); Serial.println(" hPa"); Serial.print ("Resolution:"); Serial.print(sensor.resolution); Serial.println(" hPa"); Serial.println("------------------------------------"); Serial.println(""); delay(500);}/**************************************************************************//* Takes an average of readings on a given pin, Returns the average */* used for the TMP36 and ML8511 UV Sensor readings./**************************************************************************/int averageAnalogRead(int pinToRead){ byte numberOfReadings =8; unsigned int runningValue =0; for(int x =0; x  
Taking an Average Analog ReadingArduino
This was a clever hack I found in the SparkFun library for the ML8511 UV Sensor, but I'm calling it out specifically, since you can use it for any analog read! If you ever meet Nathan Seidl, please buy him a beer (it's a Beerware license.)
//Takes an average of readings on a given pin//Returns the averageint averageAnalogRead(int pinToRead){ byte numberOfReadings =8; unsigned int runningValue =0; for(int x =0; x  
I2C bus scannerArduino
If you don't know the base address for your i2c devices, use this to scan the range of valid addresses. It knows about the sensors that I've been working with. You can add sections for your other sensors.
// --------------------------------------// i2c_scanner//// Found at http://playground.arduino.cc/Main/I2cScanner?action=sourceblock&num=1// 26 OCT 2015//// Version 1// This program (or code that looks like it)// can be found in many places.// For example on the Arduino.cc forum.// The original author is not know.// Version 2, Juni 2012, Using Arduino 1.0.1// Adapted to be as simple as possible by Arduino.cc user Krodal// Version 3, Feb 26 2013// V3 by louarnold// Version 4, March 3, 2013, Using Arduino 1.0.3// by Arduino.cc user Krodal.// Changes by louarnold removed.// Scanning addresses changed from 0...127 to 1...119,// according to the i2c scanner by Nick Gammon// http://www.gammon.com.au/forum/?id=10896// Version 5, March 28, 2013// As version 4, but address scans now to 127.// A sensor seems to use address 120.//// This sketch tests the standard 7-bit addresses// Devices with higher bit address might not be seen properly.//// Zonk er Harris added device descriptions, comments. OCT 10 2015// #include void setup(){ Wire.begin(); Serial.begin (9600); Serial.println("\nI2C Scanner");}void loop(){ byte error, address; int nDevices; Serial.println("Scanning..."); nDevices =0; for(address =1; address <127; address++ ) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(address); error =Wire.endTransmission(); if (error ==0) { Serial.print("I2C device found at address 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); // Serial.print(address); If needed, print the address in decimal // // Now, detail sensors that we know about or expect... if (address ==3) { // DEC 3 =0x03 HEX =AS3935 Lightning Sensor Serial.print(" - AS3935 Lightning Sensor"); } if (address ==64) { // DEC 64 =0x40 HEX =HTU21D Humidity and Temp Sensor Serial.print(" - HTU21D Humidity and Temp Sensor"); } if (address ==104) { // DEC 104 =0x68 HEX =DS1307 (Chrono-Dot?) RTC Serial.print(" - DS1307 RTC (Chrono-Dot?)"); } if (address ==119) { // DEC 119 =0x77 HEX =BMP180 Barometric Pressure and Tem Sensor Serial.print(" - BMP180 Barometric Pressure and Tem Sensor"); } Serial.println(" "); nDevices++; } else if (error==4) { Serial.print("Unknow error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); if (address ==3) { // DEC 3 =0x03 HEX =AS3935 Lightning Sensor Serial.print(" - AS3935 Lightning Sensor"); } if (address ==64) { // DEC 64 =0x40 HEX =HTU21D Humidity and Temp Sensor Serial.print(" - HTU21D Humidity and Temp Sensor"); } if (address ==104) { // DEC 104 =0x68 HEX =DS1307 (Chrono-Dot?) RTC Serial.print(" - DS1307 RTC (Chrono-Dot?)"); } if (address ==119) { // DEC 119 =0x77 HEX =BMP180 Barometric Pressure and Tem Sensor Serial.print(" - BMP180 Barometric Pressure and Tem Sensor"); } } } if (nDevices ==0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000); // wait 5 seconds for next scan}/* The output looks like this... * * Scanning... * I2C device found at address 0x03 - AS3935 Lightning Sensor * I2C device found at address 0x40 - HTU21D Humidity and Temp Sensor * I2C device found at address 0x68 - DS1307 RTC (Chrono-Dot?) * I2C device found at address 0x77 - BMP180 Barometric Pressure and Tem Sensor * done * */
ML8511 Demo CodeArduino
Modified for use with a 3.3v-native CPU (for DAC reference units).
/* * From https://learn.sparkfun.com/tutorials/ml8511-uv-sensor-hookup-guide 19 MAR 2016 * (Adapted for MKR1000 by Zonker Harris, MAR 2016) ML8511 UV Sensor Read Example By:Nathan Seidle SparkFun Electronics Date:January 15th, 2014 License:This code is public domain but you buy me a beer if you use this and we meet someday (Beerware license). The ML8511 UV Sensor outputs an analog signal in relation to the amount of UV light it detects. Connect the following ML8511 breakout board to Arduino:3.3V =3.3V OUT =A1 GND =GND EN =3.3V * The Sparkfun demo presumes 5v VCC, but the MKR1000 is 3.3v native. * Because of this, the second reference voltage value will always be "1023". * As a result of testing, I cut that part out... -Z- Test your sensor by shining daylight or a UV LED:https://www.sparkfun.com/products/8662 This sensor detects 280-390nm light most effectively. This is categorized as part of the UVB (burning rays) spectrum and most of the UVA (tanning rays) spectrum. There's lots of good UV radiation reading out there:http://www.ccohs.ca/oshanswers/phys_agents/ultravioletradiation.html https://www.iuva.org/uv-faqs *///Hardware pin definitionsint UVOUT =A1; //Output from the sensorvoid setup(){ Serial.begin(9600); pinMode(UVOUT, INPUT); Serial.println("ML8511 example");}void loop(){ int uvLevel =averageAnalogRead(UVOUT); float newOutVolts =0.0032258064516129 * uvLevel; // This is 3.3v \ 1023 * uvLevel float uvIntensity =mapfloat(newOutVolts, 0.99, 2.8, 0.0, 15.0); //Convert the voltage to a UV intensity level Serial.print("ML8511 out:"); Serial.print(uvLevel); Serial.print(" / UV Intensity (mW/cm^2):"); Serial.print(uvIntensity); Serial.println (); delay(100);}//Takes an average of readings on a given pin//Returns the averageint averageAnalogRead(int pinToRead){ byte numberOfReadings =8; unsigned int runningValue =0; for(int x =0; x  

Esquemas

I'm too new to Fritzing, and couldn't find many parts in the library, so I made this mock-up instead.

Processo de manufatura

  1. A integração dos dados do sensor com o microprocessador Raspberry Pi
  2. Sensor de rastreamento de linha com RPi
  3. API do sensor ambiental com um RPi
  4. Aeroponia com Raspberry Pi e sensor de umidade
  5. Raspberry Pi GPIO com sensor de movimento PIR:Melhor tutorial
  6. Usando o sensor de radar pulsado A111 com um Raspberry Pi
  7. Interface do sensor de movimento HC-SR501 PIR com Raspberry Pi
  8. Python / MicroPython Sensor Logger com Planilhas Google
  9. Windows 10 IoT Core no Raspberry Pi 2 - Dados do sensor Adafruit
  10. Circuito de desligamento Raspberry Pi com modo de espera