Arduino STM 32 F 103(BluePill)チュートリアル8 RTC時間

28114 ワード

Arduino STM 32 F 103(BluePill)チュートリアル8 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); } }

ソースの文章、メモを完全に貼り付けます.