浏览代码

Implemented RTC alarm sleep and wake up

tags/v1.2.0
Bertrand Lemasle 7 年前
父节点
当前提交
d21ba43394
共有 15 个文件被更改,包括 167 次插入65 次删除
  1. +5
    -1
      GpsTracker/Gps.cpp
  2. +6
    -4
      GpsTracker/Gps.h
  3. +8
    -14
      GpsTracker/GpsTracker.h
  4. +9
    -1
      GpsTracker/GpsTracker.ino
  5. +26
    -0
      GpsTracker/MainUnit.cpp
  6. +9
    -0
      GpsTracker/MainUnit.h
  7. +13
    -0
      GpsTracker/Pins.h
  8. +22
    -0
      GpsTracker/Positions.cpp
  9. +8
    -0
      GpsTracker/Positions.h
  10. +52
    -18
      GpsTracker/Rtc.cpp
  11. +8
    -2
      GpsTracker/Rtc.h
  12. +1
    -0
      GpsTracker/Storage.cpp
  13. +0
    -10
      GpsTracker/Time.h
  14. +0
    -8
      GpsTracker/Utils.cpp
  15. +0
    -7
      GpsTracker/Utils.h

+ 5
- 1
GpsTracker/Gps.cpp 查看文件

@@ -1,9 +1,13 @@
#include "Gps.h" #include "Gps.h"
#include "Debug.h"


#define LOGGER_NAME "Gps" #define LOGGER_NAME "Gps"


namespace gps { namespace gps {


char lastPosition[GPS_POSITION_SIZE];
SIM808_GPS_STATUS lastStatus;

void powerOn() { void powerOn() {


} }
@@ -23,7 +27,7 @@ namespace gps {
return currentStatus; return currentStatus;
} }


Time getTime() {
time_t getTime() {
} }
} }

+ 6
- 4
GpsTracker/Gps.h 查看文件

@@ -1,18 +1,20 @@
#pragma once #pragma once


#include "Time.h"
#include <TimeLib.h>
#include <Time.h>
#include <SIM808.h>


#define GPS_POSITION_SIZE 128 #define GPS_POSITION_SIZE 128


namespace gps { namespace gps {


char lastPosition[GPS_POSITION_SIZE];
SIM808_GPS_STATUS lastStatus;
extern char lastPosition[GPS_POSITION_SIZE];
extern SIM808_GPS_STATUS lastStatus;


void powerOn(); void powerOn();
void powerOff(); void powerOff();


SIM808_GPS_STATUS acquireCurrentPosition(); SIM808_GPS_STATUS acquireCurrentPosition();
Time getTime();
time_t getTime();


} }

+ 8
- 14
GpsTracker/GpsTracker.h 查看文件

@@ -3,26 +3,20 @@
#include <Arduino.h> #include <Arduino.h>
#include <SoftwareSerial.h> #include <SoftwareSerial.h>
#include <SIM808.h> #include <SIM808.h>
#include <TimeLib.h>
#include <Time.h>


#include "Debug.h" #include "Debug.h"
#include "Core.h" #include "Core.h"


#include "posmgr.h"
#include "Gps.h" #include "Gps.h"
#include "posmgr.h"
#include "MainUnit.h"
#include "Network.h" #include "Network.h"
#include "Rtc.h" #include "Rtc.h"
#include "Storage.h"
#include "Utils.h"
#include "Pins.h"
#include "Positions.h"


#define LOGGER_NAME "GpsTracker"

#define SIM_RX 5
#define SIM_TX 6
#define SIM_PWR 9
#define SIM_STATUS 8


#define RTC_PWR A0
#define EEPROM_PWR A0
#define SD_SS SS

#define SIM_RI 2
#define RTC_WAKE 3
#define LOGGER_NAME "GpsTracker"

+ 9
- 1
GpsTracker/GpsTracker.ino 查看文件

@@ -21,9 +21,17 @@ void loop() {
gps::powerOff(); gps::powerOff();


if (gpsStatus > SIM808_GPS_STATUS::NO_FIX) { if (gpsStatus > SIM808_GPS_STATUS::NO_FIX) {
Time time = utils::parseTime();
time_t time = gps::getTime();
rtc::powerOn(); rtc::powerOn();
rtc::setTime(time); rtc::setTime(time);
rtc::powerOff(); rtc::powerOff();

positions::appendLast();
}

if (positions::needsToSend()) {
positions::send();
} }

mainunit::deepSleep(10);
} }

+ 26
- 0
GpsTracker/MainUnit.cpp 查看文件

@@ -0,0 +1,26 @@
#include "MainUnit.h"
#include "Rtc.h"
#include "Pins.h"

namespace mainunit {

void interrupt() {
detachInterrupt(digitalPinToInterrupt(RTC_WAKE));
}

void interruptIn(uint16_t seconds) {
rtc::setAlarm(seconds);

pinMode(RTC_WAKE, INPUT);
attachInterrupt(digitalPinToInterrupt(RTC_WAKE), interrupt, FALLING);
}

void sleep(period_t period) {
LowPower.powerDown(period, ADC_OFF, BOD_OFF);
}

void deepSleep(uint16_t seconds) {
interruptIn(seconds);
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
}
}

+ 9
- 0
GpsTracker/MainUnit.h 查看文件

@@ -0,0 +1,9 @@
#pragma once

#include <Arduino.h>
#include <LowPower.h>

namespace mainunit {
void sleep(period_t period);
void deepSleep(uint16_t seconds);
}

+ 13
- 0
GpsTracker/Pins.h 查看文件

@@ -0,0 +1,13 @@
#pragma once

#define SIM_RX 5
#define SIM_TX 6
#define SIM_PWR 9
#define SIM_STATUS 8

#define RTC_PWR A0
#define EEPROM_PWR A0
#define SD_SS SS

#define SIM_RI 2
#define RTC_WAKE 3

+ 22
- 0
GpsTracker/Positions.cpp 查看文件

@@ -0,0 +1,22 @@
#include "Positions.h"

#include "Gps.h"
#include "Network.h"
#include "Storage.h"

#define LOGGER_NAME "Positions"

namespace positions {

void appendLast() {
//write gps::lastPosition to eeprom and eventually to sd card
}

bool needsToSend() {
return false;
}

void send() {

}
}

+ 8
- 0
GpsTracker/Positions.h 查看文件

@@ -0,0 +1,8 @@
#pragma once

namespace positions {
void appendLast();

bool needsToSend();
void send();
}

+ 52
- 18
GpsTracker/Rtc.cpp 查看文件

@@ -1,4 +1,5 @@
#include "Rtc.h" #include "Rtc.h"
#include "Pins.h"


#include <Wire.h> #include <Wire.h>
#include <MD_DS3231.h> #include <MD_DS3231.h>
@@ -7,6 +8,38 @@


namespace rtc { namespace rtc {


namespace details {

time_t readTimeFromRegisters() {
tmElements_t tmElements = {
RTC.s,
RTC.m,
RTC.h,
RTC.dow,
RTC.dd,
RTC.mm,
CalendarYrToTm(RTC.yyyy)
};

return makeTime(tmElements);
}

void writeTimeToRegisters(time_t &time) {
tmElements_t tmElements;
breakTime(time, tmElements);

RTC.s = tmElements.Second;
RTC.m = tmElements.Minute;
RTC.h = tmElements.Hour;
RTC.dow = tmElements.Wday;
RTC.dd = tmElements.Day;
RTC.mm = tmElements.Month;
RTC.yyyy = tmYearToCalendar(tmElements.Year);
}

}

void powerOn() { void powerOn() {
digitalWrite(RTC_PWR, HIGH); digitalWrite(RTC_PWR, HIGH);
pinMode(RTC_PWR, OUTPUT); pinMode(RTC_PWR, OUTPUT);
@@ -28,31 +61,32 @@ namespace rtc {


void setup() { void setup() {
RTC.control(DS3231_12H, DS3231_OFF); //24 hours clock RTC.control(DS3231_12H, DS3231_OFF); //24 hours clock
RTC.control(DS3231_INT_ENABLE, DS3231_ON); //INTCN ON
RTC.control(DS3231_INT_ENABLE, DS3231_OFF); //INTCN OFF
} }


Time getTime() {
time_t getTime() {
RTC.readTime(); RTC.readTime();
return details::readTimeFromRegisters();
}


return {
RTC.yyyy,
RTC.mm,
RTC.dd,
RTC.h,
RTC.m,
RTC.s
};
void setTime(time_t &time) {
details::writeTimeToRegisters(time);
RTC.writeTime();
} }


void setTime(Time time) {
RTC.yyyy = time.yyyy;
RTC.mm = time.mm;
RTC.dd = time.dd;
RTC.h = time.h;
RTC.m = time.m;
RTC.s = time.s;
void setAlarm(uint16_t seconds) {
time_t t = getTime();
t = t + seconds;
setAlarm(t);
}


RTC.writeTime();
void setAlarm(time_t &time) {
details::writeTimeToRegisters(time);
RTC.writeAlarm1(DS3231_ALM_S);

RTC.control(DS3231_A1_FLAG, DS3231_OFF);
RTC.control(DS3231_A1_INT_ENABLE, DS3231_ON); //Alarm 1 ON
RTC.control(DS3231_INT_ENABLE, DS3231_ON); //INTCN ON
} }


} }

+ 8
- 2
GpsTracker/Rtc.h 查看文件

@@ -1,11 +1,17 @@
#pragma once #pragma once


#include <TimeLib.h>
#include <Time.h>

namespace rtc { namespace rtc {
void powerOn(); void powerOn();
void powerOff(); void powerOff();


void setup(); void setup();


Time getTime();
void setTime(Time time);
time_t getTime();
void setTime(time_t &time);

void setAlarm(uint16_t seconds);
void setAlarm(time_t &time);
} }

+ 1
- 0
GpsTracker/Storage.cpp 查看文件

@@ -1,4 +1,5 @@
#include "Storage.h" #include "Storage.h"
#include "Gps.h"


#define LOGGER_NAME "Storage" #define LOGGER_NAME "Storage"




+ 0
- 10
GpsTracker/Time.h 查看文件

@@ -1,10 +0,0 @@
#pragma once

struct Time {
uint16_t yyyy;
uint8_t mm;
uint8_t dd;
uint8_t h;
uint8_t m;
uint8_t s;
};

+ 0
- 8
GpsTracker/Utils.cpp 查看文件

@@ -1,8 +0,0 @@
#include "Utils.h"
#include "Gps.h"

namespace utils {

Time parseTime();

}

+ 0
- 7
GpsTracker/Utils.h 查看文件

@@ -1,7 +0,0 @@
#pragma once

#include "Time.h"

namespace utils {
Time parseTime();
}

正在加载...
取消
保存