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

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 4

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  //  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  delay(50);
  display.invertDisplay(false);
}

const char _evobar[8] = {0X01, 0X03, 0X07, 0X0F, 0X1F, 0X3F, 0X7F, 0XFF,};

void loop() {
  evoBar() ;
}

void evoBar() {
  char temp[48];
  for (int j = 0; j < 8; j++) {
    for (int i = 0; i < 48; i++) {
      temp[i] = _evobar[j];
    }
    ssd1306_writeBuffer(48, 40, 0, temp);
    delayAndClear(100);
  }
   for (int j = 0; j < 8; j++) {
    for (int i = 0; i < 48; i++) {
      temp[i] = 0XFF-_evobar[j];
    }
    ssd1306_writeBuffer(48, 40, 0, temp);
    delayAndClear(50);
  } 
}

/* Functions */

void delayAndClear(int x) {
  display.display();
  delay(x);
  display.clearDisplay();
}

void ssd1306_writeBuffer(int size, int x, int y, uint8_t inarr[]) { // 比例, x座標, y座標*8, 暫存區陣列名稱
  char BufferX = size;
  int BufferAdd;
  int tempX = x;
  tempX = (x < -48) ? -48 : x;
  tempX = (tempX > 128) ? 128 : tempX;
  for (int i = 0; i < (BufferX / 8); i++) {
    for (int j = 0; j < BufferX; j++) {
      BufferAdd = j + i * 128 + tempX + y * 128;
      if ((tempX == -48) || tempX == 128) {
      }
      else if (BufferAdd < 0) {
      }
      else if (tempX < 0) {
        if ((j + i * 128 + x + y * 128) % 128 < 63) {
          display.getBuffer()[BufferAdd] = inarr[i * BufferX + j];
        }
      }
      else if (tempX > 79) {
        if ((j + i * 128 + x + y * 128) % 128 >= 63) {
          display.getBuffer()[BufferAdd] = inarr[i * BufferX + j];
        }
      }
      else {
        display.getBuffer()[BufferAdd] = inarr[i * BufferX + j];
      }
    }
  }
}
nano:12
nano:11
nano:10
nano:9
nano:8
nano:7
nano:6
nano:5
nano:4
nano:3
nano:2
nano:GND.2
nano:RESET.2
nano:0
nano:1
nano:13
nano:3.3V
nano:AREF
nano:A0
nano:A1
nano:A2
nano:A3
nano:A4
nano:A5
nano:A6
nano:A7
nano:5V
nano:RESET
nano:GND.1
nano:VIN
nano:12.2
nano:5V.2
nano:13.2
nano:11.2
nano:RESET.3
nano:GND.3
oled1:GND
oled1:VCC
oled1:SCL
oled1:SDA