RasPi  Desk

Pythonで温湿度をLCDに表示する

 (実験で使用する電子パーツのサイトで公開されているプログラムを参考にして試行する)


Python(パイソン)で温度/湿度のLCD表示をプログラムする

*プログラムを記述するにはテキストエディタが必要になる。
 RasPiのOSにGUIに馴染むいくつかのテキストエディタがあるが教則本にある Geany が
 プログラム開発では使い勝手が良いと思う。

*RasPi5のI2Cインターフェースを無効にすること。
 → I2Cモード切り替えページへ

*回路図


*I2Cインターフェース上にLCDを接続したらI2Cのアドレスを確認する
 プログラムにI2Cアドレスとして記述する必要がある

 sudo i2cdetect -y 1
 正しく回路が繋がっているとLCDのアドレスがhex数値で表示される
 例では 0x27 LCDユニットのI2Cアドレスとなる
 20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- --

*GPIOピンにてDHT11のDATA-INと接続する番号を回路図と異なるピンに変更する場合は
 プログラムにてBCM番号を変更する必要がある
 ------------------------------------------------------------------------
 Pythonで組んだプログラムを簡易に動かす場合、RasPiOSに入っているPythonのインタープリタで
 動かすことになる。インタープリタとはPythonで書かれた命令文を1つずつ解釈しながら実行して
 いく形である。ゆえにインタープリタでは実行速度がC言語で組まれたものより遅くなる。

 *実行例(ソースファイルがdht11-i2clcd.pyの場合)
  sudo python dht11-i2clcd.py

 サンプルプログラムの概要は、温湿度センサーDHT11からデータを読み込んで
 I2Cインターフェースに接続されたLCDに温度/湿度を表示する

<サンプルプログラムの動作手順>
  (続にいうフローチャートを文書化したもの)
 ------------------------------------------------------------------------
1.LCDの初期設定を行う(HD44780準拠のインターフェース)
  <関数 lcd_init() >
 ・LCDユニットに対してI2Cを通して電源投入後の初期化手順の6コマンドをLCDに送る
 a)コマンド(0x33)Initialize
 b)コマンド(0x32)Initialize
 c)コマンド(0x06)Cursor move direction
 d)コマンド(0x0C)Display On,Cursor Off, Blink Off
 e)コマンド(0x28)Data length, number of lines, font size
 f)コマンド(0x01)Clear display
 ・時間(500μs)を待つ(LCD側の動作との整合)
 ------------------------------------------------------------------------
2.LCDに1バイトのデータ送信(書き込み、出力)
  <関数 lcd_byte(bits, mode) >
 ・LCDに対する1バイトを2バイトに成形してLCDに書込み、その後、取込タイミング情報を書込む
   mode=0:コマンド/mode=1:表示データ、LCDの文字を照らすLEDをonにする
 a)上位データ形成:bits8bitから上位4bitを取得してmodeとLCD_BACKLIGHTビットを付加する
 b)下位データ形成:bits8bitから下位4bitを取得して上位4ビットへシフトして
          modeとLCD_BACKLIGHTビットを付加する

 c)I2CインターフェースでLCDアドレスに上位データを書込む
 d)LCDにデータを取り込むタイミング情報を書込む

 e)I2CインターフェースでLCDアドレスに下位データを書込む
 d)LCDにデータを取り込むタイミング情報を書込む
 ------------------------------------------------------------------------
3.LCDにバイトデータ取込タイミング書込み
  <関数 lcd_toggle_enable(data) >
 ・I2Cを通して書込んだデータをLCDが内部に取込むタイミング情報を送る
   タイミング情報(E)をlow→hi→low(トグル)する
 a)時間(500μs)を待つ(LCD側の動作との整合)
 b)LCDに対する1バイトに取込タイミング情報=1を付加して書込む
 c)時間(500μs)を待つ(LCD側の動作との整合)
 d)LCDに対する1バイトに取込タイミング情報=0を付加して書込む
 e)時間(500μs)を待つ(LCD側の動作との整合)
 ------------------------------------------------------------------------
4.LCDに文字列を書込み
  <関数 lcd_string(message,line) >
 ・lineで指定された行にmessage文字列を表示する
 a)LCDの1行文字長に書込む文字列を左揃えにして右側に空白を埋める
 b)LCDに表示行指示コマンドを送る
 c)LCDの1行分の文字列を1文字ずつ データ書込みを繰り返す
 ------------------------------------------------------------------------
5.メイン処理
  <関数 main() >
 ・GPIOの初期化
 ・GPIOにBCM番号使用モードを設定
 ・以下の処理を繰り返す(割り込みがあれば処理を抜ける)
   a)DHT11温湿度センサーからデータを取込(ライブラリで関数化されている)
   b)正常に取り込めたら温度、湿度をLCDに書込み、表示
    1行目に[temp:<取りこんだ温度> C]
    2行目に[humid:<取りこんだ湿度> %]
   c)取り込みが異常だったら以下の文字列をLCDに書込み、表示
    1行目に[Read Tutorial:]
    2行目に[osoyoo.com]

 ------------------------------------------------------------------------
6.プログラム開始処理
  <__main__>
 ・main()を実行する
 ・異常処理(ctrl+Cなどによる強制終了)の設定
   a)LCDに0x01(Clear display)コマンドを送る

 →プログラム終了

 ------------------------------------------------------------------------