検索コード

I2C対応のSSD1306 OLED 128×32ディスプレイ用のArduinoコードと動画

I2C対応のSSD1306 OLED 128×32ディスプレイ用のArduinoコードと動画

このチュートリアルでは、ArduinoでI2C通信を用いてSSD1306 OLED 128×32ディスプレイを使用する方法を紹介します。目的は、画面にテキストや矩形、電圧や温度といった動的な値など、さまざまな要素を表示することです。この構成は、コンパクトで効率的な表示ソリューションを必要とするプロジェクトに最適です。

SSD1306 OLED 128x32

必要なハードウェア部品、配線手順、そしてすべてを稼働させるためのArduinoコードを順を追って説明します。視覚的な案内として、このチュートリアルに付属する動画(動画の00:00)を必ずご確認ください。

ハードウェアの解説

プロジェクトの主要な構成要素にはSSD1306 OLEDディスプレイが含まれます。これは低消費電力で、I2C通信を使用して簡単にインターフェースできるディスプレイです。表示解像度は128×32ピクセルで、テキストや簡単なグラフィックの表示に適しています。

表示を制御するために、I2Cを介してコマンドとデータを送信するArduinoボードを使用します。Arduinoは、たとえばライブラリなどを使用して情報の表示ロジックを処理します。Adafruit_GFXそしてAdafruit_SSD1306これらのライブラリは通信処理を簡素化し、図形やテキストの描画を容易にします。

データシートの詳細

製造元Adafruit
部品番号SSD1306
ロジック/入出力電圧3.3~5 V
電源電圧3.3~5V
消費電流約20 mA(典型値)
表示解像度128×32ピクセル
インターフェースI2C
寸法128×32mm
注記/バリエーションさまざまなサイズとインターフェースでご利用いただけます
  • I2Cアドレスを確認してください。OLEDでは通常0x3Cです。
  • 損傷を防ぐため、適切な電源を確保してください。
  • 必要に応じてSDAおよびSCLラインにプルアップ抵抗を使用してください。
  • I2C信号のノイズを減らすため、配線は短くしてください。
  • 複数のモジュールに給電する場合は、放熱対策を検討してください。

配線手順

Arduino wiring for SSD1306 OLED 128x32
Arduino wiring for SSD1306 OLED 128x32

SSD1306 OLEDディスプレイを配線するには、まずディスプレイのVCCピンをArduinoの5V出力に接続します。次に、GNDピンをArduinoのグランドピンのいずれかに接続します。I2C通信では、ディスプレイのSDAピンをArduinoのSDAピン(UNOではA4)に接続し、ディスプレイのSCLピンをArduinoのSCLピン(UNOではA5)に接続します。別のArduinoモデルを使用している場合は、SDAとSCLのピン配置を確認してください。

追加の部品として、制御したいLEDがある場合は330Ωの抵抗を介してピン9に接続してください。抵抗のもう一方の端をLEDのアノードに接続し、カソードはグラウンドに接続してください。この接続により、ピン9がオンになるとLEDが点灯します。

コード例とウォークスルー

Arduinoのコードでは、まずOLEDディスプレイに必要なライブラリをインクルードします。キーとなる識別子はdisplay、これはそのインスタンスであるAdafruit_SSD1306クラス。ディスプレイはその中で初期化されますsetup()関数内で、描画の準備のためにディスプレイをクリアします。

SSD1306 OLED 128x32
void setup() {
  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.display();
  delay(2000);
  display.clearDisplay(); 
}

その中でloop()関数内で文字列変数を定義します。vString電圧値を保持するためで、その値は動的に更新されます。そのrobojaxText()この関数は、指定した座標にテキストを画面上に表示するために使用されます。

void loop() {
  String vString = String(count, 3);
  display.clearDisplay();
  robojaxText("Voltage:          ", 4, 3, 1, false);
  robojaxText(vString, 72, 3, 1, false);
  display.display();
  count += 0.173;
  delay(2000); 
}

そのrobojaxText()この関数はテキストの位置決めと表示において重要です。テキスト文字列、x および y 座標、テキストサイズ、表示を即座に更新するかどうかを決定するブール値を引数として受け取ります。

void robojaxText(String text, int x, int y, int size, boolean d) {
  display.setTextSize(size);
  display.setTextColor(WHITE);
  display.setCursor(x, y);
  display.println(text);
  if(d) {
    display.display();
  }
}

この関数は、テキストを出力する前にテキストのサイズ、色、およびカーソル位置を設定します。コードの完全な解説はビデオを必ずご覧ください(ビデオの10:00)。

デモ/何を期待できるか

コードをArduinoにアップロードすると、OLEDディスプレイに電圧、温度、容量の値が表示され、2秒ごとに動的に更新されます。テキスト要素の周りに矩形が描かれているはずです。ディスプレイが何も表示しない場合は、配線が正しいか、I2Cアドレスがコードで指定されたものと一致しているかを確認してください。

動画のタイムスタンプ

  • 00:00- プロジェクトの紹介
  • 02:00- 配線手順
  • 05:00- コードのウォークスルー
  • 10:00- 出力のデモンストレーション

画像

SSD1306 OLED 128x32
SSD1306 OLED 128x32
SSD1306 OLED 128x32
SSD1306 OLED 128x32
SSD1306 OLED 128x32
SSD1306 OLED 128x32
SSD1306 OLED 128x32
SSD1306 OLED 128x32
Arduino wiring for SSD1306 OLED 128x32
Arduino wiring for SSD1306 OLED 128x32
83-Arduino code and video for SSD1306 OLED 128 x 32 display with I2C
言語: C++
/*********************************************************************
This is an example for our monochrome OLEDs based on SSD1306 drivers.

This example is for a 128x32 size display using I2C.

If you get the error: Adafruit_GFX.h not found, download the Adafruit-GFX Library
https://github.com/adafruit/Adafruit-GFX-Library


Purchase this OLED module from Amazon: https://amzn.to/36zFvTb

Written by Limor Fried/Ladyada for Adafruit Industries.
BSD license, check license.txt for more information.
All text above, and the splash screen must be included in any redistribution.

 * Watch the video for this code to learn it fully.
  * Watch the video here: https://youtu.be/RjyulqVsz2o
 * This code is offered "as is" without any warranty.
 * Updated by Ahmad Shamshiri for Robojax.com video tutorial
 * on March 18, 2018 at 10:21 in Ajax, Ontario, Canada.
 * Please view other Robojax codes and videos at http://robojax.com/learn/arduino
 * If you are sharing this code, you must keep this copyright note.
 * 
*********************************************************************/

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
double count=0;

/*
 * PIN connection:
 * Pin connection see: https://www.arduino.cc/en/Reference/Wire
 * for UNO: SDA to A4, SCL to A5
 * for Mega2560: SDA to 20, SCL to 21
 * for Leonardo: SDA to 2, SCL to 3
 * for Due: SDA to 20, SCL to 21
 * VCC to 5V
 * GND to GND :-)
 */


// this is the Width and Height of Display which is 128 x 32
#define LOGO16_GLCD_HEIGHT 32
#define LOGO16_GLCD_WIDTH  128 


#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

void setup()   {                
  Serial.begin(9600);

  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x32)
  display.display();
  delay(2000);
   // Clear the buffer.
  display.clearDisplay(); 
}


void loop() {
  String vString =  String(count, 3);// using a float and the 
  display.clearDisplay();
  robojaxText("Voltage:          ", 4, 3, 1, false);
  robojaxText(vString, 72, 3, 1, false);
  robojaxText("V", 110, 3, 1, false);
  robojaxText("Temperature: 32C", 4, 11, 1, false);
  robojaxText("Capacity:   92.86L", 4, 21, 1, false);
  //display.drawLine(1, 37, 100, 37, WHITE);
 display.drawRect(1, 1, 126,31, WHITE);
  //display.drawCircle(63,31, 31, WHITE);
   //display.startscrollright(0x00, 0x0F);
  display.display();
  count +=0.173;
   delay(2000); 
}


/*
 * robojaxText(String text, int x, int y,int size, boolean d)
 * text is the text string to be printed
 * x is the integer x position of text
 * y is the integer y position of text
 * size is the text size, 1, 2, 3 etc
 * d is either true or false.  If true, the display is updated.
 */
void robojaxText(String text, int x, int y,int size, boolean d) {

  display.setTextSize(size);
  display.setTextColor(WHITE);
  display.setCursor(x,y);
  display.println(text);
  if(d){
    display.display();
  }
  
  //delay(100);
}

必要かもしれないもの

リソースと参考文献

ファイル📁

ファイルは利用できません。