#はじめに
最近、自社業務にてArduinoを利用したプロトタイピングする機会ができ、それを元に色々と試験機を作成している今日この頃。
先人の知恵を色々活用させて頂きつつも、わからないことは手探りで解決するのが結構クセになりつつあり、あぁプログラミングって楽しいなぁ…と思えている内が華と思いつつ、色々書かせて頂いております。
さて、今回はLTE-M Shield for Arduinoを利用した環境下においてLTE通信にて時刻を取得し記録及び活用すると言う、非常に需要の無いと思う内容について記載していこうと思います。
WiFi使ってconfigTime()使えばいいんじゃ?とか、そもそもRTCくらい設置しろよ…。思うのが普通だろうしそうしたいのは山々なのですが、まぁ行き当たりばったりも良い所なので、どうにかこうにか時間を取得する事とします。
#開発環境
- Arduino uno
- LTE-M Shield for Arduino
- SORACOM IoT SIM plan-D
- SORACOM Private Garden
- TinyGSM(通信ライブラリ)
- TimeLib.h(時間関連ライブラリ)
#関数を探す
LET-M Shield for Arduinoの利用に必要なライブラリにTinyGsmClient.h
と言うファイルがある。
LTE-M Shield for Arduinoに搭載されている通信モジュールはBG96なので、これによって呼び出されるライブラリはTinyGsmClientBG96.h
となる。
そして、このファイルの中に、TinyGsmTime.tpp
という、いかにも使えそうな雰囲気を醸し出すファイルがあるため、その内部にある関数をチェック。
すると、時刻合わせがこのライブラリで見事に出来る事が判明し、時間を簡単に呼び出せるTimeLib.h
と合わせて早速組み立ててみる事に。
#時刻取得
と言う訳で、まずは時刻の取得を行う。
modem.getNetworkTime(&year1, &month1, &day1, &hour1, &min1, &sec1, &timezone); // 時刻取得
setTime(hour1, min1, sec1, day1, month1, year1); //時刻セット
上記のように、modem.getNetworkTime()
で時刻を取得した後、setTime()
で時刻を記録する。
こう書けば案外簡単そうだが、この結論に至るまで一夜を明かす位には悩んだ。
NTPとか使わないといけないのかー?とか色々悩み始めるとドツボに嵌るから、解決してみれば簡単な物だけに、うーんとなってしまう。
#時刻表示
さて、格納までしてしまえば後はこちらの物。
とりあえず折角なので月日や時刻は0埋めを行って表示を行うようにしてみようと思う。
void Pclock() {
char tb1[20];
sprintf(tb1, "%04d/%02d/%02d %02d:%02d:%02d",
year(), month(), day(),
hour(), minute(), second());
Serial.println(tb1);
}
まぁ、言ってしまえば普通に年月日時分秒呼び出して良い感じに表記しますよー、と言うだけの関数なんですが。
年月日時分秒に関しては、それぞれTimeLib.h
内の関数
year()
、month()
、day()
、hour()
、minute()
、second()
にて取得が可能なので、それこそここからは表示するなり活用するなり煮るなり焼くなりである。
一度書き込みが終わったらあとは電源断までしっかり時計は働いてくれるので、遠慮なく時刻が活用できると言う寸法である。
スマートかどうかはさておき、とりあえず当初の目的は達成したので一応この文はこれで閉める事とする。
#参考サイト
vshymanskyy/TinyGSM
PaulStoffregen/Time
Arduino > Time > 日時設定 > setTime(hh, nn, ss, dd, mm, yyyy);
#おわりに
Qiitaの利用、実はこれが初めてだったりするのですが、果たしてこの文章が誰かの役に立つのだろうか…?と思ってしまったりはする。
とは言え、個人的な備忘録としても間違いなく機能するだろうし、これから悩んだ事象とかについてはちょくちょくここに残して行けたらなー、と思ってます。
ともあれ、ビギナーもビギナーな人間ではありますが、これから何卒よろしくお願いいたします!