酒と薔薇の日々(その2)

好きなことだけ求めて生きるアスペ気味のINTJ人

Aliex OLED SSD1306 128*32)のテスト

2023年10月20日 14時50分18秒 | マイコン(ESP32・Arduino等)

先日到着した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();している
  底づきしたら新たな場所を生成しているようです。

 

この記事についてブログを書く
« Aliex シリアルLED(WS2812B... | トップ | OLED(SSD1306)+ DHT11で温... »