【Arduino】millis()を使って時刻を取得する(?)

目的・背景

ArduinoUnoで定刻になったら処理をするプログラムを作りたかった。
そこでシステム時刻を取得したかったけど方法がわからんので、millis()関数を使って疑似的に作った。

環境

  • Arduino Uno

  • Arduino IDE 2.0.2

プログラム

setup関数でプログラムを起動する時間をセットして、loop関数で時間を更新するプログラムを作りました。

HeboTime.h

#ifndef TIME_H
#define TIME_H

#include "Arduino.h"

class HeboTime{
    private:
        unsigned long pre_millis=0;
        int sec=0;
        int min=0;
        int hour=0;
    public:
        HeboTime();
        HeboTime(int h,int m,int s);
        void updateTime(unsigned long millis);
        int getSec();
        int getMin();
        int getHour();
};

#endif

HeboTime.cpp

#include "Arduino.h"
#include "HeboTime.h"


HeboTime::HeboTime(){}
HeboTime::HeboTime(int h,int m,int s){
    sec = s;
    min = m;
    hour= h;
}
void HeboTime::updateTime(unsigned long millis){
    //算出
  if(millis-pre_millis >= 1000){
    Serial.print(millis);
    Serial.print(":");
    Serial.println(pre_millis);
    sec += (millis-pre_millis)/1000;//経過秒数分加算
    pre_millis=millis;//更新
    if(sec>=60){//60秒超えたらsec,minを更新
      min += sec/60;
      sec=sec%60;//更新
      if(min>=60){//60分超えたらmin,hour
        hour+=min/60;
        min=min%60;//更新
      }
    }
  }
  //millisがデータ範囲(4,294,967,295)を超えてリセットされたら
  if(millis<pre_millis){
    pre_millis=0;//TODO:ここでずれが生じるのをどうにかせねば
  }
}
int HeboTime::getSec(){
    return sec;
}
int HeboTime::getMin(){
    return min;
}
int HeboTime::getHour(){
    return hour;
}

使い方

スケッチブックディレクトリに上記のソースファイルを配置する。
あとは使用例のように使う。

配置した時のディレクトリ例

使用例

#include "HeboTime.h"

HeboTime time;
char buffer[30];

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);            //シリアル通信開始
  //0時4分30秒にプログラムを起動する場合
  time = HeboTime(0,4,30);       //プログラムを起動する時間を設定:HeboTime(時、分、秒)
}

void loop() {
  // put your main code here, to run repeatedly:
  time.updateTime(millis());//更新してあげないと動かないヘボ仕様

  sprintf(buffer,"%02d:%02d:%02d",time.getHour(),time.getMin(),time.getSec());
  Serial.println(buffer);
  delay(500);
}

実行結果


実行結果例

この記事が気に入ったらサポートをしてみませんか?