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行)

inserted by FC2 system