lucy522285 發表於 2020-11-6 14:26:04

arduino 睡眠問題與SoftwareSerial.h的衝突

大家好
目前使用UART 與sensor arduino 通訊 我想要使用watchdog 方式讓arduino 進入睡眠模式
但因為使用到#include <SoftwareSerial.h>而導致arduino 無法進入睡眠 想請問要如何更改
才能讓arduion 進入睡眠15分鐘並且醒來






#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;
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();
}


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 != 0x0A){// Read sensor and fill buffer up to 0XA = CR
if(mySerial.available()){
    buffer = 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-0x30;
co2 = co2+((buffer-0x30)*10);
co2 +=(buffer-0x30)*100;
co2 +=(buffer-0x30)*1000;
co2 +=(buffer-0x30)*10000;

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

}
頁: [1]
查看完整版本: arduino 睡眠問題與SoftwareSerial.h的衝突