ArduinoでOLEDディスプレイを試す

# この記事について

ebayで購入したOLEDディスプレイをArduinoで使用する手順です。

スケッチを作成するためのライブラリは「[Adafruit SSD1306](https://github.com/adafruit/Adafruit_SSD1306)」と「[Adafruit GFX Library](https://github.com/adafruit/Adafruit-GFX-Library)」を使用します。

※「Adafruit SSD1306」は解像度が異なる種々のディスプレイに対応するためにヘッダーファイルを直接編集するのが[公式の手順](https://learn.adafruit.com/monochrome-oled-breakouts/arduino-library-and-examples)なのですが、次のissueでスケッチ側で制御できるような仕様変更がコメントで提案されています。ヘッダーファイルを直接編集する今の手順は、あとで古い手順になる可能性があるので注意してください。

- [undefine SSD1306_128_32 · Issue #57 · adafruit/Adafruit_SSD1306](https://github.com/adafruit/Adafruit_SSD1306/issues/57#issuecomment-237809621)

# 購入したOLEDディスプレイについて

![IMG_1654.jpg](https://qiita-image-store.s3.amazonaws.com/0/118889/abde8c29-e774-6208-8bd0-634bb82642e9.jpeg)

Adafruitの[この商品](https://www.adafruit.com/products/938)の互換品です。

主な仕様は次のようになっています。

- I2C通信
- ディスプレイコントローラ: SSD1306
- 解像度: 128x64
- 電圧: 3.3V-5V

半年くらい前に購入して放置していたら、購入先が消えていました…。
同商品を販売している業者が大量にあるため、販売実績の多い（安全に思える）商品ページを載せておきます。

- [0.96&quot; I2C IIC SPI Serial 128X64 White OLED LCD LED Display Module for Arduino | eBay](http://www.ebay.com/itm/0-96-I2C-IIC-SPI-Serial-128X64-White-OLED-LCD-LED-Display-Module-for-Arduino-/201428440360?hash=item2ee6121528:g:MOYAAOSwv0tVeD0N)
- [Durable Good 0.96&quot; I2C IIC 128X64 OLED LCD LED Display Module For Arduino | eBay](http://www.ebay.com/itm/Durable-Good-0-96-I2C-IIC-128X64-OLED-LCD-LED-Display-Module-For-Arduino-/390915588511?hash=item5b0462819f:g:zL4AAOSw9VZXO~4N)

# 動作確認環境

- Arduino IDE: バージョン 16.12
- Arduino本体: Arduino UNO R3
- ライブラリ
    - Adafruit SSD1306: バージョン 1.1.0
    - Adafruit GFX-Library: バージョン 1.1.5

# 使用するもの

- SSD1306 OLEDディスプレイ
- Arduino
    - この記事ではArduino UNO R3を使用した
    - ほかのArduinoを使用する場合は[ここ(英語)](https://github.com/adafruit/Adafruit_SSD1306/blob/master/README.md)を参考にする
- ブレッドボード
- ジャンパ線(オス-オス)x4

ほかのArduinoを使用する場合は、[Adafruit_SSD1306の互換性の表(英語)](https://github.com/adafruit/Adafruit_SSD1306/blob/master/README.md)を参考にするといいです。

# I2Cアドレスの確認

![I2Cアドレスの表記.JPG](https://qiita-image-store.s3.amazonaws.com/0/118889/4316f254-5661-0c4c-d056-1fba47325809.jpeg)

OLEDディスプレイを背面を見て、I2Cアドレスを確認します。
上の写真のように、0x78に側に接続されているか、0x7A側に接続されているかでI2Cアドレスが次のように異なります。

| 接続先               | I2Cアドレス |
|---------------------|------------|
| 0x78側に接続されている | 0x3C       |
| 0x7A側に接続されている | 0x3A       |

このアドレスによって、この記事の「ライブラリのヘッダーファイルを編集」と「スケッチ例の動作確認」で記述する値が異なります。

# 配線

OLEDディスプレイの正面側にピン名が表記されています。左から、GND、VCC、SCL、SDAです。

Arduino Uno R3の場合、次のように接続します。

| Arduino Uno R3 | OLEDディスプレイ |
|----------------|----------------|
| GND            | GND            |
| 5V             | VCC            |
| SCL            | SCL            |
| SDA            | SDA            |

![配線.JPG](https://qiita-image-store.s3.amazonaws.com/0/118889/da36141a-a23b-72e6-5b30-3c5ff21c88f1.jpeg)

ほかのArduinoを使用する場合、次のようなWebサイトを参考に、Wireライブラリのスケッチ上の定数`SDA`、`SCL`に対応する番号のピンに接続してください。

- [Arduino - Wire](https://www.arduino.cc/en/Reference/Wire)

# ライブラリの準備

<img width="686" alt="IDEのメニュー" src="https://qiita-image-store.s3.amazonaws.com/0/118889/52e58340-66ef-a9fa-5c77-e7b04918ecc9.png">

IDEのメニュー「スケッチ > ライブラリをインクルード > ライブラリを管理…」からインストールします。スクリーンショットはMac OS Xです。

## Adafruit_SSD1306のインストール

<img width="797" alt="Adafruit SSD1306のインストール" src="https://qiita-image-store.s3.amazonaws.com/0/118889/677087d4-ee3b-1718-e941-8f0e093de9de.png">

「ssd1306」で検索すると、「Adafruit SSD1306 by Adafruit」というライブラリがヒットします。項目をクリックして、インストールしてください。

## Adafruit-GFX-Libraryのインストール

<img width="793" alt="Adafruit GFX Libraryのインストール" src="https://qiita-image-store.s3.amazonaws.com/0/118889/bbb48d2a-2ba6-acaf-0b9e-85a116abc757.png">

「gfx」で検索すると、「Adafruit GFX Library by Adafruit」というライブラリがヒットします。項目をクリックして、インストールしてください。

## ライブラリのヘッダーファイルを編集

ライブラリ「Adafruit SSD1306」に含まれている`Adafruit_SSD1306.h`ファイルを編集します。

50行目当たりが次のようになっていることを確認します。

```cpp
#define SSD1306_I2C_ADDRESS   0x3D  // 011110+SA0+RW - 0x3C or 0x3D
```

使用するOLEDディスプレイのI2Cアドレスに合わせて、次のように変更します。

**I2Cアドレスが0x3Cの場合:**

```cpp
#define SSD1306_I2C_ADDRESS   0x3C  // 011110+SA0+RW - 0x3C or 0x3D
```

**I2Cアドレスが0x3Dの場合:**

```cpp
#define SSD1306_I2C_ADDRESS   0x3D  // 011110+SA0+RW - 0x3C or 0x3D
```

70行目あたりが次のような内容になっていることを確認します。

```cpp
//   #define SSD1306_128_64
   #define SSD1306_128_32
//   #define SSD1306_96_16
```

使用するディスプレイの解像度が128x64なので、次のように編集します。

```cpp
   #define SSD1306_128_64
//   #define SSD1306_128_32
//   #define SSD1306_96_16
```

# スケッチ例の動作確認

<img width="599" alt="スケッチ例.png" src="https://qiita-image-store.s3.amazonaws.com/0/118889/865cd423-ac74-9144-f1ab-ee26d8af1947.png">

ライブラリ「Adafruit SSD1306」のスケッチ例「ssd1306_128x64_i2c」を開きます。

60行目あたりが次のようになっていることを確認します。

```cpp
  display.begin(SSD1306_SWITCHCAPVCC, 0x3D);  // initialize with the I2C addr 0x3D (for the 128x64)
```

使用するOLEDディスプレイのI2Cアドレスに合わせて、次のように変更します。

**I2Cアドレスが0x3Cの場合:**

```cpp
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64)
```

**I2Cアドレスが0x3Dの場合:**

```cpp
  display.begin(SSD1306_SWITCHCAPVCC, 0x3D);  // initialize with the I2C addr 0x3D (for the 128x64)
```

スケッチを書き込み、次のようなロゴが表示されたあとでアニメーションが開始されれば、正常に動作しています。

![スケッチ例の実行結果.JPG](https://qiita-image-store.s3.amazonaws.com/0/118889/c8989921-85f8-983f-207d-7d6f47c17bbf.jpeg)

単純に線を書いたり、テキストを表示したい場合は、次の記事を参考にしてください。

- [ArduinoでOLEDディスプレイに色々表示する - Qiita](http://qiita.com/jakalada/items/793a6cf5ff2796db4e86)

# 参考

- [Arduino Library &amp; Examples | Monochrome OLED Breakouts | Adafruit Learning System](https://learn.adafruit.com/monochrome-oled-breakouts/arduino-library-and-examples)
- [I2C 128×64 OLEDディスプレイをArduinoで使う | Program Resource](http://programresource.net/2015/05/09/2616.html)
- [ESP8266 単体で I2C OLED を動かす | macsbug](https://macsbug.wordpress.com/2015/10/19/esp8266-%E3%81%A7-oled-%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99/)
- [541円の128x64 I2C有機EL液晶 - Qiita](http://qiita.com/hotchpotch/items/d540a7d1e1e21d4859b6)