1,3" OLED im Sketch anpassen

Hi. Ich habe einen Timer + Temp anzeige auf Basis eines NanoMCU ESP8266 was im sketch mit einem 1306OLED funktioniert. Da das SH1106 größer und besser Lesbar ist würde ich das gerne ändern. Das 1,3'' OLED hab ich mit dem Treiber GitHub - ThingPulse/esp8266-oled-ssd1306: Driver for the SSD1306 and SH1106 based 128x64, 128x32, 64x48 pixel OLED display running on ESP8266/ESP32 schon zum laufen gebracht. Jedoch komm ich bei der übertragung nicht weiter im sketch nicht weiter da ich keine erfahrung habe in sachen anpassung des Display.
Originaler Sketch findet man hier GitHub - alexrus/marax_timer.

Vielleicht könnte sich da jemand mal ansehen?

Ich gebe mal nen Hinweis. Da hat es jemand geschafft seinen Display zu tauschen und - mithilfe eines Make. Artikels - den Code anzupassen. Du wirst einiges lesen müssen.

Was genau meinst du damit ?
Bei mir laufen die Oled SH1106 problemlos am ESP8266 mit dem von dir genannten Treiber.
Die Übertragung arbeitet doch per I2C und das bei beiden (SSD1306 oder SH1106) Oled.
Also bitte beschreibe dein Problem etwas genauer.

Normal hat er SSH1106 Driver, es gibt aber noch ältere Modele mit SSD1306.
Was die Lib angeht die beste ist vom Oli Kraus U8g2 die unterstützt Sh1106 und SD1306, funktioniert auf den meisten Arduino so wie ESP8266 + ESP32

Besser, ja.
Jedoch funktioniert der genannte Treiber prima mit den Displays und ist klein. :wink:

Soll der TO @normanb88 doch erst mal sein Problem beschreiben. Er muss nicht zwingend den Treiber wechseln.

Ich bekomme ja mit den von mir beschrieben treiber und nem Beispiel ein Bild. Ergo funktioniert es ja. In dem vorhandenen sketch den treiber zu ändern ist die eine sache. Ich weis nur nicht wie es den rest des sketches anpassen soll weil mit dazu eben das können fehlt.

Dan zeig doch was Du hast, wir sehen nicht auf deinen Monitor und alle Kristallkugeln sind defekt

#define D5 (14)
#define D6 (12)
#define D7 (13)

#define PUMP_PIN D7

//#include <Adafruit_SSD1306.h>
#include <SH1106Wire.h>
#include <Adafruit_GFX.h>
#include <ESP8266WiFi.h>
#include <Wire.h>
#include <Timer.h>
#include <SoftwareSerial.h>
#include <SPI.h>

//Adafruit_SSD1306 display(128, 64, &Wire, -1);
SH1106Wire display(0x3c, SDA, SCL);
SoftwareSerial mySerial(D5, D6);
Timer t;

bool displayOn = true;
int timerCount = 0;
int prevTimerCount = 0;
bool timerStarted = false;
long timerStartMillis = 0;
long timerStopMillis = 0;
long timerDisplayOffMillis = 0;
long serialUpdateMillis = 0;

const byte numChars = 32;
char receivedChars[numChars];
static byte ndx = 0;
char endMarker = '\n';
char rc;

void setup() {
  WiFi.mode(WIFI_OFF);

  Serial.begin(9600);
  mySerial.begin(9600);

  pinMode(PUMP_PIN, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);

  t.every(100, updateDisplay);

  memset(receivedChars, 0, numChars );

  Serial.begin(115200);
  display.clear();
  display.setColor(WHITE);
  display.display();
  mySerial.write(0x11);
}

void loop() {
  t.update();
  detectChanges();
  getMachineInput();
}

void getMachineInput() {
  while (mySerial.available() ) {
    serialUpdateMillis = millis();
    rc = mySerial.read();

    if (rc != endMarker) {
      receivedChars[ndx] = rc;
      ndx++;
      if (ndx >= numChars) {
        ndx = numChars - 1;
      }
    } else {
      receivedChars[ndx] = '\0';
      ndx = 0;
      Serial.println(receivedChars);
    }
  }

  if (millis() - serialUpdateMillis > 5000) {
    serialUpdateMillis = millis();
    memset(receivedChars, 0, numChars );
    Serial.println("Request serial update");
    mySerial.write(0x11);
  }
}

void detectChanges() {
  digitalWrite(LED_BUILTIN, digitalRead(PUMP_PIN));
  if (!timerStarted && !digitalRead(PUMP_PIN)) {
    timerStartMillis = millis();
    timerStarted = true;
    displayOn = true;
    Serial.println("Start pump");
  }
  if (timerStarted && digitalRead(PUMP_PIN)) {
    if (timerStopMillis == 0) {
      timerStopMillis = millis();
    }
    if (millis() - timerStopMillis > 500) {
      timerStarted = false;
      timerStopMillis = 0;
      timerDisplayOffMillis = millis();
      //display.invert(false);
      Serial.println("Stop pump");
    }
  } else {
    timerStopMillis = 0;
  }
  if (!timerStarted && displayOn && timerDisplayOffMillis >= 0 && (millis() - timerDisplayOffMillis > 1000 * 60 * 60)) {
    timerDisplayOffMillis = 0;
    timerCount = 0;
    prevTimerCount = 0;
    displayOn = false;
    Serial.println("Sleep");
  }
}

String getTimer() {
  char outMin[2];
  if (timerStarted) {
    timerCount = (millis() - timerStartMillis ) / 1000;
    if (timerCount > 15) {
      prevTimerCount = timerCount;
    }
  } else {
    timerCount = prevTimerCount;
  }
  if (timerCount > 99) {
    return "99";
  }
  sprintf( outMin, "%02u", timerCount);
  return outMin;
}

void updateDisplay() {
  display.clear();
  if (displayOn) {
    if (timerStarted) {
      display.setTextSize(7);
      display.setCursor(28, 16);
      display.print(getTimer());
    } else {
      // draw line
      display.drawVerticalLine(40,0,20);
      //display.drawLine(74, 0, 74, 64, SSD1306_WHITE);
      // draw time seconds
      display.setTextSize(4);
      display.setCursor(display.width() / 2 - 1 + 17, 20);
      display.print(getTimer());
      // draw machine state C/S
      if (receivedChars[0] ) {
        display.setTextSize(2);
        display.setCursor(1, 1);
        if (String(receivedChars[0]) == "C") {
          display.print("C");
        } else if (String(receivedChars[0]) == "V") {
          display.print("S");
        } else {
          display.print("X");
        }
      }
      if (String(receivedChars).substring(18, 22) == "0000") {
        // not in boost heating mode
        // draw fill circle if heating on
        if (String(receivedChars[23]) == "1") {
          display.fillCircle(45, 7, 6);
        }
        // draw empty circle if heating off
        if (String(receivedChars[23]) == "0") {
          display.drawCircle(45, 7, 6);
        }
      } else {
        // in boost heating mode
        // draw fill rectangle if heating on
        if (String(receivedChars[23]) == "1") {
          display.fillRect(39, 1, 12, 12);
        }
        // draw empty rectangle if heating off
        if (String(receivedChars[23]) == "0") {
          display.drawRect(39, 1, 12, 12);
        }
      }
      // draw temperature
      if (receivedChars[14] && receivedChars[15] && receivedChars[16]) {
        display.setTextSize(3);
        display.setCursor(1, 20);
        if (String(receivedChars[14]) != "0") {
          display.print(String(receivedChars[14]));
        }
        display.print(String(receivedChars[15]));
        display.print(String(receivedChars[16]));
        display.print((char)247);
        if (String(receivedChars[14]) == "0") {
          display.print("C");
        }
      }
      // draw steam temperature
      if (receivedChars[6] && receivedChars[7] && receivedChars[8]) {
        display.setTextSize(2);
        display.setCursor(1, 48);
        if (String(receivedChars[6]) != "0") {
          display.print(String(receivedChars[6]));
        }
        display.print(String(receivedChars[7]));
        display.print(String(receivedChars[8]));
        display.print((char)247);
        display.print("C");
      }
    }
  }
  display.display();
}

Das wäre der sketch. Ein 1331 Farbdisplay hab ich schon zum laufen gebracht mit dem Sketch. Beim 1,3 OLED sieht es anders aus. Beim compilieren beanstandet er jeweils alle setTextsize und setCursor. Würde ich die ermals rausnehmen läd er zwar den sketch....bleibt aber alles dunkel und die blaue LED blinkt dauerhaft

Welchen vorhandenen Sketch meinst du ?
Ich sehe den nicht.

Ok, der Sketch ist jetzt da.

Und was meinst du mit Übertragung. Bitte mal meine Frage beantworten.

Die // brauchst du nicht.

Hier

müssen die Pinbezeichnungen rein.
Und statt display.setTextSize(4); muss da display.setFont(dein Font); rein.
Da solltest du dein Beispiel vom Treiber ansehen.

Anstatt display.print(getTimer()); kommt da display.drawString(10, 20, getTimer());
Die Zahlen sind die jeweilige Cursor Position.

void updateDisplay() {
  display.clear();
  if (displayOn) {
    if (timerStarted) {
      display.setFont(ArialMT_Plain_10);
      display.setTextAlignment(TEXT_ALIGN_LEFT);
      display.drawString(0, 10, "Left aligned (0,10)");
      //display.setCursor(28, 16);
      display.drawString(0, 20, getTimer());
    } else {
      // draw line
      display.drawVerticalLine(40,0,20);
      //display.drawLine(74, 0, 74, 64, SSD1306_WHITE);
      // draw time seconds
      display.setFont(ArialMT_Plain_10);
      //display.setCursor(display.width() / 2 - 1 + 17, 20);
      display.print(getTimer());
      // draw machine state C/S
      if (receivedChars[0] ) {
        display.setFont(ArialMT_Plain_10);
        //display.setCursor(1, 1);
        if (String(receivedChars[0]) == "C") {
          display.print("C");
        } else if (String(receivedChars[0]) == "V") {
          display.print("S");
        } else {
          display.print("X");
        }
      }
      if (String(receivedChars).substring(18, 22) == "0000") {
        // not in boost heating mode
        // draw fill circle if heating on
        if (String(receivedChars[23]) == "1") {
          display.fillCircle(45, 7, 6);
        }
        // draw empty circle if heating off
        if (String(receivedChars[23]) == "0") {
          display.drawCircle(45, 7, 6);
        }
      } else {
        // in boost heating mode
        // draw fill rectangle if heating on
        if (String(receivedChars[23]) == "1") {
          display.fillRect(39, 1, 12, 12);
        }
        // draw empty rectangle if heating off
        if (String(receivedChars[23]) == "0") {
          display.drawRect(39, 1, 12, 12);
        }
      }
      // draw temperature
      if (receivedChars[14] && receivedChars[15] && receivedChars[16]) {
        display.setFont(ArialMT_Plain_10);
        //display.setCursor(1, 20);
        if (String(receivedChars[14]) != "0") {
          display.print(String(receivedChars[14]));
        }
        display.print(String(receivedChars[15]));
        display.print(String(receivedChars[16]));
        display.print((char)247);
        if (String(receivedChars[14]) == "0") {
          display.print("C");
        }
      }
      // draw steam temperature
      if (receivedChars[6] && receivedChars[7] && receivedChars[8]) {
        display.setFont(ArialMT_Plain_10);
        //display.setCursor(1, 48);
        if (String(receivedChars[6]) != "0") {
          display.print(String(receivedChars[6]));
        }
        display.print(String(receivedChars[7]));
        display.print(String(receivedChars[8]));
        display.print((char)247);
        display.print("C");
      }
    }
  }
  display.display();
}

Die #include hab ich etz mal so angepasst.
Die Pinbelegung ebenfalls wobei er ja bei SDA und SCL standartmäßig i2c pin anspricht sprich D1 und D2?
Den rest display.setFont auch bzw noch nicht ganz. Aber müsste er den nich irgendwas anzeigen? Der Sketch Lässt sich auch hochladen. Jedoch blinkt nur die Blaue LED.

JA aber man sollte nicht D Bezeichnung nutzen nur GPIO Nummern, was bei ESP8266 ist
SDA GPIO4 Schreibweise im Code zB #define LED 2 , also ohne D
SCL GPIO5
Warum? Darum dass das ist immer korrekte Zuweisung, wen jemand das Modul anders baut kann sein das am D1 GPIO13 hängt, dadurch suchst Du dich zu Tode wo der Fehler ist.
Ich habe Zwei untersidliche ESP8266 wo die VCC und GND anders sind.
Bei ESP32 kommt noch dazu das es gibt welsche mit 30 und 32Pins.
ESP ist nicht Arduino


Bei meinem ist unter ADC0 GND und +5V (dort wo RESERVET steht)

Bei der Pin Belegung hab ich alles durchprobiert. Und so wie es im Beispiel sketch angegeben ist funktioniert es auch. So hab ich es auch übernommen. Blinkt aber nur die LED am Board. Ergo dann doch ein fehler im Sketch

Wie hast du die angepasst ?
Ich sehe da nix.

Das macht er, wenn du das richtige Board ausgewählt hast.

Poste mal den kompletten Sketch, damit wir das auch sehen, was du änderst.

Zuvor könntest du noch eine Displayausgabe im Setup einbauen, um zu testen, ob das auch so funktioniert.

die Pinbelegung findest du in der entsprechenden pins_arduino.h von deinem ESP Core.

Wenn du einen NodeMCU auswählst:

#define PIN_WIRE_SDA (4)
#define PIN_WIRE_SCL (5)

static const uint8_t SDA = PIN_WIRE_SDA;
static const uint8_t SCL = PIN_WIRE_SCL;

#ifndef LED_BUILTIN
#define LED_BUILTIN 2
#endif
#define LED_BUILTIN_AUX 16

static const uint8_t D0   = 16;
static const uint8_t D1   = 5;
static const uint8_t D2   = 4;
static const uint8_t D3   = 0;
static const uint8_t D4   = 2;
static const uint8_t D5   = 14;
static const uint8_t D6   = 12;
static const uint8_t D7   = 13;
static const uint8_t D8   = 15;
static const uint8_t D9   = 3;
static const uint8_t D10  = 1;

SDA ist also am NodeMCU genauso gut wie 4 oder D2.
Wenn das Beispiel SDA nutzt, nutze auch SDA.

mir ist noch nicht klar was genau nicht funktioniert.

"1331 Farbdisplay" funktioniert
"1,3 OLED" funktioniert nicht
?
dann mach mal nur ein "hello World" Beispiel gem. deiner verwendeten Library (ok von mir aus das "Simple Demo") an den Standard-Pins (wenns umbedingt sein muss: SDA und SCL!) für das 1,3 OLED.

Solange das Display nicht Stand alone funktioniert, braucht es den ganzen übrigen Balast an wifi zeugs auch nicht.

Wenn das Hello World auch nicht funktioniert:
Link auf Display posten
Link auf Library posten (oder ist es die aus deinem ersten Post?)
Echtbild der Verkabelung posten.

#define D5 (14)
#define D6 (12)
#define D8 (15)

#define PUMP_PIN D8 

//#include <Adafruit_SSD1306.h>
#include "SH1106Wire.h"
//#include <Adafruit_GFX.h>
#include <ESP8266WiFi.h>
//#include <Wire.h>
#include <Timer.h>
#include <SoftwareSerial.h>
//#include <SPI.h>

//Adafruit_SSD1306 display(128, 64, &Wire, -1);
SH1106Wire display(0x3c, SDA, SCL);
SoftwareSerial mySerial(D5, D6);
Timer t;


bool displayOn = true;
int timerCount = 0;
int prevTimerCount = 0;
bool timerStarted = false;
long timerStartMillis = 0;
long timerStopMillis = 0;
long timerDisplayOffMillis = 0;
long serialUpdateMillis = 0;

const byte numChars = 32;
char receivedChars[numChars];
static byte ndx = 0;
char endMarker = '\n';
char rc;

void setup() {
  WiFi.mode(WIFI_OFF);
  Serial.begin(9600);
  mySerial.begin(9600);
  
  
  display.init();
  display.setContrast(255); 
  display.flipScreenVertically();
  display.clear();
  display.display();
  t.every(100, updateDisplay);
  mySerial.write(0x11);


  pinMode(PUMP_PIN, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);

  

  memset(receivedChars, 0, numChars );

  
  
}

void loop() {
  t.update();
  detectChanges();
  getMachineInput();
}

void getMachineInput() {
  while (mySerial.available() ) {
    serialUpdateMillis = millis();
    rc = mySerial.read();

    if (rc != endMarker) {
      receivedChars[ndx] = rc;
      ndx++;
      if (ndx >= numChars) {
        ndx = numChars - 1;
      }
    } else {
      receivedChars[ndx] = '\0';
      ndx = 0;
      Serial.println(receivedChars);
    }
  }

  if (millis() - serialUpdateMillis > 5000) {
    serialUpdateMillis = millis();
    memset(receivedChars, 0, numChars );
    Serial.println("Request serial update");
    mySerial.write(0x11);
  }
}

void detectChanges() {
  digitalWrite(LED_BUILTIN, digitalRead(PUMP_PIN));
  if (!timerStarted && !digitalRead(PUMP_PIN)) {
    timerStartMillis = millis();
    timerStarted = true;
    displayOn = true;
    Serial.println("Start pump");
  }
  if (timerStarted && digitalRead(PUMP_PIN)) {
    if (timerStopMillis == 0) {
      timerStopMillis = millis();
    }
    if (millis() - timerStopMillis > 500) {
      timerStarted = false;
      timerStopMillis = 0;
      timerDisplayOffMillis = millis();
      //display.invert(false);
      Serial.println("Stop pump");
    }
  } else {
    timerStopMillis = 0;
  }
  if (!timerStarted && displayOn && timerDisplayOffMillis >= 0 && (millis() - timerDisplayOffMillis > 1000 * 10 * 10)) {
    timerDisplayOffMillis = 0;
    timerCount = 0;
    prevTimerCount = 0;
    displayOn = false;
    Serial.println("Sleep");
  }
}

String getTimer() {
  char outMin[2];
  if (timerStarted) {
    timerCount = (millis() - timerStartMillis ) / 1000;
    if (timerCount > 15) {
      prevTimerCount = timerCount;
    }
  } else {
    timerCount = prevTimerCount;
  }
  if (timerCount > 99) {
    return "99";
  }
  sprintf( outMin, "%02u", timerCount);
  return outMin;
}

void updateDisplay() {
  display.clear();
  if (displayOn) {
    if (timerStarted) {
      display.setFont(ArialMT_Plain_24);
      //display.setTextAlignment(TEXT_ALIGN_LEFT);
      //display.drawString(0, 10, "");
      //display.setCursor(28, 16);
      display.drawString(100, 18, getTimer());
    } else {
      // draw line
      display.drawVerticalLine(40,0,20);
      //display.drawLine(74, 0, 74, 64, SSD1306_WHITE);
      // draw time seconds
      display.setFont(ArialMT_Plain_10);
      //display.setCursor(display.width() / 2 - 1 + 17, 20);
      display.print(getTimer());
      // draw machine state C/S
      if (receivedChars[0] ) {
        display.setFont(ArialMT_Plain_10);
        //display.setCursor(1, 1);
        if (String(receivedChars[0]) == "C") {
          display.print("C");
        } else if (String(receivedChars[0]) == "V") {
          display.print("S");
        } else {
          display.print("X");
        }
      }
      if (String(receivedChars).substring(18, 22) == "0000") {
        // not in boost heating mode
        // draw fill circle if heating on
        if (String(receivedChars[23]) == "1") {
          display.fillCircle(45, 7, 6);
        }
        // draw empty circle if heating off
        if (String(receivedChars[23]) == "0") {
          display.drawCircle(45, 7, 6);
        }
      } else {
        // in boost heating mode
        // draw fill rectangle if heating on
        if (String(receivedChars[23]) == "1") {
          display.fillRect(39, 1, 12, 12);
        }
        // draw empty rectangle if heating off
        if (String(receivedChars[23]) == "0") {
          display.drawRect(39, 1, 12, 12);
        }
      }
      // draw temperature
      if (receivedChars[14] && receivedChars[15] && receivedChars[16]) {
        display.setFont(ArialMT_Plain_10);
        //display.setCursor(1, 20);
        if (String(receivedChars[14]) != "0") {
          display.print(String(receivedChars[14]));
        }
        display.print(String(receivedChars[15]));
        display.print(String(receivedChars[16]));
        display.print((char)247);
        if (String(receivedChars[14]) == "0") {
          display.print("C");
        }
      }
      // draw steam temperature
      if (receivedChars[6] && receivedChars[7] && receivedChars[8]) {
        display.setFont(ArialMT_Plain_10);
        //display.setCursor(1, 48);
        if (String(receivedChars[6]) != "0") {
          display.print(String(receivedChars[6]));
        }
        display.print(String(receivedChars[7]));
        display.print(String(receivedChars[8]));
        display.print((char)247);
        display.print("C");
      }
    }
  }
  display.display();
}

Ich hab etz im Setup oben das Display angepasst und siehe da...es läuft!
Etz muss ich nur noch den Sketch aufs Display so anpassen das alles korrekt angezeigt wird.
Fraglich nur warum auf Pin D8 die für die PUMP PIN standartmäßig im Originalen sketch verwendet wird, die LED dauerhaft am Board leuchtet und der Timer zählt.
Hab den jetzt auf RX gelegt und alles Passt.

Das hier brauchst du auch nicht.
Da könnten Probleme mit den Einträgen in der Board.txt kommen.

Und wie schon geschrieben wurde, verwende besser die GPIO-Pinbezeichnung.

Also Bild 1 zeigt den Timer im Hauptmenü mit nem 0,96" Dislplay. Rechts der Timer der bei betätigung des Switches zum Vollbild wechselt und Zählt (Bild 3). Der wird bei beendigung den wert in den Hauptbildschirm übernehmen. Das Passt!
Links im Hauptmenü sind dann die Temps. Allerdings hab ich keine Ahnung wie ich dazu richtig den sketch auf den display.drawString ändern soll.




void updateDisplay() {
  display.clear();
  if (displayOn) {
    if (timerStarted) {
      display.setFont(DSEG7_Classic_Regular_50);
      display.drawString(25, 2, getTimer());
    } else {
      // draw line
      display.drawVerticalLine(80,0,100);
      // draw time seconds
      display.setFont(DSEG7_Classic_Regular_30);
      display.drawString(82,13, getTimer());
      // draw machine state C/S
      if (receivedChars[0] ) {
        display.setFont(ArialMT_Plain_10);
        //display.setCursor(1, 1);
        if (String(receivedChars[0]) == "C") {
          display.print("C");
        } else if (String(receivedChars[0]) == "V") {
          display.print("S");
        } else {
          display.print("X");
        }
      }
      if (String(receivedChars).substring(18, 22) == "0000") {
        // not in boost heating mode
        // draw fill circle if heating on
        if (String(receivedChars[23]) == "1") {
          display.fillCircle(45, 7, 6);
        }
        // draw empty circle if heating off
        if (String(receivedChars[23]) == "0") {
          display.drawCircle(45, 7, 6);
        }
      } else {
        // in boost heating mode
        // draw fill rectangle if heating on
        if (String(receivedChars[23]) == "1") {
          display.fillRect(39, 1, 12, 12);
        }
        // draw empty rectangle if heating off
        if (String(receivedChars[23]) == "0") {
          display.drawRect(39, 1, 12, 12);
        }
      }
      // draw temperature
      if (receivedChars[14] && receivedChars[15] && receivedChars[16]) {
        display.setFont(ArialMT_Plain_10);
        //display.setCursor(1, 20);
        if (String(receivedChars[14]) != "0") {
          display.print(String(receivedChars[14]));
        }
        display.print(String(receivedChars[15]));
        display.print(String(receivedChars[16]));
        display.print((char)247);
        if (String(receivedChars[14]) == "0") {
          display.print("C");
        }
      }
      // draw steam temperature
      if (receivedChars[6] && receivedChars[7] && receivedChars[8]) {
        display.setFont(ArialMT_Plain_10);
        //display.setCursor(1, 48);
        if (String(receivedChars[6]) != "0") {
          display.print(String(receivedChars[6]));
        }
        display.print(String(receivedChars[7]));
        display.print(String(receivedChars[8]));
        display.print((char)247);
        display.print("C");
      }
    }
  }
  display.display();
}

"display.drawstring" ist die Anweisung, um einein String (Text) auf dein Display zu schreiben.
Probier doch einfach mal mit simplen Worten, wo der Text dann angezeigt wird. Achte dabei auch auf die Position des Textanfangs.

display.drawstring (die plazierung, "name"); funktioniert ja. Ich möchte aber die Daten erhalten die ich auf PIN D5 und D6 bekomme. Die Pins funktionieren da die Kreise und das rechteck angezeigt werden und sich mit ändernungen der Machine mitändern. So wie weiter oben mit display.drawString(82,13, getTimer()); er die Timerdaten erhält müsste ich doch receivedChars arbeiten.