IchigoJam I2C LCD表示の温度計の実験
2017.10.3 JH7UBC
温度センサーLM35DZを利用した温度計は、以前に製作しましたが、今回は、I2Cシリアルインターフェース付きLCD1602に温度を表示します。
LM35DZは、0〜100℃で、0〜1000mVの出力が得られます。センサーの出力は、直接IN2に入力します。
IchigoJamのアナログ入力(A/Dコンバータ)は、3.3V(3300mV)で、1023を返しますので、100℃の時(1000mV)、1023/3/.3=310となります。
これを3.1で割れば、100になりますね。IchigoJam BASICでは、小数点が使えませんので、A/Dコンバータの値に10を掛け、31で割ります。
温度表示には、今回I2Cシリアルインターフェース付きのLCD1602を使います。
(SODIALのLCD1602+Easy MallのI2Cシリアルインターフェースモジュール 共にAmazonから購入)
IchigoJamでI2Cシリアルインターフェース付きLCDに表示した例は、Web上には少なく、
「ボクにもわかる電子工作」というサイトの記事のプログラムを利用させていただきました。
IchigoJamのVccは3.3Vですが、入力は5Vトレラント(耐性)なので、5V動作のI2C LCD1602のSDAとSCLを直接接続できます。
接続は下の回路図のとおりです。
プログラムです。変数Qには、コマンド入れます。変数Zには、文字のASCIIコードを入れます。
行番号100〜130が、setup
200〜260が、温度計測と表示
800〜850が、LCD初期化ルーチン
900〜990が、LCDへのコマンド及び文字データ送信ルーチンです。
プログラム | 説明 |
1 'Thermometer 100 gsb800 110 Z=#B5:gsb960:Z=#DD:gsb960:Z=#C4:gsb960:Z=#DE:gsb960 120 Q=#8C:gsb990:Q=#AC:gsb990 130 Z=#DF:gsb960:Z=#43:gsb960 200 'Thermometer 210 T=ANA(2):T=T*10/34 220 [1]=T/10|#30 230 [2]=T%10|#30 240 Q=#8C:gsb990:Q=#8C:gsb990 250 Z=[1]:gsb960:Z=[2]:gsb960 260 wait60:goto210 800 'INI 810 Q=60:gsb990:gsb990:gsb990 820 Q=44:gsb990:gsb990 830 Q=#8C:gsb990:Q=12:gsb990 840 Q=#CC:gsb990:Q=12:gsb990 850 Q=#1C:gsb990:Q=12:gsb990 860 Q=#06:gsb990:rtn 900 'LCD 960 Q=Z:gsb980:gsb990 970 Q=Z<<4:gsb980:goto990 980 Q=Q&#F0|13:rtn 990 poke#8ED,#FB&Q:if i2cw(#27,#8EC,1,#8ED,1) ?"E" else rtn |
LCD1602の初期化 "オンド"を表示 カーソルを1行目の10桁目に移動 "゚C"を表示 IN2でセンサーの出力を読み込む。その値を温度に変換。34の値は要調節 10度の位の値をASCIIコードに変換し、[1]に格納 1度の位の値をASCIIコードに変化し、[2]に格納 カーソルを1行目の8桁目に移動 10度の値、1度の値の順に表示 1秒待つ。210行に戻り、繰り返し。 LCD1602初期化ルーチン Q=60=#3Cを3回送信。8ビットモードを確定させる。 Q=44=#2Cを1回送信。ここから4ビットモードになる。Q=44=#2Cぼ次に Q=#8Cを送信。つまりコマンド#28(Function Set 2行表示)を送る。Q=12=#0Cと Q=#CCを送信。(コマンド#0C(Display ON Cursor OFF)を送る)Q=12=#0Cと Q=#1Cを送信。(コマンド#01(Clear Display)を送る)Q=12=#0Cと Q=#06を送信。(Entry Mode インクリメントモード、表示シフトなし) LCD表示ルーチン Z(ASCII)をQセットし、上位4ビットを送信。 Zを左に4ビットシフトしQにセットし、送信。 上位4ビットを取り出し、13=#0Dを加える。 8ビットI2C送信(説明は下に)ルーチン |
I2C送信ルーチンについて説明します。
最初にLCD1602のコマンド及びデータ書き込みの時のタイミングを見ます。
RS(Register Select)はコマンドの時0,データの時1
R/W(Read/Write)は0
E(Enable)の立下り(1→0)でデータが取り込まれます。
次に、I2Cシリアルインターフェイスモジュールの回路は、次のようになっています。
(私が調べたものです。メーカーが保証しているものではありませんので、ご注意ください。)
このI2CインターフェースモジュールのI2Cアドレスは、初期値で#27です。
(A0〜A2に接続されているジャンパー回路により、ほかのアドレスにも変更可能です)
以上より、8ビットデータの上位4ビットを送信し、LCD1602に読み込ませるためには、
データの値はそのままにして、Eの値だけを1→0になるように、送信します。
なお、BLはBack Lightで常に1です。
変数Q(2バイト)の下位8ビットのアドレスが#8ECで、上位8ビットのアドレスが#8EDです。
#8EDは、#8ECのEのビットだけを1から0にするために、#FBとのANDをとっています。
上の図のようにコマンド及びデータを送るルーチンが990行で
990 poke#8ED,#FB&Q:if i2cw(#27,#8EC,1,#8ED,1) ?"E" else rtn
となります。
なお、LCDに表示データを送る場合は、RS=1となり、上位4ビット+#0D(13)とします。(980行)