Despertar a microcontrolador Arduino, de modo sleep

Esperando se encuentren bien colegas del conocimiento, les escribo para ver si alguno me puede ayudar con una inquietud.
Estoy trabajando en un proyecto basado en un dispositivo con Arduino y un RTC ds1307(específicamente el modulo Tiny RTC), el cual debe tomar datos de forma periódica (cada media hora o mas). Este se encontrará en el campo solamente con una batería de 2300mA, por lo que necesitará una buena eficiencia energética para durar al menos dos meses. Hay información sobre librerías que permiten hacer funcionar en modo sleep o ahorro de energía al Arduino y funcionan de maravilla, pero permiten despertarlo con un pulso (alto o bajo según configuración) en el pin2 o 3 a elección, con el reloj interno del controlador (muy poco preciso en el tiempo) o por medio de un mensaje por puerto serial. Mi intención es despertar al microcontrolador cada media hora solamente con el módulo rtc, ya que su reloj es mas preciso y no pierde la hora funcionando por largo tiempo, pero no he encontrado información que indique como hacerlo.
El módulo puede generar una señal cuadrada pero la mas pequeña es de 1Hz y no quiero agregar mas componentes (como un contador de pulsos) al sistema ya que eso significaría un mayor consumo de corriente y un menor tiempo de duración de la batería que tengo disponible.

He visto en varios foros esta inquietud pero ninguno ha podido despertar a arduino con un rtc (sin importar cual ya que todos funcionan muy similar), solo mencionan que es posible hacerlo pero nadie ha ilustrado tal procedimiento.

Ojala puedan ayudarme con este pequeño gran desafío.

Existe alguna biblioteca, componente, módulo u otro método para despertar al Arduino periodicamente de forma precisa y de bajo consumo de corriente?... ,

dejo la pregunta abierta para que debatamos y aprendamos juntos de este tema de mucha utilidad y que estoy seguro ayudará a cientos de estudiantes o autodidactas entusiastas como nosotros.

Saludos y de antemano agradezco su tiempo.


void loop() { Serial.print(" Buen día, tarde o noche a todos. "); }


Les adjunto una imagen del circuito básico
 

Adjuntos

  • uno-rtc53.png
    uno-rtc53.png
    91.5 KB · Visitas: 2
Estoy leyendo por ahí que lo mejor es cambiar el DS1307 por otro modelo que tenga alguna patilla "más" con el que despertar al Arduino.

Por ejemplo, con el DS1337C tienes una patilla ¬INT que se dispara en cuanto se llega a la fecha/hora designada.

Con el DS3231 o DS3232 tienes otra patilla de interrupción. Y hay bibliotecas para Arduino con diversas opciones de alarma.

Por ejemplo, si quieres que se despierte cada media hora, se podrían programar dos alarmas:

ALM1_MATCH_MINUTES
ALM2_MATCH_MINUTES

La primera que coincide con el minuto 0, y la segunda, con el 30.

Más información
 
Estimados usuarios del foro,

Para mi proyecto estoy usando un Arduino Pro mini de 5 volts, un mpu6050 (giroscopio-acelerómetro), un módulo lector/grabador en tarjeta microSD y 3 termistores NTC.

He de alimentar todo con batería y quiero poner el Arduino en modo Sleep para ahorrar batería. Por ello quiero alimentar los sensores y el grabador de la tarjeta microSD a través de una salida digital y que ésta se active cada 8 seg y dormir así los sensores durante 8 seg cada vez.

El consumo del módulo de la tarjeta es de 4,4 mA, por lo que la salida digital puede dar esta intensidad sin problema.

El módulo se alimenta entre 4,5 y 5,5 volts, por lo que la tensión tampoco es u problema.

Ahora vienen los dos problemas: Mientras el MPU y los termistores se inician bien, la tarjeta microSD no se inicia aunque sí lo hace cuando alimento el módulo directamente de la salida Vcc del arduino.
El otro problema es que al dormir el arduino, la salida digital que alimenta a los sensores no se desactiva sino que permanece activa todo el tiempo con lo que los sensores y la tarjeta consumen continuamente. Para dormir el arduino uso la librería lowpower con la función delay(500);
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);

EL código empleado viene aquí (lo que nos interesa)

Código:
#include <SD.h> //Librería tarjeta
#include "LowPower.h"  //Libreria de ahorro de bateria 

const int pin = 8; // Usaré este PIN como salida de Vcc para alimentar los sensores

File myFile; //Para el archivo que se creara en la microSD

void setup( )
{
  Serial.begin( 9600);

pinMode(10, OUTPUT); //Pin que conecta pin CS de tarjeta a pin SS de Arduino

   pinMode(8, OUTPUT); //define el PIN 8 como salida
   digitalWrite(8, HIGH);
   delay (10); //Para que le dé tiempo a iniciar los sensores tras activarse la salida digital de alimentación

Wire.begin(); //empieza MPU6050
   mpu.initialize();
   Serial.println(mpu.testConnection() ? F("IMU iniciado correctamente") : F("Error al iniciar IMU")); //acaba MPU6050
   
  Serial.print("Iniciando MicroSD ...");
  
  if (!SD.begin(10)) {
    Serial.println("MicroSD no se pudo iniciar");
    return;
    
  }
  Serial.println("MicroSD Iniciada correctamente");

  if(!SD.exists("datalog.csv"))
  {
      myFile = SD.open("datalog.csv", FILE_WRITE);
      if (myFile) {
        Serial.println("Archivo nuevo, Escribiendo encabezado(fila 1)");
        myFile.println("Tiempo(Tiempo;Sensor1;Sensor2;Sensor3;sensor4;sensor5");
        myFile.close();
      } else {

        Serial.println("Error creando el archivo datalog.csv");      
      }
  }
}

void loop( )
{

delay(500);
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); 

  // Leer las aceleraciones  del MPU6050
   mpu.getAcceleration(&ax, &ay, &az);
 
   //Calcular los angulos de inclinacion
   float accel_ang_x = atan(ax / sqrt(pow(ay, 2) + pow(az, 2)))*(180.0 / 3.14);
   float accel_ang_y = atan(ay / sqrt(pow(ax, 2) + pow(az, 2)))*(180.0 / 3.14);
 
   // Mostrar resultados
  
 Serial.print(F("\;    Inclinacion en X:"));
   Serial.print(accel_ang_x);
   Serial.print(F(";             \Inclinacion en Y: "));
   Serial.println(accel_ang_y);

     myFile = SD.open("datalog.csv", FILE_WRITE);//abrimos  el archivo
  
  if (myFile) { 
        Serial.print("");
        
   myFile.print(F("\;    Inclinacion en X:"));
   myFile.print(accel_ang_x);
   myFile.print(F(";             \Inclinacion en Y: "));
   myFile.println(accel_ang_y);
        
        myFile.close(); //cerramos el archivo
  } else {
    Serial.println("Error al abrir el archivo"); 
  }
  }
  }

¿Alguien me puede ayudar?
Muchas gracias por la atención
 
Lógico.
La tarjeta la inicializas en el setup.
¿Se ejecuta el setup al despertarse? Creo que no.

Respecto al pin, pues lo apagas y luego duermes.
 
Atrás
Arriba