I2C LCD・RTC8564NB&DHT-22を使った時計&温湿度計             H26.3.15更新


 前回、製作した温湿度計 にI2CのRTC(リアルタイムクロック)を追加した時計+温湿度計を製作した。
 基本的に前回のものをベースにして、RTCを追加し時計を付加した。LCDはSB1602BWに変更した。

   

構成・使用部品

 CPU    AVR TINY13A 8ピン 内蔵RC4.8MHz動作 メインメモリ1024バイト
 LCD    SB1602BW ストロベリーリナックス I2Cインターフェイス バックライト付き
 RTC    RTC-8564NB 秋月電子通商 RTCモジュール (1.5F電気二重層コンデンサによりバックアップ)
 温湿度計
 DHT22 ストロベリーリナックス 1ワイヤーインターフェイス 1-Wireではない(それより簡単)
 
 回路構成は、回路図のとおり。
 I2Cバス(SCL,SDA)にLCDとRTCを接続。LCDのリセット信号は、VDDに直付。
 日付・時計の設定は、4PDIPSWを使ってBCDコード的に設定する。I2Cの制御と干渉しないようGND側にダイオード追加。
 DHT22は、なるべく他の部品から離した。(近いと温度が高めになる)
 電源は、3.3〜5V対応可。(LCDコントラスト設定調整要) LCDバックライト照度調整の抵抗は今回100Ω入れた。(9ピン)

制御ソース
 I2C上のRTCとLCDは、問題なく読み書きできた。しかし、時刻の初期設定を入力する方法で少し悩んだ。
 LCD・DHT22・RTCの制御ルーチンで既に、tiny13Aのメモリを90%程度使ったので、空きピン2本(pb3,4)を使って(yy,mm,dd,week,hh,mm)を順次
 確認しながら入力・書込・表示処理させるには、メモリがとても足りない。そこで、I2CとDH22用のI/Oピンも使って4ビット+ENTERの構成でBCDコード
 的に順次入力する方式とし、入力値のチェックはせず曜日以外はほぼ同じルーチンの繰返し処理でメモリ消費を抑えた。
 入力値は、順次表示させるためkey-in操作とI2Cバスが衝突しないように工夫した。データ入力後バスを開けるが、GND側をコモンにすると都度DIPSW
 全て開放しなければならないので、dipが入ったままでもI/O線が混触しないようにGND側にダイオードを入れた。
 また、key-in操作時の不規則信号がI2Cにかかるため表示処理がうまく出来ないことがあるため、Key-in操作後にI2Cバスにstopコンデション信号を送ることで
 解決した。

 データの入力手順
   @ロック用DIPsw in ABCD用DIPSW全てoff(干渉防止) Bpush sw 長押し(最大約2秒:1周期の処理) C年の1桁目がフリッカー表示 RTC停止
   D設定する値のBCD値をDIPswで設定 Epushonによってデータ読込 Fpushswが離れ、i/oピンが開放しBCDが全て1となった時点で表示処理
   G年の1桁目が更新し、年の2桁めにフリッカーが移動、以下同様にD〜Fを繰り返す。(BCD値が10以上の場合次の項目にスキップ) 
    分の1桁目を入力した時点から00秒からRTCスタート。
 メモリ消費は、冗長部や割込ベクタ等を削って仕上がりでギリギリ1022バイト。

 
まとめ
 tiny13Aのリソースを使い切ったが、なんとか思いどおりのものが作れた。