<Raspberry Pi-24>

LCD(AQM0802A)に時刻を表示させたいと思います。
尚、<Raspberry Pi-23>を参照してソフト関連の作業を行っておいてください。



<知っておきたいこと>

ターミナルからdateを打ち込むと画像のように表示します。


LCD(AQM0802A)は8文字/1行ですので1行目に16/02/11、2行目に15:00:06のように
したいと思います。


上の画像から分かるように、ターミナルからdate +"%y/%m/%d"を打ち込んで
次にdate +"%H:%M:%S"を打ち込めばOKです。
しかし、いちいちターミナルから打ち込むのは大変です。
そこでこの操作を自動で行うためのプログラムをします。

下の画像のようにnanoエディターでtokei.sh名のファイルを作ります


下の画像がプログラムの内容

ここでバックスラッシュ"`"は@マークキーです(Shift+@)
----------------------------------------
#!/bin/sh

while [ true ]
do
ymd=`date +"%y/%m/%d"`
hms=`date +"%H:%M:%S"`
echo $ymd
echo $hms
sleep 1
done
----------------------------------------

次にchmod 755 jikoku.shと打ち込んでアクセス権を変更する
そして./jikoku.shと打ち込むと日付と時刻が表示。停止はCTRL+C


次に下をtokeilcd.shの名前で作り実行して見てください。
----------------------------------------------------------------------
#!/bin/sh

ymd="49 54 47 48 50 47 49 49"
hms="49 53 58 50 49 58 49 49"

i2cset -y 1 0x3e 0x00 0x38 0x39 0x14 0x70 0x56 0x6c 0x38 0x0C 0x01 i #LCD初期化
i2cset -y 1 0x3e 0x40 $ymd i                                         #LCD1行目データ表示
i2cset -y 1 0x3e 0x00 0xC0 b                                         #LCD2行目先頭に移動
i2cset -y 1 0x3e 0x40 $hms i                                         #LCD2行目データ表示
----------------------------------------------------------------------

ymd="49 54 47 48 50 47 49 49"は、16/02/11 のアスキーコード(10進数)です。
     ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓  
      1  6  /  0  2  /  1  1

hms="49 53 58 50 49 58 49 49"は、15:21:11 のアスキーコード(10進数)です。
     ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓  
      1  5  :  2  1  :  1  1

この画像のように表示出来たと思います。


これでは時間がカウントしないので1秒毎にカウントするようにプログラムを
作成します。

下のような4ステップイメージでプログラムします。

                                    ←←←←←←←←←←←←←←←←←←←←←
                  ↓                                        ↑
                      ---------------------------                            ↑
                     I   ymd=`date +"%y/%m/%d"`  I                           ↑
                     I   hms=`date +"%H:%M:%S"`  I                           ↑
                      ---------------------------                            ↑
                                   ↓                                        ↑
                ------------------------------------------                   ↑
               I  ymd、hmsをアスキーコード(10進数)に変換  I                  ↑
                ------------------------------------------                   ↑
                                   ↓                                        ↑
 ------------------------------------------------------------------------    ↑
I  i2cset -y 1 0x3e 0x00 0x38 0x39 0x14 0x70 0x56 0x6c 0x38 0x0C 0x01 i  I   ↑
I  i2cset -y 1 0x3e 0x40 $ymd i                                          I   ↑
I  i2cset -y 1 0x3e 0x00 0xC0 b                                          I   ↑
I  i2cset -y 1 0x3e 0x40 $hms i                                          I   ↑
 ------------------------------------------------------------------------    ↑
                 ↓                                         ↑
                              -----------                                    ↑
                             I  0.1秒毎  I                                   ↑     
                              -----------                                    ↑
                                  ↓                                         ↑
                  →→→→→→→→→→→→→→→→→→→→→


下のプログラムをtokeidsp.shなど適当なファイル名で作成して
chmod 755 tokeidsp.shでアクセス権を変更後./tokeidsp.shで実行
--------------------------------------------------------------------------------------------------------------

#!/bin/sh

i2cset -y 1 0x3e 0x00 0x38 0x39 0x14 0x70 0x56 0x6c 0x38 0x0C 0x01 i #LCD初期化

#関数 文字→10進に変換
moji_conv()
{
        cnt=0                                                     #cntが$mojisu以上になるまで
        while [ $cnt -lt $mojisu ]
        do
        cnt=$(( cnt + 1 ))                                        #cntをインクリメント
        lcddsp=`echo $allmoji | cut -c $cnt`                      #$lcmoji列の$cnt番目の文字をlcddspに入れる
        lcdmoji_dec=$(printf "%d" \'$lcddsp)                      #その$lcddspを10進に変換
        lcdgyo=$lcdgyo$lcdmoji_dec" "                             #その$lcddspに" "を連結してlcdgyoに入れる
        done
}

#関数 文字表示
lcd_dsp()
{
        i2cset -y 1 0x3e 0x40 $ymd i                                         #LCD1行目データ表示
        i2cset -y 1 0x3e 0x00 0xC0 b                                         #LCD2行目先頭に移動
        i2cset -y 1 0x3e 0x40 $hms i                                         #LCD2行目データ表示
}




mojisu=8  #LCD1行が8文字
while [ true ]

do
        #------LCD 1行目データ----------------
        lcdgyo=""                                                 #lcdgyoをクリア
        allmoji=`date +"%y/%m/%d"`                                #西暦下2桁と月、日をallmojiに入れる
        moji_conv                                                 #関数呼出 文字→10進に変換
        ymd=$lcdgyo                                               #変換した文字列ををymdに入れる
        #------1行目データ--------------------

        #------LCD 2行目データ----------------
        lcdgyo=""                                                 #lcdgyoをクリア
        allmoji=`date +"%H:%M:%S"`                                #時、分、秒をallmojiに入れる
        moji_conv                                                 #関数呼出 文字→10進に変換
        hms=$lcdgyo                                               #変換した文字列をhmsに入れる
        #------2行目データ--------------------

        lcd_dsp                                                   #関数呼出 文字表示
        sleep 0.1   #0.1秒毎に時刻の表示

done
--------------------------------------------------------------------------------------------------------------

下の画像をクリックしてください。



Raspberry Pi-25に続く・・・

Raspberry メニューに戻る