Media de lluvia de cubo simple conectado a través de Lorawan ™. El dispositivo cuenta el número de veces la punta/caída del cubo y envía el valor usando Lorawan ™.
Una aplicación receptor puede calcular la lluvia y, si es necesario, reiniciar el contador.
El cálculo de la lluvia está inspirado en la instrucción de calibración de calibre Arduino-Rain.
Se usa un pluviómetro de cubierta con las dimensiones de 11 cm por 5 cm respectivamente, lo que da un área de captación de 55 cm². Una colección de 10 mililitros de lluvia es de 10 ml/55 cm² = 0.181818182 cm = 1.81818182 mm de lluvia.
En el plubulario del cubo de inflexión, la punta del cubo/cae 5 veces para 10 ml (o 1.81 mm de lluvia) y, por lo tanto, una sola punta es para (10/5) ml = 2ml (o 0,364636364 mm).

Todos los pines necesarios de los pines RFM95 están en la pluma directamente conectada a los pines en el 32U4, excepto RFM95 DIO1. Para RFM95 DIO1 se selecciona Arduino Pin 1, ya que es una interrupción externa #3, y también se encuentra junto a Dio1 en la pluma. Adafruit Feather 32U4 RFM95 Mapeo de pin.
El cubo de inflexión necesita dos alfileres en la pluma, GND y entrada. Ya que el pin de entrada es el pin 3 (interrupción externa 0) seleccionado.
Debe habilitarse la pull-up débil para el pin 3 Arduino, por lo que cuando se puede detectar las puntas del cubo/caída, se puede detectar una señal baja.
Platformio que usa el tablero AdaFruit Feather 32U4 Platformio es la base. La Biblioteca Arduino-Lmic proporciona el soporte Lorawan ™.
El firmware solo cuenta el número de consejos/caídas realizadas por el cubo de propina y lo envía usando Lorawan ™. En el mensaje también se informa el nivel de voltaje de la batería.
Durante la secuencia de unión de Lorawan, el LED se está desvaneciendo. La clase Fade se construye a partir del ejemplo LED de desvanecimiento de Arduino.
El ahorro de energía se realiza en dos estados principales. Modo de lluvia y sin modo de lluvia.
Un tercer modo establece el dispositivo en modo Sleep_Forever sin ninguna interrupción habilitada si el voltaje de la batería está por debajo de 3.5 V. Esto es para evitar que la batería se destruya mediante descarga.
El sueño se realiza en intervalos de 8 segundos y después de cada 8 s de sueño se verifica la máquina de estado LMIC y los datos si se envían datos de tiempo.
El período de envío de datos predeterminado es de 15 segundos.
Si no se ha detectado lluvia durante una hora, el dispositivo establece el modo de suspensión de suspensión_forever y espera la próxima vez que llueva para que una interrupción externa despierta el dispositivo.
Cuando el dispositivo despierta, se envía un mensaje para obtener cualquier comando entrante.
Para simplificar la integración de las cosas, se puede utilizar un decodificador y un codificador para simplificar el uso de la API MQTT.
Comando MQTT para restablecer el mostrador de lluvia en el dispositivo. El reinicio del parámetro tendrá el valor 234 (0xEA) para el comando de reinicio a aceptar el dispositivo.
mosquitto_pub -h < Region > .thethings.network -u " <AppID> " -P " <AppKey> " -t ' <AppID>/devices/<DevID>/down ' -m ' {"port":2,"confirmed":true,"payload_fields":{"reset":234}} 'Comando MQTT para establecer el intervalo de transmisión a 15 minutos.
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 ;
}