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

Medidor de chuva do balde basculante

Componentes e suprimentos

Arduino Nano R3
× 1
Tiny RTC I2C DS1307
× 1
Módulo de cartão SD - LC Studios
× 1
Fonte de alimentação de 7-12 VCC (ou verruga de parede)
× 1
Adafruit LCD padrão - 16x2 branco em azul
× 1
Texas Instruments Shift Register- Serial to Parallel
× 1
Resistor 1k ohm
× 2
Resistor 330 ohm
× 2
Capacitor 100 nF
× 1
Potenciômetro de volta única - 10k ohms
× 1
Botão de pressão de contato momentâneo PCB
× 1
Reed Switch, SPST-NO
× 1
Ímã (7 mm OD x 7 MM de comprimento)
× 1
Placa de protótipo de lado único 5x10CM
× 1

Ferramentas e máquinas necessárias

Impressora 3D (genérica)
Ferro de soldar (genérico)

Sobre este projeto


Este é um pluviômetro basculante, baseado em pluviômetros usados ​​por meteorologistas profissionais. O dispositivo funciona canalizando a água da chuva para um balde basculante que se assemelha a uma gangorra, com cada extremidade tendo um balde que contém aproximadamente 2 ml de água da chuva. Quando um lado enche, o balde inclina e a água da chuva começa a se acumular no balde oposto. Cada vez que o balde inclina, uma chave de palheta é temporariamente ligada, enviando um sinal para a interrupção do hardware do Arduino. O Arduino rastreia cada 'ponta' do balde e converte as 'pontas' em quantidade de chuva (polegadas de chuva), com base no volume do balde e na área da superfície do reservatório de coleta (16.605 pol²).

A unidade de exibição interna tem um menu selecionado para mostrar os totais de 'hora atual', 'hora anterior', 'dia atual' e 'dia anterior'.

Para cada dica de balde, um evento com data marcada é gravado em um arquivo de cartão SD. Este arquivo pode ser importado posteriormente para o Excel para análise e gráficos.

Embora eu não tenha um vídeo mostrando a 'ponta do balde' real, este vídeo mostra um medidor registrando o evento real de chuva.

Etapa 1

Imprima todos os componentes listados. Usei PETG para todos os componentes, pois é um material adequado à exposição aos raios ultravioleta e à exposição à temperatura ambiente para uso externo. Para o filtro superior, certifique-se de desligar todas as camadas horizontais (superior e inferior) para criar o detalhe poroso.

Etapa 2

Antes de iniciar a montagem da placa de circuito do painel frontal, insira o LCD na placa PY-5 * 10CM (sem solda) com o pino 1 do LCD no local do orifício C-1 na placa. Perfure através da placa de desempenho nos locais dos quatro orifícios de montagem da placa de LCD. Agora remova e remova o LCD para montagem posterior.

Etapa 3

Monte a placa de circuito do painel frontal. Coloque o CI do registrador de deslocamento 74HC595N, interruptores e resistores conforme mostrado. Passe todos os fios necessários (consulte o diagrama de fiação) para os pontos de localização que serão fixados ao display LCD, bem como o comprimento de 6 "que se estenderá para ser posteriormente conectado à segunda placa.

Etapa 4

Monte o LCD na placa do painel frontal, usando os espaçadores impressos para levantar o LCD e limpar o IC. Prenda usando parafusos e porcas de 3 mm x 15 mm. (Todos os fixadores estão disponíveis através da Fastenal e / ou McMaster Carr)

Etapa 5

Monte a placa de circuito principal inserindo o Arduino com o pino D12 no local do orifício R27 na placa de circuito. Adicione capacitores e resistores e execute toda a fiação nos locais antes de inserir os módulos SD e RTC. Esquema de fiação de referência para todos os detalhes.

Etapa 6

Monte o leitor SD nas localizações dos orifícios de A-3 a B-10. Monte o TinyRTC nos locais dos orifícios C-24 a I-24. Solde todas as conexões.

Etapa 7

No gabinete de controle da unidade interna, faça furos em qualquer local que melhor atenda às suas necessidades para os dois fios que irão para a unidade externa, bem como furos para fios vindos de fonte de alimentação externa ou verruga na parede. Passe os fios pelo gabinete e solde nos locais apropriados. Deslize a placa principal na caixa e prenda com dois parafusos longos de 3 mm x 6 mm. Insira o botão de pressão do interruptor através da tampa frontal e prenda a placa de circuito frontal ao painel frontal com parafusos de 3 mm x 6 mm de comprimento. Nota:usei uma pequena peça de latão torneada para o botão de interruptor em vez da parte impressa, porque gostei mais da 'sensação' dela.

Etapa 8

Prenda a tampa frontal usando o parafuso de cabeça chata M3-0,5 x 10 mm de comprimento

.

Etapa 9

Conecte o USB ao PC e carregue o programa RTC para definir a hora. Depois de definir o relógio, carregue o programa principal. Insira o cartão SD. Teste a unidade colocando em curto os fios que vão para o interruptor reed na unidade externa. O total da precipitação deve aumentar para cada evento de curto-circuito (contato fechado). Verifique se o cartão SD está lendo a data em um editor de texto, como Bloco de notas ou WordPad em um computador. Deve haver um arquivo chamado "Text.txt". O arquivo terá um carimbo de data para cada evento de 'dica'.

Etapa 10

Anexe a chave de palheta à sub-base. Use amarras de arame para mantê-las no lugar. Monte um ímã no balde e monte o balde com um pedaço curto de tubo de latão de 1/8 "de diâmetro (cerca de 2" de comprimento). Antes de montar, execute uma broca de 1/8 "nos orifícios do balde para limpar. O balde precisa inclinar-se facilmente, sem atrito. Use uma pequena lima redonda nos furos do balde, se necessário. Adicione uma pequena arruela de 1/8" no lado externo do balde para fechar ligeiramente o espaçamento. Determine como você montará a unidade externa. Usei um ângulo de alumínio de 1 ". Fixe a base ao ângulo ou suporte usando parafusos hexagonais 1 / 4-20 instalados de dentro para fora. Fixe a sub-base à parte inferior da unidade externa usando parafusos M3-0,5x 10 mm.

Etapa 11

Insira o funil no compartimento superior. Corte aprox. 24 peças de arame galvanizado de calibre 18 de 2 "de comprimento. Segurando um pedaço de arame com um alicate, aqueça com uma tocha ou isqueiro e pressione cuidadosamente a tampa de plástico. Esses arames impedirão os pássaros de pousar na unidade. Você quer medir a quantidade de chuva não é cocô de pássaro. Prenda a parte superior ao invólucro principal com (4) parafusos M3-0,5x 6 mm. Instale o filtro na parte superior do funil. Este filtro manterá as folhas fora e evitará entupimento. Lembre-se de verificar ocasionalmente e limpar conforme necessário.

Etapa 12

Monte a unidade externa e passe os fios para a unidade interna. Certifique-se de que o topo da unidade externa esteja nivelado em ambas as direções.

Etapa 13

Ligue a unidade e adicione água à unidade externa para verificar a operação.

Etapa 14 (opcional)

Para verificar a precisão, você pode adicionar LENTAMENTE um copo de água e verificar se a unidade mede 0,87 "de chuva. (Um copo =14,44 polegadas cúbicas. A área do coletor é 16,605" [chuva =14,44 cu.in. /16.605"=0.87 "]. Você pode ajustar o fator de correção no programa principal se sua unidade for diferente da minha.

Parabéns!! Desfrute da capacidade de monitorar sua precipitação.

Código

  • Código Arduino para definir a hora no RTC
  • Código do Arduino do programa principal para pluviômetro
Código Arduino para definir a hora no RTC Arduino
Carregue este código primeiro para definir a hora no RTC. Edite o código com data e hora reais antes de fazer o upload para o Arduino.
 #include "Wire.h" #define DS1307_I2C_ADDRESS 0x68 // o endereço I2C de Tiny RTCbyte segundo, minuto, hora, dayOfWeek, dayOfMonth, mês, ano; / / Converter números decimais normais em números decimais codificados em binário decToBcd (byte val) {return ((val / 10 * 16) + (val% 10));} // Converte decimais codificados em binários em números decimais normaisbyte bcdToDec (byte val) {return ((val / 16 * 10) + (val% 16));} // Função para definir a hora atual, altere o segundo e o minuto e a hora para o timevoid correto setDateDs1307 () {second =00; minute =11; hour =12; dayOfWeek =5; dayOfMonth =24; mês =7; ano =20; Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (decToBcd (0)); Wire.write (decToBcd (segundo)); // 0 ao bit 7 inicia o clockWire.write (decToBcd (minuto)); Wire.write (decToBcd (hora)); // Se você deseja 12 horas am / pm, você precisa definir // bit 6 (também precisa alterar readDateDs1307) Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (mês)); Wire.write (decToBcd (ano)); Wire.endTransmission ();} // Função para obter a data e hora do ds1307 e imprime resultvoid getDateDs1307 () {// Redefina o registro pointerWire.beginTransmission ( DS1307_I2C_ADDRESS); Wire.write (decToBcd (0)); Wire.endTransmission (); Wire.requestFrom (DS1307_I2C_ADDRESS, 7); segundo =bcdToDec (Wire.read () &0x7f); minuto =bcdToDec (Wire.read () ); hora =bcdToDec (Wire.read () &0x3f); // É necessário alterar isso se 12 horas am / pmdayOfWeek =bcdToDec (Wire.read ()); dayOfMonth =bcdToDec (Wire.read ()); mês =bcdToDec (Wire.read ()); ano =bcdToDec (Wire. read ()); Serial.print (hora, DEC); Serial.print (":"); Serial.print (minuto, DEC); Serial.print (":"); Serial.print (segundo, DEC); Serial.print (""); Serial.print (mês, DEC); Serial.print ("/"); Serial.print (dayOfMonth, DEC); Serial.print ("/"); Serial.print (ano, DEC); Serial.print (""); Serial.println (); // Serial.print ("Dia da semana:");} void setup () {Wire.begin (); Serial.begin (19200); setDateDs1307 (); // Define a hora atual;} void loop () {delay (2000); getDateDs1307 (); // obtém os dados de tempo do minúsculo RTC} 
Código do Arduino do programa principal para pluviômetro Arduino
Programa principal para pluviômetro. Certifique-se de instalar todas as bibliotecas associadas antes de compilar seu programa. Site de referência [https://roboindia.com/tutorials/arduino-3-pin-serial-lcd/] para obter instruções sobre como atualizar a biblioteca LiquidCrystal.
 / * Tipping Bucket Rain GaugeEscrito por Bob Torrence * / # include  #include  #include  #include "RTClib.h" #include  // inclui a Biblioteca LiquidCrystal (versão especial) ref https://roboindia.com/ tutorials / arduino-3-pin-serial-lcd /// Definição de LCD e pinos para interface.LiquidCrystal_SR lcd (6, 5, 9); // Pino 6 - Habilitar dados / SER, Pino 5 - Relógio / SCL, Pino 9 -SCKRTC_DS3231 rtc; int backlight =7; // o pino que o LED está conectado ao pino 7 (D7) // as constantes não mudam. Eles são usados ​​aqui para definir os números dos pinos:const byte interruptPin_bucket =3; const byte interruptPin_menu =2; // As variáveis ​​serão alteradas:volatile int Bucket_Tip_Occurence; volatile int Menu_Select; float Bucket_tip_hour_total =0; float Bucket_tip_total_total_hour_total =0; float Bucket_tip_total_total_hour_total =0;; float Bucket_tip_current_day_total =0; float Bucket_tip_previous_day_total =0; int current_minute; int loop_minute; int current_hour; int loop_hour; int current_day; int loop_day; int tip_counter; float conversion_factor =.00854; // polegadas de chuva por ponta - calculado medindo o volume do balde e a área do coletor (16.605 sq.in.) volatile unsigned long backlightOfftime; volatile unsigned long backlightOnDuration =30000; // duração (milissegundos) que a luz de fundo permanece acesa após o botão de seleção do menu pushString print_time (DateTime timestamp) {char message [120]; int Ano =carimbo de data / hora.ano (); int Mês =carimbo de data / hora.mês (); int Day =timestamp.day (); int Hour =timestamp.hour (); int Minuto =carimbo de data / hora.minuto (); segundo int =carimbo de data / hora.segundo (); sprintf (mensagem, "% 02d:% 02d:% 02d% 02d /% 02d", hora, minuto, segundo, mês, dia); mensagem de retorno;} Arquivo meuArquivo; void setup () {lcd.begin (16,2); // Inicializa a interface para a tela LCD e especifica as dimensões (largura e altura) do display lcd.home (); // Configurando o Cursor na página inicial, ou seja, 0,0 rtc.begin (); // iniciar o uso das variáveis ​​do relógio em tempo real pinMode (10, OUTPUT); pinMode (luz de fundo, SAÍDA); // Declara o LED como uma saída digitalWrite (backlight, HIGH); // liga a luz de fundo do lcd backlightOfftime =millis () + backlightOnDuration; // define o retardo de tempo inicial para que a luz de fundo do LCD esteja ligada if (! SD.begin (4)) {lcd.print ("inserir cartão SD"); Retorna; } // Configure nosso pino digital como uma interrupção para o balde pinMode (interruptPin_bucket, INPUT_PULLUP); attachInterrupt (digitalPinToInterrupt (interruptPin_bucket), contagem, FALLING); // Configure nosso pino digital como uma interrupção para o balde pinMode (interruptPin_menu, INPUT_PULLUP); attachInterrupt (digitalPinToInterrupt (interruptPin_menu), menu, RISING); meuArquivo =SD.open ("test.txt", FILE_WRITE); if (myFile) {myFile.println ("Rain Gauge Ready - unidade ligada"); meuArquivo.close (); } DateTime now =rtc.now (); current_minute =now.minute (); loop_minute =now.minute (); hora_atual =agora.horas (); loop_hour =now.hour (); lcd.setCursor (0,0); lcd.print (print_time (now)); // Imprime "Arduino" no LCD lcd.setCursor (1,1); lcd.print ("Rain Gauge"); } void loop () {DateTime now =rtc.now (); current_minute =now.minute (); loop_minute =now.minute (); hora_atual =agora.horas (); loop_hour =now.hour (); current_day =now.day (); loop_day =now.day (); // Comece o Loop para determinar os totais do dia atual de contagem while (loop_day - current_day ==0) {// Comece o Loop para determinar os totais de horas atuais do registro enquanto (loop_hour - current_hour ==0) {if (millis ()> backlightOfftime) {digitalWrite (luz de fundo, BAIXA); } if (Bucket_Tip_Occurence ==1) {Bucket_Tip_Occurence =0; tip_contador =tip_counter + 1; DateTime now =rtc.now (); meuArquivo =SD.open ("test.txt", FILE_WRITE); meuArquivo.print ("Evento"); meuArquivo.print (agora.ano (), DEC); meuArquivo.print ('/'); meuArquivo.print (agora.mês (), DEC); meuArquivo.print ('/'); myFile.print (now.day (), DEC); meuArquivo.print (""); myFile.print (now.hour (), DEC); meuArquivo.print (':'); meuArquivo.print (agora.minuto (), DEC); meuArquivo.print (':'); meuArquivo.print (agora.segundo (), DEC); meuArquivo.print (""); meuArquivo.print (fator_de_conversão, 5); meuArquivo.println (); meuArquivo.close (); atraso (200); } else {// Verifique o status da hora atual DateTime now =rtc.now (); loop_hour =now.hour ();} switch (Menu_Select) {case 1:lcd.clear (); lcd.setCursor (0,0); lcd.print ("Hora Atual"); lcd.setCursor (0,1); lcd.print (tip_counter * conversion_factor); atraso (500); pausa; caso 2:lcd.clear (); lcd.setCursor (0,0); lcd.print ("Hora Anterior"); lcd.setCursor (0,1); lcd.print (Bucket_tip_previous_hour_total); atraso (500); pausa; caso 3:lcd.clear (); lcd.setCursor (0,0); lcd.print ("Dia Atual"); lcd.setCursor (0,1); lcd.print (Bucket_tip_current_day_total + tip_counter * conversion_factor); atraso (500); pausa; caso 4:lcd.clear (); lcd.setCursor (0,0); lcd.print ("Dia anterior"); lcd.setCursor (0,1); lcd.print (Bucket_tip_previous_day_total); // lcd.print (print_time (now)); atraso (500); pausa; }} DateTime now =rtc.now (); // Reinicia os contadores para o próximo loop de uma hora current_hour =now.hour (); loop_day =now.day (); loop_hour =now.hour (); // Totalize o total da hora atual Bucket_tip_previous_hour_total =tip_counter * conversion_factor; Bucket_tip_current_day_total =Bucket_tip_previous_hour_total + Bucket_tip_current_day_total; tip_counter =0; / * Gravação de arquivo opcional com total de hora em hora myFile =SD.open ("test.txt", FILE_WRITE); myFile.print ("Resumo por hora"); meuArquivo.print (Bucket_tip_previous_hour_total); meuArquivo.print (agora.ano (), DEC); meuArquivo.print ('/'); meuArquivo.print (agora.mês (), DEC); meuArquivo.print ('/'); myFile.print (now.day (), DEC); meuArquivo.print (""); myFile.print (now.hour (), DEC); meuArquivo.print (':'); meuArquivo.print (agora.minuto (), DEC); meuArquivo.print (':'); meuArquivo.print (agora.segundo (), DEC); meuArquivo.print (""); meuArquivo.print (Bucket_tip_previous_hour_total); meuArquivo.println (); meuArquivo.close (); atraso (200); * /} // Totaliza o total da hora atual Bucket_tip_previous_day_total =Bucket_tip_current_day_total; Bucket_tip_current_day_total =0; Bucket_tip_current_hour_total =0; tip_counter =0; / * Gravação de arquivo opcional com total do dia anterior apenas myFile =SD.open ("test.txt", FILE_WRITE); myFile.print ("Total de dias"); meuArquivo.print (Bucket_tip_previous_day_total); meuArquivo.print (print_time (now)); meuArquivo.close (); * /} // inicia a interrupção do balde reed switchvoid count () {static unsigned long last_interrupt_time_bucket =0; longa interrupção sem sinal_time_bucket =millis (); // Se as interrupções vierem mais rápido do que 300ms, assuma que é um salto e ignore if (interrupt_time_bucket - last_interrupt_time_bucket> 300) {Bucket_Tip_Occurence =1; } last_interrupt_time_bucket =interrupt_time_bucket;} // iniciar interrupção do menu alternar switchvoid menu () {static unsigned long last_interrupt_time_menu =0; longo sem sinal interrupt_time_menu =millis (); // Se as interrupções vierem mais rápido do que 300ms, assuma que é um salto e ignore if (interrupt_time_menu - last_interrupt_time_menu> 300) {if (digitalRead (backlight) ==LOW) {digitalWrite (backlight, HIGH); // liga a luz de fundo se estava desligada} else Menu_Select =Menu_Select + 1; if (Menu_Select> 4) {Menu_Select =1; } backlightOfftime =millis () + backlightOnDuration; Menu_Select =Menu_Select; last_interrupt_time_menu =interrupt_time_menu; }} 

Peças personalizadas e gabinetes

Base da unidade STL para impressão 3D ao ar livre. Imprimi com PETG em arquivo 30% infillSTL para impressão 3D da tampa da unidade externa. Imprimi com PETG em 30% do infillSTL Arquivo para funil de unidade externa de impressão 3D. Eu imprimi usando PETG em 30% infill.STL File para filtro de unidade externa de impressão 3D. Imprimi usando PETG com 20% de preenchimento. Esta parte deve ser impressa SEM as camadas inferiores ou superiores horizontais, criando um arquivo de filtro 'poroso' .STL para impressão 3D da sub-base à qual o balde se conecta por meio da haste do pivô. Imprimi usando PETG com 30% de arquivo infill.STL para impressão 3D do balde. Imprimi usando PETG com 30% do arquivo infill.STL para imprimir o gabinete da unidade interna. Imprimi com PETG em arquivo 30% infill.STL para impressão 3D da capa da unidade interna. Imprimi com PETG em arquivo infill.STL de 30% para imprimir espaçadores para manter a unidade LCD elevada acima do IC do registrador de deslocamento. Imprimi usando PETG a 30% de enchimento. Modelo Fusion 360 de unidade externa rain_gauge_assembly ___ menor_profile_v15_CFg0dGwM8s.f3d.STP arquivo da unidade externa rain_gauge_assembly ___ menor_profile_v15_jWCS0hjSDq.stepSTEP Modelo Cad da unidade interna controller_box_v1_fwltgu6D0S.stepFusion 36 Modelo CAD da unidade externa controller_box_v1_NxtSrPG4Vo.f3zSTL arquivo para impressão 3D do botão de comando Switch

Esquemas

Esquema de fiação do projeto rain_gauge_NtjqXF6QEw.fzz

Processo de manufatura

  1. Manômetro
  2. Smart Blinds
  3. Word Clock italiano
  4. Mostre-me um medidor de altura digital
  5. Entendendo o calibre de parafuso do micrômetro
  6. Entendendo o manômetro
  7. Entendendo o medidor de tensão
  8. Entendendo o medidor Pirani
  9. Entendendo o medidor de pressão do diafragma
  10. Entendendo o manômetro de Bourdon