산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

티핑 버킷 레인 게이지

구성품 및 소모품

Arduino Nano R3
× 1
초소형 RTC I2C DS1307
× 1
SD 카드 모듈 - LC Studios
× 1
7-12VDC 전원 공급 장치(또는 벽 사마귀)
× 1
Adafruit Standard LCD - 파란색 바탕에 16x2 흰색
× 1
Texas Instruments 시프트 레지스터 - 직렬에서 병렬로
× 1
저항 1k 옴
× 2
저항 330옴
× 2
커패시터 100nF
× 1
단일 회전 전위차계 - 10k 옴
× 1
PCB 순간 접촉 푸시버튼 스위치
× 1
리드 스위치, SPST-NO
× 1
자석(외경 7mm x 길이 7mm)
× 1
5x10CM 단면 프로토타입 보드
× 1

필요한 도구 및 기계

3D 프린터(일반)
납땜 인두(일반)

이 프로젝트 정보

이것은 전문 기상학자가 사용하는 우량계를 기반으로 한 티핑 버킷 우량계입니다. 이 장치는 빗물을 티터-토터(teeter-totter)와 유사한 양동이에 쏟아부어 작동하며, 양 끝에 약 2ml의 빗물을 담을 수 있는 양동이가 있습니다. 한쪽이 차면 양동이 팁과 빗물이 반대쪽 양동이에 모이기 시작합니다. 버킷 팁이 있을 때마다 리드 스위치가 일시적으로 켜져 Arduino 하드웨어 인터럽트에 신호를 보냅니다. Arduino는 각 양동이의 '팁'을 추적하고 '팁'을 양동이의 부피와 수집 저수지의 표면적(16.605제곱인치)에 따라 강우량(강우 인치)으로 변환합니다.

실내 표시 장치에는 '현재 시간', '이전 시간', '현재 날짜' 및 '전일' 합계를 표시하도록 메뉴 선택이 있습니다.

각 버킷 팁에 대해 날짜 스탬프 이벤트가 SD 카드 파일에 기록됩니다. 이 파일은 나중에 분석 및 차트 작성을 위해 Excel로 가져올 수 있습니다.

실제 '버킷팁'을 보여주는 영상은 없지만, 이 영상은 실제 강우량을 기록하는 게이지를 보여줍니다.

1단계

나열된 모든 구성 요소를 인쇄합니다. 옥외용으로 UV노출과 온도노출에 적합한 소재이기 때문에 모든 부품에 PETG를 사용하였습니다. 상단 필터의 경우 다공성 디테일을 만들기 위해 모든 수평 쉘(상단 및 하단)을 꺼야 합니다.

2단계

전면 패널 회로 기판의 조립을 시작하기 전에 LCD의 핀 1이 기판의 C-1 구멍 위치에 있는 PY-5*10CM 기판(납땜 없음)에 LCD를 삽입합니다. 4개의 LCD 보드 장착 구멍 위치에서 성능 보드를 뚫습니다. 이제 나중에 조립할 수 있도록 LCD를 제거하십시오.

3단계

전면 패널 회로 기판을 조립합니다. 그림과 같이 74HC595N 시프트 레지스터 IC, 스위치 및 저항기를 배치합니다. 필요한 모든 와이어(배선도 참조)를 LCD 디스플레이에 부착할 위치 지점과 나중에 두 번째 보드에 연결하기 위해 확장될 6인치 길이로 배선합니다.

4단계

인쇄된 스페이서를 사용하여 전면 패널 보드에 LCD를 장착하고 LCD를 들어 올려 IC를 제거합니다. 3mm x15mm 캡 나사와 너트를 사용하여 부착합니다. (모든 패스너는 Fastenal 및/또는 McMaster Carr를 통해 제공됩니다.)

5단계

회로 기판의 홀 위치 R27에 핀 D12가 있는 Arduino를 삽입하여 주 회로 기판을 조립합니다. 커패시터와 저항을 추가하고 SD 및 RTC 모듈을 삽입하기 전에 위치에 모든 배선을 실행합니다. 모든 세부 사항에 대한 참조 배선 도식.

6단계

구멍 위치 A-3 ~ B-10에 SD 리더를 조립합니다. 구멍 위치 C-24에서 I-24까지 TinyRTC를 조립합니다. 모든 연결을 납땜하십시오.

7단계

실내기 제어 인클로저에서 실외기로 가는 2개의 전선과 외부 전원 공급 장치 또는 벽 사마귀에서 오는 전선용 구멍에 대한 요구 사항을 가장 잘 충족하는 위치에 구멍을 뚫습니다. 전선을 인클로저로 통과시키고 적절한 위치에 납땜하십시오. 메인 보드를 케이스에 밀어 넣고 3mm x 6mm 길이의 나사 2개로 부착합니다. 전면 커버를 통해 스위치용 푸시 버튼을 삽입하고 3mm x 6mm 길이의 나사를 사용하여 전면 회로 기판을 전면 패널에 부착합니다. 참고:'느낌'이 더 좋아서 스위치 버튼에 인쇄된 부분 대신 작은 회전 놋쇠 부분을 사용했습니다.

단계 8

M3-0.5 x 10mm 길이 납작머리 나사를 사용하여 전면 덮개를 부착합니다.

.

9단계

USB를 PC에 연결하고 RTC 프로그램을 업로드하여 시간을 설정합니다. 시계 설정 후 메인 프로그램을 업로드 합니다. SD 카드를 삽입합니다. 실외기의 리드 스위치로 가는 리드를 단락시켜 유닛을 테스트합니다. 총 강우량은 각 단락(접점 폐쇄) 이벤트에 대해 증가해야 합니다. 컴퓨터에서 메모장 또는 워드패드와 같은 텍스트 편집기를 사용하여 SD 카드가 날짜를 읽고 있는지 확인하십시오. "Text.txt"라는 파일이 있어야 합니다. 파일에는 각 'tip' 이벤트에 대한 날짜 스탬프가 있습니다.

10단계

서브 베이스에 리드 스위치를 부착합니다. 와이어 타이를 사용하여 제자리에 고정합니다. 벅에 자석을 조립하고 1/8" 지름의 황동 튜브(약 2" 길이)의 짧은 조각으로 버킷을 장착합니다. 조립하기 전에 양동이의 구멍을 통해 1/8" 드릴을 사용하여 청소하십시오. 양동이는 마찰 없이 쉽게 기울어져야 합니다. 필요한 경우 양동이 구멍에 작은 원형 줄을 사용하십시오. 작은 1/8" 와셔를 추가하십시오. 간격을 약간 좁히기 위해 양동이의 가장 바깥쪽. 실외기를 장착할 방법을 결정합니다. 저는 1" 알루미늄 앵글을 사용했습니다. 1/4-20 육각 볼트를 사용하여 베이스를 앵글 또는 브래킷에 부착합니다. M3-0.5x 10mm 나사를 사용하여 서브 베이스를 아웃사이드 유닛 바닥에 부착합니다.

11단계

깔때기를 상단 인클로저에 삽입합니다. 약 잘라. 2" 길이의 18 게이지 아연 도금 와이어 24개. 플라이어로 와이어 조각을 잡고 토치 또는 라이터로 가열하고 플라스틱 상단에 조심스럽게 누릅니다. 이 와이어는 새가 장치에 앉는 것을 방지합니다. 비의 양을 측정하고 싶습니다. 새똥이 아닙니다. M3-0.5x 6mm 나사 4개로 상단을 메인 인클로저에 부착합니다. 깔때기 상단에 필터를 설치합니다. 이 필터는 잎사귀를 막고 막힘을 방지합니다. 가끔 확인하고 필요에 따라 청소하십시오.

12단계

실외기를 장착하고 실내기에 배선을 배선합니다. 실외기 상단이 양방향으로 수평인지 확인하십시오.

단계 13

장치의 전원을 켜고 실외기에 물을 추가하여 작동을 확인합니다.

14단계(선택사항)

정확성을 확인하기 위해 물 한 컵을 아주 천천히 추가하고 단위가 0.87"의 강우량을 측정하는지 확인할 수 있습니다. (한 컵 =14,44 입방인치. 수집 면적은 16.605"[강우량=14.44cu.in. /16.605"=0.87"]. 귀하의 장치가 내 장치와 다른 경우 기본 프로그램에서 보정 계수를 조정할 수 있습니다.

축하 해요!! 강우량을 추적할 수 있습니다.

<섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

코드

<울>
  • RTC에서 시간을 설정하는 Arduino 코드
  • 레인 게이지용 메인 프로그램 Arduino 코드
  • RTCArduino에서 시간을 설정하는 Arduino 코드
    RTC에서 시간을 설정하려면 이 코드를 먼저 로드하세요. Arduino에 업로드하기 전에 실제 날짜와 시간으로 코드를 편집합니다.
    #include "Wire.h#define DS1307_I2C_ADDRESS 0x68 // Tiny RTCbyte의 I2C 주소 초, 분, 시, dayOfWeek, dayOfMonth, month, year;/ / 일반 십진수를 이진 코드 십진수로 변환byte decToBcd(byte val){return ( (val/10*16) + (val%10) );}// 이진 코딩 십진수를 일반 십진수로 변환byte bcdToDec(byte val){return ( (val/16*10) + (val%16) );}// 현재 시간을 설정하는 함수, 초&분&시를 올바른 시간으로 변경 무효 setDateDs1307(){초 =00;분 =11;시 =12;dayOfWeek =5;dayOfMonth =24;월 =7;년=20;Wire.beginTransmission(DS1307_I2C_ADDRESS);Wire.write(decToBcd(0));Wire.write(decToBcd(초)); // 0부터 비트 7은 시계를 시작합니다.Wire.write(decToBcd(분));Wire.write(decToBcd(시간)); // 오전/오후 12시간을 원하면 비트 6을 설정해야 합니다. (month));Wire.write(decToBcd(year));Wire.endTransmission();}// ds1307에서 날짜와 시간을 가져와 결과를 출력하는 함수 getDateDs1307(){// 레지스터 포인터를 재설정합니다.Wire.beginTransmission( DS1307_I2C_ADDRESS);Wire.write(decToBcd(0));Wire.endTransmission();Wire.requestFrom(DS1307_I2C_ADDRESS, 7);초 =bcdToDec(Wire.read() &0x7f);분 =bcdToDec) );시간 =bcdToDec(Wire.read() &0x3f); // 12시간 시 변경해야 함 am/pmdayOfWeek =bcdToDec(Wire.read());dayOfMonth =bcdToDec(Wire.read());month =bcdToDec(Wire.read());year =bcdToDec(Wire. read());Serial.print(시, DEC);Serial.print(":");Serial.print(분, DEC);Serial.print(":");Serial.print(초, DEC); Serial.print(" ");Serial.print(월, DEC);Serial.print("/");Serial.print(dayOfMonth, DEC);Serial.print("/");Serial.print(연도, DEC);Serial.print(" ");Serial.println();//Serial.print("요일:");} 무효 설정() {Wire.begin();Serial.begin(19200); setDateDs1307(); //현재 시간 설정;}void loop(){delay(2000);getDateDs1307();//작은 RTC에서 시간 데이터 가져오기}
    레인 게이지용 메인 프로그램 Arduino 코드Arduino
    레인 게이지의 주요 프로그램. 프로그램을 컴파일하기 전에 관련된 모든 라이브러리를 설치했는지 확인하십시오. LiquidCrystal 라이브러리 업데이트 지침은 웹사이트 [ https://roboindia.com/tutorials/arduino-3-pin-serial-lcd/ ]를 참조하십시오.
    /*Tipping Bucket Rain GaugeWritten by Bob Torrence*/#include #include #include #include "RTClib.h#include  // LiquidCrystal 라이브러리(특수 버전) 포함 참조 https://roboindia.com/ tutorials/arduino-3-pin-serial-lcd/// 인터페이스를 위한 LCD 및 핀 정의.LiquidCrystal_SR lcd(6, 5, 9); // 핀 6 - 데이터 활성화/ SER, 핀 5 - 클록/SCL, 핀 9 -SCKRTC_DS3231 rtc;int 백라이트 =7; // LED가 핀 7(D7)에 연결된 핀 // 상수는 변경되지 않습니다. 여기에서 핀 번호를 설정하는 데 사용됩니다. const byte interruptPin_bucket =3;const byte interruptPin_menu =2; // 변수가 변경됩니다. volatile int Bucket_Tip_Occurence;volatile int Menu_Select;float Bucket_tip_hour_total =0;float Bucket_pretal Bucket_current_hour_total_0;_float_tip_current_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; //팁당 비의 인치 - 버킷 부피와 수집기 면적을 측정하여 계산됨(16.605 sq.in.)volatile unsigned longbacklightOfftime;volatile unsigned longbacklightOnDuration=30000; // 메뉴 선택 버튼을 누른 후 백라이트가 유지되는 시간(밀리초) String print_time(DateTime timestamp) { char message[120]; int 연도 =timestamp.year(); int 월 =timestamp.month(); int 일 =timestamp.day(); int 시간 =timestamp.hour(); int 분 =타임스탬프.분(); int Second =timestamp.second(); sprintf(메시지, "%02d:%02d:%02d %02d/%02d", 시, 분, 초, 월, 일); return message;}파일 myFile;void setup() { lcd.begin(16,2); // LCD 화면에 대한 인터페이스를 초기화하고 디스플레이의 크기(너비 및 높이)를 지정합니다. lcd.home(); // 홈에 커서 설정, 즉 0,0 rtc.begin(); //실시간 클럭 변수 사용 시작 pinMode(10, OUTPUT); 핀모드(백라이트, 출력); // LED를 출력으로 선언 digitalWrite(backlight,HIGH); //LCD 백라이트를 켭니다.backlightOfftime =millis() +backlightOnDuration; //LCD 백라이트를 켜기 위한 초기 시간 지연 설정 if (!SD.begin(4)) { lcd.print("insert SD Card"); 반품; } // 디지털 핀을 버킷에 대한 인터럽트로 설정 pinMode(interruptPin_bucket, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(interruptPin_bucket), 개수, FALLING); // 디지털 핀을 버킷에 대한 인터럽트로 설정 pinMode(interruptPin_menu, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(interruptPin_menu), 메뉴, RISING); myFile =SD.open("테스트.txt", FILE_WRITE); if (myFile) { myFile.println("레인 게이지 준비 - 장치 전원 켜짐"); myFile.close(); } 지금 날짜 시간 =rtc.now(); 현재_분 =지금.분(); loop_minute =now.minute(); current_hour =now.hour(); loop_hour =now.hour(); lcd.setCursor(0,0); lcd.print(print_time(지금)); // LCD에 "Arduino"를 출력합니다. lcd.setCursor(1,1); lcd.print("우량계"); } 무효 루프(){ 현재 날짜 시간 =rtc.now(); 현재_분 =지금.분(); loop_minute =now.minute(); current_hour =now.hour(); loop_hour =now.hour(); current_day =now.day(); loop_day =now.day(); //루프를 시작하여 현재 날짜 합계를 집계합니다. while (loop_day - current_day ==0){ //루프를 시작하여 현재 시간 합계를 집계합니다. (백라이트, 낮음); } if (Bucket_Tip_Occurence ==1) { Bucket_Tip_Occurence =0; 팁_카운터 =팁_카운터 + 1; 현재 날짜 시간 =rtc.now(); myFile =SD.open("테스트.txt", FILE_WRITE); myFile.print("이벤트"); myFile.print(now.year(), DEC); myFile.print('/'); myFile.print(now.month(), DEC); myFile.print('/'); myFile.print(now.day(), DEC); myFile.print(" "); myFile.print(now.hour(), DEC); myFile.print(':'); myFile.print(지금.분(), DEC); myFile.print(':'); myFile.print(now.second(), DEC); myFile.print(" "); myFile.print(conversion_factor,5); myFile.println(); myFile.close(); 지연(200); } else { //현재 시간 상태 확인 DateTime now =rtc.now(); loop_hour=now.hour();} 스위치(Menu_Select) { 경우 1:lcd.clear(); lcd.setCursor(0,0); lcd.print("현재 시간"); lcd.setCursor(0,1); lcd.print(tip_counter * conversion_factor); 지연(500); 부서지다; 사례 2:lcd.clear(); lcd.setCursor(0,0); lcd.print("이전 시간"); lcd.setCursor(0,1); lcd.print(Bucket_tip_previous_hour_total); 지연(500); 부서지다; 사례 3:lcd.clear(); lcd.setCursor(0,0); lcd.print("현재 날짜"); lcd.setCursor(0,1); lcd.print(Bucket_tip_current_day_total + tip_counter * conversion_factor); 지연(500); 부서지다; 사례 4:lcd.clear(); lcd.setCursor(0,0); lcd.print("전날"); lcd.setCursor(0,1); lcd.print(Bucket_tip_previous_day_total); // lcd.print(print_time(지금)); 지연(500); 부서지다; } } 지금 날짜 시간 =rtc.now(); // 다음 1시간 루프에 대한 카운터 재설정 current_hour =now.hour(); loop_day =now.day(); loop_hour=now.hour(); //현재 시간 총계를 합산합니다. Bucket_tip_previous_hour_total =tip_counter * conversion_factor; Bucket_tip_current_day_total =Bucket_tip_previous_hour_total + Bucket_tip_current_day_total; 팁 카운터 =0; /* 시간당 총계만 있는 선택적 파일 쓰기 myFile =SD.open("test.txt", FILE_WRITE); myFile.print("시간별 요약 "); myFile.print(Bucket_tip_previous_hour_total); myFile.print(now.year(), DEC); myFile.print('/'); myFile.print(now.month(), DEC); myFile.print('/'); myFile.print(now.day(), DEC); myFile.print(" "); myFile.print(now.hour(), DEC); myFile.print(':'); myFile.print(지금.분(), DEC); myFile.print(':'); myFile.print(now.second(), DEC); myFile.print(" "); myFile.print(Bucket_tip_previous_hour_total); myFile.println(); myFile.close(); 지연(200); */ } //현재 시간 합계를 합산합니다. 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;/* 전날 총계만 있는 선택적 파일 쓰기 myFile =SD.open("test.txt", FILE_WRITE); myFile.print("총 일수 "); myFile.print(Bucket_tip_previous_day_total); myFile.print(print_time(지금)); myFile.close(); */ } // 버킷 리드에서 인터럽트 시작 switchvoid count() { static unsigned long last_interrupt_time_bucket =0; 서명되지 않은 긴 interrupt_time_bucket =millis(); // 인터럽트가 300ms보다 빠르게 오면 바운스라고 가정하고 무시 if (interrupt_time_bucket - last_interrupt_time_bucket> 300) {Bucket_Tip_Occurence =1; } last_interrupt_time_bucket =interrupt_time_bucket;}//메뉴 토글에서 인터럽트 시작 switchvoid menu() { static unsigned long last_interrupt_time_menu =0; unsigned long interrupt_time_menu =millis(); // 인터럽트가 300ms보다 빠르게 오면 바운스라고 가정하고 무시합니다. if (interrupt_time_menu - last_interrupt_time_menu> 300) { if (digitalRead(backlight)==LOW) { digitalWrite(backlight,HIGH); //이전에 꺼져 있으면 백라이트를 켭니다. } else Menu_Select =Menu_Select + 1; if(메뉴_선택> 4){ 메뉴_선택 =1; }backlightOfftime =millis() +backlightOnDuration;Menu_Select =Menu_Select; last_interrupt_time_menu =인터럽트_시간_메뉴; }}

    맞춤형 부품 및 인클로저

    3D 프린팅용 STL 실외기 베이스. 실외기 커버 3D 프린팅을 위해 30% infillSTL 파일로 PETG로 출력했습니다. 3D 프린팅 실외기 깔때기를 위한 30% infillSTL 파일에서 PETG로 프린팅했습니다. 30% infill에서 PETG를 사용하여 인쇄했습니다. 3D 인쇄 실외기 필터용 STL 파일입니다. PETG를 사용하여 20% 충전재로 인쇄했습니다. 이 부분은 수평 바닥 또는 상단 레이어 없이 인쇄되어야 '다공성' 필터를 생성합니다. 3D 인쇄를 위한 STL 파일 버킷이 피벗 로드를 통해 부착되는 서브 베이스를 인쇄합니다. 나는 30% 채우기가 있는 PETG를 사용하여 인쇄했습니다. 버킷을 3D 인쇄하기 위한 STL 파일입니다. 실내기 인클로저를 인쇄하기 위해 30% 충전된 PETG.STL 파일을 사용하여 인쇄했습니다. 30% infill로 PETG로 출력했습니다. 실내기 전면 커버 3D 출력을 위한 STL 파일입니다. 나는 30% infill.STL 파일에서 PETG로 인쇄하여 스페이서를 인쇄하여 LCD 장치가 시프트 레지스터 IC 위로 올라간 상태를 유지하도록 했습니다. 30% 충전재로 PETG를 사용하여 인쇄했습니다. 실외기의 Fusion 360 모델 rain_gauge_assembly___smaller_profile_v15_CFg0dGwM8s.f3d.STP 실외기 파일 rain_gauge_assembly___smaller_profile_v15_jWCS0hjSDq.stepSTEP 실내기의 CAD 모델 controller_box_v1_fwltgu6D0S.stepFusion 36 실외기의 CAD 모델 스위치 푸시 버튼을 3D 인쇄하기 위한 controller_box_v1_NxtSrPG4Vo.f3zSTL 파일

    회로도

    프로젝트 배선도 rain_gauge_NtjqXF6QEw.fzz

    제조공정

    1. 압력 게이지
    2. 스마트 블라인드
    3. 이탈리아어 단어 시계
    4. 디지털 높이 게이지를 보여주세요
    5. 마이크로미터 나사 게이지 이해
    6. 압력 게이지 이해
    7. 스트레인 게이지 이해
    8. 피라니 게이지의 이해
    9. 다이어프램 압력 게이지 이해
    10. 부르동 압력계 이해하기