제조공정
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
| ||||
|
이것은 전문 기상학자가 사용하는 우량계를 기반으로 한 티핑 버킷 우량계입니다. 이 장치는 빗물을 티터-토터(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="코드">#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에서 시간 데이터 가져오기}
/*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 =인터럽트_시간_메뉴; }}
제조공정
구성품 및 소모품 Arduino UNO × 1 Nokia LCD 모듈 × 1 서미스터 100k 3950 × 1 LED(일반) × 1 저항 1k 옴 × 2 저항 4.75k 옴 × 1 커패시터 10nF × 1 전력 MOSFET N-채널 또는 다리미의 PCB를 사용 × 1 필요한 도구 및 기계 납땜 인두(일반) 앱 및 온라인 서비스 Ardui
구성품 및 소모품 초음파 센서 - HC-SR04(일반) × 2 Arduino Nano R3 × 1 포토 저항기 × 1 Maxim 통합 8x8 LED 매트릭스 MAX7219 × 2 납땜 브레드보드 절반 크기 × 1 점퍼 와이어(일반) × 1 저항 330옴 × 1 앱 및 온라인 서비스 Arduino IDE 이 프로젝트 정보 저는 8x8 매트릭스 LED와