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.
hey

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.
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!!
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
Post a Comment