ArduinoでOLEDディスプレイに色々表示する

# この記事について

ebayで購入したOLEDディスプレイにArduinoを使用して色々表示するスケッチを記載します。

使用するディスプレイやライブラリの詳細は次の記事を参考にしてください。

- [ArduinoでOLEDディスプレイを試す - Qiita](http://qiita.com/jakalada/items/8f83d07291d984a31633)

# テキストを描画

![DrawText.JPG](https://qiita-image-store.s3.amazonaws.com/0/118889/c66aaf32-ed50-56fd-e2e4-93781e0411d1.jpeg)

```cpp:DrawText.ino
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// コンパイル時にヘッダーファイルが適切に編集されていない場合に
// "Height incorrect, please fix Adafruit_SSD1306.h!"
// というエラーを表示するための記述
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

// RSTピンがない互換品を使用するので-1を指定
Adafruit_SSD1306 display(-1);

void setup() {
  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
}

void loop() {
  // 画面表示をクリア
  display.clearDisplay();

  // テキストサイズを設定
  display.setTextSize(3);
  // テキスト色を設定
  display.setTextColor(WHITE);
  // テキストの開始位置を設定
  display.setCursor(0, 10);

  // 1行目に"Hello"を表示
  display.println("Hello");
  // 2行目に"World!"を表示
  display.println("World!");

  // 描画バッファの内容を画面に表示
  display.display();

  delay(1000);
}
```

# 点を描画

![DrawPixel.JPG](https://qiita-image-store.s3.amazonaws.com/0/118889/0d7218e2-03eb-6737-5ff9-ec08773b1ebf.jpeg)

```cpp:DrawPixel.ino
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// コンパイル時にヘッダーファイルが適切に編集されていない場合に
// "Height incorrect, please fix Adafruit_SSD1306.h!"
// というエラーを表示するための記述
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

// RSTピンがない互換品を使用するので-1を指定
Adafruit_SSD1306 display(-1);

void setup() {
  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
}

void loop() {
  // 画面表示をクリア
  display.clearDisplay();

  // 画面の左上に点を描画
  // display.drawPixel(座標x, 座標y, 点の色);
  display.drawPixel(10, 10, WHITE);

  // 画面の右上に点を描画
  // display.drawPixel(座標x, 座標y, 点の色);
  display.drawPixel(117, 10, WHITE);

  // 画面の右下に点を描画
  // display.drawPixel(座標x, 座標y, 点の色);
  display.drawPixel(117, 53, WHITE);

  // 画面の左下に点を描画
  // display.drawPixel(座標x, 座標y, 点の色);
  display.drawPixel(10, 53, WHITE);

  // 描画バッファの内容を画面に表示
  display.display();

  delay(1000);
}
```

# 線を描画

![DrawLine.JPG](https://qiita-image-store.s3.amazonaws.com/0/118889/8ed25de5-8c82-622c-e8ba-59868cd4bb2f.jpeg)

```cpp:DrawLine.ino
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// コンパイル時にヘッダーファイルが適切に編集されていない場合に
// "Height incorrect, please fix Adafruit_SSD1306.h!"
// というエラーを表示するための記述
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

// RSTピンがない互換品を使用するので-1を指定
Adafruit_SSD1306 display(-1);

void setup() {
  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
}

void loop() {
  // 画面表示をクリア
  display.clearDisplay();

  // 画面の左上から右下に線を描画
  // display.drawLine(始点x, 始点y, 終点x, 終点y, 線の色);
  display.drawLine(0, 0, 127, 63, WHITE);

  // 画面の右上から左下に線を描画
  // display.drawLine(始点x, 始点y, 終点x, 終点y, 線の色);
  display.drawLine(127, 0, 0, 63, WHITE);

  // 描画バッファの内容を画面に表示
  display.display();

  delay(1000);
}
```

# 長方形を描画

![DrawRect.JPG](https://qiita-image-store.s3.amazonaws.com/0/118889/6785eb72-3f1e-f995-69aa-7b98b4f6ecd0.jpeg)

```cpp:DrawRect.ino
```

# 角丸の長方形を描画

![DrawRoundRect.JPG](https://qiita-image-store.s3.amazonaws.com/0/118889/ea429f45-1372-cb80-97e5-0479aee5f350.jpeg)

```cpp:DrawRoundRect.ino
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// コンパイル時にヘッダーファイルが適切に編集されていない場合に
// "Height incorrect, please fix Adafruit_SSD1306.h!"
// というエラーを表示するための記述
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

// RSTピンがない互換品を使用するので-1を指定
Adafruit_SSD1306 display(-1);

void setup() {
  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
}

void loop() {
  // 画面表示をクリア
  display.clearDisplay();

  // 画面の左側に長方形(塗りつぶしなし)を描画
  // display.drawRect(左上x, 左上y, 幅, 高さ, 線の色)
  display.drawRect(10, 10, 44, 44, WHITE);

  // 画面の右側に長方形(塗りつぶしあり)を描画
  // display.fillRect(左上x, 左上y, 幅, 高さ, 線の色)
  display.fillRect(74, 10, 44, 44, WHITE);

  // 描画バッファの内容を画面に表示
  display.display();

  delay(1000);
}
```

# 円を描画

![DrawCircle.JPG](https://qiita-image-store.s3.amazonaws.com/0/118889/348efc94-42b9-e104-227e-c353bed68b62.jpeg)

```cpp:DrawCircle.ino
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// コンパイル時にヘッダーファイルが適切に編集されていない場合に
// "Height incorrect, please fix Adafruit_SSD1306.h!"
// というエラーを表示するための記述
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

// RSTピンがない互換品を使用するので-1を指定
Adafruit_SSD1306 display(-1);

void setup() {
  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
}

void loop() {
  // 画面表示をクリア
  display.clearDisplay();

  // 画面の左側に円(塗りつぶしなし)を描画
  // display.drawCircle(円の中心x, 円の中心y, 円の半径, 線の色)
  display.drawCircle(32, 32, 30, WHITE);

  // 画面の右側に円(塗りつぶしあり)を描画
  // display.fillCircle(円の中心x, 円の中心y, 円の半径, 線の色)
  display.fillCircle(96, 32, 30, WHITE);

  // 描画バッファの内容を画面に表示
  display.display();

  delay(1000);
}
```

# 三角形を描画

![DrawTriangle.JPG](https://qiita-image-store.s3.amazonaws.com/0/118889/68b4ab93-5fa0-075d-0d99-6b9e8a7019df.jpeg)

```cpp:DrawTriangle.ino
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// コンパイル時にヘッダーファイルが適切に編集されていない場合に
// "Height incorrect, please fix Adafruit_SSD1306.h!"
// というエラーを表示するための記述
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

// RSTピンがない互換品を使用するので-1を指定
Adafruit_SSD1306 display(-1);

void setup() {
  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
}

void loop() {
  // 画面表示をクリア
  display.clearDisplay();

  // 画面の左側に三角形(塗りつぶしなし)を描画
  // display.drawTriangle(x0, y0, x1, y1, x2, y2, 線の色)
  display.drawTriangle(32, 25, 57, 50, 7, 50, WHITE);

  // 画面の右側に三角形(塗りつぶしあり)を描画
  // display.fillTriangle(x0, y0, x1, y1, x2, y2, 線の色)
  display.fillTriangle(96, 25, 121, 50, 71, 50, WHITE);

  // 描画バッファの内容を画面に表示
  display.display();

  delay(1000);
}
```

# 描画を反転

![InvertDisplay1.JPG](https://qiita-image-store.s3.amazonaws.com/0/118889/3a18ed30-53de-d363-e961-936f0146dbdd.jpeg)

![InvertDisplay2.JPG](https://qiita-image-store.s3.amazonaws.com/0/118889/2950ee61-f432-a097-082e-97d564cb0dd8.jpeg)

```cpp:InvertDisplay.ino
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// コンパイル時にヘッダーファイルが適切に編集されていない場合に
// "Height incorrect, please fix Adafruit_SSD1306.h!"
// というエラーを表示するための記述
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

// RSTピンがない互換品を使用するので-1を指定
Adafruit_SSD1306 display(-1);

void setup() {
  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
}

void loop() {
  // 画面表示をクリア
  display.clearDisplay();

  // 画面の中心に長方形(塗りつぶしあり)を描画
  display.fillRect(10, 10, 108, 44, WHITE);
  
  // 1秒間隔で画面全体を点滅させる
  for (int i = 0; i < 10; i++) {
    // 描画バッファを反転
    if (i % 2 == 0) {
       display.invertDisplay(true);
    } else {
       display.invertDisplay(false);
    }

    // 描画バッファの内容を画面に表示
    display.display();
    delay(1000);
  }

  delay(1000);
}
```

# 参考

- [Adafruit_SSD1306/ssd1306_128x64_i2c.ino at master · adafruit/Adafruit_SSD1306](https://github.com/adafruit/Adafruit_SSD1306/blob/master/examples/ssd1306_128x64_i2c/ssd1306_128x64_i2c.ino)