先日到着したAliExからのパッケージ中、OLEDをテスト 161円
0.91 inch OLED module 128*32 IIC通信版 青
ピンヘッダは最初からハンダ付けされていた。
I2C通信アドレスは「0x3C」だが「0x3D」に変更も可能(参考サイト2)
制御が「SSD1306」というチップで成されているようで、このドライバをAdafruitから入手する。
動作電源は3.3Vで通信も3.3Vベース
なので本来はレベル変換が必要らしいのだが、ネット記事では直結してる・・・
ちなみに「adafruit」は「エイダフルーツ」で、由来は計算機の始祖「Ada」さんだそうです。
ライブラリを「SSD1306」で検索
①Adafruitの名前を冠したものをインストール
関連するライブラリを入れるか聞いてくるので②「全てをインストール」する。
サンプルから「Adafruit SSD1306」「ssd1306_128x32_i2c」を選ぶ。
配線は3.3V,GND、SDAはA4ピン、SCK(SCL)はA5ピンへ。
(SCLとSCKは同じ意味でクロック線を意味する。)
前回の128*64のOLEDは表示がバッグっていたが、今回は無問題です。
あっさりと動いてる。
前回のアズリ方を考えると、なんか拍子抜け。
参考サイト(基本) 参考サイト2(文字表示詳細・ATOM例) 参考サイト3
本日朝からダルいし喉は痛いし、鼻血が出るし・・・ボラ休みます。
サンプル・ソースを読んでおまとめしてみた。
参考サイト2 display.drawFastHLine(x, y, 長さ, 色); で、水平垂直線が引けるそうです。
#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 32 // OLED display height, in pixels
// 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)
#define OLED_RESET -1 // 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() {
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { // デバイス確認
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
display.display();
display.clearDisplay();
display.drawPixel(10, 10, SSD1306_WHITE); // 画面バッファに点を打つ
display.display(); // 表示
testdrawchar(); // 標準フォントで文字表示
:
:
}
void loop() {
}
===========各サブルーチンから抜粋==============
// 文字描画(標準フォント)
display.setTextSize(1); // Normal 1:1 pixel scale
display.setTextColor(SSD1306_WHITE); // Draw white text
display.setCursor(0, 0); // Start at top-left corner
display.cp437(true); // Use full 256 char 'Code Page 437' font
// 全てのキャラクタ表示
for(int16_t i=0; i<256; i++) {
if(i == '\n') display.write(' ');
else display.write(i);
}
// 装飾文字表示
display.setTextSize(1); // Normal 1:1 pixel scale
display.setTextColor(SSD1306_WHITE); // Draw white text
display.setCursor(0,0); // Start at top-left corner
display.println(F("Hello, world!"));
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // 文字反転
display.println(3.141592);
display.setTextSize(2); // 2倍体
display.setTextColor(SSD1306_WHITE);
display.print(F("0x")); display.println(0xDEADBEEF, HEX);
// スクロール
display.setTextSize(2); // Draw 2X-scale text
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 0);
display.println(F("scroll"));
display.startscrollright(0x00, 0x0F); delay(2000);
display.stopscroll(); delay(1000);
display.startscrollleft(0x00, 0x0F); delay(2000);
display.stopscroll(); delay(1000);
display.startscrolldiagright(0x00, 0x07); delay(2000);
display.startscrolldiagleft(0x00, 0x07); delay(2000);
display.stopscroll(); delay(1000);
// 線を引く
display.drawLine(0, 0, i, display.height()-1, SSD1306_WHITE);
// display.width()
// 矩形(Fill)
display.drawRect(i, i, display.width()-2*i, display.height()-2*i, SSD1306_WHITE);
display.fillRect (i, i, display.width()-i*2, display.height()-i*2, SSD1306_INVERSE);
// 円(Fill)
display.drawCircle(display.width()/2, display.height()/2, i, SSD1306_WHITE);
display.fillCircle(display.width() / 2, display.height() / 2, i, SSD1306_INVERSE);
// 角丸矩形(Fill)
display.drawRoundRect(i, i, display.width()-2*i, display.height()-2*i,display.height()/4, SSD1306_WHITE);
display.fillRoundRect(i, i, display.width()-2*i, display.height()-2*i,display.height()/4, SSD1306_INVERSE);
// 三角形(Filll)
display.drawTriangle(
display.width()/2 , display.height()/2-i,
display.width()/2-i, display.height()/2+i,
display.width()/2+i, display.height()/2+i, SSD1306_WHITE);
display.fillTriangle(・・・);
// BitMap描画
#define LOGO_HEIGHT 16
#define LOGO_WIDTH 16
static const unsigned char PROGMEM logo_bmp[] =
{ 0b00000000, 0b11000000,
0b00000001, 0b11000000,
:
0b00000000, 0b00110000 };
------
display.clearDisplay();
display.drawBitmap(
(display.width() - LOGO_WIDTH ) / 2,
(display.height() - LOGO_HEIGHT) / 2,
logo_bmp, LOGO_WIDTH, LOGO_HEIGHT, 1);
display.display();
// bitmapアニメーション
icons[][]の二次元配列に位置情報を生成し、
icons[][]に沿ってdrowbitmapし、
1画面完成したらdisplay.display();している
底づきしたら新たな場所を生成しているようです。