[回転]Arduino UNOとSSD1306にアイテムを表示する(drawBitmap)


参考

https://qiita.com/caa45040/items/444a05da951b44b5a471


x 過去ログをみよ

x Adafruit SSD1306 を　インストール
x Adafruit GFX Library を　インストール

x 回路は、Arduinoと同じ

目的
OLEDのテスト

SCL , SCL
SDA , SDA

あいてんどう

★0.96インチ★OLEDモジュール★I2C★ [OLED096UNO-A]


結果


![o_coq298.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/03efac19-c0cf-6f5c-ad77-378247d248d8.jpeg)

![o_coq299.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5fd02f15-4841-bc12-3570-3b8ad33e938c.jpeg)


![o_coq300.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f074ac5d-5760-52ff-6eba-3d222fea12ec.jpeg)

![o_coq301.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e77184f0-582c-745c-85fc-52f050d26e6f.jpeg)


プログラム


```c++


//OLED_SSD1306_BITMAP_KAITEN_PP1_UNO_1


//ヘッダーファイル
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>


//定義
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#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);


// ビットマップデータ
uint8_t databytes[8] =

{

  0b01100110,
  0b10101111,
  0b10111111,
  0b11011111,

  0b01111110,
  0b01111110,
  0b00111100,
  0b00011000

};


//ビット逆転
int BitReverse(int x) {
  x = (x >> 4) | ( (x & 0x0f) << 4 );
  x = ((x & 0b11001100) >> 2) | ( (x & 0b00110011) << 2 );
  x = ((x & 0b10101010) >> 1) | ( (x & 0b01010101) << 1 );
  return (x);
}


void drawBitmap_8x8_kaiten(int x, int y, unsigned char databytes[], int kaiten) {

  unsigned char databytes_a[8] = {0, 0, 0, 0, 0, 0, 0, 0};

  int a; //一時ワーク
  int a_mask; //マスク

  if (kaiten == 0 || kaiten == 4 ) { //0

    //そのまま
    databytes_a[0] = databytes[0];
    databytes_a[1] = databytes[1];
    databytes_a[2] = databytes[2];
    databytes_a[3] = databytes[3];

    databytes_a[4] = databytes[4];
    databytes_a[5] = databytes[5];
    databytes_a[6] = databytes[6];
    databytes_a[7] = databytes[7];

  } else if (kaiten == 1 ) { //90

    for (int ii = 0; ii < 8; ii++) {
      //         12345678
      a_mask = 0b00000001  << ii;
      a = databytes[ii] << ii;

      databytes_a[7] = databytes_a[7] | (a_mask & a); a = a >> 1;
      databytes_a[6] = databytes_a[6] | (a_mask & a); a = a >> 1;
      databytes_a[5] = databytes_a[5] | (a_mask & a); a = a >> 1;
      databytes_a[4] = databytes_a[4] | (a_mask & a); a = a >> 1;

      databytes_a[3] = databytes_a[3] | (a_mask & a); a = a >> 1;
      databytes_a[2] = databytes_a[2] | (a_mask & a); a = a >> 1;
      databytes_a[1] = databytes_a[1] | (a_mask & a); a = a >> 1;
      databytes_a[0] = databytes_a[0] | (a_mask & a);
    }

  } else if (kaiten == 2 ) { //180

    //180度回転処理
    databytes_a[0] = BitReverse(databytes[7]);
    databytes_a[1] = BitReverse(databytes[6]);
    databytes_a[2] = BitReverse(databytes[5]);
    databytes_a[3] = BitReverse(databytes[4]);

    databytes_a[4] = BitReverse(databytes[3]);
    databytes_a[5] = BitReverse(databytes[2]);
    databytes_a[6] = BitReverse(databytes[1]);
    databytes_a[7] = BitReverse(databytes[0]);


  } else if (kaiten == 3 ) { //270

    for (int ii = 0; ii < 8; ii++) {
      //         12345678
      a_mask = 0b10000000;
      a = databytes[ii];// << ii;

      databytes_a[7] = databytes_a[7] | ((a_mask & a) >> ii); a = a << 1;
      databytes_a[6] = databytes_a[6] | ((a_mask & a) >> ii); a = a << 1;
      databytes_a[5] = databytes_a[5] | ((a_mask & a) >> ii); a = a << 1;
      databytes_a[4] = databytes_a[4] | ((a_mask & a) >> ii); a = a << 1;

      databytes_a[3] = databytes_a[3] | ((a_mask & a) >> ii); a = a << 1;
      databytes_a[2] = databytes_a[2] | ((a_mask & a) >> ii); a = a << 1;
      databytes_a[1] = databytes_a[1] | ((a_mask & a) >> ii); a = a << 1;
      databytes_a[0] = databytes_a[0] | ((a_mask & a) >> ii);
    }
  } else if (kaiten == 5 ) { //左右
    //左右反転処理
    databytes_a[0] = BitReverse(databytes[0]);
    databytes_a[1] = BitReverse(databytes[1]);
    databytes_a[2] = BitReverse(databytes[2]);
    databytes_a[3] = BitReverse(databytes[3]);

    databytes_a[4] = BitReverse(databytes[4]);
    databytes_a[5] = BitReverse(databytes[5]);
    databytes_a[6] = BitReverse(databytes[6]);
    databytes_a[7] = BitReverse(databytes[7]);
  } else if (kaiten == 6 ) { //上下
    //上下逆転処理
    databytes_a[0] = databytes[7];
    databytes_a[1] = databytes[6];
    databytes_a[2] = databytes[5];
    databytes_a[3] = databytes[4];

    databytes_a[4] = databytes[3];
    databytes_a[5] = databytes[2];
    databytes_a[6] = databytes[1];
    databytes_a[7] = databytes[0];
  }//endif

  //ビットマップの表示
  display.drawBitmap(x, y, databytes_a, 8, 8,  WHITE);

}//drawBitmap_8x8_kaiten


//初期化
void setup() {

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

}//setup


int i_kaiten = 0;

//メインループ
void loop() {

  // 画面表示をクリア
  display.fillScreen(BLACK);

  //ビットマップの表示
  //display.drawBitmap(0, 0, databytes, 8, 8,  WHITE);

  //ビットマップの回転表示
  //(0は、0)(1は、90)(2は、180)(3は、270)(4は、0)(5は、左右)(6は、上下)
  drawBitmap_8x8_kaiten(0, 0, databytes, i_kaiten);
  //display.display();while(1){}//debug
  i_kaiten++;
  if (i_kaiten == (3 + 1)) {
    i_kaiten = 0;
  }

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

  delay(1000); //1秒待つ

}//loop



```