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

// Displaygröße definieren
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

// Reset-Pin definieren (nicht verwendet)
#define OLED_RESET -1

// Display-Instanz erstellen
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// Beispiel-Bitmap (8x8 Herz)
const unsigned char myBitmap[] PROGMEM = {
  0x00, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0xff, 0xf0, 0xff, 0xef, 0x80, 0x01, 0xff, 0xfe, 0x7f, 0xfe, 0x3f, 0x9f, 0xc7, 0xff, 0xc0, 
	0x01, 0xff, 0xf8, 0xff, 0xef, 0x80, 0x01, 0xff, 0xfe, 0x7f, 0xfe, 0x3f, 0x9f, 0xc7, 0xff, 0xe0, 
	0x03, 0xff, 0xf8, 0xff, 0xcf, 0x80, 0x01, 0xff, 0xfe, 0x7f, 0xfe, 0x7f, 0x9f, 0xc7, 0xff, 0xf0, 
	0x03, 0xe0, 0xf8, 0x1e, 0x0f, 0x00, 0x00, 0x0f, 0x80, 0xf8, 0x00, 0x7f, 0xbf, 0xc7, 0x81, 0xf0, 
	0x07, 0xc0, 0x78, 0x1e, 0x0f, 0x00, 0x00, 0x0f, 0x80, 0xf8, 0x00, 0x7f, 0xbf, 0xc7, 0x81, 0xf0, 
	0x07, 0x80, 0x78, 0x3e, 0x0f, 0x00, 0x00, 0x0f, 0x80, 0xff, 0xf8, 0x7f, 0xbb, 0xcf, 0x81, 0xe0, 
	0x07, 0x80, 0x78, 0x3c, 0x1f, 0x00, 0x00, 0x0f, 0x80, 0xff, 0xf8, 0xff, 0xfb, 0xcf, 0xff, 0xe0, 
	0x07, 0x80, 0xf8, 0x3c, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0xf1, 0xf8, 0xf7, 0xf7, 0xcf, 0xff, 0xc0, 
	0x07, 0xc0, 0xf8, 0x3c, 0x1e, 0x00, 0x00, 0x1f, 0x01, 0xf0, 0x00, 0xf7, 0xf7, 0xcf, 0xff, 0x80, 
	0x07, 0xff, 0xf1, 0xff, 0x9f, 0xff, 0x00, 0x1f, 0x01, 0xf0, 0x3d, 0xf7, 0xf7, 0xcf, 0xfc, 0x00, 
	0x07, 0xff, 0xe3, 0xff, 0x9f, 0xff, 0x00, 0x1f, 0x01, 0xff, 0xfd, 0xf7, 0xe7, 0xdf, 0x00, 0x00, 
	0x03, 0xff, 0xc3, 0xff, 0xbf, 0xff, 0x00, 0x1f, 0x01, 0xff, 0xf9, 0xf7, 0xe7, 0xdf, 0x00, 0x00, 
	0x00, 0xff, 0x03, 0xff, 0xbf, 0xfe, 0x00, 0x1e, 0x01, 0xff, 0xf9, 0xe7, 0xe7, 0x9f, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 
	0x30, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0c, 
	0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 
	0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 
	0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 
	0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 
	0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 
	0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 
	0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 
	0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 
	0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 
	0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 
	0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 
	0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 
	0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 
	0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 
	0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 
	0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 
	0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 
	0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 
	0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 
	0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 
	0x30, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x0c, 
	0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x3f, 0xf8, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfc, 0xff, 0xfc, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x9c, 0xff, 0xfc, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x99, 0xf0, 0x78, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf9, 0xe0, 0x20, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf3, 0xe0, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x70, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfd, 0xf8, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf0, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

// Fortschrittsbalken-Parameter
#define PROGRESSBAR_WIDTH 124
#define PROGRESSBAR_HEIGHT 18
#define PROGRESSBAR_X 2
#define PROGRESSBAR_Y 20

int progressValue = 0;
int progressMax = 100;
int progressStep = 1;

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

  // Display initialisieren
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);
  }

  // Display löschen und Bitmap zeichnen
  display.clearDisplay();
  display.drawBitmap(0, 0, myBitmap, 128, 64, WHITE);
  display.display();
  delay(2000);
}

void loop() {
  // Fortschrittswert aktualisieren
  progressValue += progressStep;
  if (progressValue > progressMax) {
    progressValue = 0;
  }

  // Display löschen (außer der Bitmap)
  display.clearDisplay();
  display.drawBitmap(0, 0, myBitmap, 128, 64, WHITE);

  // Fortschrittsbalken zeichnen
  //display.drawRect(PROGRESSBAR_X, PROGRESSBAR_Y, PROGRESSBAR_WIDTH, PROGRESSBAR_HEIGHT, SSD1306_WHITE);
  int barWidth = map(progressValue, 0, progressMax, 0, PROGRESSBAR_WIDTH);
  display.fillRect(PROGRESSBAR_X + 2, PROGRESSBAR_Y + 2, barWidth - 4, PROGRESSBAR_HEIGHT - 4, SSD1306_WHITE);

  // Fortschrittswert zeichnen
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor((SCREEN_WIDTH - 12) / 2, (PROGRESSBAR_Y +5) + PROGRESSBAR_HEIGHT + 8);
  display.print(progressValue);
  //display.print("%");

  display.display();

  // Aktualisierungsintervall
  delay(100);
}