Datalogger de bajo consumo

Hola,

en los últimos meses he estado trabajando en un proyecto. Si bien es algo ya existente (se trata de un datalogger), he trabajado duro para reducir el consumo de energía lo más posible y así hacerlo autónomo durante varios meses con una batería.

He invertido muchas (pero que muchas) horas en adentrarme en este campo nuevo para mí, en resolver problemas y optimizar el sistema para que se adapte a mis requisitos. Vamos, que me lo he pasado de maravilla.

Por eso pienso que todo lo que he apredido puede ser útil para la gente en este foro que por ejemplo se quiere iniciar en este tipo de sistemas, o en arduino en general.

He documentado un poco el trabajo. Aunque son notas sobre todo para mí (para cuando vuelva a tener tiempo y retome este tipo de proyectos), creo que son entendibles.

El proyecto, explicado a grosso modo, se trata de un datalogger para un olivar en el que trabajo. Quiero medir las temperatura y humedad del campo a lo largo de un periodo largo de tiempo. El campo está muy aislado. No hay luz, ni cobertura de internet de ningún tipo, ni cobertura de móvil. El mayor reto que tengo entonces es minimizar el consumo de energía.
He usado una arduino y varios componentes como un reloj rtc3231 y una tarjeta sd.
La programación la he hecho usando platformIO y eclipse corriendo en linux.

Os dejo la documentación y el código del programa. Espero que lo encontreis interesante y me alegraría también recibir vuestras ideas. Como puedo bajar el consumo, como puedo usar un módulo solar, métodos de transmisión, etc.

Saludos,
Mario


p.s. intentaré subir el proyecto de eclipse, si no excede el límite de tamaño.
 

Adjuntos

  • Datalogger.pdf
    927.5 KB · Visitas: 38
  • Datalogger_campo_cpp.txt
    9.6 KB · Visitas: 19
Te sugiero una modificación muy tonta para que el sistema te consuma nanoamperios. La salida SQW/ING del módulo RTC se puede configurar en drenador abierto para que pase a nivel bajo cuando salte la alarma configurada. En lugar del XC6210B, usa el XC6210C, y usa algun puerto del Arduino que puedas poner en drenador abierto también. La salida SQW la conectas con la patilla del Arduino hacia la entrada CE del regulador. Cuando esta entrada está flotante o con una pequeña pullup, el sistema está completamente apagado a excepción del RTC alimentado por la pila. Si está entrada, en la versión C del regulador, pasa a nivel bajo, ya sea por el RTC o por el Arduino, el regulador se encuentra en funcionamiento y el Arduino funcionando.

La idea es, el RTC activa en su momento la alarma, esto enciende el regulador que mantiene en encendido todo. Entonces el Arduino pone a nivel bajo la salida hacia el regulador, para mantener el regulador encendido. Seguidamente el Arduino hace sus tareas, apaga la alarma o configura la siguiente alarma en el RTC, y cuando ha terminado, pone a nivel alto la salida hacia la entrada CE del regulador, que apaga todo y queda como al principio.

Como ves la modificación es mínima y es más cosa del código que del hardware, solo es aprovechar la funcionalidad del regulador (digo de usar la versión C porque la B es activa a nivel alto y aquí interesa que sea activa nivel bajo, pero si no puedes cambiar el regulador, con un transistor PNP que invierta la lógica de la patilla CE es suficiente.

Poner una placa solar es muy sencillo, por AE venden módulos de 5V@0.8W entre 1 y 2€, que son suficientes para cargar tu lipo. Puedes usar un módulo TP4056 para cargar tu batería a través de la placa solar, venden 5 módulos por 1€, o 2 módulos por ese precio si vienen protegidos.

Creo que lo más caro es el mueble para alojarlo todo y que sea impermeable y resistente al ambiente.

Sobre comunicaciones a largo alcance, ahí ya depende mucho de la zona donde va a estar, si está despejada de obstáculos, en alto, bajo, etc. Hay gente que ha hecho funcionar un ESP con antena externa hasta 4km.
 
Gracias por tus ideas. Sobre las modificaciones que propones, son muy interesantes. Las estudiaré detenidamente, que son muchos conceptos para mi nivel de electrónica :) Lo de alimentar el módulo RTC con pila lo intenté pero tuve problemas. Mirando las especificaciones y comentandolo con otra gente me dijeron que con pila solo se mantiene la hora, pero las SQW unicamente funcionan con alimentación ... talvez hice algo mal...

No pensaba que lo del panel solar era tan fácil. Gracias. Una pregunta tonta. Si tengo un panel solar y lo pongo detrás de un plástico o cristal para aislarlo de la lluvia, sigue funcionando?

Quería usar un cajetín de estos que se usan en jardines para montar cables. He visto algunos por 4€. Le haría un agujero para sacar la sonda de temperatura (que es resistente al agua) y lo aislaría con silicona. Espero que resista....

Saludos
 
Pues según datasheet, llevando el bit BBSQW a 0 se activa la salida SQW en modo batería, así que parece que la posibilidad está ahí, aunque tengas el bus I2C inactivo. Recuerda que la SQW es una salida en drenador abierto. En el caso de la entrada del regulador, tiene una pullup interna pero para detectar con el Arduino la SQW necesitas una pullup ya sea dentro o fuera del Arduino.

Siempre que el cristal o el plástico esté limpio y transparente, la placa va a funcionar aunque perderá un poco de rendimiento por la luz reflejada por el cristal, pero todavía puedes obtener energía aprovechable. Puedes poner una entrada analógica desde la placa al Arduino (con un divisor de tensión para acoplar el voltaje al rango del adc) y usar el dato en el log para saber cuantos días está nublado, horas de sol al día, etc.

Y ya para hacerlo completamente autónomo, estaría bien montar un módulo DCF77 al Arduino. Así el reloj se ajustaría en hora sólo (si la señal DCF llega a tu zona, consulta cobertura en la Wikipedia)
 
Pues probaré de nuevo a ver si consigo activar la INT en modo batería.

Veo que aún puedo hacer mucho para este diseño. Y yo que pensaba que estaba terminado....

Gracias
 
Puedes usar la libreria Low-Power para ahorrar baterias
Código:
// **** INCLUDES *****
#include "LowPower.h"

void setup()
{
    // No setup is required for this library
}

void loop() 
{
    // Enter power down state for 8 s with ADC and BOD module disabled
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);  
    
    // Do something here
    // Example: Read sensor, data logging, data transmission.
}

La encuentras en este link https://github.com/rocketscream/Low-Power
Saludos
 
Para apagar el timer0 tienes que olvidarte del delay(), esa función se basa en un comparador con millis() y este ocupa al timer0 para realizar las cuentas, así que debes olvidarte de esa función y recurrir a controlar el timer directamente si quieres retrazos
 
Arriba