通过Lorawan™连接的简单小费扣雨表。该设备计数的次数次数/滚动量的次数,并使用Lorawan™发送值。
然后,接收器应用程序可以计算降雨,并在需要时重置计数器。
降雨计算的灵感来自Arduino-Rain-gauge校准指令。
使用尺寸为11 cm x 5 cm的倾倒桶雨量表,提供了55厘米的集水区。 10毫升的降雨的集合为10 ml/55cm²= 0.181818182 cm = 1.81818182 mm降雨。
在小费桶雨量计中,桶尖/跌落10毫升(或1.81 mm的雨水)5次,因此单个尖端适用于(10/5)ml = 2ml(或0,364636364 mm)。

RFM95销的所有必需销都位于羽毛上,直接连接到32U4上的销钉上,除了RFM95 DIO1。对于RFM95 dio1是Arduino引脚1,因为它是外部中断#3,并且位于羽毛上的Dio1旁边。 Adafruit Feather 32U4 RFM95针映射。
小费桶需要羽毛,GND和输入上的两个销钉。由于输入引脚是Arduino引脚3(外部中断0)。
需要为Arduino引脚3启用较弱的上下拉,因此当倾倒桶尖/滚动时,可以检测到低信号。
使用Adafruit Feather 32U4平台板的Platformio是基础。 Arduino-LMIC库提供Lorawan™支持。
该固件仅计算小费桶完成的技巧/滚动数,并使用Lorawan™发送它。在消息中,还报告了电池电压水平。
在Lorawan加入序列期间,LED正在褪色。淡出类是由Arduino淡出的LED示例构建的。
节省在两个主要状态下进行。下雨模式和无雨模式。
如果电池电压低于3.5 v,则第三个模式将设备以Sleep_forever模式设置,而无需启用任何中断设备。这是为了使电池免于被放电销毁。
睡眠以8秒的间隔完成,每8 s睡觉后,检查LMIC状态机,并且数据是否为时间数据。
默认数据发送期限为15秒。
如果未检测到大约一小时的降雨,则设备将Sleep Mode Sleep_ forverver设置,并等待下次下雨,以便外部中断唤醒设备。
当设备醒来时,发送消息将发送到获取任何传入命令。
为了简化与网络事物的集成,可以使用解码器和编码器来简化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 ;
}