Program Resource

開発者向け各種コード、アルゴリズム、リソース情報ライブラリ もしくはねふぁの覚え書き

以前から128×64や128×32ドット等のモノクロOLEDディスプレイが売られているが、最近さらに小型の64×32ドットのOLEDディスプレイも販売されている。

ただ、現時点ではAdafruitのSSD1306ライブラリはこの解像度に非対応の為対応しているライブラリを探すか、ライブラリを修正する必要がある。

今回はAdafruitのSSD1306ライブラリ(バージョン2.2.0)を修正した。

修正するのはAdafruit_SSD1306.cppのファイル2カ所。549行目と888行目あたりに64×32の処理を追加/修正する。888行目は置換しているので、このままだと他の解像度で動かなくなるので注意。

  if((WIDTH == 128) && (HEIGHT == 32)) {
    comPins = 0x02;
    contrast = 0x8F;
  } else if((WIDTH == 128) && (HEIGHT == 64)) {
    comPins = 0x12;
    contrast = (vccstate == SSD1306_EXTERNALVCC) ? 0x9F : 0xCF;
  } else if((WIDTH == 96) && (HEIGHT == 16)) {
    comPins = 0x2;    // ada x12
    contrast = (vccstate == SSD1306_EXTERNALVCC) ? 0x10 : 0xAF;
  } else if((WIDTH == 64) && (HEIGHT == 32)) {
    comPins = 0x12;
    contrast = (vccstate == SSD1306_EXTERNALVCC) ? 0x9F : 0xCF;
  } else {
    // Other screen varieties -- TBD
  }
void Adafruit_SSD1306::display(void) {
  TRANSACTION_START
/*  static const uint8_t PROGMEM dlist1[] = {
    SSD1306_PAGEADDR,
    0,                         // Page start address
    0xFF,                      // Page end (not really, but works here)
    SSD1306_COLUMNADDR,
    0 };                       // Column start address
  ssd1306_commandList(dlist1, sizeof(dlist1));
  ssd1306_command1(WIDTH - 1); // Column end address*/
  static const uint8_t PROGMEM dlist1[] = {
    SSD1306_PAGEADDR,
    0,                         // Page start address
    0xFF,                      // Page end (not really, but works here)
    SSD1306_COLUMNADDR,
    0x20 };                       // Column start address
  ssd1306_commandList(dlist1, sizeof(dlist1));
  ssd1306_command1(0x20 + (WIDTH - 1)); // Column end address

ライブラリ修正後、簡単なHello World表示のサンプルは以下の通り。

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

#define SCREEN_WIDTH 64 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

void setup() {
	Wire.begin();
	display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr

	display.clearDisplay();
	display.setTextSize(1);
	display.setTextColor(WHITE);
	display.setCursor(0, 5);
	display.print("Hello\n World");
	display.display();
}

void loop() {

}

修正したライブラリとスケッチのセットも準備したので参考に。

また、ESP8266で使える様ESP_Adafruit_SSD1306に手を加えたバージョンも作成したのでこちらも置いておく。

This post is also available in: 英語

コメントを残す

メールアドレスが公開されることはありません。


*

CAPTCHA