OLED ディスプレイ SSD1306 (I2C) を使ってみる(Arduino)

今回は、OLED ディスプレイ SSD1306(I2C) を使った、
 ・スケッチ例のデモ表示
 ・気圧・温度センサモジュール(I2C接続)を接続して、
  気圧・温度の表示
をしてみます。

私の製品です。
 ・OLED ディスプレイ(青)
   0.96インチOLED I2C 青 128*64 SSD1306
   ¥174-

OLED ディスプレイ(青)
OLED ディスプレイ(青)

いつもの大陸調達品ですが、
国内通販サイトでも、検索してみました。
”OLED ディスプレイ SSD1306 通販”
などと検索すると、多くのサイトで販売されています。

 aitendo
 ★0.96インチ★OLEDモジュール★I2C★ [OLED096UNO-A]
   https://www.aitendo.com/product/18634
   ¥500-

この製品は、青、白、青/黄色 などの単色表示で、
通信方式は、 I2C(IIC)です。

I2C通信は、通信線が2本というシンプルさで、
ピン数が少ないマイコンなどではありがたいのですが、
通信速度は、SIP通信より低速です。

I2C通信概要図
I2C通信概要図
信号線の名称信号線内容
SDA共有シリアルデータ (Serial Data)
SCL共有シリアルクロック (Serial Clock)
SDA、SCL線は、プルアップの必要があります。
(プルアップする抵抗値は、接続機器に合わせて、
 数百Ω~数キロΩを使用することが多い)
- - - - - - I2C通信仕様外 - - - - - - -
VCC 電源(VCC)
GNDグランド(Ground)
I2C通信仕様

という配線になります。

回路は図の通りです。
   この回路図の作図には fritzing を利用させて頂いております。
   https://fritzing.org/home/

回路図1
回路図1
OLEDSSD1306側Arduino UNO側
SDAA4(SDA)
SCKA5(SCL)
VDD電源(5V)
GNDGND
接続端子

では、スケッチ例を実行してみます。

今回のOLED ディスプレイ SSD1306 の使用に必要な
ライブラリ群をインストールします。
 ・Adafruit-GFX-ライブラリ
 ・Adafruit_SSD1306 ライブラリ
の2つが必要になります。

ライブラリのインストール手順です。

 1.Adafruit-GFX-ライブラリのインストール
  メニュー「スケッチ」 → 「ライブラリインストール」
    → 「ライブラリ管理」 を選択します。

ライブラリのインストール選択
ライブラリのインストール 選択

  開いた、ライブラリマネジャ画面の検索欄に、
   ”Adafruit GFX”
  と入力し、
  表示された一覧から、
  ”Adafruit GFX Library” を選択し、
  バージョン選択から、最新バージョンを選択し、
  〔インストール〕ボタンをクリックします。

”Adafruit GFX Library” の選択
”Adafruit GFX Library” の選択

  インストール内容の選択画面が表示された場合は、
  〔Install all〕 をクリックします。

インストール内容の選択
インストール内容の選択

  インストールが完了したら、
  〔閉じる〕ボタンをクリックします。

インストール完了
インストール完了

  ※GitHub の Adafruit-GFX-ライブラリ ページから、
   https://github.com/adafruit/Adafruit-GFX-Library
   ダウンロードして、

ライブラリのダウンロードページ
ライブラリのダウンロードページ

   メニュー「スケッチ」 → 「ライブラリインストール」
     → 「.ZIP形式のライブラリインストール…」 を選択して、
   インストールすることも可能です。 

Zip型式ライブラリのインストール選択
Zip型式ライブラリのインストール 選択

 2.Adafruit_SSD1306 ライブラリのインストール
  メニュー「スケッチ」 → 「ライブラリインストール」
    → 「ライブラリ管理」 を選択します。

ライブラリのインストール選択
ライブラリのインストール選択

  開いた、ライブラリマネジャ画面の検索欄に、
   ”Adafruit SSD1306”
  と入力し、
  表示された一覧から、
  ”Adafruit SSD1306” を選択し、
  バージョン選択から、最新バージョンを選択し、
  〔インストール〕ボタンをクリックします。

”Adafruit SSD1306” の選択
”Adafruit SSD1306” の選択

  ※インストール内容の選択画面が表示された場合は、
   〔Install all〕 をクリックします。

  インストールが完了したら、
  〔閉じる〕ボタンをクリックします。

インストール完了
インストール完了

  ※GitHub の Adafruit_SSD1306 ライブラリ ページから、
   https://github.com/adafruit/Adafruit_SSD1306
   ダウンロードして、

ライブラリのダウンロードページ
ライブラリのダウンロードページ

  メニュー「スケッチ」 → 「ライブラリインストール」
    → 「.ZIP形式のライブラリインストール…」 を選択して、
  インストールすることも可能です。 

 Zip型式ライブラリのインストール 選択
Zip型式ライブラリのインストール 選択

これで、ライブラリのインストールは完了です。

では、サンプル例の
”ssd1306_128x64_i2c” スケッチを実行してみます。

 1.Arduino UNO と PC を接続し、
  ボード、シリアルポートを選択(設定)します。
  メニュー「ツール」
    → 「ボード:xxxxx」 または、→ 「シリアルポート:xxxxx」 

ボード、シリアルポートの選択
ボード、シリアルポートの選択

 2.”ssd1306_128x64_i2” を開きます。
  メニュー「ファイル」 → 「スケッチ例」
    → 「Adafruit SSD1306」 → 「ssd1306_128x64_i2c」 を選択します。

スケッチ例の選択
スケッチ例の選択

 3.スケッチの修正を行います。
   OLED ディスプレイ SSD1306 のアドレスを
    #define SCREEN_ADDRESS 0x3D
           ↓
    #define SCREEN_ADDRESS 0x3C
  に変更します。

 4.アイコンメニュー「検証」をクリックし、検証します。

検証
検証

 5.アイコンメニュー「マイコンボードに書き込む」をクリックし、
  マイコンボードに書き込み、実行します。

マイコンボードへ書き込み
マイコンボードへ書き込み

OLED ディスプレイ SSD1306 に、
文字やグラフィックがデモ表示されます。
このスケッチは、
各図形描画や文字表示関数を、
void setup(void) 関数から呼び出されるかたちで
記述されていますので分かりやすいと思います。

実行結果表示
実行結果表示

続いて、このArduino UNOに、気圧センサモジュールを
接続し、この気圧、温度を、
OLED ディスプレイ SSD1306 に表示させてみます。

回路は図の通りです。

回路図2
回路図2

※使用する気圧センサモジュールは、
 ”気圧センサモジュールを使ってみる Arduino”
 で使用した、気圧センサモジュール BMP180です。

気圧センサモジュール BMP180
気圧センサモジュール BMP180

 この気圧センサモジュールは、I2C接続なので、
 OLED ディスプレイ SSD1306 と 同じ I2C 回路に
 接続して使用してみます。
 このセンサは、3.3V仕様なので、
 3.3V端子から電源を供給して使用します。

スケッチは、
サンプル例の ”ssd1306_128x64_i2c” スケッチに、
気圧センサモジュール BMP180関連の記述を
追加することにします。

このスケッチでは、
気圧センサモジュール BMP180 用に、
 ・Adafruit BMP085 Library
のライブラリのインストールが必要です。

インストールは、
 ”気圧センサモジュールを使ってみる” ページ https://shinog.jp/computer/arduino/%e6%b0%97%e5%9c%a7%e3%82%bb%e3%83%b3%e3%82%b5%e3%83%a2%e3%82%b8%e3%83%a5%e3%83%bc%e3%83%ab%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%8b/
に記載しています。

追加スケッチは、
 1.グローバル領域に、インクルード宣言とオブジェクト生成
 2.void setup(void) 関数に、センサの初期化と
  花びら表示のループ停止
 3.void loop() 関数に、気圧・温度の取得と表示
の3点について追加、修正します。

1.の部分
 (グローバル領域に、インクルード宣言、変数宣言、オブジェクト生成)

// インクルード宣言
#include <Adafruit_BMP085.h>  // 気圧センサ用
// 変数宣言
double t_data;   // 温度情報用
double d_data;   // 気圧情報用
// オブジェクト生成
Adafruit_BMP085 a_bmp;

2.の部分
 void setup(void) 関数に、センサの初期化と花びら表示のループ停止

void setup() {
  // 気圧センサ起動
  if ( !a_bmp.begin() ) {
    Serial.println( "センサ起動エラー" );
    while(1);    // エラー時の強制ループ
  }

  // 花びら表示関数の呼び出し停止
  // testanimate(logo_bmp, LOGO_WIDTH, LOGO_HEIGHT); // Animate bitmaps
}

3.の部分
 void loop() 関数に、気圧・温度の取得と表示

void loop() {
  // 温度情報取得
  t_data = a_bmp.readTemperature();
 
  // 気圧情報取得
  d_data= (double)a_bmp.readPressure()/100;

  // OLED ディスプレイ SSD1306へ表示
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println( t_data );
  display.println( d_data );
  display.display();

  // 2000ms待機
  delay( 2000 );
}

スケッチの追加修正部分( 1, 2, 3の部分 )の抜粋です。

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

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// インクルード宣言
#include <Adafruit_BMP085.h>  // 気圧センサ用

// 変数宣言
double t_data;   // 温度情報用
double d_data;   // 気圧情報用

// オブジェクト生成
Adafruit_BMP085 a_bmp;

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// The pins for I2C are defined by the Wire-library. 
// On an arduino UNO:       A4(SDA), A5(SCL)
// On an arduino MEGA 2560: 20(SDA), 21(SCL)
// On an arduino LEONARDO:   2(SDA),  3(SCL), ...
define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
// 機器アドレス設定
define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

 ~ 略 ~

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

 // 気圧センサ起動
  if ( !a_bmp.begin() ) {
    Serial.println( "センサ起動エラー" );
    while(1);    // エラー時の強制ループ
  }

  //  SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

   ~ 略 ~

  // Invert and restore display, pausing in-between
  display.invertDisplay(true);
  delay(1000);
  display.invertDisplay(false);
  delay(1000);

  // 花びら表示関数の呼び出し停止
  //  testanimate(logo_bmp, LOGO_WIDTH, LOGO_HEIGHT); // Animate bitmaps
}

void loop() {
  // 温度情報取得
  t_data = a_bmp.readTemperature();
 
  // 気圧情報取得
  d_data= (double)a_bmp.readPressure()/100;

  // OLED ディスプレイ SSD1306へ表示
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println( t_data );
  display.println( d_data );
  display.display();

  // 2000ms待機
  delay( 2000 );
}

 ~ 略 ~

アイコンメニュー「検証」をクリックし、検証します。

検証
検証

アイコンメニュー「マイコンボードに書き込む」をクリックし、
マイコンボードに書き込み、実行します。

 マイコンボードへ書き込み
マイコンボードへ書き込み

OLED ディスプレイ SSD13069 に、
文字やグラフィックがデモ表示された後、
気圧と温度が表示されます。

実行結果表示
実行結果表示

デモが必要ない場合、
void setup(void) 関数内の、
各デモ関数の呼び出しを停止(コメントアウト)します。