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

必要なハードウェア部品、配線手順、そしてすべてを稼働させるための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信号のノイズを減らすため、配線は短くしてください。
- 複数のモジュールに給電する場合は、放熱対策を検討してください。
配線手順

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()関数内で、描画の準備のためにディスプレイをクリアします。

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- 出力のデモンストレーション
/*********************************************************************
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);
}
必要かもしれないもの
-
アマゾンAmazonでOLED 128x32を購入してください。amzn.to
-
アリエクスプレスAliExpressからSSD1306 OLED 128x32を購入するs.click.aliexpress.com
リソースと参考文献
-
外部Adafruit-GFXライブラリ(GitHubから)github.com
-
外部SSD1306ライブラリ(GitHubから)github.com
ファイル📁
ファイルは利用できません。