OLED Display Kabellänge

Hallo zusammen,

ich bin neu hier und möchte mich kurz vorstellen.

Ich bin 54, aus Österreich und Modellbahnfreak.
Leider nicht programmiertechnisch fit und auch sonst kein Elektronik Spezialist.
Also Anfänger und Ahnungsloser!
Aber für die Modellbahn brauche ich den Arduino.

Da hab ich mit einem Freund, der mir beim programmieren geholfen hat, 3 Displays verbaut, welche auf der Modellbahn eingebaut worden sind. Die Displays sollen die Bahnsteiganzeigen simulieren.

Problem, der Arduino UNO V3 muss unter der Platte montiert werden, die Kabellänge ergibt sich daraus zwingend - sind so um die 1,2 Meter.
Verwendet wurden einzelne Computerlitzen, nicht verdrillt, nicht geschirmt.
Ich wisst was jetzt kommt - bis so um die 80cm geht das problemlos, darüber eigentlich kaum bis nicht mehr.
Die 1,3" OLED haben 4 Kabel und können mit 3,3 und 5 Volt betrieben werden.
Angeschlossen sind die am Ausgang A4 und A5.

Jetzt ist es so, dass manch ein Sketch, der in Modellbahnforen rumgeistert funktioniert, aber nicht für meine Bedürfnisse passt, andere gehen nicht - ich gehe daher davon aus, dass im Sketch was eingestellt werden kann, damit die längeren Kabel funktionieren.

Ich hab schon viel gelesen hier - von PullUp Widerständen, Range Extendern, etc.
Nur leider habe ich dafür keine für mich verständliche Anleitung gefunden.

Ich habe schon das mit den Widerständen probiert - in die beiden Datenleitungen sollen die rein? Richtig? Ich hab 10k, 4,7k und 2,2k probiert - immer in beiden Leitungen direkt am Arduino - auf der Displayseite ist mir dies eigentlich nicht möglich.
Aber vielleicht war dies absolut falsch?

Was könnte ich sonst noch tun - auf einer andern Seite hab ich gelesen, dass diese Wiederstände auch im Sketch aufgerufen werden können (sollen im Chip verbaut sein), ein anderer schreibt von Baud Übertragungen, die zurückgefahren werden sollten, usw.

Es ist hier sicherlich ein User unterwegs, der sich meiner annimmt :slight_smile:

Ich kopiere hier mal den Sketch rein, vielleicht hilft dies?

#include <Arduino.h>
#include <U8x8lib.h>

U8X8_SH1106_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);

char Ziel[16];
char Via[16];
char Gleis[16];
char Zug[16];
char Zugname[10];
char Zeit[6];
char Lauftext1[16];
char Lauftext2[16];
char Richtung[4];

char Ziel1[14];
char Gleis1[4];
char Ziel2[14];
char Gleis2[4];
char Ziel3[14];
char Gleis3[4];

void setup(void) {
  u8x8.begin();
  u8x8.setPowerSave(0);
  u8x8.setFont(u8x8_font_open_iconic_thing_2x2);
  u8x8.drawString(6,0,"L");
  u8x8.setFont(u8x8_font_amstrad_cpc_extended_f);
  u8x8.drawUTF8(0,2,"   Herzlich");
  u8x8.drawUTF8(0,4,"  willkommen");
  u8x8.drawUTF8(0,6,"in Innsbruck!");
  Serial.begin(115200);
}

void loop(void){

if (Serial.available() >0) {
  Serial.begin(115200);
  String incomingstring = Serial.readString();
  String temp = "1";
  int i;
  char delimiter[] = "/";
  char *p;
  char string[128];
  int temp2;
  int temp3;
  String words[10];
  
  temp = incomingstring.substring(0,1);
  
  incomingstring.toCharArray(string, sizeof(string));
  i = 0;
  p = strtok(string, delimiter);
  while(p && i < 10)
    {
    words[i] = p;
    p = strtok(NULL, delimiter);
  ++i;
  }
  
  Serial.println(words[0]);
  Serial.println(words[1]);
  Serial.println(words[2]);
  Serial.println(words[3]);
  Serial.println(words[4]);
  Serial.println(words[5]);
  Serial.println(words[6]);
  Serial.println(words[7]);
  Serial.println(words[8]);
  Serial.println(words[9]);
  
      if (words[0] == "A") {
        u8x8.setInverseFont(0);
        words[1].toCharArray(Gleis,16);
        words[2].toCharArray(Zug,16);
        words[3].toCharArray(Zugname,10);
        words[4].toCharArray(Zeit,6);
        words[5].toCharArray(Via,16);
        words[6].toCharArray(Ziel,16);
        words[7].toCharArray(Lauftext1,16);
        words[8].toCharArray(Lauftext2,16);
        words[9].toCharArray(Richtung,4);
      
        u8x8.clear();
        u8x8.setFont(u8x8_font_open_iconic_arrow_2x2);
        Serial.println(Richtung);
        if (words[9] == "S") {
          Serial.println(Richtung);
          u8x8.drawString(12,0,"A");
          }
        if (words[9] == "N") {
          Serial.println(Richtung);
          u8x8.drawString(12,0,"B");
        }
        
        u8x8.setFont(u8x8_font_px437wyse700a_2x2_f);
        u8x8.drawString(14,0,Gleis);
          if (words[6].length() > 8) {
          u8x8.setFont(u8x8_font_amstrad_cpc_extended_f);
          }
        u8x8.drawString(0,3,Ziel);
        u8x8.setFont(u8x8_font_amstrad_cpc_extended_f);
        u8x8.drawString(0,0,Zug);
        if (words[3] != "-") {
        u8x8.drawString(0,1,Zugname);
        }
        u8x8.drawString(10,2,Zeit);
        u8x8.drawString(0,5,Via);
        u8x8.setInverseFont(1);
        if (words[7] != "-") { 
        u8x8.drawString(0,6,"               ");   
        u8x8.drawString(0,6,Lauftext1); 
        }
        if (words[8] != "-") {   
        u8x8.drawString(0,7,"               ");  
        u8x8.drawString(0,7,Lauftext2);
        }
      }
    
      if (words[0] == "B") {    

........

Ich sage jetzt schon mal Danke für jegliche Hilfe!

lg aus Tirol
Günther

I2C = Inter Integrated Circuit

quasi auf einer PCB.
Nicht auf 1.2 Meter.

kürze das Kabel, und bau ein Häuschen über dem Arduino. Oder nimm einen Nano - der ist wesentlich kleiner und verschwindet fast hinter deinem OLED.

Wie noisca schon schrieb, 1,2m ist für den I2C-Bus def. zu lang.
Es kann funktionieren, ist aber reichlich außerhalb der Spezifikation und somit nicht sicher, daß es funktioniert. Wenn du abgeschirmtes Kabel (Netzwerkkabel) verwendest, hast du eher Chancen. Nur denke daran, auf deiner Anlage hast du Störungen, die dein positives Ergebnis sehr schnell zu nichte machen.

Hast Du die 3 Display am gleichen Arduino oder je einen Arduino pro Display? 2. Wahl ist besser.

Also I2C
I2C braucht Pullup-Widerstände.

in beiden Leitungen ?

Die Widerstände kommen von der Leitung auf + Versorgungsspannung nicht in serie . Im Falle des Displays weiß ich nicht ob das 5V sein können oder 3,3V sein müssen. Kontrolliere mal wohin diese auf dem OLED geschaltet sind und mache es gleich.

Andererseits kannst Du I2C Acceleratoren verwenden ( Die bringen die Busleitungen automatisch auf + Versorgungsspannung) oder I2C Extender ( 2 ICS, eins am Arduino und das andere am Display) so sind die 10 fachen Leitungslängen möglich) In beiden Fällen max Signalspannung beachten.

Grüße Uwe

Hallo,
du könnest auch auf der halben Leitungslänge eine I2C Pegelwandler einbauen und betreibst die OLED mit 3,3 Volt.
Heinz

Hallo Uwe.

Dir und auch allen anderen hier besten Dank!

Bezüglich der Widerstände. Du meinst von A4 nach 3,3 Volt und von A5 nach 3,3 Volt?
Die Displays vertragen auch 5 Volt.

Und ja, es ist ein Arduino pro Display.

Was ist dann besser, die 3,3 oder die 5 Volt nehmen und was dranklemmen? 10k Ohm oder weniger?

Danke für eure Hilfe.

Lg Günther

Nimm 4k7 an VCC des Controller.

Ohne Angabe, was Du tatsächlich benutzt, ist das nur stochern im Nebel, mit der Gefahr das das komplett in Rauch aufgeht.

Die mir bekannten Display-Boards haben PULL_UPs auf der 3.3V Seite.
Die arbeiten IMHO auch mit 5V mit einem 5V-> 3.3V Wandler.
Was auch immer Du da hast. Dafür gibt es ganz bestimmt ein Schematic. Ohne ist das vollkommendes raten.

Ach hatte ich doch gerade...

Und ziehe damit den I2C auf5V, ohne zu wissen, ob der Display-Controller (und ggfls. andere Komponenten auf dem Bus) 5V-tolerant ist/sind?
Niemals!

Hab ich was von 5Volt geschrieben ?

Ja.

Blödsinn....lies mal richtig, und spamm nicht immer rum.

was ist das?

Was hättest Du denn gerne? Beschreibe, wo ich nicht richtig gelesen habe.

@blacky67
Wenn du, wie du schreibst, die Oled an 5 Volt (VCC) betreiben kannst, können die Pullupwiderstände von 4k7 auch an die Betriebsspannung des Atmega (5Volt) angeschlossen werden.
Allerdings benötigst du evtl. keine, da diese evtl. schon auf dem Display montiert sind.
Das kannst du mit einem Vielfachmeßgerät (Stellung Widerstandsmessung) auch nachmessen.
Das Projekt spannungslos machen.

Nein.

Du hast ja nun schon eingesehen:

Aber das ist davon vollkommen unabhängig.
Wer 5V auf nicht 5Vtolerante 3.3V Pins schiesst, schiesst sich ins Knie.
Und du hast das dem TO empfohlen, ohne zu wissen was er für Hardware hat.

Schluß!!

Wichtig ist ob das Display an den I2C Anschlüssen 5V tollerant ist oder nicht. Die Versorgungsspannung des Displaymodul sagt wenig, da die 5V leicht durch einen Spannungsstabilisator auf 3,3V gebracht wird und das häufig gemacht wird.

Wie my_xy_projekt schreibt kontrolliere auf welche Spannung die Pullup-Widerstände des Display-Moduls geschaltet sind. Entweder stromlos den Widerstand zwischen SDA bzw SCL auf 5 bzw 3,3V.
Andererseits kannst Du das Modul nur mit Masse und Versorgungsspüannung anschließen und die Spannung an SDA bzw SCL messen. So weißt du wohin DU die Pullupwiderstände schalten mußt.
Grüße Uwe

Guten Morgen zusammen,

Leute - also ich bin neu hier, und ich wollte niemals eine derartige Diskussion auslösen!

Also bevor sich jetzt alle in die Haare kriegen, ob 5 Volt oder doch nur 3,3 - hier meine verwendeten OLED Displays: 1,3" Display

@uwefed

OK, also im abgeschlossenem Zustand den Wiederstand zwischen was messen.

Sorry Leute, ich bin hier der absolute Anfänger. Ich habe VDD, GND, SCK und SDA auf dem Display, am Arduino Uno Rev.3 verwende ich GND und 3,3 Volt für die Spannung und A4 und A5 für die Daten.
Also was nach von wo?
Oder kann wer hier aus dem Datenblatt der OLED's rausfinden, was richtig ist?

Danke schön!!! :slight_smile:

Das Datenblatt bei AZ ist nicht eindeutig.
Seite 4, Abschnitt 3: High Level Input Vddio (3.3V).
Unten auf der Seite steht, die Pins gingen auch mit 5V und die Arduino-Verkabelung auf Seite 5 zeigt das auch so.

Habe keinen Schaltplan entdecken können, auf dem Spannungsteiler oder Levelkonverter zu sehen wären.

OK, und was mach ich jetzt?

die 10k von 3,3 Volt nach SCK (geht nach A5) verbinden? Also die 3,3 Volt mit einem Widerstand von 10kOhm mit dem Ausgang A5 verbinden?
Stimmt das so?

Thx

Nee, wenn du einen Uno mit 5Volt hast, macht das keinen Sinn.
Miss doch erst mal nach, ob auf deinem Display die Pullups drauf sind. Dann darfst du dir diese extern sparen.