Problme mit OLED1.3" versus 0.96"

Hallo Leute,
ich habe hier ein sehr seltsames Problem mit 2 verschiedenen OLED Displays
Ich habe mir einen Sketch für einen Arduino NANO erstellt für die Auswertung eines inkrementellen Drehgebers an eine WABECO Bohrständer (inspiriert und modifiziert von Offy's Blog Digitaler Bohrtiefenmesser für Deinen Wabeco Bohrständer - YouTube ).
mit einem 0.96" AZ Delivery Display funktioniert der Sketch tadellos ohne Probleme - soweit so gut.
Da dieses Anzeige ein wenig klein und meine Augen nicht mehr die besten sind, dachte ich mir ich baue ein 1,3" OLEd auch von AZ einfach mal statt des 0.96" ein.
und jetzt kommts - sketch hängt manchmal beim einschalten(kommt über die reine "Bohrtiefe in mm" Anzeige nicht raus) und erst nach drücken des reset button und rot aufleuchten der L Led beginnt er wieder richtig anzuzeigen. Auch sehr seltam wenn ich den seriellen monitor/oder plotter aktiviere dann beginnte es auch wieder richtig anzuzeigen. Das ganze passiert aber nur wenn ich die leitung des "Nullstelltasters"=D4 gegen GND anstecke. Ich habe es auch schon mit einem 10k Pullup vom SCL/A5 Anschluss versucht, das hilft zwar am Steckbrett, nicht aber wenn die Schaltung dann eingebaut wird und die Bohrmaschine am Bohrständer daneben läuft. Der Fehler ist auch unnachvollziehbar abhängig ob ich den USB Anschluss oder direkte 5v/2,5A zur Spannungsversorgung verwende.
Ich habe jetzt Nächte damit verbracht alle Varianten zu Testen und in vielen Blogs nachzulesen was denn das Problem sein könnte, bin aber mit meinem bescheidenen Latein am Ende.
Bitte um ein paar hints wie ich meine Augen schonen und doch das grössere Display einsetzten kann.
Ich habe auch den Sketch noch reinkopiert, bitte um Nachsicht wenn ich da was falscjh mache , es ist mein erster Sketch und mein erster Forumeintrag
Danke Armin,

//variablen
 volatile long temp ; //This variable will increase or decrease depending on the rotation of encoder
 double mmLength = 0; 
 double counter = 0;
 
 #include <Arduino.h>
 #include <U8x8lib.h>
 
 U8X8_SH1106_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);
 
//umrechnungsfaktor impulse -> cm
 #define CALIBRATION 0.0458333
 
void setup() {
  Serial.begin (9600);
  u8x8.begin();
  u8x8.setPowerSave(0);
  
  pinMode(4, INPUT_PULLUP);// Pin 4 als  Input für nullen definieren
  pinMode(2, INPUT_PULLUP); // internal pullup input pin 2 
  pinMode(3, INPUT_PULLUP); // internal pullup input pin 3

 //Setting up interrupt
 //A rising pulse from encodenren activated ai0(). AttachInterrupt 0 is DigitalPin nr 2 on moust Arduino.
  attachInterrupt(0, ai0, RISING);
 //B rising pulse from encodenren activated ai1(). AttachInterrupt 1 is DigitalPin nr 3 on moust Arduino.
  attachInterrupt(1, ai1, RISING);
  }
  
   void umrechnung()
   {
     mmLength = counter * CALIBRATION;
        }


      
  void loop() 
    {
      u8x8.setFont(u8x8_font_8x13B_1x2_f);   
      u8x8.setCursor(4,0);
      u8x8.print("Bohrtiefe");
      u8x8.setCursor(6,2);
      u8x8.print("in mm");  
 
      mmLength = counter * CALIBRATION;
      u8x8.setCursor(1,5);
      u8x8.setFont(u8x8_font_courB18_2x3_f);
      //u8x8.setFont(u8x8_font_8x13B_1x2_f);
      
      if(mmLength >= 0 && mmLength < 10){
      u8x8.print("   ");
        }
            
      if(mmLength < 0 && mmLength > -10){
      u8x8.print("  ");
        }
        
      if(mmLength > 10 && mmLength < 100){
      u8x8.print("  ");
        }
      if(mmLength < -10 && mmLength > -100){
      u8x8.print(" ");
        }
      if(mmLength > 100){
      u8x8.print(" ");
        }
      if(mmLength < -100){
      u8x8.print("");
        }
      u8x8.print(mmLength);
      
 // nullen wenn pin4 auf low
      if(!digitalRead(4)){
           counter = 0;
           delay (1000);
         }
 // Ausgabe des Wertes am serial Monitor      
 Serial.println (mmLength);
    }
    
  void ai0() {
 // ai0 is activated if DigitalPin nr 2 is going from LOW to HIGH
 // Check pin 3 to determine the direction
  if(digitalRead(3)==LOW) {
      counter++;}
      else {
      counter--;
      }
    }
  void ai1() {
// ai0 is activated if DigitalPin nr 2 is going from LOW to HIGH
// Check with pin 2 to determine the direction
  if(digitalRead(2)==LOW) {
  counter--;
  }else {
  counter++;
        }
  }
  

Wenn Du große Ziffern brauchst wieso nimmst Du kein normales 2x20 LCD Display?


zB:

Grüße Uwe

Hast du denn fü dein 1,3" Oled auch den richtigen Treiber gewählt ?
Ein Link zu deinen Dispays könnte Aufschluss darüber geben.

Bei Bohrmaschine denke ich gleich an elektromagnetische Störungen, die von den OLEDs unterschiedlich "interpretiert" werden. Versuche mal 2 kΩ PullUp und einseitig mit GND verbundene Abschirmug um die Leitungen.

Die Breitseite meiner Kritik kann ich Dir nicht ersparen, bitte lies es mit einem Lächeln :slightly_smiling_face:

  1. temp nicht verwendet
  2. double gibt es auf dem Nano nicht. Fließkomma ist auf den AVRs sowieso zu ungenau. Besser also Hundertstel Millimeter.
  3. counter trotz Interrupt nicht volatile
  4. umrechnung() unbenutzt
  5. snprintf kann Dir das Programmieren erleichtern. Leider ist %f beim Nano nicht implementiert, da muß man dann selbst aufteilen.
long aktLaenge = 0;
volatile bool neu = true;
volatile long counter = 0;

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

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

//umrechnungsfaktor impulse -> cm
#define CALIBRATION 0.0458333

void setup() {
  Serial.begin (9600);
  u8x8.begin();
  u8x8.setPowerSave(0);

  pinMode(4, INPUT_PULLUP);// Pin 4 als  Input für nullen definieren
  pinMode(2, INPUT_PULLUP); // internal pullup input pin 2
  pinMode(3, INPUT_PULLUP); // internal pullup input pin 3

  //Setting up interrupt
  //A rising pulse from encodenren activated ai0(). AttachInterrupt 0 is DigitalPin nr 2 on moust Arduino.
  attachInterrupt(0, ai0, FALLING);
  //B rising pulse from encodenren activated ai1(). AttachInterrupt 1 is DigitalPin nr 3 on moust Arduino.
  attachInterrupt(1, ai1, FALLING);
}

void loop()
{
  if (neu)
  {
    neu = false;
    aktLaenge = counter * CALIBRATION;
    u8x8.setFont(u8x8_font_8x13B_1x2_f);
    u8x8.setCursor(4, 0);
    u8x8.print("Bohrtiefe");
    u8x8.setCursor(6, 2);
    u8x8.print("in mm");

    u8x8.setCursor(1, 5);
    u8x8.setFont(u8x8_font_courB18_2x3_f);
    //u8x8.setFont(u8x8_font_8x13B_1x2_f);
    char buf[10] = {'\0'};
    char vorzeichen[2] = " ";
    if (aktLaenge < 0) vorzeichen[0] = '-';
    snprintf( buf, sizeof(buf), "%s%3ld.%02ld", vorzeichen, abs(aktLaenge) / 100, abs(aktLaenge) % 100 );
    u8x8.print( buf );
    // Ausgabe des Wertes am serial Monitor
    Serial.println ( buf );
  }

  // Nullen wenn pin4 auf low
  if (!digitalRead(4)) {
    counter = 0;
    neu = true;
  }
}

void ai0() {
  // ai0 is activated if DigitalPin nr 2 is going from HIGH to LOW
  counter--;
  neu = true;
}
void ai1() {
  // ai0 is activated if DigitalPin nr 3 is going from HIGH to LOW
  counter++;
  neu = true;
}

Da kommen mir bessere Ideen :rofl:

Ja das sagt meine freundin auch , warum wohl ?

zuerst mal danke für deine antwort die ich natürlich lächelnd lese, auch wenn ich noch nicht alles verstehe - aber mr google wird mir dabei helfen zu verstehen.... :slight_smile:

Hallo Uwe, wäre natürlich auch eine Möglichkeit, dann muss ich aber wieder neues Gehause drucken und ein Display kaufen, das löst aber das technische Problem , das ich gerne wüsste warum es auftritt auch nicht, aber danke für den tip

Denke schon , zumindestens habe ich es genau nach der Anleitung von AZ Delivery (als PFD) gemacht.
hier der Link
1.3" 1,3 Zoll OLED Display I2C SSH1106 Chip 128 x 64 Pixel I2C Anzeigemodul – AZ-Delivery
0.96" 0,96 Zoll OLED Display I2C SSD1306 Chip 128 x 64 Pixel I2C Bildschirm – AZ-Delivery

habe mir jetzt deinen ausgebesserten sketch angesehen - danke, die formatierung ist wesentlich eleganter, danke für die hilfe. den 2 k pullup meintest du beim OLED Clock oder ?

Immer beide!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.