前のチュートリアルでは、OLEDは5ピンを使用するSPI通信を使用してESP32とインターフェースされます。このチュートリアルでは、I2C通信を利用して、2ピンのみを使用して16x2LCDをESP32とインターフェイスさせます。これにより、ESP32で使用されるピンの数が減り、さまざまなセンサーとのインターフェースに使用できるESP32ピンの数が増えます。
I2C通信プロトコルとは何ですか?
長期的なI2Cの略、「インテルインテグレーテッド回路」。これは通常、IICまたはIの2乗Cとして、あるいは2線式インターフェイスプロトコル(TWI)として示される場所もありますが、すべて同じ意味です。I2Cは同期通信プロトコルです。つまり、情報を共有している両方のデバイスが共通のクロック信号を共有する必要があります。情報を共有するためのSDAとSCLの2本のワイヤしかなく、そのうちSCLはクロック信号に使用され、SDAはデータの送受信に使用されます。
I2C1602LCDコントローラーが組み込まれたI2CLCDモジュールを購入することも、I2Cコントローラーを購入して16x2LCDをESP32とインターフェースさせることもできます。
必要な材料
- ESP32
- 16 * 2LCDディスプレイ
- I2CLCDコントローラー
- ワイヤー
- ブレッドボード
I2Cモジュール
I2CコントローラーにはICPCF8574があり、2線式双方向I2Cバスシリアルクロック(SCL)とシリアルデータ(SDA)を介して汎用リモートI / O拡張を提供します。これは非常に便利なICであり、LED看板、ディスプレイ、キーパッド、産業用制御などで使用できます。8つのI / Oピン、I2Cバスアドレス用の3つのピン(A0、A1、A2)、およびSDA、SCLピンがあります。 。
LCDコントローラボードには、LCDのコントラストを制御するためのポテンショメータが組み込まれています。
ICとLCDコントローラのピン配列を以下に示します。
回路図
LCDをESP32に接続するための接続を以下に示します。
- I2Cモジュールのピン1-16をLCDディスプレイのピン1-16に接続します。
- I2CモジュールのSDAピン-> ESP32のSDAピンすなわちD21
- I2CモジュールのSCLピン-> ESP32のSCLピンすなわちD22
デモンストレーションのためだけに3vのESP32を5vのI2Cに接続しましたが、データを正しく表示するにはI2Cモジュールに5V電源が必要です。ESP32はI2Cモジュールの3.3ボルトしか供給できず、データがはっきりと表示されないためです。したがって、外部5V電源を使用することをお勧めします。
ESP32のボードファイルが必要なので、ESP32を初めて使用する場合は、最初にESP32チュートリアルの開始に従ってから、ここに戻ってください。LCDをI2CなしでESP32に接続することもできますが、ESP32のピンが多くなります。
I2Cコントローラーアドレスを見つけるためのコード
メインコードに入る前に、まずI2Cモジュールのアドレスを見つける必要があります。
I2Cコントローラには、I2Cバスの制御に使用されるADDRESSビットが組み込まれています。デフォルトのアドレスは0x27ですが、場合によっては0x3fになることもあります。したがって、I2Cコントローラーのアドレスを確認するには、上記のように回路を接続し、以下のコードをアップロードしてシリアルモニターを開きます。アドレスは16進数で表示されます。
#include
LCDインターフェースコードでこの アドレス を使用していることに注意してください。
I2Cコントローラーには、ご覧のとおり、A0、A1、A2のラベルが付いた3つのジャンパー/はんだ付けパッドがあります。これらは、モジュールのアドレスを変更するために使用されます。アドレスパッドを相互に接続した場合、アドレスがデフォルト値の0x27または0x3Fからどのように変化するかを次に示します。(1 =接続されていません。0=接続されています):
A0 |
A1 |
A2 |
HEXアドレス |
1 |
1 |
1 |
0x27 |
0 |
1 |
1 |
0x26 |
1 |
0 |
1 |
0x25 |
0 |
0 |
1 |
0x24 |
1 |
1 |
0 |
0x23 |
0 |
1 |
0 |
0x22 |
1 |
0 |
0 |
0x21 |
0 |
0 |
0 |
0x20 |
ESP32のコード
まず、I2CLCDモジュール用のライブラリLiquidCrystal_I2Cが必要です。ここではI2Cを使用しているため、通常の Liquidcrsytal ライブラリは機能しません。
このhttps://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-libraryからライブラリをダウンロードします
コードは、シリアルモニターに入力されたものがすべてLCDに表示されるように記述されています。Arduino IDEは、コードの記述とアップロードに使用されています。
まず、ArduinoIDEに付属するI2C通信用の ワイヤー ライブラリを含める必要があります。
#include
次に、I2C LCDの場合、以前にダウンロードしたLiquidCrystal_I2C.hを含めます。
#include
次に、LCD I2Cアドレスを0x27に設定するか、16文字の2行表示用に上記のスキャナーコードを実行して取得したアドレスを設定します。
LiquidCrystal_I2C lcd(0x27、16,2);
セットアップ 機能、16文字のための2行をシリアル通信及びLCDを初期化し、バックライトをオンにします。バックライトをオフにしたい場合は、lcd .noBacklight()を使用し、好みに応じてsetCursor()関数を変更します。
void setup() { Serial.begin(9600); lcd.init(); lcd.backlight(); lcd.setCursor(0,0); lcd.print( "Hello、world!"); delay(1000); lcd.setCursor(0,1); lcd.print( "circuitdigest.com"); delay(3000);
LCDは最初にシリアルモニターを使用するための指示を表示し、表示する文字を入力します。
シリアルモニターオプションを「行末なし」に設定します
lcd.clear(); lcd.setCursor(0,0); lcd.print( "UseSer。Monitor"); lcd.setCursor(0,1); lcd.print( "表示するタイプ"); }
ループ 関数は、Serial.available()関数を使用して、シリアルポートからの着信シリアルデータを継続的にチェックします。メッセージがある場合は、2番目に待機し、lcd .write()およびSerial.read()関数を使用してLCDにメッセージを出力します。
void loop(){//文字がシリアルポート経由で到着したとき… if(Serial.available()){delay(100); //メッセージ全体が到着するまで少し待ちますlcd.clear(); //画面をクリアしますwhile(Serial.available()> 0){//使用可能なすべての文字を読み取りますlcd.write(Serial.read()); //各文字をLCDに表示します}}}}
競合コードを以下に示しますので、コードをアップロードしてシリアルモニターを開きます。次に、メッセージを入力してEnterキーを押します。メッセージがLCDに表示されます。
LCDで適切な応答が得られない、または応答がない場合は、I2Cコントローラーのアドレスを確認するか、上記のコードで再度スキャンして正しいアドレスを取得してください。