【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;
}
使い方
スケッチブックディレクトリに上記のソースファイルを配置する。
あとは使用例のように使う。
![](https://assets.st-note.com/img/1669561967226-POVNiOcPEs.png?width=1200)
使用例
#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);
}
実行結果
![](https://assets.st-note.com/img/1669562343225-78B9dG0bG2.png)