Arduino STM 32 F 103(BluePill)チュートリアル8 RTC時間
28114 ワード
Arduino STM 32 F 103(BluePill)チュートリアル8 RTC時間
今日、Arduinoの公式ルーチンからの純粋な翻訳性のブログを発表しました(チュートリアルの完全性を維持するためだけです).
以下は、シリアルポート出力時間のボーレート115200である.
RTCライブラリの導入
ソースの文章、メモを完全に貼り付けます.
今日、Arduinoの公式ルーチンからの純粋な翻訳性のブログを発表しました(チュートリアルの完全性を維持するためだけです).
以下は、シリアルポート出力時間のボーレート115200である.
RTCライブラリの導入
#include <RTClock.h>
RTClock rtclock (RTCSEL_LSE); // initialise
int timezone = 8; // change to your timezone
time_t tt, tt1;
tm_t mtt;
uint8_t dateread[11];
int globAlmCount = 0;
int lastGlobAlmCount;
int SPECAlmCount = 0;
int lastSPECAlmCount;
int alarmcount = 3;
uint8_t AlarmExchange = 0;
bool dispflag = true;
//-----------------------------------------------------------------------------
const char * weekdays[] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
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
", __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 attachAlarmInterrupt
//-----------------------------------------------------------------------------
void blink ()
{
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
globAlmCount++;
}
//-----------------------------------------------------------------------------
void OnOffSerial ()
{
dispflag = !dispflag;
SPECAlmCount++;
}
//-----------------------------------------------------------------------------
void setup()
{
lastGlobAlmCount = ~globAlmCount;
lastSPECAlmCount = ~SPECAlmCount;
Serial.begin(115200);
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()
{
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 (globAlmCount == 10) { // to detachAlarmInterrupt and start creatAlarm after 10 times about 110s
rtclock.detachAlarmInterrupt();
globAlmCount = 0;
rtclock.createAlarm(OnOffSerial, (rtclock.getTime() + 20)); // call OnOffSerial stop output date from Serial after 2 mins
alarmcount = 20; //change to creatAlarm 21S close Serial output and 41s open Serial output.
}
else {
lastGlobAlmCount = globAlmCount;
lastSPECAlmCount = SPECAlmCount;
Serial.println(" Say hello to every guys ");
if(dispflag == false)
Serial.println(" SPECAlarm turn Display Off ");
switch (AlarmExchange) {
case 0:
rtclock.setAlarmTime(rtclock.getTime() + alarmcount); // reset alarm = current time + 4s for attachAlarmInterrupt, 21s for creatAlarm
AlarmExchange = 1;
break;
case 1:
rtclock.breakTime(rtclock.getTime() + alarmcount * 2, mtt); reset alarm = current time + 7s for attachAlarmInterrupt, 41s for creatAlarm
rtclock.setAlarmTime(mtt);
AlarmExchange = 0;
break;
}
}
}
if (tt1 != tt && dispflag == true )
{
tt1 = tt;
// get and print actual RTC timestamp
rtclock.breakTime(rtclock.now(), mtt);
sprintf(s, "RTC timestamp: %s %u %u, %s, %02u:%02u:%02u
",
months[mtt.month], mtt.day, mtt.year+1970, weekdays[mtt.weekday], mtt.hour, mtt.minute, mtt.second);
Serial.print(s);
}
}
ソースの文章、メモを完全に貼り付けます.