Zählwerk für Tonband - Oled Display aktualisiert nicht

Mein erstes Projekt, bin Anfänger: Für meine Tonbandmaschine möchte ich ein Digitaldisplay realisieren. Aufgebaut mit einem Arduino Nano, Oled SSD1306 128*32 Display und Fotosensor der Digitalsignal ausgibt und am D3 Input vom Nano hängt. Ich hab das Problem dass auf dem Oled Display nicht der Wert Angezeigt wird wie im Serial Monitor. Soweit Funktioniert auch erstmal alles. Im Serial Monitor, zählt der Wert bei jedem Ausschlag vom Fotosensor 1 hoch, Prima soll genau so sein. Im Oled Display steht immer der Anfangswert, es aktuallisiert sich nicht so wie im Serial Monitor sichtbar.
EDIT: Hab gerade gesehen, dass sich das Display sehr langsam (20-40 Sek.) aktualisiert. Der alte Wert bleibt und wird "überschrieben" Danke für die Hilfe, Gruß Alex

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

#define SCREEN_WIDTH 128     // OLED display width, in pixels
#define SCREEN_HEIGHT 32     // OLED display height, in pixels
#define OLED_RESET -1        // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C  ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

//int analogPin = A0; // Testsensor Hallgeber
//int val = 0;        // Testsensor Hallgeber

int IR = 3;  // Pin, der gelesen werden soll
long x = 0; // Zähler

void setup()
 {
  Serial.begin(9600);  // Setup der seriellen Verbindung
  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
  display.begin();
  display.setTextSize(4);
  display.setTextColor(WHITE);
  //display.setCursor(0, 1);
  display.clearDisplay();
 }

void loop() {

  static int counterLst = 0;
  int counter = digitalRead(3);

  if (counterLst != counter) {
    counterLst = counter;
    if (HIGH == counter)
      x++;
    //if (LOW == counter)x--; // Für Rewind, bekommt eigenen InputPin und wird per Relais geschaltet
  }
  Serial.println(x);
  display.println(x);
  display.display();
   //delay(10);

}



Hier bekommst du keinen counter sondern nur einen Status.

void loop() {
  static int counterLst = 0;
  int counter = digitalRead(3);

  if (counterLst != counter) {
    counterLst = counter;
    if (HIGH == counter)
      x++;
     Serial.println(x);
     display.setCursor(0, 1);
    display.print(x);
    display.display();
  }
}

PS: Crosspostings sind nicht so beliebt: Redirecting...

1 Like

Unsinn, nur EPaper Displays sind so langsam, jedoch auch nicht alle. OLED reagieren innerhalb von Millisekunden.

Kein Unsinn, mach dir gern ein Video! Liegt aber nicht am Display. Der Beispielcode von Adafruit läuft ja korrekt.

Das liegt an deiner Art, wie du deine Impulse zählst und zur Anzeige bringst.
Was das überschreiben betrifft, solltest du am einfachsten den letzten Wert speichern und wenn der sich änderdert, den gespeicherten mit schwarz den angezeigten Wert überschreiben. Dann den neuen Wert rein schreiben.

1 Like

Hallo Wwerner,
danke dir erstmal. Das zählen klappt jetzt- Super.

Bleibt nur noch das problem das die Zahlen nicht gelöscht werden wenn eine neue kommt.
Also die 1 steht im Display, dann kommt der Zählimpuls und die 2 wird über die 1 geschrieben, die eins aber nicht gelöscht.
Hoffe das ist verständlich, kann gerne auch ein Video davon machen.

Gruß Alex

Den anderen Beitrag hab ich gelöscht

Dafür hat Adafruit so was

display.setTextColor(WHITE, BLACK);

2 Likes

Super Fony, das klappt, vielen Dank!
Gruß Alex

Du kannst jetzt noch :hearts: verteilen und den Beitrag als gelöst markieren.

1 Like

Das wollte ich eben gerade machen, finde mich aber noch nicht so gut zurecht. Danke an alle!

Du hast aber nächste Stolperfalle, wenn das band rückwärts läuft bleib dir die erste angezeigte zahl "hängen"
ZB.
Zähler ist bei 1032, bei rückwärts laufen kommt der Zähler auf 110, dann wird angezeigt 1110 :wink:
Wurde so was ähnlich Mechanischen Zähler bauen mit vorgestellter null
0012
Dazu switch case nehmen oder mit If abfrage das erschlagen.

1 Like

Danke Fony, dass du solche gedanken machst. Ich bin gerade auf der Such nach den "führenden Nullen" aber noch nichts gefunden.
Dein letzten Satz hab ich noch nicht so richtig verstanden "Dazu switch case nehmen oder mit If abfrage das erschlagen"
Kannst du mir den Code zeigen? Danke und Gruß Alex

Schau mal in die Beispiele deiner IDE. Da findest du auch Beispiele zu den if-Abfragen oder switch / case.

1 Like

Das muss man schon selber bauen war ja nur Vorschlag.
Um nicht nötigen Zeichen löschen löschen gibt's mehrere Möglichkeiten, mansche Bibliotheken machen das selber, die Adafruit jedoch nicht, wen mich nicht irre, nutze sehr sehr selten Adafruit für Displays.

Zeige dein aktuellen Sketsch, schaue mir das später an.
Beispiele sind gut nur öfters zeigen nicht das was man möchte sehen, sind ja nur Beispiele, anpassen muss man selber.

Habe dein Display nicht, aber das kriegen wir hin :wink:

1 Like

Ersetze einen Teil Deines Codes durch folgendes:

Serial.println(x);
char buf[6] = {'\0'};
snprintf(buf, 6, "%05i", x);
display.print(buf);
display.display();

Schwuppdiwupp...

1 Like

Echt Super, vielen Dank.
Läuft!!
Gruß Alex

Die Anzahl der Nullen ist in der 5 versteckt :slight_smile:
Wenn x ein (u)int16_t Wert ist, so hast Du insgesamt maximal 5 Stellen. Wenn Du sicherstellen kannst, dass Du die nicht vollständig brauchst, kannst auch 4 nehmen ....

1 Like

5 stellen ist optimal

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