| ホーム |     私の電子工作作品集

153. キッチン(カウントダウン)・タイマー

[ 初公開日:2013年8月21日 ]

 以前に 100 均で購入したタイマーが電池切れになりました。 小型でその点だけは良かったのですが、LCD表示で見づらいのと、購入当時から(現在でも) START/STOP スイッチの接触が悪く、これは致命的で非常に使いにくいものでした。

 そこでこれを機に、見やすく使いやすいキッチン・タイマーを作製することにしました。 キッチンでの使用を意識してタッパー・ケースに組み込んでみました。 最大 "99分59秒" まで設定することが可能で、"分分.秒秒" の4桁でLED表示をします。 またついでの機能として、ストップウオッチとしても機能するように考慮してあります。


プログラムを更新(操作性の向上と消費電流の低減) ( 2019/10/22 更新 )

 従来、本機では一旦スリープモードに移行すると目覚めることがなかったのですが、これではやはりおかしい(使いづらい)ので、プログラムにウェイクアップ機能を設けました。 また、カウントダウン/アップ中は電池の無駄な消耗を減らすために、毎秒ごとに約 1/4 秒間だけのLED表示になるように変更をしました。

 これらのプログラム変更にともなって、このページも大幅に追記、加筆を行いました。 詳細は 機能概要、および プログラム の項とその 最新バージョンの ソースファイル (KitchenTimer.asm) をご覧ください。

■ 回路図 ■

*注. RA4 の出力はオープンドレインのため、外部抵抗でプルアップしないと、High が出力されない。
RA5 は入力専用で、出力ポートには使えない。

| 回路図 (KitchenTimer.CE3) | ページトップ |

■ ケース外観と内部の様子 ■

ケース正面斜め上からの外観 タイマー時間3分を設定したところ
裏ぶたを外したところ 内部の様子(1) 内部の様子(2)

| ページトップ |

■ 機能概要 ■

  • 本機はキッチンで使用することを主目的とし、表示は4桁のLEDで行って見やすさと使いやすさを第一としている。

  • 本機の電源をオンにすると、"ピポッ" と開始ブザー音を出力後、バージョン番号がLEDに約1.5秒間表示される。 その後 EEPROM に記憶されている、 前回設定したタイマー時間値が読み出されて、その内容がLEDに表示される。

  • このタイマー時間の設定は、10M:十分、1M:分、10S:十秒、1S:秒の4つのタクトスイッチで行い、最大 "99分59秒" までが設定可能で、START スイッチがオンされるまでの間は いくらでも変更が可能である。

  • 10M:十分、1M:分、10S:十秒、1S:秒の4つのタクトスイッチは、そのままオン操作することにより該当の桁を1ずつインクリメントする。 またこのとき UP/DOWN/STOP スイッチ を併用しながらオン操作すると、該当の桁を1ずつデクリメントする。

  • 10M:十分、1M:分、1S:秒の3つのスイッチでは、"0" から "9" までの設定が、10S:十秒スイッチでは、"0" から "5" までの設定が可能であり、 各桁の最大値を超える(インクリメント時)と "0" に戻り、また最小値 "0" を超える(デクリメント時)と各桁の最大値に戻る。

  • タイマー時間の設定が済み、START スイッチ をオンすると、まずスイッチ入力した設定データの有効性チェックが行なわれ、もし "00分00秒" が 設定された場合には "ブッブー" というブザー音を鳴らしてエラー表示をした後、再びタイマー時間の設定状態に戻る。

    ここで機能の変更追加 (Ver.1.05) を行なった。 下記(機能の変更追加)を参照。

  • 有効性チェックがOKだった場合( "00分01秒" 〜 "99分59秒" )には、次に今回設定されたタイマー時間を次回に備えて EEPROM に再記録した後、 1秒ずつのカウントダウンが始まり、その内容が刻々とLEDに表示される。 .......... なお、カウントダウン中は電池の消耗を減らすために、 毎秒ごとに約 1/4 秒間だけのLED表示になるように変更をした。(Ver.1.06)

  • 一方タイマー時間の設定中に、10M:十分、1M:分、10S:十秒、1S:秒、UP/DOWN/STOP スイッチの操作がされなくなって(最後にどれかを操作してから) 3分 1分が経過すると、LED表示は停止され "ブッ ブッ ブッ ブッ ブッ ブー" と ゆっくりブザー音を出力してユーザに知らせた後、本機は スリープモード に移行する。 これは本機が電池駆動のため、電源の消し忘れ等によってその無駄な消耗を防ぐのが目的のためである。 .......... 3分 → 1分に変更 (Ver.1.06)

  • 一旦スリープモードに移行すると本機では目覚めることはないので、タイマー動作を続ける場合は一度本機の電源をオフしたあと十数秒後に再び電源をオンにして、 初めからやり直す必要がある。

    ここで機能の変更 (Ver.1.06) を行なった。 スリープモード中に START スイッチ をオンすると、スリープが解除されてLED表示が戻り、 再びタイマー時間の設定を可能とする。

  • また、カウントダウン中に UP/DOWN/STOP スイッチ がオンされると、カウントダウンは停止され "ブッ ブー" というブザー音を出力後、 今回設定したタイマー時間のLED表示に戻り、再びタイマー時間の設定を可能とする。

  • カウントダウンが進みやがてタイムアウトになると、それまでの間に操作された SELECT スイッチ の位置によって "ピポッピポッ" というブザー音か、 またはチャルメラのブザー音で知らせる。 SELECT スイッチが "1" に選択されていると前者の "ピポッピポッ" 音を5回、"2" に選択されていると後者の チャルメラ音を2回繰り返し出力する。

  • その後、再び今回設定したタイマー時間のLED表示に戻り、タイマー時間の設定を可能とする。

  • (機能の変更追加)

    有効性チェックが行なわれ、もし "00分00秒" が設定された場合には、本機は ストップウオッチ として機能する。 そして EEPROM の再記録は行なわれず以前のままで、1秒ずつのカウントアップが始まり、その内容が刻々とLEDに表示される。  .......... なお、カウントアップ中も毎秒ごとに約 1/4 秒間だけのLED表示になるように変更をした。(Ver.1.06)

  • 簡単な操作でストップウオッチとして機能させるため、タイマー時間の設定状態のときに UP/DOWN/STOP スイッチをオンしながら START スイッチをオン すると、 現在LEDに何が表示されていても、瞬時に4桁分ともクリアされ "00分00秒" が設定される。

  • カウントアップ中に UP/DOWN/STOP スイッチがオンされることがなく、LEDに "99分59秒" が表示されていると、次には "00分00秒" に再び戻り、 初めからカウントアップをし続ける。

  • 一方、カウントアップ中に UP/DOWN/STOP スイッチ がオンされると、カウントアップは停止され "ブッ ブー" というブザー音を2回出力する。

  • カウントアップが停止されてLEDに表示されているカウントアップされた値、すなわちストップウオッチの値を確認後、再び UP/DOWN/STOP スイッチ がオンされると、前回設定したタイマー時間のLED表示に戻り、再びタイマー時間の設定を可能とする。

| ページトップ |

■ プログラム ■

・ 基準時間の発生と調整

本機では、タイマーカウントをするための基準時間の発生には、PIC の TMR0: タイマー0割り込みを使用して、基準となる1秒を作り出しています。

PIC のクロックパルス = 10MHz、プリスケーラのスケール値 = 1:2、TMR0 は8ビットカウンタで カウント値 = 125、とすることで、これらの条件から
	(4 / 発振周波数) x プリスケーラ値 x ハードタイマーカウント値 = (4 / 10MHz) x 2 x 125 = 100μS
となり、この 100μS 周期でハード的にタイマー0割り込みを起こさせ、それをソフトタイマーカウント値 = 10000 をカウントすることにより
	割り込み周期 x ソフトタイマーカウント値 = 100μS x 10000 = 1,000,000μS = 1 Sec
が得られます。

しかしこれは計算上の話で、実際に時間を測定してみると、次の表のように(補正値 = 0 の場合)1秒からはかなりかけ離れている(90 分に対して 5 分 25 秒ほど多い)ことが分かります。 これは実際にはクロックパルスが正確に 10MHz で発振していない、すなわち、基準となる正確な 100μS が得られないのが主な要因と考えられます。

この正確ではない 100μS を1秒あたり 10000 をカウントしていると、90 分間で 5 分 25 秒ほど多くなってしまうということは、10000 が多すぎるということなので、 その多い分だけ実際のカウント数を減らしてやれば良い訳です。 その減らす量が次に示す補正値 xx です。
	tm0_h_val	equ	256 - 125		;ハードタイマー0カウント値 (0.4 * 2 * 125 = 100μS)
	xx		equ	-569			;補正値
	tm0_s_val_h	equ	high (10000 + xx)	;ソフトタイマー0の high カウント値
	tm0_s_val_l	equ	low  (10000 + xx)	;ソフトタイマー0の low  カウント値
次表は本機のタイマー値を 90 分に設定し、以前に作製をした "長時間ストップウオッチ/タイマー" で、 実際のタイマー時間を測定してみたものです。 表からも分かるように、補正値 = -569 としたときが最も実時間に近くなることが分かりました。

設定時間 補正値 測定時間 誤差
1 90 分 0 01゚ 35' 25''75 + 5' 25''75
2 90 分 - 565 01゚ 30' 02''14 + 2''14
3 90 分 - 570 01゚ 29' 59''18 - 0''82
4 90 分 - 568 01゚ 30' 00''46 + 0''46
5 90 分 - 569 01゚ 30' 00''04 + 0''04
6 90 分 - 569 01゚ 29' 59''89 - 0''11
7 90 分 - 569 01゚ 29' 59''90 - 0''10
8 90 分 - 569 01゚ 29' 59''85 - 0''15
9 90 分 - 569 01゚ 29' 59''95 - 0''05
10 90 分 - 569 01゚ 30' 00''04 + 0''04
"長時間ストップウオッチ/タイマー" で時間測定をしているところ

本機では、ポートをすべて使用していて空きポートが1つもないため、この基準時間の調整中だけ RB7: ブザー音出力を、時間測定用端子として切り替えて使用をしました。 具体的には、プログラム中の "変数、定数の定義とレジスタ割付け" 部分の先頭行
	;#define 	_debug			;TMR0 基準時間の調整中
の先頭の ;(セミコロン)を取り除いてアセンブルし直すことによって、"TMR0 基準時間の調整支援" プログラムに切り替わります。 (詳細は ソースファイル (KitchenTimer.asm) を参照のこと。 _debug で検索してください。)

プログラムを起動すると、通常通り各スイッチの押下待ちになるので、10M:十分、1M:分、10S:十秒、1S:秒、UP/DOWN/STOP スイッチでタイマー時間(例. 90 分)の設定後、 START スイッチを押下するとカウントダウンが始まります。 そして、設定をしたタイマー時間(例. 90 分)が経過してタイムアウトになると、UP/DOWN/STOP スイッチの押下待ちになります。 ストップウオッチの時間表示を確認後、同スイッチを押下すれば再び各スイッチの押下待ちになるので、何度でも時間測定を繰り返すことが可能です。

このとき時間測定用端子(RB7)からは、待機中は "H" が出力され、カウントダウン中は "L" が出力されるので、この信号を前述の "長時間ストップウオッチ/タイマー" で測定をすれば、 正確な時間測定が可能となります。

・ タイムアウト時のブザー音

カウントダウン・タイマーがタイムアウトになったとき、圧電ブザーを鳴らせてそれをユーザに知らせるのですが、そのブザー音に2種類のメロディを用意しました。

その1つは単純にピポッピポッ・・・ と言うものと、もう1つはチャルメラ音を奏でると言うものです。 チャルメラ音については頭では分かっているのですが、 正確にはどんなものかとインターネットで検索したところ、サイト "feb19.jp blog" で次の譜面が見つかりました。


そこでこの譜面を基にしてメロディプログラムを作成してみました。 と言ってもメロディプログラム自体は、既に "025. 電子オルゴール" で 作成済みのものをカスタマイズしただけで今回のプログラムに組み込み、チャルメラ音の曲データは当然ながら新たに作成しました。

・ スリープモードとウェイクアップ機能 ( 2019/10/22 追記 )

従来、本機では一旦スリープモードに移行すると目覚めることがなかったので、タイマー動作を続ける場合には、一度本機の電源をオフしたあと十数秒後に再び電源をオンにして、 初めからやり直す必要がありました。 これは、本機のプログラムを作成しだした初期のころの私には、目覚め(ウェイクアップ)させるための具体的な上手い方法が分からなかったためで、 当時の私としてはやむを得ませんでした。

しかし、いつまでもこのまま放置をしておくのもおかしい(使いづらい)し、また、最近このページをご覧いただいている方々が多くなってきたこともあって、遅まきながら 今回プログラムにウェイクアップ機能を盛り込みました。

本機で使用している PIC16F628A には、RB4 〜 RB7 の4つのポートに "RB ポート変化割り込み" の機能があり、本機では丁度 RB4 ポートに START スイッチが繋がっています。 そこで、スリープモード中に、この START スイッチを押すことによって "RB ポート変化割り込み" を起こさせ、スリープモードから脱出させることにしました。

次に示したリストが、実際にスリープモードへの移行とウェイクアップを行っているプログラムの、必要な部分だけを抜粋したものです。
			; スリープモードに突入

				:
				:

			bsf	STATUS,RP0	;バンク 1
			bsf	TRISB,4		;RB4 入力設定
			bcf	STATUS,RP0	;バンク 0

	m0x		bsf	INTCON,RBIE	;RBポート変化割り込みを許可
			sleep
			;
			;			;wake up
			btfsc	PORTB,4		;START スイッチ操作 = あり か?			;*
			goto	m0x		;No. 操作なしでポート変化 ... 再度 sleep 	;*

			movlw	50
			call	wait_w1ms	;チャタリング吸収

	m0y		btfss	PORTB,4		;START スイッチ操作 = なし(終った) か?
			goto	m0y		;No

			movlw	50
			call	wait_w1ms	;チャタリング吸収
			bsf	STATUS,RP0	;バンク 1
			bcf	TRISB,4		;RB4 出力設定
			bcf	STATUS,RP0	;バンク 0
			goto	ini03		;

				:
				:

			; RB ポート変化割り込み処理

	int_rb		bcf	INTCON,RBIF	;RBポート変化割り込みフラグをクリア
			bcf	INTCON,RBIE	;RBポート変化割り込みを禁止
	;		goto	int_end

				:
				:
上記の 回路図 に示すように、RB4 ポートには START スイッチの他に、7セグLEDの e セグメントにも繋がっています。 そして、この1つの同一ポートを、平常時(スリープモード時以外)には必要なタイミングで入力/出力を切り替えて、入力時には START スイッチの検出、出力時には7セグLEDの e セグメントの制御をしています。

そこで、本機がスリープモードに移行する直前にも、START スイッチの入力が検出できるように、まず RB4 ポートを入力に切り替え、次に INTCON レジスタのビット RBIE = 1 にセットして、 "RB ポート変化割り込み" を許可して準備を整えた上で、スリープモードに移行をしています。

本機の RB4 入力ポートは、抵抗でプルアップされているので常時 "H" が入力されていますが、START スイッチが ON されたときには "L" が入力されて、この状態が変化したことにより "RB ポート変化割り込み" が起こります。 そして、割り込みルーチンに処理が移ると、本機プログラムでは該当の RB ポート変化割り込み処理内で、先に許可していた INTCON レジスタのビット RBIE = 0 にクリアして "RB ポート変化割り込み" を再び禁止にし、割り込みルーチンを抜けて sleep の次の命令に処理が移ります。

sleep の次の命令以降では、START スイッチを押した直後から離した直後までの、両チャタリングを考慮した ON/OFF の状態検出処理を行っています。 そしてその後は、7セグLEDの e セグメントの制御に備えて RB4 ポートを再び出力に戻しています。

以上の過程で重要なのは、上リスト内の右端のコメント ;* 印を付けた2行で、これらがないとプログラムは思っているようなウェイクアップ動作はしてくれません。

上述のように、初めのスリープモード時には、RB4 入力ポートには常時 "H" が入力されていて、START スイッチによる "L" 入力によって "RB ポート変化割り込み" が起こりますが、 次のスリープモード時には、START スイッチによる "L" ではなく、プルアップによる "H" で割り込みが起こります。 すなわち、何もスイッチ操作をしていないのに、スリープモードに 移行したと同時に割り込みが起こってしまって、困ったことになります。 そして、その次のスリープモード時には、再び START スイッチによる "L" で割り込みが起こります。

このように、"RB ポート変化割り込み" が起こるのは、RB4 入力ポートに加わる電位がスリープモードになる度に、"L" → "H" → "L" → "H" → ・・・ と変化をして行きます。

したがって、"H" のときには意図しない割り込みが起こる訳だから、上リストの ;* 印を付けた2行のように、もう一度 sleep(実際には m0x)に戻してやれば良いことになります。

・ 消費電流の削減対策 ( 2019/10/22 追記 )

本機では電池駆動にもかかわらず4桁の7セグLEDで時間表示をしています。 従来ではスリープモードに移行しているとき以外は、電源を ON してから OFF するまでの間中は、 常にこれらの7セグLEDに電流が流れたままになっていて、勿論、ダイナミック点灯をさせていますが、使用したLEDが高輝度タイプではないためそれなりの電流消費があります。

そこで、電池の無駄な消耗を少しでも減らすために、時間表示がカウントダウン(または、カウントアップ)中には、電流消費を抑えるために一工夫をしてみました。 その方法として、従来では上述のように常に電流が流れたままになっていたのを、毎秒ごとに約 1/4 秒間だけのLED点灯になるようにプログラムの変更をしました。

また、スイッチ操作がなくなってからスリープモードに移行するまで(その間はLEDに電流が流れたままの常時点灯)の監視時間を、従来3分であったのを1分に短縮をしました。 これは上述のように、スリープモードからいつでもウェイクアップをさせることを可能としたために、短くても全く問題がなくなったためです。

・ 消費電流の削減対策 ( 2019/11/17 補足追記 )

 これは運用上の話ですが、本機の SELECT スイッチを操作したときの消費電流については、私の他のページ "183. ラーメン・タイマー III" の "回路図" の項で ALARM スイッチについて述べたことと、まったく同じことが本機にも当てはまります。

 これらのスイッチはタイムアウトになったときのアラーム音を切り替えるもので、本機での機能割り当ては、OFF("1")のときには "ピポッピポッ" 音を、また、ON("2")のときには チャルメラ音をブザー出力します。("183. ラーメン・タイマー III" では OFF を優先して、逆に OFF のときにはチャルメラ音を、また、ON のときには "ピポッピポッ" 音を割り当てている。)

 本機がスリープモードになったときの消費電流(電源電圧が 6V のとき)を実測してみると、SELECT スイッチが ON のときには約 252 μA、 また OFF のときには殆んどゼロ(私が所有するデジタルマルチメータでは、00.0 μA と表示されて正確には分からない)になりました。

 したがって、本機には電源スイッチを設けてありますが、SELECT スイッチが OFF のときに限っては、電源スイッチが ON のままで放置してもまったく構わないと思います。

現在の最新バージョン: Ver. 1.06  ( 2019/10/22 更新 )

| ページトップ |

■ プリント基板(1)パターン図 (部品面) ■

 左側のパターン図には、2P (PIC の右上) と 3P (PIC の左) の各ピンヘッダが追加されていますが、これは前項 プログラム の "基準時間の発生と調整" で述べた、"長時間ストップウオッチ/タイマー" への電源と /BUSY 信号の取り出し用の端子です。 右側の写真にはそれらが反映されておりませんので、 注意をお願いします。

| プリント基板(1)パターン図 (部品面) (KitchenTimer1PC.CE3) | ページトップ |

■ プリント基板(1)パターン図 (ハンダ面) ■

| プリント基板(1)パターン図 (ハンダ面) (KitchenTimer1PC1.CE3) | ページトップ |

■ プリント基板(2)パターン図 (部品面) ■

| プリント基板(2)パターン図 (部品面) (KitchenTimer2PC.CE3) | ページトップ |

■ プリント基板(2)パターン図 (ハンダ面) ■

| プリント基板(2)パターン図 (ハンダ面) (KitchenTimer2PC1.CE3) | ページトップ |

■ コネクタケーブル ■

プリント基板(1)とプリント基板(2)の、両基板を繋ぐためのコネクタケーブルです。


プリント基板の製作でコネクタ(秋月電子通商で販売している)を使用する場合、一般的に、基板側にピンヘッダ(オス)を、ケーブル側に ピンフレーム(ピンソケット)(メス)を使用します。

そのときのケーブル側に接続するピンフレーム(ピンソケット)ですが、決して、ピンソケットにケーブルを直接ハンダ付けしてはいけません。 ( "151. 電子メトロノームU(参考基板パターン図)" を参照)

上写真のように、必ず基板の端材等を介してハンダ付けをしないと、ピンヘッダに差し込んだ時に、ピンソケットの各ピンが黒色のソケットケース部分から バラバラに抜けてしまいます。

また、ケーブルについてですが、プリント基板(1)とプリント基板(2)の、両基板でのコネクタピンの並び順が異なっているために、上写真のようにフラットケーブルが クロスして捻じれてしまいました。

これは当初、ピンソケットとケーブルを使用するつもりはなく、両基板のピンヘッダ同士を、直接ラッピングワイヤで配線する予定でした。 したがってピンの並び順には さほど拘りがなく、どうでもいいことでした。

しかし、実際にラッピングワイヤで配線をしたところ、プログラムのデバッグ中に、不安定位置の基板からの度重なるPICの抜き差しによって、 ラッピングワイヤに無理な力が加わり、単線であるワイヤの断線がしばしば起こりました。

そんな訳で、ラッピングワイヤで配線するのを止めて、上写真のようなコネクタケーブルに変更をしたのです。

| ページトップ |

■ ケース加工図 ■

 使用したケースは、100均で購入した "タッパ ナカヤ化学産業" ポリプロピレンケースです。 型番は不明ですが、このシリーズは数種類のものが 販売されており、下図のような寸法のものを使用しました。

| ケース加工図 (KitchenTimerCS.CE3) | ページトップ |

前側面から見る 右側面から見る 後側面から見る 左側面から見る

■ 使用部品表 ■

(主要部品: IC, トランジスタ等)

(データシート)
PICマイコン .................... PIC16F628A
トランジスタ .................... 2SA1015
7セグLED .................... GL9A040G

| 部品表 | Excel ファイル (KitchenTimer_parts.xls) | ページトップ |

■ 参考サイト ■

カウントダウン・タイマー ..... http://www.piclist.com/images/www/hobby_elec/pic6_3.htm

| ページトップ | ホーム |


Copyright (C) 2010-2023 やまもとみのる
初版:2010年11月13日、初公開:2013年8月21日、最終更新:2023年11月1日