Merge branch 'patch-7' of https://github.com/stevstrong/Arduino_STM32 into stevstrong-patch-7

This commit is contained in:
Roger Clark 2017-12-10 20:52:20 +11:00
commit dbbb6b0c25
1 changed files with 77 additions and 47 deletions

View File

@ -4,9 +4,9 @@
based on https://github.com/rogerclarkmelbourne/Arduino_STM32
1. Blink on PC13 per 4s or 7s by attachAlarmInterrupt for 10 times
2. Second counter by attachSecondsInterrpt
2. Second counter by attachSecondsInterrupt
3. Serial output on(41s) or off(21s) by creatAlarm
4. change to your timezone in the sketch; .
4. change to your timezone in the sketch;
3. get Unix epoch time from https://www.epochconverter.com/ ;
4. last step input the 10 bits number( example: 1503945555) to Serialport ;
5. the clock will be reset to you wanted.
@ -28,70 +28,110 @@
RTClock rtclock (RTCSEL_LSE); // initialise
int timezone = 8; // change to your timezone
time_t tt;
time_t tt1;
tm_t mtt = { 47, 9, 13, 3, 11, 22, 30, 30 }; // init time 47+1970 = 2017 Unix epoch Time counted from 00:00:00 1 Jan 1970
char weekday1[][7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; // 0,1,2,3,4,5,6
time_t tt, tt1;
tm_t mtt;
uint8_t dateread[11];
int globAlmCount = 0;
int lastGlobAlmCount;
int SPECAlmCount = 0;
int lastSPECAlmCount;
int i = 0;
int alarmcount = 3;
uint8_t AlarmExchange = 0;
bool dispflag = true;
#define LED_PIN PC13
// This function is called in the attachSecondsInterrpt
//-----------------------------------------------------------------------------
const char * weekdays[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
const char * months[] = {"Dummy", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
//-----------------------------------------------------------------------------
uint8_t str2month(const char * d)
{
uint8_t i = 13;
while ( (--i) && strcmp(months[i], d)!=0 );
return i;
}
//-----------------------------------------------------------------------------
const char * delim = " :";
char s[128]; // for sprintf
//-----------------------------------------------------------------------------
void ParseBuildTimestamp(tm_t & mt)
{
// Timestamp format: "Dec 8 2017, 22:57:54"
sprintf(s, "Timestamp: %s, %s\n", __DATE__, __TIME__);
//Serial.print(s);
char * token = strtok(s, delim); // get first token
// walk through tokens
while( token != NULL ) {
uint8_t m = str2month((const char*)token);
if ( m>0 ) {
mt.month = m;
//Serial.print(" month: "); Serial.println(mt.month);
token = strtok(NULL, delim); // get next token
mt.day = atoi(token);
//Serial.print(" day: "); Serial.println(mt.day);
token = strtok(NULL, delim); // get next token
mt.year = atoi(token) - 1970;
//Serial.print(" year: "); Serial.println(mt.year);
token = strtok(NULL, delim); // get next token
mt.hour = atoi(token);
//Serial.print(" hour: "); Serial.println(mt.hour);
token = strtok(NULL, delim); // get next token
mt.minute = atoi(token);
//Serial.print(" minute: "); Serial.println(mt.minute);
token = strtok(NULL, delim); // get next token
mt.second = atoi(token);
//Serial.print(" second: "); Serial.println(mt.second);
}
token = strtok(NULL, delim);
}
}
//-----------------------------------------------------------------------------
// This function is called in the attachSecondsInterrupt
//-----------------------------------------------------------------------------
void SecondCount ()
{
tt++;
}
// This function is called in the attachAlarmInterrpt
//-----------------------------------------------------------------------------
// This function is called in the attachAlarmInterrupt
//-----------------------------------------------------------------------------
void blink ()
{
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
globAlmCount++;
//tt++;
}
//-----------------------------------------------------------------------------
void OnOffSerial ()
{
dispflag = !dispflag;
SPECAlmCount++;
}
//-----------------------------------------------------------------------------
void setup()
{
lastGlobAlmCount = ~globAlmCount;
lastSPECAlmCount = ~SPECAlmCount;
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
tt = rtclock.makeTime(mtt);
rtclock.setTime(tt);
pinMode(LED_BUILTIN, OUTPUT);
//while (!Serial); delay(1000);
ParseBuildTimestamp(mtt); // get the Unix epoch Time counted from 00:00:00 1 Jan 1970
tt = rtclock.makeTime(mtt) + 25; // additional seconds to compensate build and upload delay
rtclock.setTime(tt);
tt1 = tt;
rtclock.attachAlarmInterrupt(blink);// Call blink
rtclock.attachSecondsInterrupt(SecondCount);// Call SecondCount
}
//-----------------------------------------------------------------------------
void loop()
{
while (Serial.available())
{ dateread[i] = Serial.read();
if (i < 11) {
i++;
}
else {
i = 0;
tt = (dateread[0] - '0') * 1000000000 + (dateread[1] - '0') * 100000000 + (dateread[2] - '0') * 10000000 + (dateread[3] - '0') * 1000000 + (dateread[4] - '0') * 100000;
tt += (dateread[5] - '0') * 10000 + (dateread[6] - '0') * 1000 + (dateread[7] - '0') * 100 + (dateread[8] - '0') * 10 + (dateread[9] - '0');
rtclock.TimeZone(tt, timezone); //adjust to your local date
rtclock.setTime(rtclock.TimeZone(tt, timezone));
if ( Serial.available()>10 ) {
for (uint8_t i = 0; i<11; i++) {
dateread[i] = Serial.read();
}
Serial.flush();
tt = atol((char*)dateread);
rtclock.setTime(rtclock.TimeZone(tt, timezone)); //adjust to your local date
}
if (lastGlobAlmCount != globAlmCount | lastSPECAlmCount != SPECAlmCount ) {
if (lastGlobAlmCount != globAlmCount || lastSPECAlmCount != SPECAlmCount ) {
if (globAlmCount == 10) { // to detachAlarmInterrupt and start creatAlarm after 10 times about 110s
rtclock.detachAlarmInterrupt();
globAlmCount = 0;
@ -117,23 +157,13 @@ void loop()
}
}
}
if (tt1 != tt & dispflag == true )
if (tt1 != tt && dispflag == true )
{
tt1 = tt;
//rtclock.breakTime(tt, mtt);
Serial.print("Date: ");
Serial.print(rtclock.day());
Serial.print("- ");
Serial.print(rtclock.month());
Serial.print(" ");
Serial.print(rtclock.year() + 1970);
Serial.print(" ");
Serial.print(weekday1[rtclock.weekday()]);
Serial.print(" Time: ");
Serial.print(rtclock.hour());
Serial.print(" : ");
Serial.print(rtclock.minute());
Serial.print(" : ");
Serial.println(rtclock.second());
// get and print actual RTC timestamp
rtclock.breakTime(rtclock.now(), mtt);
sprintf(s, "RTC timestamp: %s %u %u, %s, %02u:%02u:%02u\n",
months[mtt.month], mtt.day, mtt.year+1970, weekdays[mtt.weekday], mtt.hour, mtt.minute, mtt.second);
Serial.print(s);
}
}