Sleep and wake with external interrupt


(sorry have had in 2 posts. apparently have exceeded maximum size limit post)

hey :) . new , little confused how somethings work. first background. have bullt data logger arduino nano, rtc (ds3231), micro sd module, , solenoid. device log sensor data sd card , if sensor returns value open solenoid 10 seconds. here code , working perfectly.

code: [select]
#include <spi.h>
#include <sd.h>
#include <wire.h>
#include "rtclibextended.h"

// simple data logger arduino analog pins

// how many milliseconds between grabbing data , logging it. 1000 ms once second
#define log_interval  3000 // mills between entries (reduce take more/faster data)

// how many milliseconds before writing logged data permanently disk
// set log_interval write each time (safest)
// set 10*log_interval write data every 10 datareads, lose
// last 10 reads if power lost uses less power , faster!
#define sync_interval 5000 // mills between calls flush() - write data card
uint32_t synctime = 0; // time of last sync()

#define echo_to_serial   1 // echo data serial port
#define wait_to_start    0 // wait serial input in setup()

// analog pins connect sensors
#define voltage a1                // analog 1
int solenoidpin = a3;    //this output pin on arduino using

rtc_ds1307 rtc; // define real time clock object

// data logging shield, use digital pin 10 sd cs line
const int chipselect = 10;

// logging file
file logfile;

void error(char *str)
{
  serial.print("error: ");
  serial.println(str);
  


  while(1);
}

void setup(void)
{
  serial.begin(9600);
  serial.println();
  
  
#if wait_to_start
  serial.println("type character start");
  while (!serial.available());
#endif //wait_to_start
 pinmode(solenoidpin, output);           //sets pin output

  // initialize sd card
  serial.print("initializing sd card...");
  // make sure default chip select pin set to
  // output, if don't use it:
  pinmode(10, output);
  
  // see if card present , can initialized:
  if (!sd.begin(chipselect)) {
    error("card failed, or not present");
  }
  serial.println("card initialized.");
  
  // create new file
  char filename[] = "etc2.csv";
  //for (uint8_t = 0; < 100; i++) {
    //filename[6] = i/10 + '0';
    //filename[7] = i%10 + '0';
    //if (! sd.exists(filename)) {
      // open new file if doesn't exist
      logfile = sd.open(filename, file_write);
      //break;  // leave loop!
   // }
 // }
  
  if (! logfile) {
    error("couldnt create file");
  }
  
  serial.print("logging to: ");
  serial.println(filename);

  // connect rtc
  wire.begin();  
  if (!rtc.begin()) {
    logfile.println("rtc failed");
#if echo_to_serial
    serial.println("rtc failed");
#endif  //echo_to_serial

 }
  

  logfile.println("millis,stamp,datetime,voltage");    
#if echo_to_serial
  serial.println("millis,stamp,datetime,voltage");
#endif //echo_to_serial
 
}

void loop(void)
{
  datetime now;

  // delay amount of time want between readings
  delay((log_interval -1) - (millis() % log_interval));
  
  
  // log milliseconds since starting
  uint32_t m = millis();
  logfile.print(m);           // milliseconds since start
  logfile.print(", ");    
#if echo_to_serial
  serial.print(m);         // milliseconds since start
  serial.print(", ");  
#endif

  // fetch time
  now = rtc.now();
  // log time
  logfile.print(now.unixtime()); // seconds since 1/1/1970
  logfile.print(", ");
  logfile.print('"');
  logfile.print(now.year(), dec);
  logfile.print("/");
  logfile.print(now.month(), dec);
  logfile.print("/");
  logfile.print(now.day(), dec);
  logfile.print(" ");
  logfile.print(now.hour(), dec);
  logfile.print(":");
  logfile.print(now.minute(), dec);
  logfile.print(":");
  logfile.print(now.second(), dec);
  logfile.print('"');
#if echo_to_serial
  serial.print(now.unixtime()); // seconds since 1/1/1970
  serial.print(", ");
  serial.print('"');
  serial.print(now.year(), dec);
  serial.print("/");
  serial.print(now.month(), dec);
  serial.print("/");
  serial.print(now.day(), dec);
  serial.print(" ");
  serial.print(now.hour(), dec);
  serial.print(":");
  serial.print(now.minute(), dec);
  serial.print(":");
  serial.print(now.second(), dec);
  serial.print('"');
#endif //echo_to_serial

 
  analogread(voltage);
  delay(10);
  int tempreading = analogread(voltage);    
  
  // converting reading voltage, 3.3v arduino use 3.3, 5.0, use 5.0
//  float voltage = tempreading * aref_voltage / 1024;  
  float voltage = tempreading * (5.0 / 1023.0);
  
  
  logfile.print(", ");    
  logfile.print(voltage);
  logfile.println();
#if echo_to_serial

  serial.print(", ");    
  serial.print(voltage);
  serial.println();
#endif //echo_to_serial

 
  // write data disk! don't sync - requires 2048 bytes of i/o sd card
  // uses bunch of power , takes time
  if ((millis() - synctime) < sync_interval) return;
  synctime = millis();
  logfile.flush();
 
analogread(voltage);
 if (tempreading <297) {
    digitalwrite(solenoidpin, high);
    delay(10000); // time in milliseconds parameter
    digitalwrite(solenoidpin, low);
  } else {
    digitalwrite(solenoidpin, low);
}  
}


so save power log few times hour. 1 min of logging , 10 min of sleep ideal. although every half hour or once hour acceptable if thats way has be.  so here code have found put arduino sleep.

code: [select]
#include <wire.h>
#include <rtclibextended.h>
#include <lowpower.h>

#define wakepin 2    //use interrupt 0 (pin 2) , run function wakeup when pin 2 gets low
#define ledpin 13    //use arduino on-board led indicating sleep or wakeup status

rtc_ds3231 rtc;      //we using ds3231 rtc

byte alarmflag = 0;
byte ledstatus = 1;

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

void wakeup()        // here interrupt handled after wakeup
{
}

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

void setup() {
  //set pin d2 input accepting interrupt signal ds3231
  pinmode(wakepin, input);

  //switch-on on-board led 1 second indicating sketch ok , running
  pinmode(ledpin, output);
  digitalwrite(ledpin, high);
  delay(1000);

  //initialize communication clock
  wire.begin();
  rtc.begin();
  rtc.adjust(datetime(__date__, __time__));   //set rtc date , time compile time
  
  //clear 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 off (in case set default 1hz)
  //the output of ds3231 int pin connected pin
  //it must connected arduino d2 pin wake-up
  rtc.writesqwpinmode(ds3231_off);

  //set alarm1 every day @ 18:33
  rtc.setalarm(alm1_match_seconds, 20, 0, 0, 1);   //set wake-up time here
  rtc.alarminterrupt(1, true);
}

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

void loop() {

  //on first loop enter sleep mode
   {  
    //set alarm1 every day @ 18:33
    rtc.setalarm(alm1_match_seconds, 20, 0, 0, 1);   //set wake-up time here
    rtc.alarminterrupt(1, true);
    
    attachinterrupt(0, wakeup, low);                       //use interrupt 0 (pin 2) , run function wakeup when pin 2 gets low
    digitalwrite(ledpin, low);                             //switch-off led indicating enter sleep mode
    ledstatus = 0;                                         //set led status accordingly
    lowpower.powerdown(sleep_forever, adc_off, bod_off);   //arduino enters sleep mode here
    detachinterrupt(0);                                    //execution resumes here after wake-up

//    when exiting sleep mode clear alarm
    rtc.armalarm(1, false);
   rtc.clearalarm(1);
   rtc.alarminterrupt(1, false);
    alarmflag++;
  }

  //cycles led indicate no more in sleep mode
  if (ledstatus == 0) {
    ledstatus = 1;
    digitalwrite(ledpin, high);
  }
  else {
    ledstatus = 0;
    digitalwrite(ledpin, low);
  }

  delay(5000);
}



so question how integrate these 2 together? not sure put code sleep code work. not sure how set interrupt once every 10min instead of same time every day currently. or @ same time every hour okay if thats limited too. open idea of using watchdog timer noob , @ first glance looked little tricky set up. appreciated thankyou!!


Arduino Forum > Using Arduino > Programming Questions > Sleep and wake with external interrupt


arduino

Comments

Popular posts from this blog

Flip address is out of range arduino uno r3

Arduino Uno not uploading

Indesign and MathType fonts