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

200. 6桁ニキシー管時計 III(IN-17)

[ 初公開日:2024年5月10日 ]

 ニキシー管時計の製作に初めて私が挑戦をしたのは今から 18 年も以前のことで、そのときには見事?に失敗( "053. 6桁ニキシー管時計" )に終わりました。 そして、その7年後(すなわち 11 年前)にハードウエア、 ソフトウエアともに見直しをして、ニキシー管時計の製作に再挑戦( "173. 6桁ニキシー管時計(改良版)" )をし、何とか自分の思惑どうりのニキシー管時計に仕上げることができました。

 それらを私のホームページ上に公開をしてから早くも 10 年が経とうとしていますが、最近、ホームページをご覧になった方からの質問で久しぶりにニキシー管時計に係わったことと、今なお、私の部品箱内で製作されるのを順番待ちしている、 前作とは異なったニキシー管が存在することから、新たな製作意欲が湧いてきて今回の "6桁ニキシー管時計 III" の製作に至りました。


 今回製作のニキシー管時計では、初めに収納するケース有りきで、そのケースに合わせたサイズにプリント基板をカットし、時計全体のサイズもかなりコンパクトに仕上げました。 そのため、製作後半になって多少の無理も生じてきましたが、 何とかケース内に納め切りました。 しかし、タイマースイッチ等のリレー出力を AC 電源等の制御に使用したい方は、私が使用した小型リレーをパワーリレーに取り替えたり、収納ケース自体ももっと大型のものを使用した方が、 本機としての取り扱いは便利になると思います。

 また、最近のニキシー管時計などをインターネット上で見ていると、ニキシー管をバックからブルーの LED で照らして、装飾品としての相乗効果を狙った? ようなものをよく見かけるようになり、見ていて単純に奇麗である ― ということから私も真似をしてみました。 ただし、単に LED を点灯させるだけではつまらないので、ニキシー管に表示させる内容によって LED の表示パタンも変化させて、私なりにいろいろと(Lチカのように)遊んでみました。

■ 回路図 ■


 上の回路図をご覧になって不思議に思われた方もいるかもしれないと思いますので、一応、なぜこのような回路になったのか説明(言い訳?)をしておきます。 元々、初めに検討した回路図では、左下に位置する I/O エキスパンダ IC PCF8574/74A から、 右いっぱいに広がっている6個のブルーの LED と、左上辺りに位置しているデジタル温度センサ DS18B20 はどれも存在せず、PIC のポート RA2 には CH3 スイッチが繋がっていて、上図に比べるとずっとシンプルな構成でした。

 左側にある CH1 〜 CH3 スイッチと2組のリレー回路は、当初からタイマースイッチ機能、温度スイッチ機能を本機に盛り込む考えがあったので、現在の CH3 スイッチの位置を除いて上図と変更はありません。 そして、メイン基板であるプリント基板(1) に、 6本のニキシー管を取り付けるだけのハードウエアが完成間近になってから、ブルー LED のアイディアが浮かんできたため、急遽、上図のように I/O エキスパンダ IC PCF8574/74A と6個のブルー LED を追加することにしました。

 本機には気温を表示させる機能もあるのですが、その温度データを取り出す源に当初は、リアルタイムクロックモジュールに使用されている、RTC IC DS3231 の内蔵温度センサから読み出していました。 ところが、この RTC IC の実装位置が使用したケースでほぼ密閉状態となるため、ケース内の温度に左右されて正確な温度の測定ができないことが分かりました。 この事実に気が付いたのは全体のプログラムもほぼ完成に近づき、季節も冬から春になりかけたころですが、 これでは DS3231 の内蔵温度センサの使用は断念せざるを得ません。

 密閉状態の問題は別として、プリント基板(1)パターン図ケース外観と内部の様子 などを見ていただければ、空きスペースがほとんどないことが分かるように、本機ではあまり大型のセンサ類を使用することは難しい問題です。 そこで、私の手持ちに TO-92 パッケージの DS18B20 というデジタル温度センサがあったので、それを使用してみることにしました。

 DS18B20 は独自の 1-Wire インターフェースを持つ IC ですが、そのための空きポートが PIC 側になかったので、RA2 に収容していた CH3 スイッチには引っ越しをしてもらい、その空いたポートに DS18B20 を収容しました。 そして、CH3 スイッチには I/O エキスパンダ IC PCF8574/74A の空きポート P7 に収容することにしたのです。

 このような回りくどいことをしなくても、PIC のポート RA2 には CH3 スイッチ収容のままで、PCF8574/74A の空きポート P7 に DS18B20 を収容すれば ― という案も考えたのですが、PIC とは PCF8574/74A との I2C インターフェース上で、 独自の 1-Wire インターフェースを実行させるのは、プログラマ(私)にとってかなり荷が重くなることでもあるし、たぶん、1-Wire インターフェースでのタイミングで問題が起こるのではないか ― とも思われます。

 それに対して、PCF8574/74A の空きポートに CH3 スイッチを収容の場合には、単にスイッチの ON/OFF だけを検知すれば良いので、プログラム作成においても前者に比べればずっと簡単になります。 結果、上の回路図のように、同じスイッチ仲間の CH1、CH2 スイッチとは離れ離れになり、CH3 スイッチは一人ぼっちとなってしまいました。

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

■ 本機で使用したニキシー管 ■

 今回の製作で使用したニキシー管は、本ページの表題にあるように ИH-17(IN-17)という6本のロシア製のニキシー管で、16 〜 17 年も以前に Yahoo!オークションで入手したもので、その頃、特にすぐには使用する予定もなく入札して置いたら落札をしてしまった、 というシロモノで、ようやく今回日の目を見ることになりました。

 外観は次の写真群に示すようなもので、写し方が悪く写真では分かりづらいのですが、一番左の側面の写真には ИH-17 9102 というように印字がされているので、たぶん 1991 年製のものと思われます。 6本いずれのニキシー管も同様に、 11 本ある足ピンの所々が腐食して錆が浮き出ているのが写真を拡大してみるとよくわかります。



ニキシー管 IN-17 の周囲(4方向側面)を見た様子 底面側から見た様子と上面(表示面)の様子

 11 本といえば、今回実際に使用してみて初めて分かったことなのですが、この ИH-17(IN-17)というニキシー管には、足ピンが 0 〜 9 の 10 種の数字電極(カソード)とアノード1本の計 11 本しかありません。 "前作" で使用したニキシー管 CD81 のように小数点(ピリオド)は存在していませんでした。


 左上図は、下記 参考サイト の "ニキシー管 IN-17" データのリンクサイトから、ダウンロードした PDF ファイルから抜粋をした足ピン図ですが、この図は理解しにくく誤解を招きやすい図だと思います。

 というのも、この図はニキシー管を裏側から見た図ではあるのだけれど、上に掲載した外観写真群の 右端下 の上面写真とは上下が逆になっていて、数字を逆立ちさせた状態を表しています。 逆立ちをさせず通常のように数字を表示させる場合には、ダウンロードした左上図を 180 度上下に回転させて右上図(裏面図)のように見なければなりません。

 実物を裏側から見て、1 ピンと 11 ピンの間の 12 ピンに相当(右上図の赤 x 印: 上に掲載した外観写真群の 右から3つ目 の写真を拡大参照)する切れた足ピン位置を目印として、 1 ピンのアノードから時計回りに 2, 3, 4 …… 11 と、カソード 0 〜 カソード 9 までが順序良く並んでいます。



 なお、このニキシー管(ИH-17(IN-17))の使用前の外観状態では6本とも、上写真のようなハカマ?(ソケットとは違う)のようなものが足ピンに穿かせてありましたが、ページの冒頭で述べたように、本機ではニキシー管をバック(底)からブルーの LED で照らすのに邪魔なので、ハカマ?は取り外して使用することにしました。

 しかし、6本の各ニキシー管をプリント基板に取り付けるときには、それらの高さを揃えるためにはハカマ?があった方が有利となるので、添付のハカマ?の代わりに手元にあった透明のイラックスチューブ(内径Φ1)を、 7 mm 長ほどに切って絶縁を兼ねて各足ピンに通して使用しました。

 私が入手をしたこれら6本のニキシー管ですが、実際に通電をしてみると 機能概要と使用法 で使用した各写真のように、各数字文字の輪郭がはっきりせず一見ぼやけたように見えます。 これは IN-17 に特有なもの?のようで、各数字電極よりも最前に位置する細かい格子状の電極(アノードか?)が邪魔をしているせいだと思います。 また、6本の内の最左端桁に使用した管は各数字電極が少し右に、その右隣に使用した管は少し左に傾いて取り付けられていました。(これは愛嬌なのでしょうか? 品質の悪さなのでしょうか?)

| ページトップ |

■ リアルタイムクロックモジュール( DS3231 For PI )■

 本機 "ニキシー管時計 III" のクロック源には、既に公開済みの "199. 多機能携帯デジタル時計" で使用した RTC モジュール と同じ "DS3231 For PI" を使用しました。 その詳細についてはそちらで述べている説明を参照して頂くとして、本ページでは外観写真と回路図だけを次に再掲しておきます。


 本機で RTC モジュール( DS3231 For PI )を使用するためには、次の写真に示すような少しばかりの改造が必要で、そのためには "はんだ吸取線" なるものが必須となります。

(1) (2) (3) (4) はんだ吸取線

(1) -1. まず、ハンダ付けがされていて簡単には交換ができないコイン電池を取り外す。
-2. 次に、5P のピンソケットを取り外し、5P のピンヘッダ(ロープロファイルピンヘッダ(低オス) を使用)と取り換える。
(2) RTC IC DS3231 の SQW (3 ピン 赤↑印) と、ピンヘッダ 4 ピン(赤↓印) 間をジャンパー線(写真の緑色線)で接続する。
(3) (2) の写真を別角度から見た様子。
(4) (1) -1 でコイン電池を取り外した跡の+側に、ジャンパー線(写真の赤色線)を接続する。
なお、この ジャンパー線(赤色線)の先と、モジュールをプリント基板本体に取り付けたときに、コイン電池ホルダの+端子との接続 を、忘れないように必ず行うこと。

 私がこの RTC モジュール( DS3231 For PI )を使用するのは、まだ未公開の作品も含めて3作目となりますが、以前から気になっていたことがありました。 それは前2作では (2) の改造工程だけを実施してこのモジュールを使用してきました。 したがって、ハードウエア的に PIC マイコンとの接続には、モジュール側のピンソケットと本体側のプリント基板に設けたピンヘッダとで行うことになります。

 その場合に私が気になっていたということは、モジュール側のピンソケットが四角面積の片側だけに偏っているため、接続をしても簡単にクラクラと動いてしまうのです。 要するに接触不良を起こしてしまうのではないか?、ということです。 そこで今回は、(1) -2 の工程でピンソケットをピンヘッダに取り換え、本体側のプリント基板に直接ハンダ付けをして固定をしてしまう、というものです。 この改造によって接触不良の問題は解消されます。

 そして、2つ目の問題点は (1) -1 で述べているように、本モジュールにはコイン電池が直接ハンダ付けされているために、電池の交換が簡単には行えない、という点です。 そこで本機のモジュール使用では、(1) -1 のように当初からモジュールに搭載されているコイン電池を取り除いてしまい、(4) のようにジャンパー線を接続しておいて、モジュールに搭載の電池に代わる外部のコイン電池(CR2032)に 接続ができるように改造を行いました。

 3つ目の改造は以前から行っているように、(2) のようにジャンパー線を接続することによって、上に掲載したリアルタイムクロックモジュールの回路図中の、赤線で示した SQW 信号を外部に引き出す改造を行います。 この信号を PIC の外部割込みで検知することにより、プログラムでポーリング処理をするよりも簡単になって有利です。

・・・・・

 ところで、この DS3231 という RTC IC にはデジタル温度センサを内蔵しているので、今まで私のプログラムでは使用したことはありませんでしたが、今回はそれを使用してみたいと思います。 ← ← ← ところがこの試みは失敗でした。

 プログラム上では何の問題もなく、温度データを取り出してニキシー管に表示をさせることができたのですが、周りの環境に問題がありました。 プリント基板(1)パターン図 (部品面) に示すように、RTC モジュール( DS3231 For PI )を プリント基板上に搭載をして、また、ケース加工図 で示すように、プリント基板をスチロール樹脂ケース内に収納して使用することになるのですが、ケースの蓋を開けたときと閉めたときとでは、 2 〜 3 ℃ ほど(最大時にはそれ以上)の温度差が生じるのです。

 そのためにもケースの背面には穴を開けて空気が流動するように考慮はしてあるのですが、ケース加工図で示した程度ではほとんど効果はないようです。 ケースの蓋を開けたときとでは比べ物になりません。 この点については大きな盲点で誤算でした。 "173. 6桁ニキシー管時計(改良版)" のように、温度センサはケース外に出して使用すべきです。

 そこで、RTC IC DS3231 の内蔵温度センサを使用することはきっぱり諦めて、別の温度センサを使用することを考えます。 そして、私の手持ちに DS18B20 という デジタル温度センサ があるので、それを使用してみることにしました。

| ページトップ |

■ デジタル温度センサ( DS18B20 )■

 上述したように、本機で最終的に採用したデジタル温度センサは、次の左端の写真のような 3ピンTO-92 パッケージのもので、3年半ほど前にアマゾンで入手をしました。 現在でも1個 150 円程度で入手ができますが、秋月電子通商で購入する場合にはかなり高価になるようです。

デジタル温度センサ DS18B20 ナイロンクリップ NK-2N 温度センサの取り付けの様子

 上右端の写真のように、ケース左側面にΦ6 の穴を開け温度センサの頭をケース外に出して、ケース内部の温度にはあまり影響がされないように取り付けました。 左端写真の温度センサに 3P のケーブルの取り付けと、ヒシ(熱収縮)チューブで絶縁をして行く 過程の写真を撮るのを忘れてしまいましたが、右端写真がその最終結果です。

 右端写真の黒色部分がヒシチューブで、その内部に温度センサとケーブルとの接続部分が隠れています。 そして、中央写真のようなナイロンクリップ NK-2N(商品名か? ずいぶん以前に購入したものでメーカー等は不明)で、右端写真に示すような要領で ケース左側面の外側に温度センサを固定しました。


 上の左図は Maxim 社の データシート DS18B20 から抜粋した足ピン図ですが、右図に示した プリント基板(1) と接続をするコネクタのピン並びとは、異なっているので注意をしてください。 これはプリント基板(1) にピンヘッダ 3P を取り付けるときに、自由に選べるような空きスペースがなかったために、仕方なく右図のような配置になってしまいました。

DS18B20 の特徴
  • 独自の 1-Wire インターフェイス* により、通信にはポートピンを 1 つだけ必要とする。
  • 各デバイスは、オンボード ROM に保存された固有の 64 ビット シリアル コードを持つ。
  • マルチドロップ機能により分散型温度検知アプリケーションを簡素化する。
  • 外付け部品を必要としない。
  • データラインから電力を供給可能で、電源範囲は 3.0V 〜 5.5V である。
  • -55 ℃ 〜 +125 ℃ (-67 °F 〜 +257 °F) の温度を測定できる。
  • -10 ℃ 〜 +85 ℃ では ±0.5 ℃ の精度である。
  • 温度計の分解能を、9 〜 12 ビットからユーザーが選択可能である。
  • 温度を 750ms (最大) で 12 ビットのデジタルデータに変換する。
  • ユーザー定義可能な不揮発性 (NV) アラームを設定できる。
  • アラーム検索コマンドは、温度がプログラムされた制限を超えているデバイスを識別して対処する。 (温度アラーム状態)
  • 8ピンSO (150ミル)、8ピンμSOP、および 3ピンTO-92パッケージで入手可能である。
  • DS1822 とソフトウェアの互換性がある。
  • アプリケーションには、サーモスタット制御、産業システム、消費者製品、温度計、または熱に敏感なシステムに組み込める。
 * 1-Wire インターフェイス: Dallas Semiconductor 社によって開発され、現在は Maxim 社に吸収されている。

| ページトップ |

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

前側面側から見た様子 後側面側から見た様子
左側面側から見た様子 右側面側から見た様子

以下は外観6面写真です。

後側面
左側面 正面(上面) 右側面
前側面
背面(下面) 天地を逆にした写真

上蓋を開いてケース内部を見た様子 左写真を少し拡大した様子 ( もっと拡大する

--------------------------------------------------------------------------------------------------------------------------------------------

以下は一回り大きいケースに入れ替えた後の外観6面写真です。

後側面
左側面 正面(上面) 右側面
前側面
背面(下面) 天地を逆にした写真

上蓋を開いてケース内部を見た様子 別角度からケース内部を見た様子

| ページトップ |

■ 機能概要と使用法 ■


◎ 本機の起動時の動作
  • 本機に電源を投入すると、"ピポッ" と開始ブザー音を出力後に、ブルー LED の簡単な点灯デモ (1) が8秒間行われ、続いて9から0までの数字を1秒間ずつ降順に更新しながら、ニキシー全管(6本)の 9〜0表示テストを計10秒間行う。

  • 続いて、ブルー LED の簡単な点灯デモ (2) が約7秒間行われた後、プログラムのバージョン番号がニキシー管に約5秒間表示される。
    		バージョン番号  [ _x.xx __ ]
    

  • その後、ニキシー管、ブルー LED ともに1秒間 全桁消灯の後、RTC(リアルタイムクロック)モジュール "DS3231 For PI" の状態がチェックされ、本機に初めて電源を入れたときや、バックアップ用バッテリーが異常なとき等に、 次のエラーメッセージがニキシー管に表示されるとともに、"ブッブー" ブザー音が出力される。 このとき、先頭の文字 "9" はエラーメッセージであることを表し、細かくブリンク表示をしてエラーであることを強調する。
    		エラーメッセージ [ 9_.32 31 ]
    

  • ユーザはバックアップ用バッテリーの状態等を確認してその対処を行った後、全8つのスイッチの内のどれかを押して応答をする。

  • すると、RTC(リアルタイムクロック)モジュールが初期設定され、エラーフラグがクリアされるとともに、年月日、時分秒がモジュールをプログラミングしたときの初期値、 "2024/01/01"、"00:00:00" に設定がされて時計機能が開始されるが、 これらは現在値とは異なるため、後述のスイッチ操作による手順(SET モードの機能と操作 を参照)で現在の年月日、時分秒に設定をし直す必要がある。 ちなみに "2024/01/01" は "月曜日" である。
    		年月日 [ 24.01.01 月曜 ]            時分秒 [ 午前 00:00:00 ]
    

◎ 表示モードと基本機能の操作
  • そのスイッチ操作による手順の説明の前に、本機における表示モードと本機の基本機能を先に説明をしておくと、本機には上述の時間表示の他に、年月日表示(年表示は西暦4桁の内、下2桁のみ表示)、気温表示の機能を持っている。
    		表示モード 0                        表示モード 1                         表示モード 2
    		時間表示 [ xx:xx:xx ]              年月日表示 [ xx.xx.xx ]             気温表示 [ __ xx.xx ]
    
    時間表示 (14:20:56) 年月日表示 (2024.04.27 土曜) 気温表示 (26.37℃)

  • 気温表示については、デジタル温度センサ "DS18B20" の性能そのままを使用しているため、- 55 ℃ 〜 + 125 ℃ の範囲で測定が可能で、本機ではバイナリデータから BCD データに変換をする過程で、小数点以下2位までを表示対象として、 3位以降は切り捨てて無視をしている。 また、マイナス値の表記については、マイナスを表す記号が使用したニキシー管にないため、HL 桁(左から2桁目)に数字 "9" を表示することでマイナス値を表す。

  • なお、上の表示モード 0 〜 表示モード 2 の他に、オートモードの表示モード 3 もあって、これらは MODE / SET スイッチ を押すごとにモード番号が増加をし、ニキシー管に表示される内容が切り替わる。 そして表示モード 3 の次は 再び表示モード 0 に戻る。
    		┌─→ 時間表示 ─→ 年月日表示 ─→ 気温表示 ─→ オートモード ──┐
    		│  (モード 0)   (モード 1)   (モード 2)    (モード 3)   │
    		│                                 │
    		└─────────────────────────────────┘
    
  • このとき、MODE スイッチを何度も続けて押していると、現在のモードがどれなのか分かり辛くなるときがあるため、MODE スイッチを押した直後に、ニキシー管の1桁目(最左端桁)にそのときのモード種類の番号( 0 〜 3 の内のどれか)を、 約3秒間ブリンク表示をして知らせる。

  • オートモード(表示モード 3) を選択したときには、表示モード 0 〜 表示モード 2 の個々の内容表示を、次図に示すように自動的に切り替えて、それぞれの表示を繰り返す。
    		毎05〜09秒と35〜39秒の間: 年月日表示
    		毎20〜24秒と50〜54秒の間: 気温表示
    		上記以外:            時間表示
    
    		(___: 時間表示、NNN: 年月日表示、KKK: 気温表示)
    
    		00        10        20        30        40        50        00
    		.    .    .    .    .    .    .    .    .    .    .    .    .
    		_____NNNNN__________KKKKK__________NNNNN__________KKKKK_____
    
  • なお、これらの表示モード 0 〜 表示モード 3 を表示しているときの状態を、表示モードとは別に NORMAL モード という。 そして、この NORMAL モード中のときにはニキシー管の表示だけではなく、 ブルー LED を次の表示パターン(○は点灯、●は消灯)によってその日の曜日を表し、1秒ごとに点灯、消灯を反転させながら繰り返し表示する。

          ブルー LED の桁
          HH HL MH ML SH SL


          ブルー LED の桁
          HH HL MH ML SH SL


          初めの1秒間の表示パターン 次の1秒間の表示パターン

  • このブルー LED の曜日表示は四六時中行われるので、煩わしく感じられるようなときがあるかもしれない。 そこで DELETE / DOWN スイッチ を押しながら MODE / SET スイッチ を押すことによって、その表示をいつでも抑止することができる。 このスイッチ操作はトグル動作になっていて、押す度に 表示/非表示 を繰り返す。 ただし、このスイッチ操作は四六時中行われる曜日表示に限って有効であり、その他の一時的に行われるブルー LED 表示についてはその限りではない。

  • 本機では12/24時間の両表示機能を持ち、通常の NORMAL モード中であれば TMODE / UP スイッチ を押すことによって、いつでも切り替えることができる。 すなわち、時間表示(表示モード 0) 中だけでなく、年月日表示(表示モード 1) 〜 オートモード(表示モード 3) 中であっても切り替えられる。 ただし、時間表示(表示モード 0) とオートモード(表示モード 3) の時間表示中以外のときには、切り替わったことを目で確認することはできない。

  • 次に、24時間表示と12時間表示の両者の対応を示すが、本機では、24時間表示では "時" の表示に "xx" と常に2桁で表示するのに対して、12時間表示では先頭が "0" であった場合には、ゼロサプレスをして表示しないようにしている。
    		(24H)  00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 
    		(12H)  12  1  2  3  4  5  6  7  8  9 10 11 12  1  2  3  4  5  6  7  8  9 10 11
    		       am am am am am am am am am am am am pm pm pm pm pm pm pm pm pm pm pm pm
    
  • 12時間表示の場合には午前と午後との区別をさせるため、左列の :(コロン)の上側 LEDで AM を、また下側 LEDで PM を、1秒ごとに点滅を繰り返すことで、それぞれを表現している。
    					  ┌─ AM
    					  ↓
    		12時間表示		[ xx:xx:xx ]
    					  ↑
    					  └─ PM
    
    (12H 表示例) AM 01 : 23 : 45 (12H 表示例) PM 01 : 23 : 45 (24H 表示例) 01 : 23 : 45

  • ZERO / BACK スイッチ は、後述する SET モード中を除いた NORMAL モード中には、毎正時プラス・マイナス5分以内に押された場合に限り、00 分 00 秒に設定をするための ZERO スイッチとして機能 をする。

  • SIGNAL スイッチ は、毎時の時報音や後述のタイマー機能時の効果音等を、押すごとに有効/無効に交互に設定をする。 このときの設定状態は視覚的な表示がないため、有効になったときには "ピピピッ" 音を、無効になったときには "ブー" 音を、 それぞれ鳴らして知らせる。 なお、電源を投入した直後は有効状態に設定がされている。 また、有効に設定時には、時間表示(表示モード 0) 以外の表示モードにおいても、毎時の時報音やタイマー機能時の効果音等は有効(鳴る)なので 注意が必要である。

  • 年月日カレンダー機能について、うるう年の計算は 2001年 〜 2399年までの範囲で対応している。 ただし、年の表示は下2桁のみになる。

  • その他の機能として、周囲の明るさに応じてニキシー管の表示を減光するディマー機能を持ち、周囲が明るいときはニキシー管の表示も明るく、周囲が暗くなるとニキシー管も暗く表示される。

  • なお、本機での気温表示のために使用している、デジタル温度センサ "DS18B20" からのデータ読み出しは2秒ごとに行って、表示モード 2 のときにはその表示を更新させている。 温度センサと通信を行うときには常に温度センサの状態がチェックされ、 エラーを検出したときには次のエラーメッセージがニキシー管に表示されるとともに、 "ブッブー" ブザー音が出力される。 このとき、先頭の文字 "9" はエラーメッセージであることを表し、細かくブリンク表示をしてエラーであることを強調する。
    		エラーメッセージ [ 9_.18 20 ]
    

  • ユーザは温度センサの状態等を確認してその対処を行った後、全8つのスイッチの内のどれかを押して応答をする。 例えば、温度センサとの接続用のコネクタが抜けていた場合などには、接続をし直せばエラーは回復するが、 それ以外の場合には簡単にエラーが回復することはないので、原因を追究する必要がある。

◎ SET モードの機能と操作
  • さて、ここで話を戻して、年月日、時分秒の設定を変更する手順としては、現在、NORMAL モード 中であれば、時間表示(表示モード 0) 〜 オートモード(表示モード 3) のどの内容が表示されている場合においても可能で、 まず、表示内容(表示モード)を切り替えるときのように "チョン押し" ではなく、同じ MODE / SET スイッチ を "長押し" することによって、年月日、時分秒を自由に変更することができる SET モード に移行をする。

  • すなわち、MODE / SET スイッチ を5秒以上 "長押し" をしていると、"ピッ" というブザー音とともにニキシー管は全桁消灯して、ブルー LED が全桁 1/4 秒点灯 1/4 秒消灯の 0.5 秒周期でブリンク表示を始め、 NORMAL モードから SET モード に移行をしたことを知らせる。


  • ユーザは、ブルー LED の全桁ブリンク表示を合図として MODE / SET スイッチから指を離すと、ブリンク表示をしていたブルー LED は全桁消灯し、現在、RTC(リアルタイムクロック)モジュールに設定がされている、 "年月日6桁" が年月日の表示パターンでニキシー管に表示され、かつ、先頭の "年2桁" がブリンク表示をしてこれから設定変更を行う対象項目であることを知らせる。

  • もし変更が必要であれば、UP スイッチ を押すごとに現在値より1ずつ増加し、また DOWN スイッチ を押すごとに1ずつ減少するので、適宜希望する値に変更をする。 また、このときの増減幅を大きくしたい場合には、UP スイッチ、 または DOWN スイッチを押したままにしていると、1秒当たり 4 〜 5 の増減幅で更新をするようになる。

  • "年2桁" の変更が済んだら、再び MODE / SET スイッチ を押すと、次には "月2桁" にブリンク表示が移り、変更の対象項目も移動したことを示す。 同様に変更が必要であれば、UP スイッチ、または DOWN スイッチを押すことによって、 適宜希望する値に変更をする。

  • 以降同様に、SET スイッチ を押すごとに "年"、"月"、"日"、"時"、"分"、"秒" と、変更の対象項目(2桁ずつのブリンク表示位置(~~))が移動するので、該当の項目を選択後 UP または DOWN スイッチ によって値を変更設定する。 このとき、"日" から "時" に対象項目が移動すると、時間表示パターンに切り替わる。 両者での見かけ上の違いは、各項目間の区切り記号表示が前者ではピリオド(.) 、後者ではコロン(:)となる。
    		"年" が選択 [ xx.xx.xx ]      "月" が選択 [ xx.xx.xx ]      "日" が選択 [ xx.xx.xx ]
    		          ~~                           ~~                           ~~
    		"時" が選択 [ xx:xx:xx ]      "分" が選択 [ xx:xx:xx ]      "秒" が選択 [ xx:xx:xx ]
    		          ~~                           ~~                           ~~
    
  • なお、NORMAL モード時に12時間表示が選択されていた場合、SET モードで "時"、"分"、"秒" を選択中には、左列の :(コロン)の 上側 LED点灯 + 下側 LED消灯AM を、上側 LED消灯 + 下側 LED点灯PM を、 それぞれ表現をする。

  • そして、最後の "秒2桁" 設定後にもう一度 SET スイッチを押すことによって、変更された設定値( "年" 〜 "秒" のすべて* )が RTC(リアルタイムクロック)モジュールに書き込まれる。 そして、年月日、時分秒の設定変更の処理が終了して、 SET モードから抜け出して再び NORMAL モード に移行をし、必ず時間表示(表示モード 0) に戻って、新たに設定し直した時分秒から時(とき)を刻み続ける。

      * "年" 〜 "秒" のすべて: "年"、"月"、"日" が変更されれば "曜日" も変更するが、"曜日" についてはユーザが入力しなくても、プログラムが自動的に計算をした "曜日" 値を一緒に RTC に書き込む。

  • この SET スイッチによって対象項目を選択中に、誤って希望する項目を通り過ぎてしまったような場合には、BACK スイッチ を押すごとに、ひとつずつ前の項目に戻ることができる。 これらの SET スイッチ、または BACK スイッチの操作と、各選択項目の関係を図に表すと次のようになる。
    	                 BACK   BACK   BACK   BACK   BACK
    	                 ←─   ←─   ←─   ←─   ←─
    	             SET    SET    SET    SET    SET    SET    SET
    	4つのどれかの表示モード ─→ 年 ─→ 月 ─→ 日 ─→ 時 ─→ 分 ─→ 秒 ─→ 時間表示モード(表示モード 0) 
    	               │                   ↑
    	             BACK└───────────────────┘
    
  • また、SET モードに移行中に何らかの理由で、設定変更の処理を中止したいような場合には、SIGNAL / CANCEL スイッチ を押すことによって、それまでに設定変更されてきた各項目値はすべて破棄され、 RTC(リアルタイムクロック)モジュールに書き込まれることはなく、再び NORMAL モード に移行をする。

◎ タイマー機能関連の操作
  • 本機には、CH1 と CH2 の2個のスイッチ(リレー)が搭載してあり、それぞれのスイッチ(リレー)を次の方法で個々にコントロールすることができる。

    (1) タイマースイッチ機能 ..... "CH1 スイッチ(リレー)を 何曜日の何時何分にどのようにするか" を設定する
    (2) 温度スイッチ機能 ..... "CH2 スイッチ(リレー)を 何曜日に温度が何℃になったらどのようにするか" を設定する
    (3) インターバル・タイマー機能 ..... "CH1 または CH2 スイッチ(リレー)を 温度には関係なく、現在の時刻から何時間何分後にどのようにするか" を設定する
    (4) ダイレクト・コントロール機能 ..... "CH1 または CH2 スイッチ(リレー)を 時間、温度には関係なく、直ちにどのようにするか" を設定する

  • タイマー機能関連の操作を行うためには、CH1、CH2、CH3 の3個のタクトスイッチと、上述してきた5個のタクトスイッチのすべてを使用する。 CH1 タクトスイッチ は上で述べた (1) タイマースイッチ機能 専用であり、 CH2 タクトスイッチ(2) 温度スイッチ機能 専用である。 また、CH3 タクトスイッチ(3) インターバル・タイマー機能、または (4) ダイレクト・コントロール機能 関連のときに使用する。
    (以降、紛らわしいので、CH1 〜 CH3 タクトスイッチを CH1 〜 CH3 スイッチといい、CH1、CH2 スイッチ(リレー)を CH1、CH2 リレーという。)

          操作スイッチ 機能名 動 作 制御リレー O N OFF SLP
          CH1 スイッチ (1) タイマースイッチ 何曜日の何時何分にどのようにするか CH1 リレー
          CH2 スイッチ (2) 温度スイッチ 何曜日に温度が何℃になったらどのようにするか CH2 リレー ×
          CH3 スイッチ (3) インターバル・タイマー 温度には関係なく、現在の時刻から何時間何分後にどのようにするか CH1 または
          CH2 リレー
          (4) ダイレクト・コントロール 時間、温度には関係なく、直ちにどのようにするか

  • また、これらのタイマースイッチ機能、温度スイッチ機能等のユーザー・インターフェースとしての操作には、あらかじめそれらの情報をメモリに設定をしておくための メモリ設定機能、 メモリに設定されている情報をいつでも読み出して確認ができる メモリ読み出し機能、不要になったメモリ情報を消去するための メモリ消去機能 がある。

    [ メモリの設定機能 ]

  • まず、メモリの設定機能 の操作は、本機が NORMAL モードのときに、CH1CH3 スイッチ のどれかを押しながら SET スイッチ を押す ことによって始める。 CH1 〜 CH3 スイッチは上述のように、 CH1 または CH2 リレーに対して、(1) 〜 (4) の内のどの機能を設定するかを選択するものである。

  • すると、選択をした CHx スイッチによって、ニキシー管には次の3種類の内のどれかが表示される。 すなわち、CH1 スイッチの場合には左側の、CH2 スイッチの場合には中央の、CH3 スイッチの場合には右側の形式で表示がされ、なおかつ、 先頭の2桁がブリンク表示 をしてこれから設定をする対象項目の位置(~~)を表している。
    		CH1 スイッチ [ 00:00 00 ]      CH2 スイッチ [ 00.00 00 ]      CH3 スイッチ [ 00 00 10 ]
    		           ~~                         ~~                         ~~
    
    		 └───┘この2桁が点滅        └───┘この2桁が点滅        └───┘この2桁が点滅
    
  • CH1、CH3 スイッチの場合には、設定をする "時"、"分" の内の "時" の位2桁 であり、CH2 スイッチの場合には、設定をする 温度値の整数部2桁(00 〜 79 の範囲)が設定の対象項目となる。 なお、すべての設定項目の初期値は "00"、または "0" が表示される。 ただし、CH3 スイッチの場合には、第3項目(リレー番号)には "1" が表示される。

  • それぞれの値を設定するには、UP スイッチ を押すごとに現在値より1ずつ増加し、また DOWN スイッチ を押すごとに1ずつ減少するので、適宜希望値に設定をする。 また、このときの増減幅を大きくしたい場合には、 UP スイッチ、または DOWN スイッチを押したままにしていると、1秒当たり 4 〜 5 の増減幅で更新をするようになる。

  • "時" または、温度値の整数部の設定が済んだら、SET スイッチ を押すと、次には "分" の位2桁 または、温度値の 小数部2桁 がブリンク表示され、設定の対象項目が次に移動したことを示す。 同様に、UP スイッチ、または DOWN スイッチを押すことによって、適宜希望値に設定をする。
    		CH1 スイッチ [ xx:00 00 ]      CH2 スイッチ [ xx.00 00 ]      CH3 スイッチ [ xx 00 10 ]
    		              ~~                         ~~                         ~~
    
  • ここで、まず CH2 スイッチの場合について補足をしておくと、温度値の 小数部2桁 の設定ではあるが、UP スイッチ、または DOWN スイッチを押しても、2桁の設定値の内の先頭1桁しか設定変更することはできず、2桁目は常に "0" となる。 ここで設定をする温度値の整数部、小数部は、もちろん温度スイッチ機能として使用されるものであり、本機では2秒ごとに温度センサからの読み出しデータが更新され、その都度、温度監視プログラムが実行されて設定値と比較される。 このときの比較される設定値は、整数部の "00" 〜 "99" までと、小数部の先頭1桁の "0" 〜 "9" を対象とするためである。 小数部2桁目を設定しても意味がない。(おまけの説明 を参照)

  • 次に CH3 スイッチの場合について補足をしておくと、"時"、"分" のそれぞれ2桁を指定するときに、どちらも "00" 指定をすると (4) ダイレクト・コントロール機能 とプログラムは解釈をし、 どちらかが "00" 以外であれば (3) インターバル・タイマー機能 と解釈をする。

  • "分" または、温度値の小数部の設定が済んだら、再度 SET スイッチ を押すことによって、ブリンク表示が次の設定の対象項目に移動する。 CH1、CH2 スイッチの場合には、どちらも "曜日" を次表のように指定をし、 CH3 スイッチの場合には、コントロールする CH1 または CH2 リレーの番号(1 または 2)を指定する。
    		CH1 スイッチ [ xx:xx 00 ]      CH2 スイッチ [ xx.xx 00 ]      CH3 スイッチ [ xx xx 10 ]
    		                 ~                          ~                          ~ 
    
  • "曜日" の設定方法は CH1、CH2 スイッチ共通で、UP スイッチ、または DOWN スイッチによって、次の左の対応表のように数値によって指定をする。 なお、このように温度スイッチの設定にも "曜日" の条件を加えてある。

          曜日 毎日
          設定値 0 1 2 3 4 5 6 7
          リレー CH1 CH2
          設定値 1 2
          CH1、CH2 スイッチの場合 CH3 スイッチの場合

  • 同様に、再々度 SET スイッチ を押すと、4つ目(最後)の設定項目の右端1桁にブリンク表示が移動する。 CH1 または CH2 リレーの各 動作種類 をどのようにコントロールするかを設定するもので、 UP スイッチ、または DOWN スイッチによって、次の対応表のように数値によって指定をする。
    		CH1 スイッチ [ xx:xx x0 ]      CH2 スイッチ [ xx.xx x0 ]      CH3 スイッチ [ xx xx x0 ]
    		                  ~                          ~                          ~ 
    
          CH1、CH3 スイッチ CH2 スイッチ
          動作種類 OFF ON SLP OFF ON
          設定値 0 1 3 0 1

  • 上表のように、CH2 の温度スイッチにはスリープ(SLP)動作を設定することはできない。 また、CH1、CH3 スイッチにおいて設定値 "2" は、プログラムの内部で使用するものでユーザが設定することはできない (ON 動作をしたリレーが1時間後に OFF 動作をさせるときの情報に使用)。

  • また、UP スイッチ、または DOWN スイッチによって、上表3つのそれぞれの設定値以外を指定しようとしても、プログラムがそれぞれで制限をかけているのでそれはできない。

  • なお、これまでの SET スイッチの操作によって対象項目を選択中に、誤って希望する項目を通り過ぎてしまったような場合には、BACK スイッチ を押すごとに、ひとつずつ前の項目に戻ることができる。 また、これらの項目を設定途中に何らかの理由によって中止をしたいような場合には、CANCEL スイッチ を押すとそれまでに設定をしてきた項目が破棄され、メモリの設定機能を終了して、NORMAL モードに戻る。

  • 最後の リレーの動作種類 を設定後、すなわち、右端1桁がブリンク表示をしているときに、もう一度 SET スイッチ を押すと、今まで入力をしてきたタイマースイッチ、または温度スイッチの設定情報を記憶するために、 プログラムは PIC 内部の RAM メモリに書き込み動作を行う。

  • ただし、(4) ダイレクト・コントロール機能SLP 以外の設定 では、直ちに指定されたリレーの ON、または OFF 動作を行い、必要がないので RAM メモリに書き込みを行うことはない。 また、SLP の設定 のときには直ちに指定されたリレーの ON 動作を行い、かつ、1時間後の OFF 動作時の時刻をプログラムが計算をして RAM メモリに書き込む。 そして、これらの ON/OFF/SLP 動作後には NORMAL モードに戻る。 また、SLP 設定のときには1時間後の OFF 動作実行後には、自動的に RAM メモリから削除される。

  • また、(3) インターバル・タイマー機能 では、入力された "現在の時刻から何時間何分後" を、絶対的な "何時何分" の時刻にプログラムが変換をして RAM メモリに書き込みを行う。 やがて、設定時刻がやってきて SLP 以外の設定 では、指定されたリレーの ON、または OFF 動作を行った後は、自動的に RAM メモリから削除される。 また、SLP の設定 のときには設定時刻になると、指定されたリレーの ON 動作を行い、かつ、次の1時間後の OFF 時刻を計算して RAM メモリの書き替えを行うが、やがて1時間後の OFF 動作実行後にはダイレクト・コントロール時と同様に、自動的に RAM メモリから削除される。

  • タイマースイッチ、または温度スイッチの設定情報が正常に書き込まれると、"ピピッ" ブザー音を鳴らしてユーザにそれを知らせ、再び新たなメモリ設定のために、すべての設定項目を初期値の "00"、または "0" に戻して、 先頭の2桁がブリンク表示をするので、続けて次の設定情報の入力を行うことができる。

  • ただし、この場合には CHx スイッチは前回のものが引き継がれるので、もしも他の CHx スイッチに変更をしたい場合には CANCEL スイッチ を押して、一旦、それまでの CHx での メモリの設定機能を終了 させて NORMAL モードに戻し、新たに CH1CH3 スイッチ のどれかを押しながら SET スイッチ を押して、CHx の選択をし直す必要がある。

  • これらの時間(時分)や温度等の設定情報を記憶しておくためのメモリは、本機では CH1 および CH2 リレー分を共通で使用し、合計 20 メモリまでを可能とする。 そして、プログラムが PIC 内部の RAM メモリに書き込み動作を行うときに、 既に 20 メモリまでが書き込まれて満タン状態の場合には、"ブッブー" ブザー音が出力されるとともにエラーメッセージとして、ニキシー管には全桁 "9" 表示と消灯、ブルー LED は全桁消灯と点灯とが、 交互に 1/4 秒間ずつ 0.5 秒周期でブリンク表示を繰り返す。
    		エラーメッセージ [ 99 99 99 ]
    

  • このニキシー管とブルー LED とのブリンク表示は、いつまでも続くので確認後に CANCEL スイッチ を押して メモリの設定機能を終了 させると、NORMAL モードに戻る。

    [ メモリの読み出し機能 ]

  • 次に、メモリの読み出し機能 の操作は、本機が NORMAL モードのときに、CH1CH3 スイッチ のどれか1つだけを押す ことによって始める。 本機では、CHx スイッチ別にメモリ読み出しを行うようにプログラミングがされているため、メモリ内容の確認を希望する CHx スイッチを押す。

  • すると、直ちに RAM メモリ内が検索されて CHx の設定情報が見つかった場合は、押した CHx スイッチによって、次の3種類の内のどれかの形式でニキシー管に表示がされる。 メモリの設定機能のときと同形式で表示がされるが、メモリ設定ではないためブリンク表示が行われることはない。
    		CH1 スイッチ [ xx:xx xx ]      CH2 スイッチ [ xx.xx xx ]      CH3 スイッチ [ xx xx xx ]
    
    例. 15 時 00 分、7:土曜、1:ON 例. 27.00 ℃、0:毎日、1:ON 例. 16:27、1:CH1 リレー、1:ON

  • このとき 20 メモリの内の先頭から検索が行われ、まず、最初に見つかったメモリ内容が上記の形式で表示がされる。 その後、続けて CH x スイッチを押すごとに、2番目に見つかったメモリ内容、3番目に見つかったメモリ内容、・・・ の順にニキシー管に表示がされる。

  • やがて最終の 20 メモリを過ぎると、一旦、次のように空白表示を行い、なおも CHx スイッチが押されると、また先頭からの検索に戻って以上の表示が繰り返される。
    		CH1 スイッチ [ __:__ __ ]      CH2 スイッチ [ __.__ __ ]      CH3 スイッチ [ __ __ __ ]
    

  • このメモリの読み出し機能では、現在検索中の CHx(例えば CH1)スイッチのときに、異なった CHx(例えば CH2)スイッチを押した場合には、検索対象が(CH2 に)変更されて、新たに 20 メモリの内の先頭から検索がされるようになる。

  • なお、CH3 スイッチによってメモリ設定が行われた情報(インターバル・タイマー時の情報(ON/OFF/SLP)、および ダイレクト・コントロール時の情報(SLP で OFF))については、それらが自動的に RAM メモリから削除される以前であれば、 CH3 スイッチだけでなく CH1、または CH2 スイッチによってもメモリ読み出しが行われ、CH3 スイッチによる読み出しと、CH1、または CH2 スイッチによる読み出しとでは、同じメモリ内容でも表示されるときには その表示内容が異なるので注意が必要である。
    		      CHx スイッチ番号  		                    曜日番号
    		                  |   		                          |
    		CH3 スイッチ [ xx xx xx ]		CH1、または CH2 スイッチ [ xx:xx xx ]
    		                      		                    |
    		                      		                (*注意)
    
    また、CH2 スイッチによる読み出しの場合でも先頭から4桁目までは時間情報であって、これらの CH1、または CH2 スイッチによる読み出しの場合には、(*注意)とある先頭桁は常に8をプラスした値(8、9、または無表示)になり、 CH3 スイッチによってメモリ設定が行われたことを表しているので、併せて十分に注意をする必要がある。

    [ メモリの消去機能 ]

  • このようにメモリ内容の確認中に、現在、ニキシー管に表示がされている内容が不要となった場合には、そのときに DELETE スイッチ を押すことによって、20 メモリの内のその情報だけを 個別に消去 することができる。

  • メモリ内容が消去されると、"ピピッ" ブザー音が出力されるとともに、次の左のメッセージが約5秒間ニキシー管に表示され、ブルー LED がブリンク表示をする。 なお、上述のように最終の 20 メモリを過ぎて空白表示がされているときに DELETE スイッチ を押すと、"ブー" ブザー音が出力されるとともに、右のメッセージが約5秒間表示される。
    		     CHx スイッチ番号   消去件数		     CHx スイッチ番号   消去件数
    				   |    |				   |    |
    		CLR メッセージ	[ _x:__ 01 ]		NOT メッセージ	[ _x:__ 00 ]
    

  • 上述の操作で、現在表示中のメモリ内容が消去されてメッセージが表示された約5秒後、消去したメモリ内容の次の順に記憶がされている同じ CHx の内容が読み出されて、新たにニキシー管に表示がされる。

  • このように メモリの読み出し機能 では、後からの DELETE スイッチの併用によって 個別のメモリ消去機能 も有している。

  • また、このメモリの読み出し機能を終了させるためには、前のメモリの設定機能と同様に CANCEL スイッチ を押すことによって、再び NORMAL モードに戻る。

  • 上述の例では、個別に1件ずつメモリ内容を確認しながら消去をする方法であるが、これとは別に CHx スイッチ別に一気に消去 をしてしまう方法もある。

  • 本機が NORMAL モードのときに、CH1CH3 スイッチ のどれかを押しながら DELETE スイッチ を押す と、その指定された CHx スイッチによって記憶されているメモリ内容のすべてが一気に消去され、 "ピピッ" ブザー音が出力されるとともに、次の左のメッセージが約5秒間ニキシー管に表示され、ブルー LED がブリンク表示をする。 なお、このとき指定された該当の CHx によるメモリ内容が1つもなかった場合には、 "ブー" ブザー音が出力されるとともに、右のメッセージが約5秒間表示される。
    		     CHx スイッチ番号   消去件数		     CHx スイッチ番号   消去件数
    				   |    |				   |    |
    		CLR メッセージ	[ _x:__ xx ]		NOT メッセージ	[ _x:__ 00 ]
    
  • そして、メモリの設定機能やメモリの読み出し機能とは異なって、メッセージの表示時間約 3 秒が過ぎると、再び NORMAL モードに戻る(CANCEL スイッチの操作は不要)。

    [ メモリ情報の監視機能 ]

  • 上述のメモリの設定機能の (1) タイマースイッチ機能 と、(2) 温度スイッチ機能 でメモリに記憶設定された情報は、本機の電源が断になって消滅をした場合や、ユーザがメモリの消去機能で故意に消去をしない限り、 いつまでも RAM メモリ内に存在し続けて、タイマースイッチや温度スイッチのプログラムでの監視対象となる。

  • タイマースイッチ の情報としては、"時"、"分"、"曜日"、リレーの動作種類、CHx リレー番号がメモリに記憶されているため、本機の時計機能が毎分 "00" 秒になると、該当の情報がメモリ内に設定されていないかどうかを、 監視プログラムが検索をする。

  • また、温度スイッチ の情報としては、温度値の整数部、小数部、"曜日"、リレーの動作種類、CHx リレー番号がメモリに記憶されていて、本機では2秒ごとに温度情報をセンサから読み出して更新をするため、 その都度監視プログラムが同様に検索をする。 ただし、この温度スイッチの場合には、現在、設定情報がメモリ内に存在しているかどうかだけを常にプログラムが把握をしていて、存在している場合に限ってメモリ検索を行う。

  • このようにメモリ検索をした結果、該当の設定情報がメモリ内に存在した場合には、それぞれの CH リレーが、指定をされた動作種類( ON/OFF/SLP )に応じた動作をするとともに、 SIGNAL スイッチ によってアラーム音の出力が有効に設定されている場合には、リレーが ON 動作のときには "ピポッピポッ" ブザー音を、また OFF 動作のときには "ブーー" ブザー音を併せて出力をする。

  • なお、以上述べてきたメモリ設定、メモリ読み出し、メモリ消去、それぞれの操作時に伴う "ピピッ" ブザー音、"ブッブー" ブザー音、"ブー" ブザー音は、SIGNAL スイッチ によるアラーム音の有効/無効にかかわらず出力されるので、 注意が必要である。

    おまけの説明

     本機ではデジタル温度センサ( DS18B20 )を使用しており、12 ビット分解能(最高)を選択して温度値を読み出している。 そのときの読み出しデータのフォーマットは "Figure 2" のように、 水色部分が小数部で4ビットで構成されている。

     これらのビットはバイナリ(2進数)データであり、デシマル(10 進数)データに変換をすると、2-1 = 0.5、2-2 = 0.25、2-3 = 0.125、2-4 = 0.0625 となり、 4ビットで構成されるバイナリデータをデシマルデータに変換をしても、小数部4ビットのデータが取りうる値は次のように連続値にはならない。(整数部は常に連続値になる。)
          (2進数)   (10進数)
             .0000	.0000
             .0001	.0625
             .0010	.1250
             .0011	.1875
             .0100	.2500
             .0101	.3125
             .0110	.3750
             .0111	.4375
             .1000	.5000
             .1001	.5625
             .1010	.6250
             .1011	.6875
             .1100	.7500
             .1101	.8125
             .1110	.8750
             .1111	.9375
          
     したがって、本機ではバイナリ - デシマル変換後のデータは、小数点以下2位までを表示対象としているが、温度スイッチとしての設定値は、小数点以下1位までを設定対象とした。 たとえば、小数点以下2位までを設定対象としても上表のような温度値しか取らないため、上表以外の温度値を設定したような場合には、温度スイッチの監視プログラムは永遠にヒットすることがなくなる。 というよりも、"DS18B20" では -10 ℃ 〜 +85 ℃ で ±0.5 ℃ の精度なので、小数点以下2位を指定してもまったくその意味がない。

| ページトップ |

■ プログラム ■

 最近の私が製作をする多くのデジタル時計では、その心臓部とも言えるクロック源には、すべてリアルタイムクロック(RTC)モジュールを使用しており、本機でも私が最も信頼のおける RTC IC の "DS3231" を採用しました。 そして、 その "DS3231" のプログラミングについては、"190. I2C IF モジュール + LCD(1602A) 表示時計" の リアルタイムクロックモジュールのプログラミング で詳述をしているので、そちらをご覧になってください。

 また、当初に設計をしたハードウエアで製作をしてきた本機のような作品に、後になってからもっとポート数を増やしたくなっても、今更、ポート数の多い PIC に変更をすることができない ― というような場合に、追加して使用することで 頼りになり力を発揮してくれるのが I/O エキスパンダ IC で、今回も PCF8574/74A のお世話になりました。 これについても "189. ドットマトリクス 8 x 8 LED 表示時計 II ( MAX7219 版)" の I/O エキスパンダ IC(PCF8574/74A)のプログラミング で詳述をしているので、参考にしてください。

 本機では、温度センサの変更を本機の完成の間際になってから余儀なくされてしまい、どうしたものか ― と悩んだ末に、私にとっては始めて使用することになるのですが次に述べる "DS18B20" に変更を決めました。 その具体的なプログラミング例についてを、 本プログラムの項にまとめておきたいと思います。

● デジタル温度センサ( DS18B20 )のプログラミング

 "DS18B20" は独自の 1-Wire インターフェイスによって通信を行うデジタル温度センサで、その使用には複数の種類の接続方法(詳細はデータシートを参照のこと)がありますが、ここでは 回路図(左上)に示した結線方法での 具体的なプログラミング例を紹介します。(なお、以下の説明で使用している Figure 2 〜 Figure 14 の図は、Maxim Integrated Products 社のデータシート( デジタル温度センサ DS18B20 )から抜粋をし、彩色のあるものは私が施しました。)

 データシートによると、"DS18B20"、PIC の両者ともに通信に使用するポートには、3−ステート、またはオープンドレインを想定していますが、"DS18B20" はともかく PIC 側にそのような空きポートは今回は望めないため、通常のポートを使用することとします。 ただ、"DS18B20" のポートが出力になる直前には、すかさず PIC 側では入力ポートに切り替えるように、両者の出力同士がぶつからないように注意を払ってプログラミングをします。

 初めに、"DS18B20" に内蔵されているメモリの種類ですが、次の Figure 7 に示すようにスクラッチパッドメモリ(RAM)と EEPROM とがあり、他にもこれらとは別に 64 ビットからなるデバイスごとに固有のシリアル番号等の情報を持つ ROM がありますが、 本機では PIC との通信を簡略化するためと 製作に汎用性を持たせるために、シリアル番号等の情報は使用していません。(もし、デバイスに固有のシリアル番号を使用すると、他の方が本機を製作されてもシリアル番号の不一致でプログラムが動作しなくなります。)

 Figure 7 で最も重要なのは、Byte 0、Byte 1 の温度レジスタ Temperature LSB、MSB で、センサからのデータが A/D 変換されてデジタル値として2バイトに格納されます。 このときの変換データの分解能には4種類あってユーザが選択することができますが、 デフォルトでは最も高い 12 ビット分解能となっており、本機では選択をし直す必要がない( PIC との通信を簡略化するため)のでそのデフォルト値で使用をします。 ただし、分解能が高い分 A/D 変換にかかる時間は多く(750 mS)なります。

 もし、分解能を変更したい場合は、Byte 4 の動作設定レジスタ Configuration Register の設定値を変更します。 また、Byte 2、Byte 3 の温度アラーム通知レジスタ TH Register、TL Register についても本機では使用しません。 そして、最後位 Byte 8 の CRC レジスタについては、Byte 0 〜 Byte 7 に対しての CRC 値が付与され、"DS18B20" から送られてきたデータのチェックに使用するためのものですが、これも現在のところ使用していません。
        CRC = X8 + X5 + X4 + 1
 CRC チェックの重要性については十分分かっていますが、そのための CRC 計算ルーチンをアセンブラで作成する能力が、残念ながら今の私にはないので現在はノーチェック状態です。 "DS18B20" では CRC 生成回路によって上の多項式の CRC 生成が実現されていますが、 上式を PIC アセンブラに変換する方法や既にライブラリ等があればその情報を、このページをご覧になったどなたか、ご存じでしたらぜひご教授ください。 そして、いつの日か私のプログラム内に、アセンブラの CRC 計算ルーチンを組み込んでみたいと思います。


 Byte 0、Byte 1 の温度レジスタ Temperature LSB、MSB については、次の Figure 2 に示すようなバイナリのビット配置になっており、上述したようにデフォルトの 12 ビット分解能ではすべてのビットが有効になりますが、本機のニキシー管時計では、 バイナリデータから BCD データに変換する過程で、小数点以下2位までを表示対象として、3位以降は切り捨てて無視をしています。


 "DS18B20" で採用されている 1-Wire インターフェイスはタイミング的には結構シビアなようで、次の Figure 13、Figure 14 のように定められています。 そして、これらの2つの図を基にして後述のアセンブラソースリストを作成しました。

 PIC と "DS18B20" との通信では Figure 13 のように、まず、1-Wire バス上に PIC が 480 μS 間のリセットパルス Low を送信することから始めます。 それに対して "DS18B20" が 60 〜 240 μS 間の存在パルス Low で応答して、動作する準備ができていることを PIC に知らせます。 これらの両者のパルスのやり取りで初期化手順が終了し、次には PIC からのコマンド送信が可能になります。


 コマンドの種類(詳細はデータシートを参照のこと)には、ROM コマンド5種類と機能コマンド6種類がありますが、この内、本機では [SKIP ROM]、[CONVERT T]、[READ SCRATCHPAD] コマンドの3種類だけを使用します。 それぞれのコマンドは8ビット長で、 それらを構成している各ビットは、"DS18B20" に "0" を書き込む タイミング・スロット と、"1" を書き込む タイミング・スロット とで構成されています。 それらの説明図が Figure 14 の上半分が表しています。

 また、上に挙げた [READ SCRATCHPAD] コマンドなどでは、そのコマンド送信直後に "DS18B20" からデータ送信ができるように、PIC は 読み込み・タイミング・スロット を用意します。 その説明図が Figure 14 の下半分が表しています。


 以上の Figure 13、Figure 14 の各説明図を、具体的なアセンブラソースに、私が書き換えたものが次に示すリストです。 なお、本機では PIC16F886 を使用し、内部クロックを 8 MHzに設定をして動作をさせています。 したがって、次のリストはジャンプ命令等を除いた1命令当たりの実行時間は、0.5 μS であることが前提になっています。
      ;==========================================================================
      ;	1-Wire デジタル温度センサ(DS18B20)制御サブルーチン
      ;==========================================================================
      
      ;#define 	TRISX	TRISA			;例. DATA ポートを PORTA で使用する場合 
      ;#define 	PORTX	PORTA			;include する側で #define 定義をすること
      
      ;_DQ		equ	2			;DS18B20 入出力ポート
      
      ;<使用レジスタ>
      
      ;temp_1w					;送受信データの一時保存
      ;w1_lpcnt					;ループカウンタ
      
      ;wt1cnt				;既存レジスタ	;ウェイト用ループカウンタ
      ;wt2cnt				;既存レジスタ	;ウェイト用ループカウンタ
      
      ;==========================================================================
      ;		ウェイト・ルーチン (8 MHz)
      ;==========================================================================
      
      		; 15 μ秒 ウェイト・ルーチン
      
      	;;	call	wait_15us		;(2)
      wait_15us
      		movlw	4			;1
      		movwf	wt1cnt			;1
      w15u01		goto	$+1			;2
      		nop				;1
      		decfsz	wt1cnt,F		;1,2
      		goto	w15u01			;2,0
      	;	nop				;
      		return				;2	(2)+1+1+(2+1+1+2)*4-1+2=29, 29*0.5=14.5uS
      
      		; 45 μ秒 ウェイト・ルーチン
      
      	;;	call	wait_45us		;(2)
      wait_45us
      		movlw	14			;1
      		movwf	wt1cnt			;1
      w45u01		goto	$+1			;2
      		nop				;1
      		decfsz	wt1cnt,F		;1,2
      		goto	w45u01			;2,0
      		nop				;1
      		return				;2	(2)+1+1+(2+1+1+2)*14-1+1+2=90, 90*0.5=45uS
      
      		; 60 μ秒 ウェイト・ルーチン
      
      	;;	call	wait_60us		;(2)
      wait_60us
      		movlw	19			;1
      		movwf	wt1cnt			;1
      w60u01		goto	$+1			;2
      		nop				;1
      		decfsz	wt1cnt,F		;1,2
      		goto	w60u01			;2,0
      		nop				;1
      		return				;2	(2)+1+1+(2+1+1+2)*19-1+1+2=120, 120*0.5=60uS
      
      		; 480 μ秒 ウェイト・ルーチン
      
      	;;	call	wait_480us		;(2)
      wait_480us
      		movlw	8			;1
      		movwf	wt2cnt			;1
      w480u01		call	wait_60us		;120
      		decfsz	wt2cnt,F		;1,2
      		goto	w480u01			;2,0
      		return				;2	(2)+1+1+(120+1+2)*8-1+2=989, 989*0.5=494.5uS
      
      ;==========================================================================
      ;		1-Wire バスの初期設定
      ;==========================================================================
      
      Init_1_Wire
      		; リセットパルスを送信
      
      		bsf	STATUS,RP0		;バンク 1
      		bcf	TRISX,_DQ		;_DQ: 出力ポート
      		bcf	STATUS,RP0		;バンク 0
      
      		bcf	PORTX,_DQ		;1-Wire バスを "L" にする
      		call	wait_480us		;480μs 間(最低)
      		bsf	PORTX,_DQ		;
      
      		; 存在パルスを受信
      
      		bsf	STATUS,RP0		;バンク 1
      		bsf	TRISX,_DQ		;_DQ: 入力ポート、バスを開放
      		bcf	STATUS,RP0		;バンク 0
      
      	;	call	wait_60us		;15〜60μs 間待つ
      
      		movlw	4 + 1			;**
      		movwf	w1_lpcnt		;ループカウンタ
      
      ini1w01		call	wait_60us		;60〜240μs 間待つ
      
      		btfss	PORTX,_DQ		;存在パルス = "L" か?
      		goto	ini1w02			;Yes
      
      		decfsz	w1_lpcnt,F		;ループカウンタ - 1 = 0 か?
      		goto	ini1w01			;No
      
      		bsf	STATUS,C		;Error
      		goto	ini1w04
      
      		; タイミング合わせ
      
      ini1w02		movlw	4
      		addwf	w1_lpcnt,F		;ループカウンタ
      
      ini1w03		call	wait_60us		;** から 480μs 間(最低)
      		decfsz	w1_lpcnt,F		;ループカウンタ - 1 = 0 か?
      		goto	ini1w03			;No
      
      		bcf	STATUS,C		;OK
      
      ini1w04		bsf	STATUS,RP0		;バンク 1
      		bcf	TRISX,_DQ		;_DQ: 出力ポート
      		bcf	STATUS,RP0		;バンク 0
      		return
      
      ;==========================================================================
      ;		コマンドの送信
      ;==========================================================================
      
      Write_1_Wire
      		movwf	temp_1w			;送信データ(コマンド)
      		movlw	8
      		movwf	w1_lpcnt		;ループカウンタ
      
      wr1w01		rrf	temp_1w,F
      		btfss	STATUS,C		;C = 0 か?
      		call	Write_0_Slot		;Yes. "0" 書き込み・タイミング・スロット
      		btfsc	STATUS,C		;C = 1 か?
      		call	Write_1_Slot		;Yes. "1" 書き込み・タイミング・スロット
      		decfsz	w1_lpcnt,F		;ループカウンタ - 1 = 0 か?
      		goto	wr1w01			;No
      
      		return
      
      ;--------------------------------------------------------------------------
      
      ;		"0" 書き込み・タイミング・スロット
      
      Write_0_Slot
      		bcf	PORTX,_DQ		;1-Wire バスを "L" にする
      		call	wait_15us		;60μs (最低)
      		call	wait_45us		;
      		nop
      		bsf	PORTX,_DQ		;(バスを開放)
      
      	;	bsf	STATUS,RP0		;バンク 1
      	;	bsf	TRISX,_DQ		;_DQ: 入力ポート、バスを開放
      	;	bcf	STATUS,RP0		;バンク 0
      		return
      
      ;--------------------------------------------------------------------------
      
      ;		"1" 書き込み・タイミング・スロット
      
      Write_1_Slot
      		bcf	PORTX,_DQ		;1-Wire バスを "L" にする
      		call	wait_15us		;15μs 以内
      		bsf	PORTX,_DQ		;(バスを開放)
      		call	wait_45us		;60μs (最低)
      
      	;	bsf	STATUS,RP0		;バンク 1
      	;	bsf	TRISX,_DQ		;_DQ: 入力ポート、バスを開放
      	;	bcf	STATUS,RP0		;バンク 0
      		return
      
      ;==========================================================================
      ;		データの受信
      ;==========================================================================
      
      Read_1_Wire
      		movlw	8			;
      		movwf	w1_lpcnt		;ループカウンタ
      
      rd1w01		rrf	temp_1w,F
      		call	Read_0_1_Slot		;"0" / "1" 読み込み・タイミング・スロット
      		btfss	STATUS,C		;C = 0 か?
      		bcf	temp_1w,7		;Yes. "0" ビット
      		btfsc	STATUS,C		;C = 1 か?
      		bsf	temp_1w,7		;Yes. "1" ビット
      		decfsz	w1_lpcnt,F		;ループカウンタ - 1 = 0 か?
      		goto	rd1w01			;No
      
       		movf	temp_1w,W		;受信データ (1 バイト)
      		return
      
      ;--------------------------------------------------------------------------
      
      ;		"0" / "1" 読み込み・タイミング・スロット
      
      Read_0_1_Slot
      		bcf	PORTX,_DQ		;1-Wire バスを "L" にする
      		nop				;1μs (最低)
      		nop				;
      		nop				;
      		bsf	PORTX,_DQ	;1	;** (バスを開放)
      
      		bsf	STATUS,RP0	;1	;バンク 1
      		bsf	TRISX,_DQ	;1	;_DQ: 入力ポート、バスを開放
      		bcf	STATUS,RP0	;1	;バンク 0
      
      		movlw	4  ;5		;1	;
      		movwf	wt1cnt		;1	;ループカウンタ
      		bcf	STATUS,C	;1 (7)	;"0" ビット (初期値)
      
      					;** (バスを開放)から 15μs以内に読み込み
      rd01w01		btfsc	PORTX,_DQ	;2,1	;バス = "H" か?
      		bsf	STATUS,C	;0,1	;Yes. "1" ビット
      		decfsz	wt1cnt,F	;1,2	;ループカウンタ - 1 = 0 か?
      		goto	rd01w01		;2,0	;No
      
      		call	wait_45us		;** から 60μs (最低)
      
      		bsf	STATUS,RP0		;バンク 1
      		bcf	TRISX,_DQ		;_DQ: 出力ポート
      		bcf	STATUS,RP0		;バンク 0
      		return
      
      ;=============================================================== end ======
      
 上述したように、以上のリストは Figure 13、Figure 14 からアセンブラソースリストに、変換をした最も基本的なサブルーチン群で、このリストの中で バスの初期設定(Init_1_Wire)、コマンドの送信(Write_1_Wire)、 データの受信(Read_1_Wire)の3つのサブルーチンを使用した、本機での実際の使用例を次に示します。

 下のリスト中で最右位置のコメント (4) の部分については、既に上述したように、CRC チェック を取り敢えず省略している部分です。
      ;==========================================================================
      ;		DS18B20 から温度データの読み出し
      ;==========================================================================
      
      read_temperature
      		btfsc	int_flg,2		;温度変換時間監視中フラグ = 1 か?		;;
      		goto	rdtemp04		;Yes						;;
      												;; .......... (1)
      		btfsc	int_flg,3		;温度変換時間監視終了フラグ = 1 か?		;;
      		goto	rdtemp01		;Yes						;;
      
      		call	Init_1_Wire		;1-Wire バスの初期設定
      		btfsc	STATUS,C		;Error か?
      		goto	rdtemp03		;Yes
      
      		movlw	h'cc'			;
      		call	Write_1_Wire		;[SKIP ROM] コマンドの送信
      		movlw	h'44'			;
      		call	Write_1_Wire		;[CONVERT T] コマンドの送信
      
      	;;	bcf	PCLATH,3		;ページ 0					;;
      	;;	call	wait_250ms		;750 ms 間(変換時間)待つ			;; .......... (2)
      	;;	call	wait_500ms		;分解能 = 12 ビット(デフォルト)		;;
      	;;	bsf	PCLATH,3		;ページ 1					;;
      
      		bsf	int_flg,2		;温度変換時間監視中フラグ = 1			;;
      		movlw	tm2_s_val		;=47,  16ms x 47 = 752ms			;;
      		movwf	tm2_s_cnt		;ソフトタイマー2カウンタに設定			;; .......... (3)
      		bsf	T2CON,TMR2ON		;タイマー2 ON/OFF 制御 = ON			;;
      		goto	rdtemp04								;;
      
      rdtemp01 	call	Init_1_Wire		;1-Wire バスの初期設定
      		btfsc	STATUS,C		;Error か?
      		goto	rdtemp03		;Yes
      
      		movlw	h'cc'			;
      		call	Write_1_Wire		;[SKIP ROM] コマンドの送信
      		movlw	h'be'			;
      		call	Write_1_Wire		;[READ SCRATCHPAD] コマンドの送信
      
      		movlw	low sp_temp_lsb		;スクラッチパッド格納エリア (9 byte 使用)
      		movwf	FSR
      		movlw	9
      		movwf	lp_cnt1			;ループカウンタ
      
      rdtemp02	call	Read_1_Wire		;データの受信
      		movwf	INDF			;格納エリアに移動
      		incf	FSR,F			;間接アドレス +1 更新
      		decfsz	lp_cnt1,F		;ループカウンタ - 1 = 0 か?
      		goto	rdtemp02		;No
      
      	;;	call	crc8			;受信データ 9バイトの CRC8 計算チェック		;;
      	;;	btfsc	STATUS,C		;Error か?					;; .......... (4)
      	;;	goto	rdtemp0x		;Yes						;;
      
      		goto	rdtemp04		;
      
      rdtemp03	movlw	h'ff'			;ブルー LED 消灯
      		call	ExpPCF8574_Write	;(PCF8574/74A)のポートへデータを書き込み
      
      ;		[ 9_.18 20 ]			;DS18B20 エラーメッセージ
      		movlw	h'9f'			;"9f" = "Error"
      		movwf	temp_hh
      		movlw	h'18'			;"18"
      		movwf	temp_mm
      		movlw	h'20'			;"20"
      		movwf	temp_ss
      		call	error_disp		;DS18B20 異常時のエラー表示
      		goto	read_temperature
      
      rdtemp04	return
      
 コメント (2) の部分についてはこれも上述したように、本機ではデフォルトの 12 ビット分解能を選択しているため、"DS18B20" で A/D 変換にかかる時間は 750 mS 間を必要とします。 [CONVERT T] コマンドを送信後に、次の [READ SCRATCHPAD] コマンドの送信までを休止させるために、当初はコメント (2) のように単純にウェイト・ルーチンで時間消費をさせていました。

 しかし、本機でのニキシー管の点灯にはダイナミック方式で点灯をさせているために、A/D 変換をさせる度に 750 mS 間も点灯が途切れるのではとても実用にはなりません。 そのためにリスト中のコメント行にした (2) 部分の前後に (1) と (3) の命令群を追加して、 タイマー2割り込みを使用した 750 mS の時間監視をするように改めました。

 このような場合に私は通常タイマー0割り込みを使用するのですが、本機では既にタイマー0割り込みをいろいろな目的で使用しているので競合を避けるため、タイマー2割り込みを使用することにしました。 次のリストは抜粋で分かりづらいかもしれませんが、本機で使用したタイマー2割り込みに関連した設定を次にまとめておきます。
      ;==========================================================================
      ;		定数の定義と変数のレジスタ割付け
      ;==========================================================================
      
      		radix	dec
      
      			:
      			:
      
      tm2_h_val	equ	250			;ハードタイマー2カウント値(割り込み周期)(4/8Mz*16*8*250=16msec)
      tm2_s_val	equ	47			;ソフトタイマー2カウント値                (16msec*47=752msec)
      
      			:
      
      		cblock	h'20'			; (( バンク 0 ))
      
      			:
      tm2_s_cnt					;ソフトタイマー2カウンタ
      			:
      
      		endc
      
      			:
      			:
      
      ;==========================================================================
      ;		割り込み処理
      ;==========================================================================
      
      		org	h'0004'			;割り込みベクタ
      
      interrupt
      			:
      			:
      
      		btfsc	PIR1,TMR2IF		;タイマー2割り込み か?
      		goto	t2_int			;Yes
      
      			:
      
      ;---------------- タイマー2割り込み処理 ----------------------------------
      						;割り込み周期 = 4/8Mz*16*8*250=16msec)
      
      t2_int		bcf	PIR1,TMR2IF		;タイマー2割込みフラグをクリア
      
      		decfsz	tm2_s_cnt,F		;ソフトタイマー2カウンタ - 1 = 0 か?
      		goto	int_end			;No
      						;16ms x 47 = 752ms
      		bcf	T2CON,TMR2ON		;タイマー2 ON/OFF 制御 = OFF
      		bcf	int_flg,2		;温度変換時間監視中フラグ = 0
      		bsf	int_flg,3		;温度変換時間監視終了フラグ = 1
      ;		goto	int_end
      
      int_end
      			:
      
      		retfie				;割り込みからの復帰	
      
      			:
      			:
      
      ;==========================================================================
      ;		初期化処理
      ;==========================================================================
      
      initialize
      			:
      			:
      
      		bsf	STATUS,RP0		;バンク 1
      
      			:
      
      		; 割り込みの設定
      
      		bsf	PIE1,TMR2IE		;TMR2IE: タイマー2割り込みを許可
      		movlw	tm2_h_val
      		movwf	PR2			;PR2 に設定
      
      		bcf	STATUS,RP0		;バンク 0
      
      			:
      
      		movlw	b'00111010'		;bit7:        未使用
      						;bit6-3=0111: ポストスケーラのスケール値 1:8
      						;bit2(TMR2ON)=0:
      						;bit1-0=10:   プリスケーラのスケール値 1:16
      		movwf	T2CON			;T2CON に設定
      
      			:
      
      		bsf	INTCON,PEIE		;PEIE: 周辺機器割り込みを許可
      		bsf	INTCON,GIE		;GIE:  グローバル割り込みを許可
      
      			:
      			:
      
 そして、DS18B20 から温度データの読み出しサブルーチン(read_temperature の使用法ですが、次の 各種データ読み出しと タイマー & 温度の監視と時報音出力コントロール(xtime_monitor) のようにまとめ、 メインルーチン内でダイナミック方式でニキシー管の点灯をさせるループ(約 13.4 mS 周期)の中に入れています。

 したがって、本機では2秒に1度 int_flg フラグの bit 1(温度データの読み出し要求フラグ)が ON になり、その都度、bit 1 = OFF にされるまでループ内で何度も実行され続けることになりますが、 750 mS 経過しないと [READ SCRATCHPAD] コマンドは実行されず、750 mS 経過後に初めて DS18B20 から温度データの読み出しが行われ、続いて、読み出したデータの BCD 変換(temp_cnv2)も済ませた後に、int_flg の温度関連フラグすべてをクリアします。
      ;--------------------------------------------------------------------------
      ;    各種データ読み出しと タイマー & 温度の監視と時報音出力コントロール
      ;--------------------------------------------------------------------------
      
      xtime_monitor
      		btfss	int_flg,0		;RTC DS3231 からデータ読み出し要求フラグ = 1(1秒周期) か?
      		goto	xtime01  ;03			;No
      
      		xRtc_Read_M  seconds,7		;RTC DS3231 から年月日、時分秒を読み出し
      		call	buffer_to_counter
      		bcf	int_flg,0		;RTC DS3231 からデータ読み出し要求フラグ = 0
      
      		call	time_signal		;時報音出力コントロール
      
      		btfss	tmon_flg,0		;タイマー監視フラグ = 1 か?
      		goto	xtime01			;No
      
      		bsf	PCLATH,3		;ページ 1
      		call	time_monitor		;タイマー & 温度の監視とその処理
      		bcf	PCLATH,3		;ページ 0
      
      xtime01		btfss	int_flg,1		;DS18B20 から温度データの読み出し要求フラグ = 1(2 秒周期) か?
      		goto	xtime02			;No
      
      #ifdef temp_ds3231
      		xRtc_Read_M  temp_msb,2		;RTC DS3231 から温度データ 11h,12h を読み出し
      		call	temp_cnv		;温度データの BCD 変換
      		bcf	int_flg,1		;温度データの読み出し要求フラグ = 0
      #else
      		bsf	PCLATH,3		;ページ 1
      		call	read_temperature	;DS18B20 から温度データの読み出し
      		btfsc	int_flg,3		;温度変換時間監視終了フラグ = 1 か?
      		call	temp_cnv2		;Yes. 温度データの BCD 変換
      		bcf	PCLATH,3		;ページ 0
      
      		movlw	h'01'
      		btfsc	int_flg,3		;温度変換時間監視終了フラグ = 1 か?
      		andwf	int_flg,F		;Yes. 温度関連フラグ = 0
      #endif
      		movf	ch2_cnt,W		;
      		btfsc	STATUS,Z		;CH2 メモリカウンタ = 0 か?
      		goto	xtime02			;Yes
      
      		bsf	tmon_flg,1		;温度監視フラグ = 1
      		bsf	PCLATH,3		;ページ 1
      		call	time_monitor		;タイマー & 温度の監視とその処理
      		bcf	PCLATH,3		;ページ 0
      
      xtime02		call	alarm_sound		;アラームフラグの監視とアラーム音出力
      
      xtime03		return
      
 上のリスト xtime_monitor サブルーチン内で #ifdef と #else 間は機械語に翻訳されることはありません。 温度センサを変更する以前には、RTC DS3231 から温度データの読み出しを行っていたことが分かるように、リスト中に残してあります。

現在の最新バージョン: Ver. 1.15a ( 2024/5/24 更新 )

| ページトップ |

■ 部品配置図 ■

 使用したプリント基板は、"秋月電子通商" の 155 x 114 mm (通販コード:104708 ) サイズのガラスエポキシ片面ユニバーサル基板ですが、後述の ケース加工図 で示したケース内に収めるためには、プリント基板の切断等の加工が必要です。

 ガラスエポキシ基板は丈夫なので私は好んで使用しているのですが、次図に示すように、今回は切断箇所が多いので大変でした。 まず、X1、X2 の横方向 ----- 2か所で切断をします。 次に、Y1、Y2 の縦方向 ----- 2か所で切断をし、 最後に X3 の横方向 ----- を切断すれば切断加工は終了です。

 後は、メイン基板となる一番大きな基板の四隅4か所 + 右下のコイン電池位置にブザー取り付け用2か所 = 計6か所 にΦ3.2 の丸穴と、右写真の左下位置のように DC ジャックの取り付け用穴( DC ジャックの取り付け方法 を参照)を開けます。 また、そのメイン基板の右横に位置するスイッチ用基板の上下2か所にも、同Φ3.2 の丸穴を空ければ加工はすべて終了で、切断をしたプリント基板の内の、メイン基板とスイッチ用基板の2枚だけを本機では使用します。 (他に プリント基板(3) が追加されました。)



左下に DC ジャックの取り付け用穴と、赤○印2か所にΦ3.2 の丸穴を追加

 当初は、ブザー(圧電スピーカー)の取り付け位置に、ケースの左側面の内側を予定していました。 しかし、後述するブルー LED のアイデアが浮かび、その LED 制御用のプリント基板(3) の取り付け位置に困ってしまい、とりあえず、ブザーには移動してもらって その跡地にプリント基板(3) を取り付けることにしたのですが、次にはブザーをどの位置に取り付ければ良いのか悩んだ末、プリント基板(1) の右下にあるコイン電池ホルダの上空を2階建てにして取り付けることにしたのです。 ( この問題について大きな変更 があるので、ケース加工図 の後半部分を先にご覧になってください。)

 そのために右上の写真の赤○印2か所にΦ3.2 の丸穴を追加して、そこに2本のジュラコンスペーサー(M3 x 15 両側メス 六角)を次の写真のように建て、その先にブザーを取り付けることにしたのですが、2本のスペーサーの内の右上のスペーサーの根元部分が、 電池ホルダと接触して無理な力が加わるので 0.5 mm ほど削って対処しました。

右側のスペーサーが邪魔になる 最終的にスペーサーの先にブザーを取り付ける

 また、赤○印2か所の同位置の(プリント基板(1) の)裏側も考えたのですが、プリント基板(1) の裏側のスペース 5 mm に対して使用したブザーの厚さが 5.5 mm あるため、ちょっと無理なので止めにしました。 (裏側のスペース 5 mm を広げることも考えられますが、そうするとまた別の不具合が発生するので、結局ボツにしました。)

 こうして、コイン電池ホルダの上空を2階建てにして取り付けることに決めたのですが、次にはプリント基板(2) を取り付けるときにまた問題が起こりました。 使用したケースサイズの都合上、ケースには先にプリント基板(1) を取り付けた上で、プリント基板(2) を取り付けなければならないのですが、そのときに、2本のジュラコンスペーサーの内の右上のスペーサーが邪魔をして、プリント基板(2) を(右側面の内側に)取り付けることができなくなってしまいました。

 そこで苦肉の策、邪魔になるスペーサーを外したプリント基板(1) を取り付けた上でプリント基板(2) を取り付け、その後で邪魔になったスペーサーを取り付けることにしました。 そのために右上のスペーサー位置の背面に当たる、ケースの底面に丸穴( ケース加工図 を参照、(下箱上面図) の右下のΦ7 丸穴)を開けておき、プリント基板(2) を取り付けた後で、そのケース底面の丸穴からビスを通して、改めて邪魔になった右上のスペーサーをプリント基板(1) に取り付ける方法を採りました。

| 部品配置図 (NixieTubeClockIII_1PC0.CE3) | ページトップ |

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

 本機も完成間近になってから、RTC IC DS3231 の内蔵の温度センサから、専用の温度センサ DS18B20 を使用することに仕様変更をしたため、そのコネクタ(ピンヘッダ 3P)の取り付け場所(基板上に空きスペースがほとんどない)に困ってしまい、 下図のように窮屈な位置(三端子レギュレータ TA7805S の上)になってしまった。 なお、このコネクタ 3P の信号並びは、DS18B20 の足ピン 並びとは異なっているので注意をしてください。


 [ 上図から黒文字を除去して表示 ..... ハンダ面側のパターンが分かりづらいときに参照してください

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


正面側 背面側

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


ブルー LED 用の配線を次図に示す青線のように、プリント基板(1) のハンダ面側で行ってください。(右上の写真を参照)

各ブルー LED の取り付け向きはハンダ面側から見て → 向きで、左側がアノード、右側がカソードです。 右上の写真では逆に取り付けてしまったため、失敗 !!
そのために各 LED ピンの配線がパターン図とは逆になっています(注意)。 すべてパターン図 (部品面)、パターン図 (ハンダ面) の方が正解です。

また、LED ピンの周囲にはニキシー管用の高圧がぎっしりと隣り合わせに取り囲んでいるので、ハンダ付けには十分に注意をして絶縁不良等を起こさないように !!

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

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

 ケースサイズとプリント基板(2) の取り付け位置を、ケース加工図 で述べているように変更をしたため、右下の写真に移っているケーブル長では足らなくなってしまい、変更後はもっと長いケーブルに付け替えてあります。 (ケース外観と内部の様子 の 写真 を参照)



コネクタ, ケーブルを取り付け後の様子

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

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



コネクタ, ケーブルを取り付け後の様子

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

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

 当初、プリント基板(1) パターン図の設計中には考えにはなかったのですが、そのプリント基板(1) が完成間近になってからブルー LED のアイデアが浮かび、急遽、LED の制御用として 回路図 の変更(追加更新)と、このプリント基板(3) を追加作製することになりました。 そのために完成間近のプリント基板(1) も所々の変更を余儀なくされました。



コネクタ, ケーブルを取り付け後の様子

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

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

 その後、またまたハードウエアの変更をすることになり、PIC のポート RA2 に収容していた CH3 スイッチ(SW7)を、この I/O エキスパンダ IC PCF8574/74A のポートに引っ越しをすることになりました。 (温度データの取り込みを、RTC IC DS3231 の内蔵の温度センサから、専用の温度センサ DS18B20 に変更をするにあたって、現在、その温度センサを収容するための空きポートが PIC 側にないため、 CH3 スイッチを移動させて空きポートを作ることにしました。) コネクタ, ケーブルも 6P から 7P に変更しました。



コネクタ, ケーブルを取り付け後の様子

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

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



コネクタ, ケーブルを取り付け後の様子

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

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



コネクタ, ケーブルを取り付け後の様子

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

■ ユニバーサル基板を使用時の DC ジャックの取り付け方法 ■

 本機のようにユニバーサル基板を使用して DC ジャックを取り付けるためには、あらかじめ基板に対して以下の穴あけ加工の処理を行っておかなければなりません。

1. 穴を開ける 2. 穴を繋げる 3. ジャック端子を通す 4. メッキ線を巻き付け 5. ハンダ付けをする 6. すべての端子を処理 7. 取り付け完了
  1. DC ジャックを取り付ける位置に3本の端子を通すためには、まずΦ1 程度の小穴を写真の要領で5個(赤○)追加して開ける。 DC ジャックの端子間隔は、2.54 mm の倍数ピッチにはなっていないので多少の無理が生じるが構わずに作業を続ける。
  2. 追加して開けた穴を中心として、3個ずつの穴を直線的に繋げる。(写真の例では3個以上が繋がってしまっているが、でも大丈夫)
  3. 3個の直線的な穴が開いたら、基板の部品面側から DC ジャックの端子をそれぞれ押し込んで差し込む。
  4. 2. の工程でハンダ面側のランドがかなり傷んで、そのままではハンダ付けが困難になっているため、4. の写真の要領で端子にスズメッキ線等を巻き付け、ハンダが乗り易いように補正(補強)をしておく。
  5. スズメッキ線等で補正をした端子にハンダ付けをする。(ハンダはたっぷりと多めに盛ると良い。 ただし、芋ハンダは禁止。)
  6. 4 〜 5. と同要領で、3本の端子すべてにハンダ付けをする。
  7. ユニバーサル基板に DC ジャックの取り付けが終了して、基板の部品面側から取り付けの様子を見た写真。これでがっちりと固定され少々の外力ではビクともしない。
 この面倒な加工についても、使用ケースを一回り大きなものに変更をしたことから、ケースの横幅が広くなり必ずしも必要ではなくなりました。 ここで使用している MJ-179P 型の DC ジャックを、MJ-60 型に変更してケースの側面に取り付けることができます。 そして、基板側にはピンヘッダ 2P を取り付けて、両者をコードで結線をします。

| ページトップ |

■ プリント基板(1)用のコロン(:)の作製 ■

 "時" と "分"、"分" と "秒" との間の区切り記号としてコロン(:)を表示させるために、本機においても前作( "173. 6桁ニキシー管時計(改良版)" )と同様に、 次の写真のような、私の手持ちにある LED とピンヘッダを使用して作製をしました。 どちらも十数年前に入手したものなので、現時点においての入手は難しいと思われます。

 ・ LED仕様: Agilent(Hewlett-Packard)、HSMV-A100、オレンジ、3228サイズチップ、("秋月電子" で購入)
 ・ ピンヘッダ仕様: HRS、型番不明、台座から上部分の実測ピン長さ16.5mm、(Yahoo!オークションで入手)



下段の 40P のピンヘッダは比較用のもので、私が通常
使用している "秋月電子" で購入のピン長さ6mmのもの

 そのコロン(:)を作製する過程の写真を撮るのを忘れて、プリント基板(1) に取り付けてしまいましたが、まずピンヘッダを 4P ずつに分割をします。 そして、今回使用したニキシー管は次の写真のように文字の表示面が側面ではなく上面にあるため、 LED の取り付けもピンヘッダの側面ではなく上面に向くように先端に取り付けます。


 したがって、必ずしも私が使用したような表面実装型の LED と、通常よりも長いピンヘッダを使用して作製をする必要はなく、ごく普通の砲弾型でサイズ的にニキシー管に見合ったオレンジ色の LED があれば、それを使用することができます。

| ページトップ |

■ ケース加工図 ■

 使用したケースは、100均(セリア)で購入した "ディスプレイボックス M 「和泉化成」" という、スチロール樹脂ケースです。 サイズは、外側(内側)が 95 (89) x 135 (127) x 41 (35) mm で、前面に可動式のフタが付いています。 ( 注意. このケースではなく、次の2つ目の加工図のケースを使用することをお勧めします。)


採用ケースとスイッチ配置についての反省点

 本機で使用したケースの感想ですが、やはり少しばかり小さかったようで横幅サイズがキツキツでした。 せめて左右にあと+ 5 mm ずつは欲しいところです。 左側面の内側にはプリント基板(3) を取り付け、右側面の内側にはプリント基板(2) を取り付けたのですが、 無理やり ― という感じでまったく余裕がありません。

 そして、右側面に取り付けた8個のタクトスイッチについてですが、その操作に十分慣れるまでは操作性はまったく良くありません(はっきり言って悪いです)。 AAA スイッチを押しながら BBB スイッチを押す、という2個のスイッチを ほぼ同時に押す操作があるのですが、この場合に、スイッチを右側面に取り付けたことから、一般的には、左手で本機ケースを支えながら右手では2個のスイッチ操作を強いられます。 この右手だけの2個のスイッチ操作が難しくなります。

 ケースの横幅サイズをもう少し大きくすることと、スイッチの操作性を良くするという意味で、私が使用したケースの採用とスイッチ配置は失敗でした。 できればもう少し大きなケースを選択すべきで、スイッチ類も前面に配置をすれば両手操作も可能となり、 また、たとえ片手操作においても右側面に取り付けたときよりもずっと楽になると思います。

そして一転、朗報です

 このホームページもほとんど完成に近づいたある日のこと、郵便局に用があって外出したときのことです。 郵便局の用も済んで帰り道にフラッと 100 均に入ったところ、良いケースを見つけました。 "ディスプレイボックス L 「和泉化成」" という、 サイズが、外側(内側)が 107 (100) x 155 (148) x 41 (35) mm のスチロール樹脂ケースです。

 初めに店でこのケースを見たときには見た目が同じなので、本機で採用したケースと同一のものだと思いましたが、よくよく見てみるとこのケースには "ディスプレイボックス L " と書かれております。 このホームページの ケース加工図 の項の冒頭説明には、確か "ディスプレイボックス M " と書いたような記憶があったのですが、店で他に探してみても "L" サイズのものだけが置いてあり、"M" サイズのものは見当たらないので確信が持てませんでしたが、 どうせ 110 円のことなのでそのまま購入をして帰りました。

 帰宅してからさっそく両者を比べてみると、新しく購入した方は間違いなく一回り大きく、以前に購入したケースの兄貴分だったのです。 以前に購入したときには、"L" サイズの兄貴が存在するとは知らずに "M" サイズの弟分の方を購入していたのでした。 ・・・ 何はともあれ、良いケースが見つかりました。 もう一度、本機ケースの作り直しです。

      上図の ( 下箱下側面図 ) において、縦書きで "注意" と書いた長方形のものは、このような要領でケースに足を取り付けることを表している。
      両端の足に挟まれている4個の〇穴はリレーの接点出力の取り出し用もので、コードを繋いだときにケースの座りが悪くなるのを防止するた
      めのもので、左右に足を取り付けることを考えているが、どのようなものを足とするか ― の具体案が未だ決まっていない。

 2つ目の加工図の新ケースと1つ目の旧ケースとで大きく異なっている点は、上の反省点で書いたことを踏まえて、タクトスイッチのプリント基板(2) を前面の右下に取り付けたことです。 ただ、このプリント基板(2) は、 旧ケースの右側面に取り付けることを前提にして作製したものなので、各タクトスイッチ間が若干狭くなっています。 新しく作る場合には、すべて 0.4 インチ間隔にするとより良くなると思います。

 そして、右側面が空いたことからその右側面の内側の下位置辺りにブザーを取り付けました。 したがって、部品配置図 で述べた、プリント基板(1) のコイン電池ホルダ上空を2階建てにする構想は取り止めで、 2本のジュラコンスペーサーも廃止です。 プリント基板(1) のブザー接続用のピンヘッダからブザー位置が少しばかり遠退いたために、コード長が足らなくなったので継ぎ足しをして対処しましたが、 新しく作る場合には、ピンヘッダ位置をもっと右方向に移動させると良いと思います。

 また、タクトスイッチ関連で、プリント基板(2) に取り付けてあるケーブルとコネクタについては、ケースの蓋を開けた状態ではケーブル長が足らなくなったため新しく作り直しました。 リレー回路に取り付けた2個の動作確認用の LED は、プリント基板(2) が前面に来たことから陰になって、多少は見にくくなりましたが、見る角度を少し変えれば見ることもできるし、正面から見てもプリント基板(2) 越しで周りがボーと赤く光っているので分かります。

 他には、プリント基板(1) に直接取り付けたΦ 2.1 DC ジャック(MJ-179P マル信無線電機)については、DC ジャックの取り付け方法 で述べたような面倒な加工は、ケースの横幅が広くなったことから必ずしも必要ではなくなりました。 基板(1) 側に単にピンヘッダ 2P を取り付けておいて、ケース側面には MJ-60 型の DC ジャックを取り付け、両者をコードで結線をするだけでよく簡単になります。 私の場合には、ケースの左側面が DC ジャック(MJ-179P)から遠退いたために、 プラグの太い部分が通るようにケース側面の穴径を通常より大きくする必要が生じました。

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

■ 使用部品表 ■

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

(データシート)
PICマイコン .................... PIC16F886
DC-DC コンバータ .................... NJM2360AD
三端子レギュレータ .................... TA7805S
トランジスタ .................... 2SA1015
高耐圧 MOS FET トランジスタ .................... 2SK3234
ダイオード .................... UF2010
ダイオード .................... 1N4148
RTCモジュール .................... ( DS3231 )
デジタル温度センサ .................... DS18B20
I/O エキスパンダ .................... PCF8574/74A
フォトカプラ .................... TLP627-2
TTL ニキシー管ドライバ .................... SN74141
ニキシー管 .................... IN-17

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

■ 参考資料・参考サイト ■

PIC16F886 データシート  ..........  https://akizukidenshi.com/goodsaffix/pic16f886.pdf
ニキシー管 IN-17 データシート  ..........  https://tubehobby.com/datasheets/in17.pdf
DS3231 データシート  ..........  https://datasheets.maximintegrated.com/en/ds/DS3231.pdf
DS18B20 データシート  ..........  https://akizukidenshi.com/goodsaffix/DS18B20.pdf
DS18B20 データシート(日本語訳)  ..........  https://www.ne.jp/asahi/shared/o-family/ElecRoom/AVRMCOM/DS18B20/DS18B20manual.html
PCF8574/PCF8574A データシート  ..........  https://www.nxp.com/docs/en/data-sheet/PCF8574_PCF8574A.pdf
DS3231 For PI  ..........  https://www.amazon.co.jp/Rasbee-クロックモジュール-時計モジュール-……(2024年5月現在)
デジタル温度センサ DS18B20  ..........  https://www.amazon.co.jp/KKHMF-2PCS-DS18B20-デジタル温度センサ-コントロー/……(2024年5月現在)
173. 6桁ニキシー管時計(改良版)  ..........  https://xyama.sakura.ne.jp/hp/NixieTubeClockII.html

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


Copyright (C) 2024 やまもとみのる
初版:2024年5月10日、初公開:2024年5月10日、最終更新:2024年5月24日