Lorawan ™을 통해 연결된 간단한 팁 버킷 레인 게이지. 이 장치는 버킷 팁/회전의 횟수를 계산하고 Lorawan ™을 사용하여 값을 보냅니다.
그런 다음 수신기 응용 프로그램은 강우량을 계산하고 필요한 경우 카운터를 재설정 할 수 있습니다.
강우 계산은 Arduino-Rain-Gauge-Calibration Instruction에서 영감을 얻었습니다.
차원 11cm x 5cm의 팁 버킷 레인 게이지가 각각 5cm로 사용되며, 집수 영역은 55cm²입니다. 10 밀리리터의 비 컬렉션은 10 ml/55 cm² = 0.181818182 cm = 1.81818182 mm의 비입니다.
티핑 버킷 레인 게이지에서 버킷 팁/텀블은 10ml (또는 1.81mm의 비)에 대해 5 회 팁/텀블링되므로 단일 팁은 (10/5) ml = 2ml (또는 0,364636364 mm)입니다.

RFM95 핀의 필요한 모든 핀은 RFM95 DIO1을 제외하고 32U4의 핀에 직접 연결된 깃털에 있습니다. RFM95의 경우 DIO1은 외부 인터럽트 #3이므로 Arduino 핀 1이며 깃털의 DIO1 옆에 있습니다. Adafruit Feather 32U4 RFM95 핀 매핑.
티핑 버킷은 깃털, GND 및 입력에 두 개의 핀이 필요합니다. 입력 핀이 Arduino 핀 3 (외부 인터럽트 0)이 선택되므로 선택되었습니다.
Arduino Pin 3의 경우 약한 풀업을 활성화해야하므로 팁 버킷 팁/텀블이 낮을 때 낮은 신호를 감지 할 수 있습니다.
Adafruit Feather 32U4 Platformio 보드를 사용하는 Platformio가 기본입니다. Arduino-LMIC 라이브러리는 Lorawan ™ 지원을 제공합니다.
펌웨어는 팁 버킷으로 수행 된 팁/텀블 수를 계산하고 Lorawan ™을 사용하여 보냅니다. 이 메시지에는 또한 배터리 전압 레벨이보고되었습니다.
로라완 결합 시퀀스 중에 LED가 희미 해집니다. 페이드 클래스는 Arduino 페이딩 LED 예제에서 구축됩니다.
전력 절약은 두 가지 주요 상태에서 이루어집니다. 비가 내리는 모드 및 비 모드가 없습니다.
세 번째 모드는 배터리 전압이 3.5 v 미만인 경우 장치를 잠자기 모드로 설정합니다. 배터리가 배터리를 방전하여 배터리가 파괴되는 것을 막기위한 것입니다.
수면은 8 초 간격으로 이루어지며 8 초의 수면 후 LMIC 상태 기계를 확인하고 시간 데이터가 전송되는 경우 데이터가 확인됩니다.
기본 데이터 전송 기간은 15 초입니다.
대략 1 시간 동안 비가 감지되지 않은 경우 장치는 수면 모드 Sleep_Forever를 설정하고 다음 번 비가 내릴 때 기다립니다. 그래서 외부 인터럽트가 장치를 깨우냅니다.
장치가 깨어나면 메시지가 전송되어 들어오는 명령을 가져옵니다.
사물 네트워크에 통합을 단순화하기 위해 디코더와 인코더를 사용하여 MQTT API 사용을 단순화 할 수 있습니다.
MQTT 명령 장치의 레인 카운터를 재설정합니다. 매개 변수 재설정은 장치가 재설정 명령을 허용 할 값 234 (0xea)를 가져야합니다.
mosquitto_pub -h < Region > .thethings.network -u " <AppID> " -P " <AppKey> " -t ' <AppID>/devices/<DevID>/down ' -m ' {"port":2,"confirmed":true,"payload_fields":{"reset":234}} 'MQTT 명령은 전송 간격을 15 분으로 설정합니다.
mosquitto_pub -h < Region > .thethings.network -u " <AppID> " -P " <AppKey> " -t ' <AppID>/devices/<DevID>/down ' -m ' {"port":2,"confirmed":true,"payload_fields":{"multiplexer":15}} ' function Decoder ( bytes , port )
{
// Decode an uplink message from a buffer
// (array) of bytes to an object of fields.
var decoded = { } ;
if ( port === 1 )
{
if ( bytes . length >= 3 )
{
decoded . counts = ( ( ( bytes [ 2 ] & 0x80 ) >> 7 ) << 16 ) | ( bytes [ 1 ] << 8 ) | bytes [ 0 ] ;
decoded . vbat = ( ( bytes [ 2 ] & 0x7F ) + 330 ) / 100.0 ;
}
}
return decoded ;
} function Encoder ( object , port ) {
// Encode downlink messages sent as
// object to an array or buffer of bytes.
var bytes = [ ] ;
if ( port === 1 && ( ( object . multiplexer > 0 ) && ( object . multiplexer < 255 ) ) )
{
bytes [ 0 ] = 1 ;
bytes [ 1 ] = object . multiplexer ;
}
else if ( port === 2 && object . reset === 0xea )
{
bytes [ 0 ] = object . reset ;
}
return bytes ;
}