なんでも作っちゃう、かも。

Arduino/Make/フィジカルコンピューティング/電子工作あたりで活動しています。スタバの空きカップを使ったスタバカップアンプなど製作。最近はもっぱらArduinoと3Dプリンタの自作に興味があります。

Arduinoで遊ぼう - 日付と時刻を表示する

Posted by arms22 on 2009年01月18日 20  0

Arduino Duemilanove with LCD(HD44780) #2
前回のキャラクタ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



Arduino Uno SMD
Arduino Uno SMD
posted with amazlet at 11.02.04
スイッチサイエンス
売り上げランキング: 21734



Ads by Google

20 Comments

taneuma1 says..."間違いでは?"
いつも興味深く拝見させていただいております
とてもわかりやすく、正確な情報
助かっています(今後も続けてください・・・)
ところで、今回のスケッチそのままでは動きませんでした
setupでlcd.biginの設定が抜けているのでは?
いまさらですが、同じ事で困っている方のために・・・
勝手にコメントを使わせていただき、カキコします
あしからず・・・
2013.11.01 15:53 | URL | #HfMzn2gY [edit]
arms22 says..."No title"
あああ、本当だ抜けていますね。。
なんで動いてたんだろ。。
2013.11.03 21:51 | URL | #V/sWM3gk [edit]
m_makun says..."勉強中。。。"
この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ライブラリの
プログラムを勉強中です。
がんばります。
2013.11.09 20:24 | URL | #- [edit]
しがない大学生 says..."曜日と月が一つずれてしまう"
いきなりすいません。
DateTimenのプログラムの一月ずれるエラーを私もなおしていますが、なかなか修正できず苦戦しています。
何かこの解決策はわかりますか?
2013.12.19 17:13 | URL | #- [edit]
arms22 says..."No title"
0は1月だからあってるんじゃなーい?
1は2月。

2013.12.20 09:46 | URL | #j7sy4omY [edit]
しがない大学生 says..."No title"
それだと、12月が0になります。
2013.12.23 14:44 | URL | #- [edit]
arms22 says..."No title"
monthに11していしたら12月にならずに0月になるの?
2013.12.24 10:00 | URL | #j7sy4omY [edit]
arms22 says..."No title"
ああ、違うか。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月

サンプルコードのコメントが間違っています。
2013.12.24 10:27 | URL | #j7sy4omY [edit]
しがない大学生 says..."No title"
解決しました、ありがとうございました。
2014.01.09 15:56 | URL | #- [edit]
あじおん says...""
こんにちは。
最近時計を作り始めた者です。
ここの記事をいつも楽しく見ています。
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.

というエラーが出てきて詰んでしまっています。
これをどのように解決したらよいでしょうか?
回答お待ちしています
2016.05.28 20:37 | URL | #LvreOBmw [edit]
arms22 says..."Re: タイトルなし"
boolean 型が多重定義されているようです。
DateTimeライブラリからboolean型の定義箇所を探して削除 or コメントアウトしてみてください。
2016.05.29 22:41 | URL | #- [edit]
says...""
こんにちわ。
なんでも作っちゃう様の記事は勉強になるので愛読させて頂いております。

ところが、最近ブログのシステムが変わったようで、数学等の記事がなくなってしまったようです。

勉強になっていたので数学関連の記事も復活お願いします


2016.06.05 02:00 | URL | #- [edit]
mac says...""
上記メッセージのものですが、電子工学ののわかりやすい解説も愛読してましたので、復活お願いします。
2016.06.05 02:13 | URL | #- [edit]
arms22 says...""
こっちのブログと間違えてない?
http://gomisai.blog75.fc2.com
2016.06.06 23:29 | URL | #j7sy4omY [edit]
san says..."no idea"
こんいちは。
最近アルディーノを構い始めてこのサイトを参考にさせていただいてます。

今回の時計作りで困っていることがあるのですが、
あじおんさんと同じエラーが出て(私もArduino1.6.8で開発しております。)、上記のコメント通り
DateTimeライブラリからboolean型の定義箇所を探してコメントアウトしてみたのですが、

sketch_clock.ino:19:12: error: 'class DateTimeClass' has no member named 'available'

とエラーメッセージがでてどう直せばいいのかわからず苦戦しております。
ぜひともお力添えをお願いしたいです。
2016.06.13 16:41 | URL | #- [edit]
arms22 says...""
新しいライブラリがでているみたいだからそっちを使ってみてください。
サンプルコードも新しいライブラリの方を参考にしてください。
http://playground.arduino.cc/Code/Time
2016.06.14 23:26 | URL | #j7sy4omY [edit]
san says...""
こんにちは。
二日前に質問させていただいた者です。
教えていただいた新しいライブラリを使ってみたところはじめは
コンパイルエラーが出ましたが、なんとかできました。

ありがとうございました。
2016.06.15 11:31 | URL | #- [edit]
ardino初心者 says..."コンパイル"
こんにちは
プログラムを始めたばかりで、非常に参考にさせてもらってます。
こちらの記事自体がだいぶ前のもののようなので、流れに乗り遅れてしまいましたが、
サンプルスケッチと同じものでコンパイルをしてもエラーとなってしまうため、質問をさせていただきます。

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ライブラリを使って手動で時刻取得したく思います。

どなたかお知恵をお借りできませんでしょうか。

宜しくお願い致します。
2016.08.05 18:46 | URL | #JKANFDgA [edit]
arms22 says...""
Timeライブラリに無線通信機能は必要ありません。
setTime関数で時刻を設定します。
あるいはsetSyncProvider関数で時刻を提供する関数を登録してやると良いです。
2016.08.10 22:54 | URL | #j7sy4omY [edit]
ardino初心者 says..."できました"
返信が遅くなり申し訳ないです。コンパイルが通らなかった者です。
Timeライブラリに切り替えて時刻も手動で初期設定をしたところ、
うまくコンパイルも通り、無事実行ができました。
ありがとうございます。
2016.08.30 18:21 | URL | #JKANFDgA [edit]

Leave a reply






管理者にだけ表示を許可する

該当の記事は見つかりませんでした。