Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Regenmeter voor kantelbak

Componenten en benodigdheden

Arduino Nano R3
× 1
Kleine RTC I2C DS1307
× 1
SD-kaartmodule - LC Studios
× 1
7-12 VDC voeding (of muurwrat)
× 1
Adafruit Standaard LCD - 16x2 Wit op Blauw
× 1
Texas Instruments Shift Register- Serieel naar Parallel
× 1
Weerstand 1k ohm
× 2
Weerstand 330 ohm
× 2
Condensator 100 nF
× 1
Single Turn Potentiometer - 10k ohm
× 1
PCB Momentary Contact Drukknopschakelaar
× 1
Reed-schakelaar, SPST-NO
× 1
Magneet (7 mm buitendiameter x 7 mm lang)
× 1
5x10CM enkelzijdig prototypebord
× 1

Benodigde gereedschappen en machines

3D-printer (algemeen)
Soldeerbout (algemeen)

Over dit project

Dit is een tipping bucket regenmeter, gebaseerd op regenmeters die gebruikt worden door professionele meteorologen. Het apparaat werkt door regenwater naar een kantelende emmer te leiden die lijkt op een wipplank, met aan elk uiteinde een emmer die ongeveer 2 ml regenwater kan bevatten. Wanneer een kant vol raakt, kantelt de emmer en begint het regenwater zich op te vangen in de tegenoverliggende emmer. Elke keer dat de bucket tipt, wordt tijdelijk een reed-schakelaar ingeschakeld om een ​​signaal naar de Arduino-hardware-interrupt te sturen. De Arduino volgt de 'tip' van elke emmer en converteert de 'tips' naar de hoeveelheid regen (inch regen), op basis van het volume van de emmer en het oppervlak van het opvangreservoir (16,605 vierkante inch).

De binnendisplay heeft een menu om de totalen voor 'huidig ​​uur', 'vorig uur', 'huidige dag' en 'vorige dag' weer te geven.

Voor elke buckettip wordt een gebeurtenis met datumstempel naar een SD-kaartbestand geschreven. Dit bestand kan later in Excel worden geïmporteerd voor analyse en grafieken.

Hoewel ik geen video heb die de daadwerkelijke 'emmertip' laat zien, toont deze video een meter die de daadwerkelijke regenval registreert.

Stap 1

Druk alle vermelde componenten af. Ik heb PETG voor alle componenten gebruikt, omdat het een materiaal is dat goed geschikt is voor blootstelling aan UV-straling en temperatuur voor buitengebruik. Zorg ervoor dat voor het bovenste filter alle horizontale schalen (boven en onder) zijn uitgeschakeld om het poreuze detail te creëren.

Stap 2

Voordat u begint met de montage van de print op het voorpaneel, plaatst u het LCD-scherm op het PY-5*10CM-bord (zonder te solderen) met pin 1 van het LCD-scherm in de C-1-gatlocatie aan het bord. Boor door geperforeerd bord op de locaties van de vier montagegaten van het LCD-bord. Verwijder nu het LCD-scherm voor latere montage.

Stap 3

Monteer de printplaat op het voorpaneel. Plaats 74HC595N Shift Register IC, schakelaars en weerstanden zoals afgebeeld. Leid alle benodigde draden (raadpleeg het bedradingsschema) naar de locatiepunten die aan het LCD-scherm worden bevestigd, evenals een lengte van 6 inch die zal worden verlengd om later op het tweede bord te worden aangesloten.

Stap 4

Monteer het LCD-scherm op het voorpaneelbord en gebruik de gedrukte afstandhouders om het LCD-scherm omhoog te brengen om het IC vrij te maken. Bevestig met 3 mm x 15 mm dopschroeven en moeren. (Alle bevestigingsmiddelen zijn verkrijgbaar via Fastenal en/of McMaster Carr)

Stap 5

Monteer de hoofdprintplaat door Arduino met pin D12 op de gatlocatie R27 op de printplaat te plaatsen. Voeg condensator en weerstanden toe en leid alle bedrading naar locaties voordat u SD- en RTC-modules plaatst. Referentie bedradingsschema voor alle details.

Stap 6

Monteer de SD-lezer op de gatenlocaties A-3 tot en met B-10. Monteer TinyRTC op hole-locaties C-24 tot en met I-24. Soldeer alle verbindingen.

Stap 7

Boor in de besturingsbehuizing van de binnenunit gaten op de locatie die het beste aan uw behoeften voldoet voor de twee draden die naar de buiteneenheid gaan, evenals gaten voor draden die afkomstig zijn van externe voeding of muurwrat. Leid de draden door de behuizing en soldeer ze op de juiste plaatsen. Schuif het moederbord in de behuizing en bevestig met twee 3 mm x 6 mm lange schroeven. Steek de drukknop voor de schakelaar door de voorklep en bevestig de voorste printplaat aan het voorpaneel met 3 mm x 6 mm lange schroeven. Opmerking:ik heb een klein gedraaid koperen stuk gebruikt voor de schakelknop in plaats van het gedrukte deel, omdat ik het 'gevoel' ervan beter vond.

Stap 8

Bevestig de voorklep met een M3-0,5 x 10 mm lange platte schroef

.

Stap 9

Sluit USB aan op pc en upload het RTC-programma om de tijd in te stellen. Nadat de klok is ingesteld, uploadt u het hoofdprogramma. SD-kaart plaatsen. Test de unit door de kabels die naar de reed-schakelaar op de buitenunit gaan kort te sluiten. De totale regenval moet toenemen voor elke gebeurtenis van kortsluiting (contact gesloten). Controleer of de SD-kaart de datum leest door te lezen met een teksteditor zoals Kladblok of WordPad op een computer. Er zou een bestand moeten zijn met de naam "Text.txt". Bestand heeft een datumstempel voor elke 'tip'-gebeurtenis.

Stap 10

Bevestig de reed-schakelaar aan de subbasis. Gebruik draadbinders om ze op hun plaats te houden. Monteer een magneet op de bok en monteer de emmer met een kort stuk koperen buis met een diameter van 1/8 inch (ongeveer 2 inch lang). Let op:voer voor het monteren een boor van 1/8" door de gaten in de emmer om schoon te maken. De emmer moet gemakkelijk en zonder wrijving kunnen kantelen. Gebruik indien nodig een kleine ronde vijl in de emmergaten. Voeg een kleine 1/8" ring toe aan de buitenste kant van de emmer om de afstand iets te verkleinen. Bepaal hoe u de buitenunit monteert. Ik gebruikte een aluminium hoek van 1 ". Bevestig de basis aan de hoek of beugel met behulp van 1/4-20 zeskantbouten die van binnen naar buiten zijn geïnstalleerd. Bevestig de basis aan de onderkant van de buitenunit met M3-0,5x 10 mm schroeven.

Stap 11

Steek de trechter in de bovenste behuizing. Snijd ca. 24 stuks 2 "lengte 18 gauge gegalvaniseerde draad. Houd een stuk draad vast met een tang, verwarm met een fakkel of aansteker en druk voorzichtig in de plastic bovenkant. Deze draden zullen vogels ervan weerhouden om op het apparaat te gaan zitten. U wilt de hoeveelheid regen meten geen vogelpoep. Bevestig de bovenkant aan de hoofdbehuizing met (4) M3-0,5x 6 mm schroeven. Installeer het filter in de bovenkant van de trechter. Dit filter houdt bladeren buiten en voorkomt verstopping. Vergeet niet om af en toe te controleren en indien nodig schoon te maken.

Stap 12

Monteer de buitenunit en leid de draden naar de binnenunit. Zorg ervoor dat de bovenkant van de buitenunit in beide richtingen waterpas is.

Stap 13

Schakel de unit in en voeg water toe aan de buitenunit om de werking te controleren.

Stap 14 (optioneel)

Om de nauwkeurigheid te controleren, kunt u heel LANGZAAM een kopje water toevoegen en controleren of de eenheid 0,87" regenval meet. /16.605"=0.87"]. U kunt de correctiefactor in het hoofdprogramma aanpassen als uw eenheid verschilt van de mijne.

Gefeliciteerd!! Geniet ervan om je regenval te kunnen volgen.

Code

  • Arduino-code om tijd in te stellen op RTC
  • Hoofdprogramma Arduino-code voor regenmeter
Arduino-code om tijd in te stellen op RTCArduino
Laad eerst deze code om de tijd op RTC in te stellen. Bewerk de code met de werkelijke datum en tijd voordat u deze naar Arduino uploadt.
#include "Wire.h"#define DS1307_I2C_ADDRESS 0x68 // het I2C-adres van Tiny RTCbyte seconde, minuut, uur, dayOfWeek, dayOfMonth, maand, jaar;/ / Converteer normale decimale getallen naar binair gecodeerde decimale byte decToBcd(byte val){return ((val/10*16) + (val%10));}// Converteer binair gecodeerde decimaal naar normale decimale getallenbyte bcdToDec(byte val){return ( (val/16*10) + (val%16));}// Functie om de huidige tijd in te stellen, verander de seconde&minuten&uur in de juiste timevoid setDateDs1307(){second =00;minute =11;hour =12;dayOfWeek =5;dayOfMonth =24;maand =7;jaar=20;Wire.beginTransmission(DS1307_I2C_ADDRESS);Wire.write(decToBcd(0));Wire.write(decToBcd(second)); // 0 tot bit 7 start de clockWire.write(decToBcd(minute));Wire.write(decToBcd(hour)); // Als u 12 uur am/pm wilt, moet u // bit 6 instellen (moet ook readDateDs1307 wijzigen)Wire.write(decToBcd(dayOfWeek));Wire.write(decToBcd(dayOfMonth));Wire.write(decToBcd (maand));Wire.write(decToBcd(year));Wire.endTransmission();}// Functie om de datum en tijd van de ds1307 op te halen en het resultaat af te drukken getDateDs1307(){// Reset de registerpointerWire.beginTransmission( DS1307_I2C_ADDRESS);Wire.write(decToBcd(0));Wire.endTransmission();Wire.requestFrom(DS1307_I2C_ADDRESS, 7);second =bcdToDec(Wire.read() &0x7f);minuten =bcdToDec(Wire.read() );hour =bcdToDec(Wire.read() &0x3f); // Moet dit wijzigen als 12 uur am/pmdayOfWeek =bcdToDec(Wire.read());dayOfMonth =bcdToDec(Wire.read());month =bcdToDec(Wire.read());year =bcdToDec(Wire. read());Serial.print(uur, DEC);Serial.print(":");Serial.print(minuut, DEC);Serial.print(":");Serial.print(seconde, DEC); Serial.print(" ");Serial.print(maand, DEC);Serial.print("/");Serial.print(dayOfMonth, DEC);Serial.print("/");Serial.print(jaar, DEC);Serial.print(" ");Serial.println();//Serial.print("Dag van de week:");}void setup() {Wire.begin();Serial.begin (19200); setDateDs1307(); //Stel de huidige tijd in;}void loop(){delay(2000);getDateDs1307();//haal de tijdgegevens van kleine RTC}
Hoofdprogramma Arduino-code voor regenmeterArduino
Hoofdprogramma voor regenmeter. Zorg ervoor dat u alle bijbehorende bibliotheken installeert voordat u uw programma compileert. Referentiewebsite [https://roboindia.com/tutorials/arduino-3-pin-serial-lcd/] voor instructies over het bijwerken van de LiquidCrystal-bibliotheek.
/*Tipping Bucket Rain GaugeWritten by Bob Torrence*/#include #include #include #include "RTClib.h"#include  // omvat de LiquidCrystal Library (speciale versie) ref https://roboindia.com/ tutorials/arduino-3-pin-serial-lcd/// Definiëren van LCD en pinnen voor interfacing.LiquidCrystal_SR lcd (6, 5, 9); // Pin 6 - Gegevens inschakelen/ SER, Pin 5 - Klok/SCL, Pin 9 -SCKRTC_DS3231 rtc;int achtergrondverlichting =7; // de pin waarop de LED is aangesloten op pin 7 (D7)// constanten veranderen niet. Ze worden hier gebruikt om pinnummers in te stellen:const byte interruptPin_bucket =3;const byte interruptPin_menu =2;// Variabelen zullen veranderen:volatile int Bucket_Tip_Occurence;volatile int Menu_Select;float Bucket_tip_hour_total =0;float Bucket_tip_current_hour_total =0;float Bucket_tip_current_hour_total =0;float Bucket_tip_current_hour_total =0;;float Bucket_tip_current_day_total =0;float Bucket_tip_previous_day_total =0;int huidige_minuut;int loop_minuut;int current_hour;int loop_hour;int huidige_dag;int loop_day;int tip_counter;float conversiefactor =.00854; // inches regen per tip - berekend door het meten van het emmervolume en de oppervlakte van de collector (16,605 sq.in.)vluchtige niet-ondertekende lange achtergrondverlichtingOfftime;vluchtige niet-ondertekende lange achtergrondverlichtingOnDuration=30000; // duur (miiliseconden) dat de achtergrondverlichting aan blijft nadat de menuselectieknop is ingedrukt. String print_time (DateTime-tijdstempel) {char message [120]; int Jaar =tijdstempel.jaar(); int Maand =tijdstempel.maand(); int Dag =tijdstempel.dag(); int uur =tijdstempel.uur(); int Minuut =tijdstempel.minuut(); int Second=timestamp.second(); sprintf(bericht, "%02d:%02d:%02d %02d/%02d", uur, minuut, seconde, maand, dag); retourbericht;}File myFile;void setup() { lcd.begin (16,2); // Initialiseert de interface naar het LCD-scherm en specificeert de afmetingen (breedte en hoogte) van het scherm lcd.home(); // Cursor thuis instellen, d.w.z. 0,0 rtc.begin(); //gebruik van Real Time Clock-variabelen pinMode (10, OUTPUT); pinMode (achtergrondverlichting, UITGANG); // Verklaar de LED als een output digitalWrite (achtergrondverlichting, HOOG); // schakel lcd-achtergrondverlichting in backlightOfftime =millis() + backlightOnDuration; // stel de initiële vertraging in voor de LCD-achtergrondverlichting als (!SD.begin (4)) { lcd.print ("insert SD Card"); opbrengst; } // Stel onze digitale pin in als een interrupt voor bucket pinMode (interruptPin_bucket, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(interruptPin_bucket), count, FALLING); // Stel onze digitale pin in als een interrupt voor bucket pinMode (interruptPin_menu, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(interruptPin_menu), menu, RISING); mijnBestand =SD.open("test.txt", FILE_WRITE); if (myFile) { myFile.println("Regenmeter Ready - unit ingeschakeld"); mijnBestand.close(); } DateTime nu =rtc.now(); huidige_minuut =nu.minuut(); loop_minute =nu.minute(); huidig_uur =nu.uur(); loop_hour =nu.uur(); lcd.setCursor (0,0); lcd.print(print_time(nu)); // Drukt "Arduino" af op het LCD lcd.setCursor (1,1); lcd.print("Regenmeter"); }void loop(){ DateTime now =rtc.now(); huidige_minuut =nu.minuut(); loop_minute =nu.minute(); huidig_uur =nu.uur(); loop_hour =nu.uur(); huidige_dag =nu.dag(); loop_day =nu.dag(); //Begin Loop om de telling van de huidige dagtotalen te bepalen terwijl (loop_day - current_day ==0){ //Begin Loop om de telling van de huidige uurtotalen te bepalen while (loop_hour - current_hour ==0){ if (millis()> backlightOfftime) {digitalWrite (achtergrondverlichting, LAAG); } if (Bucket_Tip_Occurence ==1) { Bucket_Tip_Occurence =0; tip_counter =tip_counter + 1; DateTime nu =rtc.now(); mijnBestand =SD.open("test.txt", FILE_WRITE); mijnBestand.print("Gebeurtenis "); myFile.print(nu.jaar(), DEC); mijnBestand.print('/'); myFile.print(nu.maand(), DEC); mijnBestand.print('/'); myFile.print(nu.day(), DEC); mijnBestand.print(" "); myFile.print(now.hour(), DEC); mijnBestand.print(':'); myFile.print(nu.minute(), DEC); mijnBestand.print(':'); myFile.print(now.second(), DEC); mijnBestand.print(" "); mijnBestand.print(conversiefactor,5); mijnBestand.println(); mijnBestand.close(); vertraging (200); } else { //Controleer de huidige uurstatus DateTime now =rtc.now(); loop_hour=now.hour();} switch (Menu_Select) { case 1:lcd.clear(); lcd.setCursor(0,0); lcd.print("Huidig ​​uur"); lcd.setCursor(0,1); lcd.print(tip_counter * conversiefactor); vertraging (500); pauze; geval 2:lcd.clear(); lcd.setCursor(0,0); lcd.print("Vorige uur"); lcd.setCursor(0,1); lcd.print(Bucket_tip_previous_hour_total); vertraging (500); pauze; geval 3:lcd.clear(); lcd.setCursor(0,0); lcd.print("Huidige dag"); lcd.setCursor(0,1); lcd.print(Bucket_tip_current_day_total + tip_counter * conversiefactor); vertraging (500); pauze; geval 4:lcd.clear(); lcd.setCursor(0,0); lcd.print("Vorige dag"); lcd.setCursor(0,1); lcd.print(Bucket_tip_previous_day_total); // lcd.print(print_time(nu)); vertraging (500); pauze; } } DateTime nu =rtc.now(); // Reset tellers voor het volgende uur loop current_hour =now.hour(); loop_day =nu.dag(); loop_hour=now.hour(); // Totaliseer het huidige uurtotaal Bucket_tip_previous_hour_total =tip_counter * conversiefactor; Bucket_tip_current_day_total =Bucket_tip_previous_hour_total + Bucket_tip_current_day_total; tip_counter =0; /* Optioneel bestand schrijven met alleen per uur totaal myFile =SD.open("test.txt", FILE_WRITE); myFile.print("Uuroverzicht "); myFile.print(Bucket_tip_previous_hour_total); myFile.print(nu.jaar(), DEC); mijnBestand.print('/'); myFile.print(nu.maand(), DEC); mijnBestand.print('/'); myFile.print(nu.day(), DEC); mijnBestand.print(" "); myFile.print(now.hour(), DEC); mijnBestand.print(':'); myFile.print(nu.minute(), DEC); mijnBestand.print(':'); myFile.print(now.second(), DEC); mijnBestand.print(" "); myFile.print(Bucket_tip_previous_hour_total); mijnBestand.println(); mijnBestand.close(); vertraging (200); */ } //Totaal huidige uur totaal 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;/* Optioneel bestand schrijven met alleen het totaal van de vorige dag myFile =SD.open("test.txt", FILE_WRITE); myFile.print("Dagtotaal "); myFile.print(Bucket_tip_previous_day_total); mijnBestand.print(print_time(nu)); mijnBestand.close(); */} // begin interrupt fromm bucket reed switchvoid count () { static unsigned long last_interrupt_time_bucket =0; niet-ondertekende lange interrupt_time_bucket =millis(); // Als interrupts sneller dan 300 ms komen, neem dan aan dat het een bounce is en negeer if (interrupt_time_bucket - last_interrupt_time_bucket> 300) {Bucket_Tip_Occurence =1; } last_interrupt_time_bucket =interrupt_time_bucket;}//initiate interrupt fromm menu toggle switchvoid menu() { static unsigned long last_interrupt_time_menu =0; unsigned long interrupt_time_menu =millis(); // Als interrupts sneller dan 300 ms komen, neem dan aan dat het een bounce is en negeer if (interrupt_time_menu - last_interrupt_time_menu> 300) { if (digitalRead(backlight)==LOW) { digitalWrite(backlight,HIGH); // schakelt de achtergrondverlichting in als deze eerder uit was } 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; }}

Aangepaste onderdelen en behuizingen

STL voor 3D-printen Basis van de buitenunit. Ik heb geprint met PETG met 30% infillSTL-bestand voor 3D-printen van buitenunitafdekking. Ik heb geprint met PETG met 30% infillSTL-bestand voor 3D-printen van de trechter van de buitenunit. Ik heb geprint met PETG met 30% infill.STL File for 3D Printing outdoor unit filter. Ik heb geprint met PETG met 20% vulling. Dit onderdeel moet worden geprint zonder horizontale onder- of bovenlagen, waardoor een 'poreus' filter ontstaat. STL-bestand voor 3D-printen van de onderbouw waaraan de emmer wordt bevestigd door middel van een scharnierstang. Ik heb geprint met PETG met 30% infill.STL File for 3D Printing the bucket. Ik heb afgedrukt met PETG met 30% infill.STL-bestand voor het afdrukken van de behuizing van de binnenunit. Ik heb geprint met PETG met 30% infill.STL-bestand voor 3D Printen van de voorkant van de binnenunit. Ik heb geprint met PETG met 30% infill.STL-bestand om afstandhouders af te drukken om de LCD-eenheid boven het schuifregister-IC te houden. Ik heb geprint met PETG met 30% vulling.Fusion 360-model van buitenunit rain_gauge_assembly___smaller_profile_v15_CFg0dGwM8s.f3d.STP-bestand van buitenunit rain_gauge_assembly___smaller_profile_v15_jWCS0hjSDq.stepSTEP Cad-model van binnenunit controller_box_v1_fwltgu6D0S.stepFusion 36 CAD-model van buitenunit controller_box_v1_NxtSrPG4Vo.f3zSTL-bestand voor 3D-printen van de Switch-drukknop

Schema's

Project bedradingsschema rain_gauge_NtjqXF6QEw.fzz

Productieproces

  1. Manometer
  2. Slimme jaloezieën
  3. Italiaanse Word Clock
  4. Sigfox kWh-meter
  5. Laat me een digitale hoogtemeter zien
  6. Inzicht in de schroefmaat van de micrometer
  7. Manometer begrijpen
  8. Spanningsmeter begrijpen
  9. Pirani-meter begrijpen
  10. Membraandrukmeter begrijpen
  11. Bourdon-drukmeter begrijpen