Arduinoで遊ぼう - 日付と時刻を表示する
Posted by arms22 on 2009年01月18日

前回のキャラクタLCDモジュールに日付と時刻を表示させてみました。正確な時刻が必要だったり、Arduinoの電源を切った後も時刻を保持したい場合は外付けのRTC(リアルタイムクロック)を使用します。今回の実験では正確な時刻やバックアップは必要なかったので、Arduino.ccのDateTimeライブラリを使用しました。DateTimeライブラリはこちらからダウンロードできます。
DateTimeライブラリはArduinoに日付と時刻を提供するソフトウェアライブラリです。外付けのハードウェアは必要ありません。起動時に1度、外部から時刻情報を設定してやる必要があります。また1日に数秒~十数秒時間がずれます。Arduinoがリセットされれば時刻は無効になります。
使い方
1.DateTimeライブラリをarduino-0012/hardware/libraries/以下にコピーします。
※ DateTimeライブラリにはDateTimeとDateTimeString、2つのライブラリが含まれています。2つともlibrariesにコピーしてください。
※ DateTimeライブラリの使い方はサンプルスケッチを参考にしてください。
サンプルスケッチ
#include <DateTime.h>
#include <DateTimeStrings.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd = LiquidCrystal(12,11,10,5,4,3,2);
time_t prevtime;
void setup() {
prevtime = DateTime.makeTime(0,0,9,17,1,2009);
DateTime.sync(prevtime);
}
void loop() {
while( prevtime == DateTime.now() ){
delay(100);
}
DateTime.available();
digitalClockDisplay();
}
void digitalClockDisplay(){
lcd.setCursor(0,0);
lcd.print(DateTimeStrings.dayStr(DateTime.DayofWeek));
lcd.print(" ");
lcd.print(DateTimeStrings.monthStr(DateTime.Month));
lcd.print(" ");
lcd.print(DateTime.Day,DEC);
lcd.print(" ");
lcd.print(DateTime.Year+1900,DEC);
lcd.setCursor(0,1);
lcd.print(" ");
lcd.print(DateTime.Hour,DEC);
printDigits(DateTime.Minute);
printDigits(DateTime.Second);
}
void printDigits(byte digits){
lcd.print(":");
if(digits < 10)
lcd.print('0');
lcd.print(digits,DEC);
}
setup関数で今の時間を設定します。本来パソコンなど外部機器から時刻情報を設定するのですが、今回はDateTimeライブラリのmakeTimeメソッドで時間を作成しました。時間の設定はsyncメソッドを行います。prevtimeには1970年1月1日からmakeTimeで指定した日付時刻(2009/1/17 9:00)までの経過秒数が格納されています。
loop関数では時間が更新されるのを待って、digitalClockDisplay関数でキャラクタLCDモジュールに時間情報を表示しています。
時間情報の取得はDateTimeのHour,Minute,Second,Year,Month,Dayプロパティを参照します。これらのプロパティはavailableメソッドで更新されます。
2009/01/18追記
DateTimeStringクラスのdayStrメソッド、monthStrメソッドを使えば曜日、月の英語名が得られます。DateTimeStrings.cppの次のマクロを有効にすれば長い名前が得られます。
dt_LONG_MONTH_STRINGS
dt_LONG_DAY_STRINGS
次のマクロを有効にすれば短い名前が得られます。dt_SHORT_DAY_STRINGS
dt_SHORT_MONTH_STRINGS
サンプルスケッチ: DateTime
http://xfind.hp.infoseek.co.jp/electric/arduino/sketch_090116b.pde
Arduino Playground - DateTime
http://www.arduino.cc/playground/Code/DateTime
Arduinoで遊ぼう - キャラクタLCDモジュール
http://arms22.blog91.fc2.com/blog-entry-203.html
Ads by Google
20 Comments
いつも興味深く拝見させていただいております
とてもわかりやすく、正確な情報
助かっています(今後も続けてください・・・)
ところで、今回のスケッチそのままでは動きませんでした
setupでlcd.biginの設定が抜けているのでは?
いまさらですが、同じ事で困っている方のために・・・
勝手にコメントを使わせていただき、カキコします
あしからず・・・
とてもわかりやすく、正確な情報
助かっています(今後も続けてください・・・)
ところで、今回のスケッチそのままでは動きませんでした
setupでlcd.biginの設定が抜けているのでは?
いまさらですが、同じ事で困っている方のために・・・
勝手にコメントを使わせていただき、カキコします
あしからず・・・
あああ、本当だ抜けていますね。。
なんで動いてたんだろ。。
なんで動いてたんだろ。。
このHPのスケッチでいろいろと
勉強させていただいています
ありがとうございます
arduino 1.0.5で動作確認中にわかったこと
検証・コンパイルでエラー発生
DateTime.cppの中身で
#include <wiring.h>が#include <wiring_private.h>の
変更が必要なことがわかりました
理由はwiring.hはwiring_private.hに置き換わっていました
これでエラーはなくなりました
また、表示ができなかったのでlcd.beginがないことに
前出の方のいうとおりでした
これでarduinoに書き込みますと
Tue Feb 17 2009
9:00:00
となり、うまくいったようなのですが
曜日と月が1ヶ月ずれていました
Sat Janとなるはずが、、、
今、DateTimeライブラリの
プログラムを勉強中です。
がんばります。
勉強させていただいています
ありがとうございます
arduino 1.0.5で動作確認中にわかったこと
検証・コンパイルでエラー発生
DateTime.cppの中身で
#include <wiring.h>が#include <wiring_private.h>の
変更が必要なことがわかりました
理由はwiring.hはwiring_private.hに置き換わっていました
これでエラーはなくなりました
また、表示ができなかったのでlcd.beginがないことに
前出の方のいうとおりでした
これでarduinoに書き込みますと
Tue Feb 17 2009
9:00:00
となり、うまくいったようなのですが
曜日と月が1ヶ月ずれていました
Sat Janとなるはずが、、、
今、DateTimeライブラリの
プログラムを勉強中です。
がんばります。
いきなりすいません。
DateTimenのプログラムの一月ずれるエラーを私もなおしていますが、なかなか修正できず苦戦しています。
何かこの解決策はわかりますか?
DateTimenのプログラムの一月ずれるエラーを私もなおしていますが、なかなか修正できず苦戦しています。
何かこの解決策はわかりますか?
0は1月だからあってるんじゃなーい?
1は2月。
1は2月。
それだと、12月が0になります。
monthに11していしたら12月にならずに0月になるの?
ああ、違うか。12を指定したら0月になるってことか。
monthは月-1を設定してください。
月は0からはじまります。
0→1月
1→2月
2→3月
3→4月
4→5月
5→6月
6→7月
7→8月
8→9月
9→10月
10→11月
11→12月
サンプルコードのコメントが間違っています。
monthは月-1を設定してください。
月は0からはじまります。
0→1月
1→2月
2→3月
3→4月
4→5月
5→6月
6→7月
7→8月
8→9月
9→10月
10→11月
11→12月
サンプルコードのコメントが間違っています。
解決しました、ありがとうございました。
こんにちは。
最近時計を作り始めた者です。
ここの記事をいつも楽しく見ています。
Arduino1.6.8で開発していてDateTimeライブラリを使おうと思ったのですが
'boolean' has a previous declaration as 'typedef bool boolean'
typedef bool boolean;
^
exit status 1
Error compiling for board Arduino/Genuino Uno.
というエラーが出てきて詰んでしまっています。
これをどのように解決したらよいでしょうか?
回答お待ちしています
最近時計を作り始めた者です。
ここの記事をいつも楽しく見ています。
Arduino1.6.8で開発していてDateTimeライブラリを使おうと思ったのですが
'boolean' has a previous declaration as 'typedef bool boolean'
typedef bool boolean;
^
exit status 1
Error compiling for board Arduino/Genuino Uno.
というエラーが出てきて詰んでしまっています。
これをどのように解決したらよいでしょうか?
回答お待ちしています
boolean 型が多重定義されているようです。
DateTimeライブラリからboolean型の定義箇所を探して削除 or コメントアウトしてみてください。
DateTimeライブラリからboolean型の定義箇所を探して削除 or コメントアウトしてみてください。
こんにちわ。
なんでも作っちゃう様の記事は勉強になるので愛読させて頂いております。
ところが、最近ブログのシステムが変わったようで、数学等の記事がなくなってしまったようです。
勉強になっていたので数学関連の記事も復活お願いします
なんでも作っちゃう様の記事は勉強になるので愛読させて頂いております。
ところが、最近ブログのシステムが変わったようで、数学等の記事がなくなってしまったようです。
勉強になっていたので数学関連の記事も復活お願いします
こっちのブログと間違えてない?
http://gomisai.blog75.fc2.com
http://gomisai.blog75.fc2.com
こんいちは。
最近アルディーノを構い始めてこのサイトを参考にさせていただいてます。
今回の時計作りで困っていることがあるのですが、
あじおんさんと同じエラーが出て(私もArduino1.6.8で開発しております。)、上記のコメント通り
DateTimeライブラリからboolean型の定義箇所を探してコメントアウトしてみたのですが、
sketch_clock.ino:19:12: error: 'class DateTimeClass' has no member named 'available'
とエラーメッセージがでてどう直せばいいのかわからず苦戦しております。
ぜひともお力添えをお願いしたいです。
最近アルディーノを構い始めてこのサイトを参考にさせていただいてます。
今回の時計作りで困っていることがあるのですが、
あじおんさんと同じエラーが出て(私もArduino1.6.8で開発しております。)、上記のコメント通り
DateTimeライブラリからboolean型の定義箇所を探してコメントアウトしてみたのですが、
sketch_clock.ino:19:12: error: 'class DateTimeClass' has no member named 'available'
とエラーメッセージがでてどう直せばいいのかわからず苦戦しております。
ぜひともお力添えをお願いしたいです。
新しいライブラリがでているみたいだからそっちを使ってみてください。
サンプルコードも新しいライブラリの方を参考にしてください。
http://playground.arduino.cc/Code/Time
サンプルコードも新しいライブラリの方を参考にしてください。
http://playground.arduino.cc/Code/Time
こんにちは。
二日前に質問させていただいた者です。
教えていただいた新しいライブラリを使ってみたところはじめは
コンパイルエラーが出ましたが、なんとかできました。
ありがとうございました。
二日前に質問させていただいた者です。
教えていただいた新しいライブラリを使ってみたところはじめは
コンパイルエラーが出ましたが、なんとかできました。
ありがとうございました。
こんにちは
プログラムを始めたばかりで、非常に参考にさせてもらってます。
こちらの記事自体がだいぶ前のもののようなので、流れに乗り遅れてしまいましたが、
サンプルスケッチと同じものでコンパイルをしてもエラーとなってしまうため、質問をさせていただきます。
ArdinoIDEが1.6.8で、
他の方と同じようなコンパイルのエラーがでてたので、
DateTimeライブラリ内のDateTime.cppの<wiring.h>→<wiring_private.h>に変更し、DateTime.hのboolean型の多重定義部分?(typedef uint8_t boolean;)を退けました。
そうすると今度は、「DateTime.cpp:59:1: error: expected unqualified-id before '{' token」というエラーが表示されてしまいました。
59行目の{の前は「this->status = dtStatusSync;}」となっているのですが、何がおかしいのかわからず苦戦しております。
新しいTimeライブラリの方は、時刻取得のために無線通信機能が必要なようなので、
できればこのDateTimeライブラリを使って手動で時刻取得したく思います。
どなたかお知恵をお借りできませんでしょうか。
宜しくお願い致します。
プログラムを始めたばかりで、非常に参考にさせてもらってます。
こちらの記事自体がだいぶ前のもののようなので、流れに乗り遅れてしまいましたが、
サンプルスケッチと同じものでコンパイルをしてもエラーとなってしまうため、質問をさせていただきます。
ArdinoIDEが1.6.8で、
他の方と同じようなコンパイルのエラーがでてたので、
DateTimeライブラリ内のDateTime.cppの<wiring.h>→<wiring_private.h>に変更し、DateTime.hのboolean型の多重定義部分?(typedef uint8_t boolean;)を退けました。
そうすると今度は、「DateTime.cpp:59:1: error: expected unqualified-id before '{' token」というエラーが表示されてしまいました。
59行目の{の前は「this->status = dtStatusSync;}」となっているのですが、何がおかしいのかわからず苦戦しております。
新しいTimeライブラリの方は、時刻取得のために無線通信機能が必要なようなので、
できればこのDateTimeライブラリを使って手動で時刻取得したく思います。
どなたかお知恵をお借りできませんでしょうか。
宜しくお願い致します。
Timeライブラリに無線通信機能は必要ありません。
setTime関数で時刻を設定します。
あるいはsetSyncProvider関数で時刻を提供する関数を登録してやると良いです。
setTime関数で時刻を設定します。
あるいはsetSyncProvider関数で時刻を提供する関数を登録してやると良いです。
返信が遅くなり申し訳ないです。コンパイルが通らなかった者です。
Timeライブラリに切り替えて時刻も手動で初期設定をしたところ、
うまくコンパイルも通り、無事実行ができました。
ありがとうございます。
Timeライブラリに切り替えて時刻も手動で初期設定をしたところ、
うまくコンパイルも通り、無事実行ができました。
ありがとうございます。
Leave a reply
該当の記事は見つかりませんでした。