Conteo y almacenamiento de pulsos de Arduino

Estoy usando jeenodes de jeelabs para capturar datos como temperatura, luz, humedad y movimiento. Ahora estoy buscando capturar el consumo de gas y agua usando interruptores de láminas (los medidores producen una cantidad x de pulsos por kWh. ¿Cómo sugiere que lo logre?

Las preguntas principales son:

¿Cómo debo almacenar el conteo de pulsos localmente? (¿EEPROM? No puedo simplemente transmitir cada vez que ocurre un pulso porque algunos paquetes pueden perderse, puede haber interrupciones en la red, etc.) ¿Con qué frecuencia debo transmitir datos? ¿Cómo debo almacenar el recuento de pulsos de forma centralizada? (¿solo la cifra acumulada? ¿Qué luego tengo que comparar con el valor en un momento dado para determinar el consumo entre 2 fechas/horas?)

Si escribe en la eeprom con cada pulso, pronto terminará con una eeprom muerta. Guárdelo en ram.
Si solo almaceno en la memoria volátil, ¿cómo manejo los reinicios?
Si está transmitiendo periódicamente, solo tiene que preocuparse por el tiempo entre transmisiones. ¿Y por qué tener reinicios? Si lo diseñas bien, no tendrás ningún reinicio.
Si estuviera seguro de que el 100 % de las transmisiones se recibirían y procesarían, estaría contento con eso, pero sé que, debido a muchas variables, algunas transmisiones se perderán. Necesito algo más. Un reinicio podría ser tan simple como reemplazar las baterías.
Entonces, ¿usted no implementa sistemas de respaldo? ¿O sistemas de baterías superpuestos? (Agregue baterías nuevas antes de quitar las baterías viejas). ¿Qué tal agregar un poco de RAM respaldada por batería, tal vez un chip DS1306 RTC con una batería recargable? Tiene algo así como 96 bytes de RAM respaldada por batería, y la batería dura meses sin alimentación externa.
Agregue un botón que pueda presionar para almacenar el contador actual inmediatamente en la EEPROM y siempre puede presionar este botón antes de reemplazar las baterías (de todos modos, perderá algunos pulsos durante eso). Para operaciones normales, puede actualizar automáticamente la EEPROM periódicamente. El período debe depender de cuántos ciclos de escritura puede manejar su EEPROM y cuánto tiempo planea ejecutar esta pieza de hardware. También puede usar alguna tarjeta flash (tarjeta SD, por ejemplo) que puede reemplazarse después de un tiempo. También tienes muchos más bloques para quemar antes de que toda la tarjeta quede inutilizable.

Respuestas (2)

Es probable que una solución factible al 99% se encuentre en algún lugar entre los absolutos. Por ejemplo:

Podrías transmitir un conteo incremental. El receptor puede perder algunas transmisiones siempre que reciba una posterior. Si obtiene una transmisión posterior que se reinicia desde (casi) cero, puede asumir que el transmisor ha sido reiniciado y puede agregar el conteo recibido históricamente al nuevo. Puede medir la duración de cualquier intervalo y estimar la cantidad de conteos perdidos durante la pérdida de energía en función de la tasa antes de la pérdida o de un período anterior que podría ser plausiblemente similar (es decir, a la misma hora del mismo día en las semanas anteriores). , o de un período de algunas semanas hace un año, etc.). Esto puede funcionar incluso mejor si realiza la corrección después del hecho para igualar el consumo durante períodos más largos (es decir, interrupción de unas pocas horas, ajuste el total del día para que coincida con días similares, en lugar de la hora para que coincida con horas similares).

Puede almacenar periódicamente el valor de conteo en EEPROM, si lo hace en números redondos agradables, podría hacerlo usando relativamente pocos bits, ya que solo necesitaría los significativos. Al reiniciar, puede reiniciar el conteo en el último número guardado. El receptor vería que el conteo se reanuda en un número ligeramente más bajo que antes y podría volver a agregar la diferencia a los números recibidos.

Como la mayoría de los cortes de energía son breves (aparte de algunas excepciones recientes), puede usar una batería de respaldo.

Si los medidores tienen una pantalla, puede adoptar un enfoque completamente diferente y apuntar una cámara hacia ellos y usar el reconocimiento óptico de caracteres en las imágenes.

Ningún sistema es perfecto; en casos extremos, puede ser necesaria una corrección manual inteligente.

Gracias, buena respuesta completa. Es posible que no escriba en la EEPROM, ya que restablecer desde 0 en realidad proporciona un buen indicador de que ha habido una interrupción y, potencialmente, se ha perdido algún uso. El transmisor/dispositivo de conteo de pulsos se agota con las baterías, por lo que es seguro en caso de un corte de energía, pero no seguro cuando se agotan las baterías (DEBERÍA notificarme cuando las baterías estén bajas). Ahora necesito abordar el mecanismo más efectivo para almacenar los datos de tiempo/pulso para graficar/analizar.
Tenga cuidado de que su circuito de monitoreo de voltaje (¿divisor?) No aumente el consumo de corriente (no es realmente significativo si el procesador siempre está funcionando, pero es muy importante en comparación con los microamperios en modo de suspensión)

Consumo de agua en kWh???

La frecuencia para transmitir sus datos dependerá de la frecuencia del pulso y de cuán actualizada debe estar su información. No tiene mucho sentido enviar una actualización cada hora si obtiene en promedio solo 1 pulso por hora. En ese caso, una vez al día más o menos servirá. Puede enviar cada vez que haya contado, digamos, 10 pulsos, pero no enviará nada si está fuera durante una semana, y el receptor puede querer actualizaciones más frecuentes. Por lo tanto, una mejor alternativa es enviar a intervalos de tiempo fijos, como todos los días al mediodía y a la medianoche.

Para la confiabilidad de la transferencia de datos, tiene varias opciones. Los módulos de radio RFM12B son transceptores, por lo que puede dejar que el receptor envíe un reconocimiento. No es exactamente complicado, pero puede ser aún más simple, con una comunicación unidireccional. La palabra es redundancia. Montones. A menudo es una mala palabra, pero aquí nuestro volumen de datos es tan bajo que cierta redundancia no hará ningún daño; difícilmente valdría la pena encender el transmisor para enviar dos bytes, ¿verdad?

Ahora enviar 5 copias de los mismos datos en la misma transmisión no es una buena idea. La redundancia no sirve de nada si la transmisión completa se atasca. Esto es lo que debe hacer: la N-ésima transmisión envía lo siguiente:

• el valor N del contador (1 byte servirá) • los datos N-4
• los datos N-3
• los datos N-2
• los datos N-1
• los datos nuevos
• Hamming ECC

Enviaría datos acumulativos, por ejemplo, números de 16 bits. Si tienes un pulso por 0,1 m 3 de agua tendrá un desbordamiento después de un par de años, pero el receptor no debería tener problemas con eso.

Eso le dará una carga útil de solo unas pocas docenas de bytes, pero le asegurará que todos los datos se reciban incluso cuando se pierdan 4 transmisiones consecutivas. Si te hace dormir mejor, aún puedes combinar esto con un reconocimiento y una retransmisión si es necesario.

El microcontrolador no tendrá casi nada que hacer: mantenga un temporizador para mantener el tiempo hasta la próxima transmisión y cuente los pulsos entrantes. Puede ejecutarlo con un cristal barato de 32.768 kHz. Incluso sin usar los modos de bajo consumo, un MSP430F1101A solo usará un par insignificante de µA; su fuente de alimentación consumirá un múltiplo de eso. Solo encienda el transmisor dos veces al día para enviar sus datos.

Tu microcontrolador tendrá que funcionar continuamente durante meses y luego tendrás que tener en cuenta los cortes de energía. Donde yo vivo son raros; el último data de hace 3 años y duró 15 minutos, pero me han dicho que son más frecuentes en las zonas rurales de los EE. UU. donde hay muchas líneas eléctricas aéreas. De todos modos, desea una batería de respaldo para mantener el controlador funcionando durante un corte de energía. Una celda CR2032 y una MSP430 es suficiente para la eternidad. O la salida de la batería con la fuente de alimentación de red (3.3V) con un par de diodos. Posponga las transmisiones cuando funcione con batería.

No hay necesidad de almacenar los contadores en la EEPROM, solo manténgalos en la RAM.