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

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C

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

void setup() {
  Serial.begin(9600);

  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;)
      ;
  }

  display.clearDisplay();
}

void displayMessage(const char *message, int textSize = 1, int delayTime = 2000) {
  display.setTextSize(textSize);
  display.setTextColor(WHITE);
  display.setCursor(0, 28);
  display.println(message);
  display.display();
  delay(delayTime);
  display.clearDisplay();
}

void displayNumber(long number, int textSize = 1, int delayTime = 2000) {
  display.setTextSize(textSize);
  display.setCursor(0, 28);
  display.println(number);
  display.display();
  delay(delayTime);
  display.clearDisplay();
}

void displayHexDecimal(byte value, int delayTime = 2000) {
  display.setCursor(0, 28);
  display.print("0x");
  display.print(value, HEX);
  display.print("(HEX) = ");
  display.print(value, DEC);
  display.println("(DEC)");
  display.display();
  delay(delayTime);
  display.clearDisplay();
}

void displayScroll(const char *message, int scrollDelay = 2000) {
  display.setCursor(0, 0);
  display.setTextSize(1);
  display.println(message);
  display.display();
  display.startscrollright(0x00, 0x00);
  delay(scrollDelay);
  display.stopscroll();
  delay(1000);
}

void loop() {
  displayMessage("Hello world!");
  displayMessage("Hello world!", 2);
  displayNumber(123456789);
  displayHexDecimal(0xFF);
  displayMessage("Scroll full screen");
  displayScroll("Full screen scrolling!");
  displayScroll("Scroll some part", 1000);
}