Duda con modificación de código para Deep Sleep con RTC.

:frowning:

Buenas tardes.

Estoy tratando de armar un sistema de riego para un lugar donde no hay electricidad, tengo casi todo los componentes.

Mi intención es activar una electrovalvula, dos días a la semana, y que funcione por una hora y media. Como todo debe de funcionar a baterías, estoy tratando de “ahorrar” energía.

Estoy usando un:

  • ATmega328
  • RTC DS3231

Tengo duda si la modificación de este código, si no es el día que voy a regar que se vuelva a dormir el arduino y que al siguiente día vuelva a checar el día.

#include <Wire.h>
#include <RTClibExtended.h>
#include <LowPower.h>

#define wakePin 2    //use interrupt 0 (pin 2) and run function wakeUp when pin 2 gets LOW
#define ledPin 13    //use arduino on-board led for indicating sleep or wakeup status

RTC_DS3231 RTC;      //we are using the DS3231 RTC

//original
byte AlarmFlag = 0;
byte ledStatus = 1;

//-------------------------------------------------

void wakeUp()        // here the interrupt is handled after wakeup
{
}

//------------------------------------------------------------

void setup() {
  
  //Set pin D2 as INPUT for accepting the interrupt signal from DS3231
  pinMode(wakePin, INPUT);

  //switch-on the on-board led for 1 second for indicating that the sketch is ok and running
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, HIGH);
  delay(1000);

  //Initialize communication with the clock
  Wire.begin();
  RTC.begin();
  //RTC.adjust(DateTime(__DATE__, __TIME__));   //set RTC date and time to COMPILE time
  
  //clear any pending alarms
  RTC.armAlarm(1, false);
  RTC.clearAlarm(1);
  RTC.alarmInterrupt(1, false);
  RTC.armAlarm(2, false);
  RTC.clearAlarm(2);
  RTC.alarmInterrupt(2, false);

  //Set SQW pin to OFF (in my case it was set by default to 1Hz)
  //The output of the DS3231 INT pin is connected to this pin
  //It must be connected to arduino D2 pin for wake-up
  RTC.writeSqwPinMode(DS3231_OFF);

  //Set alarm1 every day at 18:33
  RTC.setAlarm(ALM1_MATCH_HOURS, 55, 15, 0);   //set your wake-up time here
  RTC.alarmInterrupt(1, true);
}

//------------------------------------------------------------

//---------------------por mientras



void loop() {

  //On first loop we enter the sleep mode
  if (AlarmFlag == 0) {
    attachInterrupt(0, wakeUp, LOW);                       //use interrupt 0 (pin 2) and run function wakeUp when pin 2 gets LOW 
    digitalWrite(ledPin, LOW);                             //switch-off the led for indicating that we enter the sleep mode
    ledStatus = 0;                                         //set the led status accordingly
    LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);   //arduino enters sleep mode here
    detachInterrupt(0);                                    //execution resumes from here after wake-up

    //When exiting the sleep mode we clear the alarm
    RTC.armAlarm(1, false);
    RTC.clearAlarm(1);
    RTC.alarmInterrupt(1, false);
    AlarmFlag++;
  }

   //////////////////////////////
   //Aqui mi modificación.
   /////////////////////////////

   DateTime now2 = RTC.now();

   if (now2.dayOfTheWeek() == 0)
   {
     for (int i=0; i<100; i++)
     {
          if (ledStatus == 0) {
          ledStatus = 1;
          digitalWrite(ledPin, HIGH);
        }
        else {
          ledStatus = 0;
          digitalWrite(ledPin, LOW);
        }
        delay(500);
     }
   }
   
   AlarmFlag=0;
   ledStatus = 1;   
  
}

De antemano gracias.

tendria que andar eso, lo probaste ? no ahi nada mejor que experimentar, yo usaria este libreria me parece mas intuitiva o facil. si es que sos inexperto como yo https://github.com/adafruit/RTClib pero no se la verdad configurar alarmas estaria bueno que alguien que sepa mas lo lea.

Saludos.

Muchas gracias, por tu respuesta, si no funciona con esta librería usare la que me recomiendas.

El día de hoy, lo puse a funcionar y pues, no hizo nada.

Lo primero que hice fue hacer un programa que me "diera" la hora del RTC y esta bien.

Resubi el programa quitandole esta parte únicamente.

//When exiting the sleep mode we clear the alarm
    RTC.armAlarm(1, false);
    RTC.clearAlarm(1);
    RTC.alarmInterrupt(1, false);

Vamos a ver que pasa mañana. :( :confused: