About watchdog sleep mode have conflict with #include <SoftwareSerial.h>

Hi
I want to let arduino sleep 15 minutes
so I used watchdog to count time
but I also need UART communication to my sensor
I found when I used SoftwareSerial.h my arduino can’t sleep
What should I do to let my arduino sleep and wake up thanks
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include “RTClib.h”
#include “Oxygen.h”
#include <avr/sleep.h>

volatile int sleep_count = 0; // Keep track of how many sleep
const int sleep_total = 103; // ~ 15 min

#include <SoftwareSerial.h>

SoftwareSerial mySerial(8, 9); // RX, TX pins on Ardunio
#define SampleNum 20

int co2 =0;
double multiplier = 10;// 1 for 2% =20000 PPM, 10 for 20% = 200,000 PPM
uint8_t buffer[25];
uint8_t ind =0;
uint8_t index =0;

int fill_buffer(); // function prototypes here
String format_output();

RTC_DS3231 rtc;
const int chipSelect = 4;
int checkstate = 0;
//analogReference(INTERNAL2v56);

void setup(void) {
Serial.begin(9600);
//rtc.adjust(DateTime(F(DATE), F(TIME)));
deviceINIT();

watchdogOn(); // Turn on the watch dog timer.

mySerial.begin(9600); // Start serial communications with sensor
mySerial.println(“M 6”); // send Mode for Z and z outputs
mySerial.println(“K 1”); // set streaming mode

}

void loop(void) {

if (sleep_count % sleep_total == 0) {

// CODE TO BE EXECUTED PERIODICALLY
Serial.println(“wake!”);

String dataString = “”;

// read RTC
DateTime now = rtc.now();
dataString = String(now.year()) + “/” + String(now.month()) + “/” + String(now.day()) + " " + String(now.hour()) + “:” + String(now.minute()) + “:” + String(now.second()) + " ";
// read O2
float O2 = 0;
O2 = O2_value();
dataString += "O2 ";
dataString += String(O2);
dataString += " ";
delay(500);

// read CO2
fill_buffer();
index = 8; // In ASCII buffer, filtered value is offset from raw by 8 bytes
String CO2=format_output();

dataString += "CO2 ";
dataString += String(CO2);
dataString += " ";
delay(500);

// write SD
File dataFile = SD.open(“Dlog.txt”, FILE_WRITE);
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
Serial.println(dataString);
}
else {
Serial.println(“error opening Dlog.txt”);
}

Serial.println(“go to sleep”);
// delay to print out serial
delay(2900);

// reset count
sleep_count = 0;
}

goToSleep();
}

void goToSleep()
{
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Set sleep mode.
sleep_enable(); // Enable sleep mode.
sleep_mode(); // Enter sleep mode.
sleep_disable(); // Disable sleep mode after waking.
}

void watchdogOn() {
MCUSR = MCUSR & B11110111;
WDTCSR = WDTCSR | B00011000;
WDTCSR = B00100001;
WDTCSR = WDTCSR | B01000000;
MCUSR = MCUSR & B11110111;
}

ISR(WDT_vect)
{
sleep_count ++; // keep track of how many sleep cycles
}

void deviceINIT(){
// SD module init
Serial.print(“Initializing SD card…”);
if (!SD.begin(chipSelect)) {
Serial.println(“Card failed, or not present”);
return;
}
Serial.println(“card initialized.”);

//RTC init
delay(3000); // wait for console opening
if (! rtc.begin()) {
Serial.println(“Couldn’t find RTC”);
while (1);
}
if (rtc.lostPower()) {
Serial.println(“RTC lost power!”);
rtc.adjust(DateTime(F(DATE), F(TIME)));
}

O2_value();
C2H4_pre_sampling(3);
//StartTimeCorrect();
}

void StartTimeCorrect(){
DateTime now = rtc.now();
int c_time = (60-now.minute())%15;
complement_delay(c_time);
Serial.println(“end wait”);
delay(100);
}

void delay1min(){
delay(30000);
delay(30000);
}

void complement_delay(int c){
for (int i=0;i<c;i++){
delay1min();
}
}

int fill_buffer(void){

// Fill buffer with sensor ascii data
ind = 0;
while(buffer[ind-1] != 0x0A){ // Read sensor and fill buffer up to 0XA = CR
if(mySerial.available()){
buffer[ind] = mySerial.read();
ind++;
}
}
// buffer() now filled with sensor ascii data
// ind contains the number of characters loaded into buffer up to 0xA = CR
ind = ind -2; // decrement buffer to exactly match last numerical character
}

String format_output(){ // read buffer, extract 6 ASCII chars, convert to PPM and print
int co2 =0;
int index=8; double multiplier = 10;
co2 = buffer[15-index]-0x30;
co2 = co2+((buffer[14-index]-0x30)*10);
co2 +=(buffer[13-index]-0x30)*100;
co2 +=(buffer[12-index]-0x30)*1000;
co2 +=(buffer[11-index]-0x30)*10000;

return String(co2*multiplier/10000,4);

}

See the post at the top of the forum;

'How to get the best out of this forum'

For details on how to post code so that it can be read by the forum.

I suspect you may not be shutting down softwareserial before going into sleep\wakeup mode so try this;

mySerial.end();

You then need to start it again when you need to read the GPS.

THANKS you for your reply I want to know if I use mySerial.end(); HOW can I wake up the sensor(UART) when the sleep time is over (automated)