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のリソースを使い切ったが、なんとか思いどおりのものが作れた。